X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmessages.c;h=e891539ce500dbf4e6da49da42bc55f65f38318e;hb=89406b8ce58376969b5f11c4f88d77eb15d3b7d2;hp=6af7002b58a4d29288e74584395559587b5bae67;hpb=307ff84a60b03889b9cd5ff84c29489177f9a39d;p=citadel.git diff --git a/webcit/messages.c b/webcit/messages.c index 6af7002b5..e891539ce 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -1,21 +1,15 @@ /* * 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" @@ -43,6 +37,15 @@ typedef struct _MsgPartEvaluatorStruct { 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) @@ -235,10 +238,11 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co 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); @@ -321,7 +325,7 @@ HttpStatus(long CitadelStatus) */ void handle_one_message(void) { - long CitStatus; + long CitStatus = ERROR + NOT_HERE; int CopyMessage = 0; const StrBuf *Destination; void *vLine; @@ -783,11 +787,14 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer) 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); } @@ -896,7 +903,9 @@ void post_mime_to_server(void) { } /* 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; } @@ -1017,7 +1026,7 @@ void post_message(void) 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; @@ -1072,14 +1081,15 @@ void post_message(void) 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); @@ -1091,11 +1101,12 @@ void post_message(void) 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)){ @@ -1120,13 +1131,14 @@ void post_message(void) 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; @@ -1178,6 +1190,7 @@ void post_message(void) * Otherwise, just go to the "read messages" loop. */ else { + fixview(); readloop(readnew, eUseDefault); } } @@ -1307,14 +1320,28 @@ long l_msgn; 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; @@ -1349,6 +1376,7 @@ void display_enter(void) } 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; @@ -1390,6 +1418,15 @@ void display_enter(void) } + 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... @@ -1404,6 +1441,7 @@ void display_enter(void) StrBuf *rfca = NULL; StrBuf *rcpt = NULL; StrBuf *cccc = NULL; + StrBuf *replyto = NULL; serv_printf("MSG0 %ld|1", replying_to); StrBuf_ServGetln(Line); @@ -1423,7 +1461,7 @@ void display_enter(void) 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); } @@ -1487,7 +1525,9 @@ void display_enter(void) 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); @@ -1518,11 +1558,14 @@ void display_enter(void) /* * 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); @@ -1533,7 +1576,7 @@ void display_enter(void) 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); @@ -1545,11 +1588,12 @@ void display_enter(void) /* * 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); @@ -1579,14 +1623,15 @@ void display_enter(void) 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) + @@ -1594,7 +1639,7 @@ void display_enter(void) StrLength(display_name) + StrLength(Cc) + StrLength(Bcc) + - StrLength(Wikipage)); + strlen(wikipage)); StrBufPrintf(CmdBuf, CMD, @@ -1603,9 +1648,11 @@ void display_enter(void) 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); @@ -1617,6 +1664,7 @@ void display_enter(void) 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; } @@ -1655,6 +1703,8 @@ void delete_msg(void) StrBuf_ServGetln(Line); GetServerStatusMsg(Line, NULL, 1, 0); + fixview(); + readloop(readnew, eUseDefault); } @@ -1679,6 +1729,7 @@ void move_msg(void) AppendImportantMessage(_("The message was not moved."), -1); } + fixview(); readloop(readnew, eUseDefault); } @@ -2005,6 +2056,7 @@ InitModule_MSG 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);