/*
* Functions which deal with the fetching and displaying of messages.
*
- * Copyright (c) 1996-2011 by the citadel.org team
+ * Copyright (c) 1996-2012 by the citadel.org team
*
* This program is open source software. You can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
+ * modify it under the terms of the GNU General Public License, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "webcit.h"
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)
evaluate_mime_part(Msg, Mime);
}
DeleteHashPos(&it);
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_MAILSUM;
- SubTP.Context = Msg;
- *OutMime = DoTemplate(tmpl, tmpllen, Target, &SubTP);
+ StackContext(NULL, &SubTP, Msg, CTX_MAILSUM, 0, NULL);
+ {
+ *OutMime = DoTemplate(tmpl, tmpllen, Target, &SubTP);
+ }
+ UnStackContext(&SubTP);
DestroyMessageSummary(Msg);
FreeStrBuf(&FoundCharset);
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 *Recp = NULL;
StrBuf *Cc = NULL;
StrBuf *Bcc = NULL;
- const StrBuf *Wikipage = NULL;
+ char *wikipage = NULL;
const StrBuf *my_email_addr = NULL;
StrBuf *CmdBuf = NULL;
StrBuf *references = NULL;
FreeStrBuf(&EmailAddress);
FreeStrBuf(&EncBuf);
- Wikipage = sbstr("page");
+ wikipage = strdup(bstr("page"));
+ str_wiki_index(wikipage);
my_email_addr = sbstr("my_email_addr");
HeaderLen = StrLength(Recp) +
StrLength(encoded_subject) +
StrLength(Cc) +
StrLength(Bcc) +
- StrLength(Wikipage) +
+ strlen(wikipage) +
StrLength(my_email_addr) +
StrLength(references);
CmdBuf = NewStrBufPlain(NULL, sizeof (CMD) + HeaderLen);
ChrPtr(display_name),
saving_to_drafts?"":ChrPtr(Cc),
saving_to_drafts?"":ChrPtr(Bcc),
- ChrPtr(Wikipage),
+ wikipage,
ChrPtr(my_email_addr),
ChrPtr(references));
FreeStrBuf(&references);
FreeStrBuf(&encoded_subject);
+ free(wikipage);
if ((HeaderLen + StrLength(sbstr("msgtext")) < 10) &&
(GetCount(WCC->attachments) == 0)){
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;
* Otherwise, just go to the "read messages" loop.
*/
else {
+ fixview();
readloop(readnew, eUseDefault);
}
}
long l_from;
long l_rcpt;
long l_cccc;
+long l_replyto;
long l_node;
long l_rfca;
+const char *ReplyToModeStrings [3] = {
+ "reply",
+ "replyalle",
+ "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;
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);
/*
* 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);
const StrBuf *Recp = NULL;
const StrBuf *Cc = NULL;
const StrBuf *Bcc = NULL;
- const StrBuf *Wikipage = NULL;
+ char *wikipage = NULL;
StrBuf *CmdBuf = NULL;
const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s";
Recp = sbstr("recp");
Cc = sbstr("cc");
Bcc = sbstr("bcc");
- Wikipage = sbstr("page");
+ wikipage = strdup(bstr("page"));
+ str_wiki_index(wikipage);
CmdBuf = NewStrBufPlain(NULL,
sizeof (CMD) +
StrLength(display_name) +
StrLength(Cc) +
StrLength(Bcc) +
- StrLength(Wikipage));
+ strlen(wikipage));
StrBufPrintf(CmdBuf,
CMD,
ChrPtr(display_name),
ChrPtr(Cc),
ChrPtr(Bcc),
- ChrPtr(Wikipage));
+ wikipage
+ );
serv_puts(ChrPtr(CmdBuf));
StrBuf_ServGetln(CmdBuf);
+ free(wikipage);
rc = GetServerStatusMsg(CmdBuf, &Result, 0, 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);