MsgPartEvaluatorFunc f;
} MsgPartEvaluatorStruct;
+void fixview()
+{
+ /* workaround for json listview; its not useable directly */
+ if (WC->CurRoom.view == VIEW_JSON_LIST) {
+ StrBuf *View = NewStrBuf();
+ StrBufPrintf(View, "%d", VIEW_MAILBOX);
+ putbstr("view", View);;
+ }
+}
int load_message(message_summary *Msg,
StrBuf *FoundCharset,
StrBuf **Error)
void *vHdr;
long len;
const char *Key;
+ WCTemplputParams SuperTP;
WCTemplputParams SubTP;
StrBuf *Error = NULL;
+ memset(&SuperTP, 0, sizeof(WCTemplputParams));
+ memset(&SubTP, 0, sizeof(WCTemplputParams));
+
Buf = NewStrBuf();
FoundCharset = NewStrBuf();
Msg = (message_summary *)malloc(sizeof(message_summary));
StrBufTrim(Buf);
StrBufLowerCase(Buf);
- /* Locate a renderer capable of converting this MIME part into HTML */
- if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
- (vHdr != NULL)) {
- RenderMimeFuncStruct *Render;
- Render = (RenderMimeFuncStruct*)vHdr;
- Render->f(Msg->MsgBody, NULL, FoundCharset);
- }
-
- if (StrLength(Msg->reply_references)> 0) {
- /* Trim down excessively long lists of thread references. We eliminate the
- * second one in the list so that the thread root remains intact.
- */
- int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
- int rrlen = StrLength(Msg->reply_references);
- if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
- StrBufRemove_token(Msg->reply_references, 1, '|');
+ StackContext(NULL, &SuperTP, Msg, CTX_MAILSUM, 0, NULL);
+ {
+ /* Locate a renderer capable of converting this MIME part into HTML */
+ if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) &&
+ (vHdr != NULL)) {
+ RenderMimeFuncStruct *Render;
+
+ StackContext(&SuperTP, &SubTP, Msg->MsgBody, CTX_MIME_ATACH, 0, NULL);
+ {
+ Render = (RenderMimeFuncStruct*)vHdr;
+ Render->f(Target, &SubTP, FoundCharset);
+ }
+ UnStackContext(&SubTP);
+ }
+
+ if (StrLength(Msg->reply_references)> 0) {
+ /* Trim down excessively long lists of thread references. We eliminate the
+ * second one in the list so that the thread root remains intact.
+ */
+ int rrtok = num_tokens(ChrPtr(Msg->reply_references), '|');
+ int rrlen = StrLength(Msg->reply_references);
+ if ( ((rrtok >= 3) && (rrlen > 900)) || (rrtok > 10) ) {
+ StrBufRemove_token(Msg->reply_references, 1, '|');
+ }
}
- }
- /* now check if we need to translate some mimeparts, and remove the duplicate */
- it = GetNewHashPos(Msg->AllAttach, 0);
- while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) &&
- (vMime != NULL)) {
- wc_mime_attachment *Mime = (wc_mime_attachment*) vMime;
- evaluate_mime_part(Msg, Mime);
+ /* now check if we need to translate some mimeparts, and remove the duplicate */
+ it = GetNewHashPos(Msg->AllAttach, 0);
+ while (GetNextHashPos(Msg->AllAttach, it, &len, &Key, &vMime) &&
+ (vMime != NULL)) {
+ StackContext(&SuperTP, &SubTP, vMime, CTX_MIME_ATACH, 0, NULL);
+ {
+ evaluate_mime_part(Target, &SubTP);
+ }
+ UnStackContext(&SubTP);
+ }
+ DeleteHashPos(&it);
+ *OutMime = DoTemplate(tmpl, tmpllen, Target, &SuperTP);
}
- DeleteHashPos(&it);
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_MAILSUM;
- SubTP.Context = Msg;
- *OutMime = DoTemplate(tmpl, tmpllen, Target, &SubTP);
+ UnStackContext(&SuperTP);
DestroyMessageSummary(Msg);
FreeStrBuf(&FoundCharset);
*/
void handle_one_message(void)
{
- long CitStatus;
+ long CitStatus = ERROR + NOT_HERE;
int CopyMessage = 0;
const StrBuf *Destination;
void *vLine;
StrBufCutLeft(Buf, nBuf + 1);
Eval->f(Msg, Buf);
}
- else syslog(1, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
+ else syslog(LOG_INFO, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
}
return Msg;
}
if (Stat.sortit) {
CompareFunc SortIt;
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_MAILSUM;
- SubTP.Context = NULL;
- SortIt = RetrieveSort(&SubTP, NULL, 0,
- HKEY("date"), Stat.defaultsortorder);
+ StackContext(NULL, &SubTP, NULL, CTX_MAILSUM, 0, NULL);
+ {
+ SortIt = RetrieveSort(&SubTP,
+ NULL, 0,
+ HKEY("date"),
+ Stat.defaultsortorder);
+ }
+ UnStackContext(&SubTP);
if (SortIt != NULL)
SortByPayload(WCC->summ, SortIt);
}
}
/* Only do multipart/alternative for mailboxes. BBS and Wiki rooms don't need it. */
- if (WC->CurRoom.view == VIEW_MAILBOX) {
+ if ((WCC->CurRoom.view == VIEW_MAILBOX) ||
+ (WCC->CurRoom.view == VIEW_JSON_LIST))
+ {
include_text_alt = 1;
}
StrBuf_ServGetln(Buf);
if (GetServerStatusMsg(Buf, NULL, 1, 2) != 2) {
/* You probably don't even have a dumb Drafts folder */
- syslog(9, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+ syslog(LOG_DEBUG, "%s:%d: server save to drafts error: %s\n", __FILE__, __LINE__, ChrPtr(Buf) + 4);
AppendImportantMessage(_("Saved to Drafts failed: "), -1);
display_enter();
FreeStrBuf(&Buf);
}
else
{
- syslog(9, "%s\n", ChrPtr(CmdBuf));
+ syslog(LOG_DEBUG, "%s\n", ChrPtr(CmdBuf));
serv_puts(ChrPtr(CmdBuf));
FreeStrBuf(&CmdBuf);
serv_printf("Cc: %s", ChrPtr(Cc));
serv_printf("Bcc: %s", ChrPtr(Bcc));
} else {
- serv_printf("X-Citadel-Room: %s", ChrPtr(WC->CurRoom.name));
+ serv_printf("X-Citadel-Room: %s", ChrPtr(WCC->CurRoom.name));
}
}
post_mime_to_server();
if (saving_to_drafts) {
AppendImportantMessage(_("Message has been saved to Drafts.\n"), -1);
gotoroom(WCC->CurRoom.name);
+ fixview();
readloop(readnew, eUseDefault);
FreeStrBuf(&Buf);
return;
}
dont_post = lbstr("postseq");
} else {
- syslog(9, "%s:%d: server post error: %s", __FILE__, __LINE__, ChrPtr(Buf) + 4);
+ syslog(LOG_DEBUG, "%s:%d: server post error: %s", __FILE__, __LINE__, ChrPtr(Buf) + 4);
AppendImportantMessage(ChrPtr(Buf) + 4, StrLength(Buf) - 4);
display_enter();
if (saving_to_drafts) gotoroom(WCC->CurRoom.name);
* Otherwise, just go to the "read messages" loop.
*/
else {
+ fixview();
readloop(readnew, eUseDefault);
}
}
void *v;
wc_mime_attachment *att;
- syslog(9, "upload_attachment()\n");
+ syslog(LOG_DEBUG, "upload_attachment()\n");
wc_printf("upload_attachment()<br>\n");
if (WCC->upload_length <= 0) {
- syslog(9, "ERROR no attachment was uploaded\n");
+ syslog(LOG_DEBUG, "ERROR no attachment was uploaded\n");
wc_printf("ERROR no attachment was uploaded<br>\n");
return;
}
- syslog(9, "Client is uploading %d bytes\n", WCC->upload_length);
+ syslog(LOG_DEBUG, "Client is uploading %d bytes\n", WCC->upload_length);
wc_printf("Client is uploading %d bytes<br>\n", WCC->upload_length);
att = malloc(sizeof(wc_mime_attachment));
memset(att, 0, sizeof(wc_mime_attachment ));
long l_from;
long l_rcpt;
long l_cccc;
+long l_replyto;
long l_node;
long l_rfca;
-
+long l_nvto;
+
+const char *ReplyToModeStrings [3] = {
+ "reply",
+ "replyall",
+ "forward"
+};
+typedef enum _eReplyToNodes {
+ eReply,
+ eReplyAll,
+ eForward
+}eReplyToNodes;
+
/*
* display the message entry screen
*/
void display_enter(void)
{
+ const char *ReplyingModeStr;
+ eReplyToNodes ReplyMode = eReply;
StrBuf *Line;
long Result;
int rc;
}
else if (rc != 2) { /* Any other error means that we cannot continue */
rc = GetServerStatusMsg(Line, &Result, 0, 2);
+ fixview();
readloop(readnew, eUseDefault);
FreeStrBuf(&Line);
return;
}
+ ReplyingModeStr = bstr("replying_mode");
+ if (ReplyingModeStr != NULL) for (i = 0; i < 3; i++) {
+ if (strcmp(ReplyingModeStr, ReplyToModeStrings[i]) == 0) {
+ ReplyMode = (eReplyToNodes) i;
+ break;
+ }
+ }
+
+
/*
* If the "replying_to" variable is set, it refers to a message
* number from which we must extract some header fields...
StrBuf *rfca = NULL;
StrBuf *rcpt = NULL;
StrBuf *cccc = NULL;
+ StrBuf *replyto = NULL;
+ StrBuf *nvto = NULL;
serv_printf("MSG0 %ld|1", replying_to);
StrBuf_ServGetln(Line);
StrBuf *subj = NewStrBuf();
StrBuf *FlatSubject;
- if (!strcasecmp(bstr("replying_mode"), "forward")) {
+ if (ReplyMode == eForward) {
if (strncasecmp(ChrPtr(Line) + 5, "Fw:", 3)) {
StrBufAppendBufPlain(subj, HKEY("Fw: "), 0);
}
else if (which == l_node) {
node = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
}
-
+ else if (which == l_replyto) {
+ replyto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+ }
else if (which == l_rfca) {
StrBuf *FlatRFCA;
rfca = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
FreeStrBuf(&rfca);
rfca = FlatRFCA;
}
+ else if (which == l_nvto) {
+ nvto = NewStrBufPlain(ChrPtr(Line) + 5, StrLength(Line) - 5);
+ putbstr("nvto", nvto);
+ }
}
/*
* If this is a Reply or a ReplyAll, copy the sender's email into the To: field
*/
- if ( (!strcasecmp(bstr("replying_mode"), "reply"))
- || (!strcasecmp(bstr("replying_mode"), "replyall"))
- ) {
+ if ((ReplyMode == eReply) || (ReplyMode == eReplyAll))
+ {
StrBuf *to_rcpt;
- if (StrLength(rfca) > 0) {
+ if ((StrLength(replyto) > 0) && (ReplyMode == eReplyAll)) {
+ to_rcpt = NewStrBuf();
+ StrBufAppendBuf(to_rcpt, replyto, 0);
+ }
+ else if (StrLength(rfca) > 0) {
to_rcpt = NewStrBuf();
StrBufAppendBuf(to_rcpt, from, 0);
StrBufAppendBufPlain(to_rcpt, HKEY(" <"), 0);
to_rcpt = from;
from = NULL;
if ( (StrLength(node) > 0)
- && (strcasecmp(ChrPtr(node), ChrPtr(WC->serv_info->serv_nodename)))
+ && (strcasecmp(ChrPtr(node), ChrPtr(WCC->serv_info->serv_nodename)))
) {
StrBufAppendBufPlain(to_rcpt, HKEY(" @ "), 0);
StrBufAppendBuf(to_rcpt, node, 0);
/*
* Only if this is a ReplyAll, copy all recipients into the Cc: field
*/
- if ( (!strcasecmp(bstr("replying_mode"), "replyall"))
- ) {
+ if (ReplyMode == eReplyAll)
+ {
StrBuf *cc_rcpt = rcpt;
rcpt = NULL;
- if (StrLength(cccc) > 0) {
+ if ((StrLength(cccc) > 0) && (StrLength(replyto) == 0))
+ {
if (cc_rcpt != NULL) {
StrBufAppendPrintf(cc_rcpt, ", ");
StrBufAppendBuf(cc_rcpt, cccc, 0);
else if (rc != 2) { /* Any other error means that we cannot continue */
AppendImportantMessage(ChrPtr(CmdBuf) + 4, StrLength(CmdBuf) - 4);
FreeStrBuf(&CmdBuf);
+ fixview();
readloop(readnew, eUseDefault);
return;
}
StrBuf_ServGetln(Line);
GetServerStatusMsg(Line, NULL, 1, 0);
+ fixview();
+
readloop(readnew, eUseDefault);
}
AppendImportantMessage(_("The message was not moved."), -1);
}
+ fixview();
readloop(readnew, eUseDefault);
}
l_from = FourHash("from", 4);
l_rcpt = FourHash("rcpt", 4);
l_cccc = FourHash("cccc", 4);
+ l_replyto = FourHash("rep2", 4);
l_node = FourHash("node", 4);
l_rfca = FourHash("rfca", 4);
+ l_nvto = FourHash("nvto", 4);
return ;
}