#endif
#include <stdarg.h>
+#include <libcitadel.h>
#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
char reply_to[SIZ];
char reply_subject[SIZ];
+char reply_references[SIZ];
struct cittext {
struct cittext *next;
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;
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) {
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",
strcpy(message.recipient, "");
strcpy(message.author, "");
strcpy(message.subject, "");
+ strcpy(message.references, "");
message.text = ""; /* point to "", changes later */
message.anonymous = 0;
message.type = mode;
strcpy(message.recipient, buf);
if (is_reply) {
+
if (!IsEmptyStr(reply_subject)) {
if (!strncasecmp(reply_subject,
"Re: ", 3)) {
reply_subject);
}
}
+
+ safestrncpy(message.references, reply_references, sizeof message.references);
}
if (room_flags & QR_ANONOPT) {
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;
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);
&& (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");
case 'r':
scr_printf("Reply");
break;
+ case 'o':
+ scr_printf("Open attachments");
+ break;
case 'f':
scr_printf("File");
break;
" 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)
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) {
* 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);