mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-10 18:23:28 +00:00
Implemented receive_message
SVN revision: 697
This commit is contained in:
parent
7bf9695573
commit
4126915853
117
src/elogd.c
117
src/elogd.c
@ -6,6 +6,9 @@
|
|||||||
Contents: Web server program for Electronic Logbook ELOG
|
Contents: Web server program for Electronic Logbook ELOG
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.201 2004/01/19 21:34:14 midas
|
||||||
|
Implemented receive_message
|
||||||
|
|
||||||
Revision 1.200 2004/01/19 16:22:28 midas
|
Revision 1.200 2004/01/19 16:22:28 midas
|
||||||
Continued working on synchronization
|
Continued working on synchronization
|
||||||
|
|
||||||
@ -294,6 +297,7 @@ typedef int INT;
|
|||||||
#define EL_EMPTY 7
|
#define EL_EMPTY 7
|
||||||
#define EL_MEM_ERROR 8
|
#define EL_MEM_ERROR 8
|
||||||
#define EL_DUPLICATE 9
|
#define EL_DUPLICATE 9
|
||||||
|
#define EL_LOCKED 10
|
||||||
|
|
||||||
#define EL_FIRST 1
|
#define EL_FIRST 1
|
||||||
#define EL_LAST 2
|
#define EL_LAST 2
|
||||||
@ -7974,6 +7978,7 @@ int retrieve_remote_md5(char *url, MD5_INDEX ** md5_index)
|
|||||||
sscanf(p + 2 * i, "%02X", &((*md5_index)[n].md5_digest[i]));
|
sscanf(p + 2 * i, "%02X", &((*md5_index)[n].md5_digest[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* debugging only
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@ -7983,6 +7988,7 @@ int retrieve_remote_md5(char *url, MD5_INDEX ** md5_index)
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
free(text);
|
free(text);
|
||||||
|
|
||||||
@ -8257,6 +8263,86 @@ int submit_message(LOGBOOK * lbs, char *url, int message_id, char *error_str)
|
|||||||
|
|
||||||
int receive_message(LOGBOOK * lbs, char *url, int message_id, char *error_str)
|
int receive_message(LOGBOOK * lbs, char *url, int message_id, char *error_str)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
char str[256], *p, *p2, *message, date[80], attrib[MAX_N_ATTR][NAME_LENGTH],
|
||||||
|
in_reply_to[80], reply_to[MAX_REPLY_TO * 10],
|
||||||
|
attachment[MAX_ATTACHMENTS][MAX_PATH_LENGTH], encoding[80], locked_by[256],
|
||||||
|
attachment_all[64 * MAX_ATTACHMENTS];
|
||||||
|
|
||||||
|
strlcpy(str, url, sizeof(str));
|
||||||
|
if (str[strlen(str) - 1] != '/')
|
||||||
|
strlcat(str, "/", sizeof(str));
|
||||||
|
sprintf(str + strlen(str), "%d?cmd=Download", message_id);
|
||||||
|
|
||||||
|
retrieve_url(str, &message);
|
||||||
|
p = strstr(message, "\r\n\r\n");
|
||||||
|
if (p == NULL) {
|
||||||
|
free(message);
|
||||||
|
return EL_NO_MSG;
|
||||||
|
}
|
||||||
|
p+= 4;
|
||||||
|
|
||||||
|
/* check for correct ID */
|
||||||
|
if (atoi(p + 8) != message_id) {
|
||||||
|
free(message);
|
||||||
|
return EL_NO_MSG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* decode message */
|
||||||
|
el_decode(p, "Date: ", date);
|
||||||
|
el_decode(p, "Reply to: ", reply_to);
|
||||||
|
el_decode(p, "In reply to: ", in_reply_to);
|
||||||
|
|
||||||
|
for (i = 0; i < lbs->n_attr; i++) {
|
||||||
|
sprintf(str, "%s: ", attr_list[i]);
|
||||||
|
el_decode(p, str, attrib[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
el_decode(p, "Attachment: ", attachment_all);
|
||||||
|
el_decode(p, "Encoding: ", encoding);
|
||||||
|
|
||||||
|
/* break apart attachements */
|
||||||
|
for (i = 0; i < MAX_ATTACHMENTS; i++)
|
||||||
|
attachment[i][0] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ATTACHMENTS; i++) {
|
||||||
|
if (i == 0)
|
||||||
|
p2 = strtok(attachment_all, ",");
|
||||||
|
else
|
||||||
|
p2 = strtok(NULL, ",");
|
||||||
|
|
||||||
|
if (p2 != NULL)
|
||||||
|
strcpy(attachment[i], p2);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
el_decode(p, "Locked by: ", locked_by);
|
||||||
|
if (locked_by[0]) {
|
||||||
|
free(message);
|
||||||
|
return EL_LOCKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = strstr(message, "========================================\n");
|
||||||
|
|
||||||
|
/* check for \n -> \r conversion (e.g. zipping/unzipping) */
|
||||||
|
if (p == NULL)
|
||||||
|
p = strstr(message, "========================================\r");
|
||||||
|
|
||||||
|
if (p != NULL) {
|
||||||
|
p += 41;
|
||||||
|
|
||||||
|
/* el_submit(); */
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ATTACHMENTS; i++) {
|
||||||
|
if (attachment[i][0]) {
|
||||||
|
/* el_submit_attachment() */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
free(message);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8303,7 +8389,7 @@ int save_md5(char *server, MD5_INDEX * md5_index, int n)
|
|||||||
int load_md5(char *server, MD5_INDEX ** md5_index)
|
int load_md5(char *server, MD5_INDEX ** md5_index)
|
||||||
{
|
{
|
||||||
char str[256], file_name[256], *p;
|
char str[256], file_name[256], *p;
|
||||||
int i, j;
|
int i, j, x;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
strlcpy(file_name, resource_dir, sizeof(file_name));
|
strlcpy(file_name, resource_dir, sizeof(file_name));
|
||||||
@ -8334,7 +8420,7 @@ int load_md5(char *server, MD5_INDEX ** md5_index)
|
|||||||
if (i == 0)
|
if (i == 0)
|
||||||
*md5_index = calloc(sizeof(MD5_INDEX), 1);
|
*md5_index = calloc(sizeof(MD5_INDEX), 1);
|
||||||
else
|
else
|
||||||
*md5_index = realloc(md5_index, sizeof(MD5_INDEX) * (i + 1));
|
*md5_index = realloc(*md5_index, sizeof(MD5_INDEX) * (i + 1));
|
||||||
|
|
||||||
p = str + 2;
|
p = str + 2;
|
||||||
|
|
||||||
@ -8344,8 +8430,10 @@ int load_md5(char *server, MD5_INDEX ** md5_index)
|
|||||||
while (*p && *p == ' ')
|
while (*p && *p == ' ')
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++) {
|
||||||
sscanf(p + j * 2, "%02X", (*md5_index)[i].md5_digest[j]);
|
sscanf(p + j * 2, "%02X", &x);
|
||||||
|
(*md5_index)[i].md5_digest[j] = (unsigned char) x;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@ -8368,9 +8456,8 @@ BOOL equal_md5(unsigned char m1[16], unsigned char m2[16])
|
|||||||
|
|
||||||
void synchronize(LOGBOOK * lbs, char *path)
|
void synchronize(LOGBOOK * lbs, char *path)
|
||||||
{
|
{
|
||||||
int index, i, i_remote, i_cache, n_remote, n_cache, nserver,
|
int index, i, i_msg, i_remote, i_cache, n_remote, n_cache, nserver,
|
||||||
remote_id, exist_remote, exist_cache, message_id;
|
remote_id, exist_remote, exist_cache, message_id;
|
||||||
|
|
||||||
int priority_remote = 0;
|
int priority_remote = 0;
|
||||||
char str[2000];
|
char str[2000];
|
||||||
MD5_INDEX *md5_remote, *md5_cache;
|
MD5_INDEX *md5_remote, *md5_cache;
|
||||||
@ -8390,7 +8477,7 @@ void synchronize(LOGBOOK * lbs, char *path)
|
|||||||
show_error(str);
|
show_error(str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
show_html_header(NULL, FALSE, loc("Synchronization"));
|
show_html_header(NULL, FALSE, loc("Synchronization"));
|
||||||
|
|
||||||
rsprintf("<body>\n");
|
rsprintf("<body>\n");
|
||||||
@ -8418,9 +8505,9 @@ void synchronize(LOGBOOK * lbs, char *path)
|
|||||||
n_cache = load_md5(list[index], &md5_cache);
|
n_cache = load_md5(list[index], &md5_cache);
|
||||||
|
|
||||||
/* loop through logbook entries */
|
/* loop through logbook entries */
|
||||||
for (i = 0; i < *lbs->n_el_index; i++) {
|
for (i_msg = 0; i_msg < *lbs->n_el_index; i_msg++) {
|
||||||
|
|
||||||
message_id = lbs->el_index[i].message_id;
|
message_id = lbs->el_index[i_msg].message_id;
|
||||||
rsprintf("ID%d: ", message_id);
|
rsprintf("ID%d: ", message_id);
|
||||||
|
|
||||||
/* look for message id in MD5s */
|
/* look for message id in MD5s */
|
||||||
@ -8438,7 +8525,7 @@ void synchronize(LOGBOOK * lbs, char *path)
|
|||||||
if (exist_remote && exist_cache) {
|
if (exist_remote && exist_cache) {
|
||||||
|
|
||||||
/* if message has been changed on this server, but not remotely, send it */
|
/* if message has been changed on this server, but not remotely, send it */
|
||||||
if (!equal_md5(md5_cache[i_cache].md5_digest, lbs->el_index[index].md5_digest)
|
if (!equal_md5(md5_cache[i_cache].md5_digest, lbs->el_index[i_msg].md5_digest)
|
||||||
&& equal_md5(md5_cache[i_cache].md5_digest,
|
&& equal_md5(md5_cache[i_cache].md5_digest,
|
||||||
md5_remote[i_remote].md5_digest)) {
|
md5_remote[i_remote].md5_digest)) {
|
||||||
|
|
||||||
@ -8452,18 +8539,18 @@ void synchronize(LOGBOOK * lbs, char *path)
|
|||||||
|
|
||||||
} else
|
} else
|
||||||
/* if message has been changed remotely, but not on this server, receive it */
|
/* if message has been changed remotely, but not on this server, receive it */
|
||||||
if (!equal_md5
|
if (!equal_md5
|
||||||
(md5_cache[i_cache].md5_digest, md5_remote[i_remote].md5_digest)
|
(md5_cache[i_cache].md5_digest, md5_remote[i_remote].md5_digest)
|
||||||
&& equal_md5(md5_cache[i_cache].md5_digest,
|
&& equal_md5(md5_cache[i_cache].md5_digest,
|
||||||
lbs->el_index[index].md5_digest)) {
|
lbs->el_index[i_msg].md5_digest)) {
|
||||||
|
|
||||||
receive_message(lbs, list[index], message_id, error_str);
|
receive_message(lbs, list[index], message_id, error_str);
|
||||||
} else
|
} else
|
||||||
/* if message has been changed remotely and on this server, show conflict */
|
/* if message has been changed remotely and on this server, show conflict */
|
||||||
if (!equal_md5
|
if (!equal_md5
|
||||||
(md5_cache[i_cache].md5_digest, md5_remote[i_remote].md5_digest)
|
(md5_cache[i_cache].md5_digest, md5_remote[i_remote].md5_digest)
|
||||||
&& !equal_md5(md5_cache[i_cache].md5_digest,
|
&& !equal_md5(md5_cache[i_cache].md5_digest,
|
||||||
lbs->el_index[index].md5_digest)) {
|
lbs->el_index[i_msg].md5_digest)) {
|
||||||
|
|
||||||
rsprintf("%s\n",
|
rsprintf("%s\n",
|
||||||
loc
|
loc
|
||||||
@ -8485,7 +8572,7 @@ void synchronize(LOGBOOK * lbs, char *path)
|
|||||||
it must be new, so send it */
|
it must be new, so send it */
|
||||||
if (!exist_cache && !exist_remote) {
|
if (!exist_cache && !exist_remote) {
|
||||||
remote_id =
|
remote_id =
|
||||||
submit_message(lbs, list[index], lbs->el_index[i].message_id, error_str);
|
submit_message(lbs, list[index], lbs->el_index[i_msg].message_id, error_str);
|
||||||
|
|
||||||
if (error_str[0])
|
if (error_str[0])
|
||||||
rsprintf("%s: %s\n", loc("Error sending local message"), error_str);
|
rsprintf("%s: %s\n", loc("Error sending local message"), error_str);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user