void examine_room(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
if ((StrLength(HdrLine) > 0) &&
- (strcasecmp(ChrPtr(HdrLine), ChrPtr(WC->wc_roomname)))) {
+ (strcasecmp(ChrPtr(HdrLine), ChrPtr(WC->CurRoom.name)))) {
FreeStrBuf(&Msg->Room);
Msg->Room = NewStrBufDup(HdrLine);
}
wcsession *WCC = WC;
if ( (StrLength(HdrLine) > 0) &&
- ((WC->room_flags & QR_NETWORK)
+ ((WC->CurRoom.QRFlags & QR_NETWORK)
|| ((strcasecmp(ChrPtr(HdrLine), ChrPtr(WCC->serv_info->serv_nodename))
&& (strcasecmp(ChrPtr(HdrLine), ChrPtr(WCC->serv_info->serv_fqdn))))))) {
FreeStrBuf(&Msg->OtherNode);
StrBufAppendBufPlain(Target, datebuf, -1, 0);
}
+void tmplput_MAIL_SUMM_EUID(StrBuf *Target, WCTemplputParams *TP)
+{
+ message_summary *Msg = (message_summary*) CTX;
+ StrBufAppendTemplate(Target, TP, Msg->euid, 0);
+}
+
void tmplput_MAIL_SUMM_DATE_FULL(StrBuf *Target, WCTemplputParams *TP)
{
char datebuf[64];
{
const StrBuf *TemplateMime;
- Mime->Data = NewStrBufPlain(NULL, Mime->length);
+ if (Mime->Data == NULL)
+ Mime->Data = NewStrBufPlain(NULL, Mime->length);
+ else
+ FlushStrBuf(Mime->Data);
read_message(Mime->Data, HKEY("view_submessage"), Mime->msgnum, Mime->PartNum, &TemplateMime);
/*
if ( (!IsEmptyStr(mime_submessages)) && (!section[0]) ) {
void render_MIME_VCard(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
wcsession *WCC = WC;
- MimeLoadData(Mime);
+ if (StrLength(Mime->Data) == 0)
+ MimeLoadData(Mime);
if (StrLength(Mime->Data) > 0) {
StrBuf *Buf;
Buf = NewStrBuf();
/** If it's my vCard I can edit it */
- if ( (!strcasecmp(ChrPtr(WCC->wc_roomname), USERCONFIGROOM))
- || (!strcasecmp(&(ChrPtr(WCC->wc_roomname)[11]), USERCONFIGROOM))
- || (WC->wc_view == VIEW_ADDRESSBOOK)
+ if ( (!strcasecmp(ChrPtr(WCC->CurRoom.name), USERCONFIGROOM))
+ || (!strcasecmp(&(ChrPtr(WCC->CurRoom.name)[11]), USERCONFIGROOM))
+ || (WC->CurRoom.view == VIEW_ADDRESSBOOK)
) {
- StrBufAppendPrintf(Buf, "<a href=\"edit_vcard?msgnum=%ld&partnum=%s\">",
+ StrBufAppendPrintf(Buf, "<a href=\"edit_vcard?msgnum=%ld?partnum=%s\">",
Mime->msgnum, ChrPtr(Mime->PartNum));
StrBufAppendPrintf(Buf, "[%s]</a>", _("edit"));
}
/* In all cases, display the full card */
- display_vcard(Buf, Mime->Data, 0, 1, NULL, Mime->msgnum);
+ display_vcard(Buf, Mime, 0, 1, NULL, -1);
FreeStrBuf(&Mime->Data);
Mime->Data = Buf;
}
void render_MIME_VNote(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
{
- MimeLoadData(Mime);
+ if (StrLength(Mime->Data) == 0)
+ MimeLoadData(Mime);
if (StrLength(Mime->Data) > 0) {
struct vnote *v;
StrBuf *Buf;
vnote_free(v);
Mime->Data = Buf;
}
- else
- Mime->Data = NewStrBuf();
+ else {
+ if (Mime->Data == NULL)
+ Mime->Data = NewStrBuf();
+ else
+ FlushStrBuf(Mime->Data);
+ }
}
-
}
void render_MIME_ICS(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset)
void examine_mime_part(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
+ const char *Ptr = NULL;
wc_mime_attachment *Mime;
StrBuf *Buf;
Buf = NewStrBuf();
Mime->Name = NewStrBuf();
- StrBufExtract_token(Buf, HdrLine, 0, '|');
+ StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
StrBuf_RFC822_to_Utf8(Mime->Name, Buf, WC->DefaultCharset, FoundCharset);
StrBufTrim(Mime->Name);
- StrBufExtract_token(Buf, HdrLine, 1, '|');
+ StrBufExtract_NextToken(Buf, HdrLine, &Ptr, '|');
Mime->FileName = NewStrBuf();
StrBuf_RFC822_to_Utf8(Mime->FileName, Buf, WC->DefaultCharset, FoundCharset);
StrBufTrim(Mime->FileName);
Mime->PartNum = NewStrBuf();
- StrBufExtract_token(Mime->PartNum, HdrLine, 2, '|');
+ StrBufExtract_NextToken(Mime->PartNum, HdrLine, &Ptr, '|');
StrBufTrim(Mime->PartNum);
if (strchr(ChrPtr(Mime->PartNum), '.') != NULL)
Mime->level = 2;
Mime->level = 1;
Mime->Disposition = NewStrBuf();
- StrBufExtract_token(Mime->Disposition, HdrLine, 3, '|');
+ StrBufExtract_NextToken(Mime->Disposition, HdrLine, &Ptr, '|');
Mime->ContentType = NewStrBuf();
- StrBufExtract_token(Mime->ContentType, HdrLine, 4, '|');
+ StrBufExtract_NextToken(Mime->ContentType, HdrLine, &Ptr, '|');
StrBufTrim(Mime->ContentType);
StrBufLowerCase(Mime->ContentType);
-
if (!strcmp(ChrPtr(Mime->ContentType), "application/octet-stream")) {
StrBufPlain(Mime->ContentType,
GuessMimeByFilename(SKEY(Mime->FileName)), -1);
}
- Mime->length = StrBufExtract_int(HdrLine, 5, '|');
+
+ Mime->length = StrBufExtractNext_int(HdrLine, &Ptr, '|');
+
+ StrBufSkip_NTokenS(HdrLine, &Ptr, '|', 1); /* cbid?? */
+
+ Mime->Charset = NewStrBuf();
+ StrBufExtract_NextToken(Mime->Charset, HdrLine, &Ptr, '|');
+
if ( (StrLength(Mime->FileName) == 0) && (StrLength(Mime->Name) > 0) ) {
StrBufAppendBuf(Mime->FileName, Mime->Name, 0);
void examine_text(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
{
- Msg->MsgBody->Data = NewStrBufPlain(NULL, SIZ);
+ if (Msg->MsgBody->Data == NULL)
+ Msg->MsgBody->Data = NewStrBufPlain(NULL, SIZ);
+ else
+ FlushStrBuf(Msg->MsgBody->Data);
}
void examine_msg4_partnum(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
FreeStrBuf(&Buf);
}
-void tmplput_EDIT_WIKI_BODY(StrBuf *Target, WCTemplputParams *TP) // FIXME
+void tmplput_EDIT_WIKI_BODY(StrBuf *Target, WCTemplputParams *TP)
{
const StrBuf *Mime;
long msgnum;
StrBuf *Buf;
- msgnum = locate_message_by_uid(BSTR("wikipage"));
- if (msgnum >= 0L) {
- Buf = NewStrBuf();
- read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime);
- StrBufAppendTemplate(Target, TP, Buf, 1);
- FreeStrBuf(&Buf);
+ /* Insert the existing content of the wiki page into the editor. But we only want
+ * to do this the first time -- if the user is uploading an attachment we don't want
+ * to do it again.
+ */
+ if (!havebstr("attach_button")) {
+ msgnum = locate_message_by_uid(BSTR("page"));
+ if (msgnum >= 0L) {
+ Buf = NewStrBuf();
+ read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime);
+ StrBufAppendTemplate(Target, TP, Buf, 1);
+ FreeStrBuf(&Buf);
+ }
}
}
/* HTML is fun, but we've got to strip it first */
output_html(ChrPtr(Mime->Charset),
- (WC->wc_view == VIEW_WIKI ? 1 : 0),
+ (WC->CurRoom.view == VIEW_WIKI ? 1 : 0),
Mime->msgnum,
Mime->Data, Buf);
FreeStrBuf(&Mime->Data);
wc_mime_attachment *mime = (wc_mime_attachment*) CTX;
wc_mime_attachment *att;
- if ( (!strcasecmp(ChrPtr(mime->Disposition), "inline"))||
- (!strcasecmp(ChrPtr(mime->Disposition), "attachment")) )
+ if (( (!strcasecmp(ChrPtr(mime->Disposition), "inline"))||
+ (!strcasecmp(ChrPtr(mime->Disposition), "attachment"))) &&
+ (strcasecmp(ChrPtr(mime->ContentType), "application/ms-tnef")!=0))
{
int n;
StrBufAppendPrintf(Target, "%ld", mime->length);
}
-/* startmsg is an index within the message list.
- * starting_from is the Citadel message number to be supplied to a "MSGS GT" operation
- */
-long DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg, int nMessages, long starting_from)
-{
- StrBuf *TmpBuf;
- wcsession *WCC = WC;
- void *vMsg;
- int lo, hi;
- long ret;
- long hklen;
- const char *key;
- int nItems;
- HashPos *At;
- long vector[16];
- WCTemplputParams SubTP;
- int wantmore = 1;
-
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_LONGVECTOR;
- SubTP.Context = &vector;
- TmpBuf = NewStrBufPlain(NULL, SIZ);
- At = GetNewHashPos(WCC->summ, nMessages);
- nItems = GetCount(WCC->summ);
- ret = nMessages;
- vector[0] = 7;
- vector[2] = 1;
- vector[1] = startmsg;
- vector[3] = 0;
- vector[7] = starting_from;
-
- while (wantmore)
- {
-
- vector[3] = abs(nMessages);
- lo = GetHashPosCounter(WCC->summ, At);
- wantmore = GetNextHashPos(WCC->summ, At, &hklen, &key, &vMsg);
- if (!wantmore)
- break;
- if (nMessages > 0) {
- if (lo + nMessages >= nItems) {
- hi = nItems - 1;
- vector[3] = nItems - lo;
- if (startmsg == lo)
- ret = vector[3];
- }
- else {
- hi = lo + nMessages - 1;
- }
- } else {
- if (lo + nMessages < -1) {
- hi = 0;
- }
- else {
- if ((lo % abs(nMessages)) != 0) {
- int offset = (lo % abs(nMessages) *
- (nMessages / abs(nMessages)));
- hi = lo + offset;
- vector[3] = abs(offset);
- if (startmsg == lo)
- ret = offset;
- }
- else
- hi = lo + nMessages;
- }
- }
-
- /*
- * Bump these because although we're thinking in zero base, the user
- * is a drooling idiot and is thinking in one base.
- */
- vector[4] = lo + 1;
- vector[5] = hi + 1;
- vector[6] = lo;
- FlushStrBuf(TmpBuf);
- dbg_print_longvector(vector);
- DoTemplate(HKEY("select_messageindex"), TmpBuf, &SubTP);
- StrBufAppendBuf(Selector, TmpBuf, 0);
- }
- vector[6] = 0;
- FlushStrBuf(TmpBuf);
- if (maxmsgs == 9999999) {
- vector[1] = 1;
- ret = maxmsgs;
- }
- else
- vector[1] = 0;
- vector[2] = 0;
- dbg_print_longvector(vector);
- DoTemplate(HKEY("select_messageindex_all"), TmpBuf, &SubTP);
- StrBufAppendBuf(Selector, TmpBuf, 0);
- FreeStrBuf(&TmpBuf);
- DeleteHashPos(&At);
- return ret;
-}
-
HashList *iterate_get_registered_Attachments(StrBuf *Target, WCTemplputParams *TP)
{
return WC->attachments;
snprintf(buf, bufsize, "MSGS GT|%s", bstr("gt"));
}
+void servcmd_readlt(char *buf, long bufsize)
+{
+ snprintf(buf, bufsize, "MSGS LT|%s", bstr("lt"));
+}
+
void servcmd_readnew(char *buf, long bufsize)
{
snprintf(buf, bufsize, "MSGS NEW");
}
+/* DO NOT REORDER OR REMOVE ANY OF THESE */
readloop_struct rlid[] = {
- { {HKEY("do_search")}, servcmd_do_search},
- { {HKEY("headers")}, servcmd_headers},
- { {HKEY("readfwd")}, servcmd_readfwd},
- { {HKEY("readnew")}, servcmd_readnew},
- { {HKEY("readold")}, servcmd_readold},
- { {HKEY("readgt")}, servcmd_readgt}
+ { {HKEY("do_search")}, servcmd_do_search },
+ { {HKEY("headers")}, servcmd_headers },
+ { {HKEY("readfwd")}, servcmd_readfwd },
+ { {HKEY("readnew")}, servcmd_readnew },
+ { {HKEY("readold")}, servcmd_readold },
+ { {HKEY("readgt")}, servcmd_readgt },
+ { {HKEY("readlt")}, servcmd_readlt }
};
+
+int ParseMessageListHeaders_Detail(StrBuf *Line,
+ const char **pos,
+ message_summary *Msg,
+ StrBuf *ConversionBuffer)
+{
+ wcsession *WCC = WC;
+
+ Msg->from = NewStrBufPlain(NULL, StrLength(Line));
+ StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+ if (StrLength(ConversionBuffer) != 0) {
+ /* Handle senders with RFC2047 encoding */
+ StrBuf_RFC822_to_Utf8(Msg->from, ConversionBuffer, WCC->DefaultCharset, NULL);
+ }
+
+ /* node name */
+ StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+ if ((StrLength(ConversionBuffer) !=0 ) &&
+ ( ((WCC->CurRoom.QRFlags & QR_NETWORK)
+ || ((strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_nodename))
+ && (strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_fqdn))))))))
+ {
+ StrBufAppendBufPlain(Msg->from, HKEY(" @ "), 0);
+ StrBufAppendBuf(Msg->from, ConversionBuffer, 0);
+ }
+
+ /* Internet address (not used)
+ * StrBufExtract_token(Msg->inetaddr, Line, 4, '|');
+ */
+ StrBufSkip_NTokenS(Line, pos, '|', 1);
+ Msg->subj = NewStrBufPlain(NULL, StrLength(Line));
+
+ FlushStrBuf(ConversionBuffer);
+ /* we assume the subject is the last parameter inside of the list;
+ * thus we don't use the tokenizer to fetch it, since it will hick up
+ * on tokenizer chars inside of the subjects
+ StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+ */
+ if (*pos != StrBufNOTNULL) {
+ StrBufPlain(ConversionBuffer, *pos,
+ StrLength(Line) - (*pos - ChrPtr(Line)));
+ *pos = StrBufNOTNULL;
+ if ((StrLength(ConversionBuffer) > 0) &&
+ (*(ChrPtr(ConversionBuffer) +
+ StrLength(ConversionBuffer) - 1) == '|'))
+ StrBufCutRight(ConversionBuffer, 1);
+ }
+
+ if (StrLength(ConversionBuffer) == 0)
+ StrBufAppendBufPlain(Msg->subj, _("(no subject)"), -1,0);
+ else {
+ StrBuf_RFC822_to_Utf8(Msg->subj, ConversionBuffer, WCC->DefaultCharset, NULL);
+ if ((StrLength(Msg->subj) > 75) &&
+ (StrBuf_Utf8StrLen(Msg->subj) > 75)) {
+ StrBuf_Utf8StrCut(Msg->subj, 72);
+ StrBufAppendBufPlain(Msg->subj, HKEY("..."), 0);
+ }
+ }
+
+ if ((StrLength(Msg->from) > 25) &&
+ (StrBuf_Utf8StrLen(Msg->from) > 25)) {
+ StrBuf_Utf8StrCut(Msg->from, 23);
+ StrBufAppendBufPlain(Msg->from, HKEY("..."), 0);
+ }
+ return 1;
+}
+
/* Spit out the new summary view. This is basically a static page, so clients can cache the layout, all the dirty work is javascript :) */
void new_summary_view(void) {
DoTemplate(HKEY("msg_listview"),NULL,&NoCtx);
-typedef struct _bbsview_stuct {
- StrBuf *BBViewToolBar;
- StrBuf *MessageDropdown;
- long *displayed_msgs;
- int a;
-}bbsview_struct;
-
-int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat,
- void **ViewSpecific,
- long oper,
- char *cmd,
- long len)
-{
- bbsview_struct *VS;
-
- VS = (bbsview_struct*) malloc(sizeof(bbsview_struct));
- memset(VS, 0, sizeof(bbsview_struct));
- *ViewSpecific = (void*)VS;
- Stat->defaultsortorder = 1;
- Stat->startmsg = -1;
- Stat->sortit = 1;
-
- rlid[oper].cmd(cmd, len);
-
- if (havebstr("maxmsgs"))
- Stat->maxmsgs = ibstr("maxmsgs");
- if (Stat->maxmsgs == 0) Stat->maxmsgs = DEFAULT_MAXMSGS;
-
- if (havebstr("startmsg")) {
- Stat->startmsg = lbstr("startmsg");
- }
- if (lbstr("SortOrder") == 2) {
- Stat->reverse = 1;
- Stat->num_displayed = -DEFAULT_MAXMSGS;
- }
- else {
- Stat->reverse = 0;
- Stat->num_displayed = DEFAULT_MAXMSGS;
- }
-
- return 200;
-}
-
-int bbsview_PrintViewHeader(SharedMessageStatus *Stat, void **ViewSpecific)
-{
- bbsview_struct *VS;
- WCTemplputParams SubTP;
-
- VS = (bbsview_struct*)*ViewSpecific;
-
- VS->BBViewToolBar = NewStrBufPlain(NULL, SIZ);
- VS->MessageDropdown = NewStrBufPlain(NULL, SIZ);
-
- /*** startmsg->maxmsgs = **/DrawMessageDropdown(VS->MessageDropdown,
- Stat->maxmsgs,
- Stat->startmsg,
- Stat->num_displayed,
- Stat->lowest_found-1);
- if (Stat->num_displayed < 0) {
- Stat->startmsg += Stat->maxmsgs;
- if (Stat->num_displayed != Stat->maxmsgs)
- Stat->maxmsgs = abs(Stat->maxmsgs) + 1;
- else
- Stat->maxmsgs = abs(Stat->maxmsgs);
-
- }
- if (Stat->nummsgs > 0) {
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_STRBUF;
- SubTP.Context = VS->MessageDropdown;
- DoTemplate(HKEY("msg_listselector_top"), VS->BBViewToolBar, &SubTP);
- StrBufAppendBuf(WC->WBuf, VS->BBViewToolBar, 0);
- FlushStrBuf(VS->BBViewToolBar);
- }
- return 200;
-}
-
-int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat,
- void **ViewSpecific,
- message_summary* Msg,
- int is_new,
- int i)
-{
- bbsview_struct *VS;
-
- VS = (bbsview_struct*)*ViewSpecific;
- if (VS->displayed_msgs == NULL) {
- VS->displayed_msgs = malloc(sizeof(long) *
- ((Stat->maxmsgs < Stat->nummsgs) ?
- Stat->maxmsgs + 1 :
- Stat->nummsgs + 1));
- }
- if ((i >= Stat->startmsg) && (i < Stat->startmsg + Stat->maxmsgs)) {
- VS->displayed_msgs[Stat->num_displayed] = Msg->msgnum;
- Stat->num_displayed++;
- }
- return 200;
-}
-
-
-int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat,
- void **ViewSpecific,
- long oper)
-{
- wcsession *WCC = WC;
- bbsview_struct *VS;
- WCTemplputParams SubTP;
- const StrBuf *Mime;
-
- VS = (bbsview_struct*)*ViewSpecific;
- if (Stat->nummsgs == 0) {
- wc_printf("<div class=\"nomsgs\"><br><em>");
- switch (oper) {
- case readnew:
- wc_printf(_("No new messages."));
- break;
- case readold:
- wc_printf(_("No old messages."));
- break;
- default:
- wc_printf(_("No messages here."));
- }
- wc_printf("</em><br></div>\n");
- }
- else
- {
- if (VS->displayed_msgs != NULL) {
- /* if we do a split bbview in the future, begin messages div here */
- int a;/// todo
- for (a=0; a < Stat->num_displayed; ++a) {
- read_message(WCC->WBuf, HKEY("view_message"), VS->displayed_msgs[a], NULL, &Mime);
- }
-
- /* if we do a split bbview in the future, end messages div here */
-
- free(VS->displayed_msgs);
- VS->displayed_msgs = NULL;
- }
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_STRBUF;
- SubTP.Context = VS->MessageDropdown;
- DoTemplate(HKEY("msg_listselector_bottom"), VS->BBViewToolBar, &SubTP);
- StrBufAppendBuf(WCC->WBuf, VS->BBViewToolBar, 0);
- }
- return 0;
-
-}
-
-
-int bbsview_Cleanup(void **ViewSpecific)
-{
- bbsview_struct *VS;
-
- VS = (bbsview_struct*)*ViewSpecific;
- end_burst();
- FreeStrBuf(&VS->BBViewToolBar);
- FreeStrBuf(&VS->MessageDropdown);
- free(VS);
- return 0;
-}
-
void
InitModule_MSGRENDERERS
(void)
VIEW_MAILBOX,
mailview_GetParamsGetServerCall,
NULL, /// TODO: is this right?
+ ParseMessageListHeaders_Detail,
NULL, //// ""
mailview_RenderView_or_Tail,
mailview_Cleanup);
- RegisterReadLoopHandlerset(
- VIEW_BBS,
- bbsview_GetParamsGetServerCall,
- bbsview_PrintViewHeader,
- bbsview_LoadMsgFromServer,
- bbsview_RenderView_or_Tail,
- bbsview_Cleanup);
-
RegisterSortFunc(HKEY("date"),
NULL, 0,
summcmp_date,
RegisterIterator("MAIL:SUMM:MSGS", 0, NULL, iterate_get_mailsumm_All,
NULL,NULL, CTX_MAILSUM, CTX_NONE, IT_NOFLAG);
+ RegisterNamespace("MAIL:SUMM:EUID", 0, 1, tmplput_MAIL_SUMM_EUID, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:DATEBRIEF", 0, 0, tmplput_MAIL_SUMM_DATE_BRIEF, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:DATEFULL", 0, 0, tmplput_MAIL_SUMM_DATE_FULL, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:DATENO", 0, 0, tmplput_MAIL_SUMM_DATE_NO, NULL, CTX_MAILSUM);