X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmessages.c;h=bc5a6e5cfd4bd0c9ef44baced9fa9e74a8b21c62;hb=1bf28924fb95c17730a07c1a1547bca3de9afa20;hp=0d822804c346bdc13f37340976cd0753aac35354;hpb=1ef5a54193bd3da7cbeecc5e72eb078e218dbdac;p=citadel.git diff --git a/citadel/messages.c b/citadel/messages.c index 0d822804c..bc5a6e5cf 100644 --- a/citadel/messages.c +++ b/citadel/messages.c @@ -35,14 +35,13 @@ #endif #include +#include #include "citadel.h" #include "citadel_ipc.h" #include "citadel_decls.h" #include "messages.h" #include "commands.h" #include "rooms.h" -#include "tools.h" -#include "html.h" #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif @@ -53,6 +52,7 @@ char reply_to[SIZ]; char reply_subject[SIZ]; +char reply_references[SIZ]; struct cittext { struct cittext *next; @@ -70,6 +70,7 @@ int msg_arr_size = 0; int num_msgs; char rc_alt_semantics; extern char room_name[]; +extern char tempdir[]; extern unsigned room_flags; extern unsigned room_flags2; extern long highest_msg_read; @@ -404,6 +405,7 @@ int read_message(CtdlIPC *ipc, strcpy(reply_to, NO_REPLY_TO); strcpy(reply_subject, ""); + strcpy(reply_references, ""); r = CtdlIPCGetSingleMessage(ipc, num, (pagin == READ_HEADER ? 1 : 0), 4, &message, buf); if (r / 100 != 1) { @@ -588,9 +590,20 @@ int read_message(CtdlIPC *ipc, lines_printed = checkpagin(lines_printed, pagin, screenheight); } + + /* Always do msgid before references ... the latter is a concatenation! */ + if (message->msgid != NULL) { + safestrncpy(reply_references, message->msgid, sizeof reply_references); + } + + if (message->references != NULL) if (!IsEmptyStr(message->references)) { + int l = strlen(reply_references); + strcpy(&reply_references[l++], "|"); + safestrncpy(&reply_references[l], message->references, (sizeof(reply_references) - l)); + } + if (message->subject != NULL) { - safestrncpy(reply_subject, message->subject, - sizeof reply_subject); + safestrncpy(reply_subject, message->subject, sizeof reply_subject); if (!IsEmptyStr(message->subject)) { if (dest) { fprintf(dest, "Subject: %s\n", @@ -1090,6 +1103,7 @@ int entmsg(CtdlIPC *ipc, strcpy(message.recipient, ""); strcpy(message.author, ""); strcpy(message.subject, ""); + strcpy(message.references, ""); message.text = ""; /* point to "", changes later */ message.anonymous = 0; message.type = mode; @@ -1136,6 +1150,7 @@ int entmsg(CtdlIPC *ipc, strcpy(message.recipient, buf); if (is_reply) { + if (!IsEmptyStr(reply_subject)) { if (!strncasecmp(reply_subject, "Re: ", 3)) { @@ -1148,6 +1163,8 @@ int entmsg(CtdlIPC *ipc, reply_subject); } } + + safestrncpy(message.references, reply_references, sizeof message.references); } if (room_flags & QR_ANONOPT) { @@ -1276,13 +1293,13 @@ void process_quote(void) line = 0; fgets(buf, 128, qfile); while (fgets(buf, 128, qfile) != NULL) { - scr_printf("%2d %s", ++line, buf); + scr_printf("%3d %s", ++line, buf); } - scr_printf("Begin quoting at [ 1] : "); - ctdl_getline(buf, 3); + scr_printf("Begin quoting at [1] : "); + ctdl_getline(buf, 4); qstart = (buf[0] == 0) ? (1) : atoi(buf); scr_printf(" End quoting at [%d] : ", line); - ctdl_getline(buf, 3); + ctdl_getline(buf, 4); qend = (buf[0] == 0) ? (line) : atoi(buf); rewind(qfile); line = 0; @@ -1470,8 +1487,9 @@ void readmsgs(CtdlIPC *ipc, char filename[PATH_MAX]; char save_to[PATH_MAX]; void *attachment = NULL; /* Downloaded attachment */ - FILE *dest = NULL; /* Alternate destination other than screen */ + FILE *dest = NULL; /* Alternate destination other than screen */ int r; /* IPC response code */ + static int att_seq = 0; /* Attachment download sequence number */ if (c < 0) b = (num_msgs - 1); @@ -1631,7 +1649,7 @@ RMSGREAD: scr_flush(); && (e != 'q') && (e != 'b') && (e != 'h') && (e != 'r') && (e != 'f') && (e != '?') && (e != 'u') && (e != 'c') && (e != 'y') - && (e != 'i')); + && (e != 'i') && (e != 'o') ); switch (e) { case 's': scr_printf("Stop"); @@ -1666,6 +1684,9 @@ RMSGREAD: scr_flush(); case 'r': scr_printf("Reply"); break; + case 'o': + scr_printf("Open attachments"); + break; case 'f': scr_printf("File"); break; @@ -1711,9 +1732,10 @@ RMSGREAD: scr_flush(); " H Headers (display message headers only)\n"); if (is_mail) scr_printf(" R Reply to this message\n"); - if (rc_allow_attachments) - scr_printf - (" F (save attachments to a file)\n"); + if (rc_allow_attachments) { + scr_printf(" O (Open attachments)\n"); + scr_printf(" F (save attachments to a File)\n"); + } if (!IsEmptyStr(rc_url_cmd)) scr_printf(" U (list URL's for display)\n"); if (!IsEmptyStr(imagecmd) && has_images > 0) @@ -1757,9 +1779,9 @@ RMSGREAD: scr_flush(); if (r / 100 != 2) /* r will be init'ed, FIXME */ goto RMSGREAD; /* the logic here sucks */ break; + case 'o': case 'f': - newprompt("Which section? ", filename, - ((sizeof filename) - 1)); + newprompt("Which section? ", filename, ((sizeof filename) - 1)); r = CtdlIPCAttachmentDownload(ipc, msg_arr[a], filename, &attachment, progress, cmd); if (r / 100 != 2) { @@ -1770,12 +1792,23 @@ RMSGREAD: scr_flush(); * Part 1 won't have a filename; use the * subject of the message instead. IO */ - if (IsEmptyStr(filename)) + if (IsEmptyStr(filename)) { strcpy(filename, reply_subject); - destination_directory(save_to, filename); - save_buffer(attachment, - extract_unsigned_long(cmd, 0), - save_to); + } + if (e == 'o') { /* open attachment */ + mkdir(tempdir, 0700); + snprintf(save_to, sizeof save_to, "%s/%04x.%s", + tempdir, + ++att_seq, + filename); + save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to); + snprintf(cmd, sizeof cmd, rc_open_cmd, save_to); + system(cmd); + } + else { /* save attachment to disk */ + destination_directory(save_to, filename); + save_buffer(attachment, extract_unsigned_long(cmd, 0), save_to); + } } if (attachment) { free(attachment);