#include "webcit.h"
#include "webserver.h"
-#include "groupdav.h"
+#include "dav.h"
FreeStrBuf(&Msg->Rfca);
FreeStrBuf(&Msg->OtherNode);
- FreeStrBuf(&Msg->reply_to);
-
- DeleteHash(&Msg->Attachments); /**< list of Accachments */
+ DeleteHash(&Msg->Attachments); /* list of Attachments */
DeleteHash(&Msg->Submessages);
DeleteHash(&Msg->AttachLinks);
DeleteHash(&Msg->AllAttach);
Hdr = (headereval*)vHdr;
Hdr->evaluator(Msg, Value, FoundCharset);
}
- else lprintf(1, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token));
+ else syslog(1, "don't know how to handle content type sub-header[%s]\n", ChrPtr(Token));
}
FreeStrBuf(&Token);
FreeStrBuf(&Value);
}
+void tmplput_MAIL_SUMM_PERMALINK(StrBuf *Target, WCTemplputParams *TP)
+{
+ message_summary *Msg = (message_summary*) CTX;
+ char perma_link[1024];
+
+ strcpy(perma_link, "/readfwd?go=");
+ urlesc(&perma_link[12], sizeof(perma_link) - 12, (char *)ChrPtr(WC->CurRoom.name) );
+ sprintf(&perma_link[strlen(perma_link)], "?start_reading_at=%ld#%ld", Msg->msgnum, Msg->msgnum);
+ StrBufAppendPrintf(Target, "%s", perma_link);
+}
+
int Conditional_MAIL_MIME_ALL(StrBuf *Target, WCTemplputParams *TP)
{
* to do it again.
*/
if (!havebstr("attach_button")) {
- msgnum = locate_message_by_uid(BSTR("page"));
+ char *wikipage = strdup(bstr("page"));
+ str_wiki_index(wikipage);
+ msgnum = locate_message_by_uid(wikipage);
+ free(wikipage);
if (msgnum >= 0L) {
Buf = NewStrBuf();
read_message(Buf, HKEY("view_message_wikiedit"), msgnum, NULL, &Mime);
StrBuf *Line1;
StrBuf *Line2;
StrBuf *Target;
-
+ long Linecount;
+ long nEmptyLines;
int bn = 0;
int bq = 0;
int i;
else {
ctdl_iconv_open("UTF-8", ChrPtr(cs), &ic);
if (ic == (iconv_t)(-1) ) {
- lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
+ syslog(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
__FILE__, __LINE__, ChrPtr(Mime->Charset), strerror(errno));
}
}
Line1 = NewStrBufPlain(NULL, SIZ);
Line2 = NewStrBufPlain(NULL, SIZ);
Target = NewStrBufPlain(NULL, StrLength(Mime->Data));
-
+ Linecount = 0;
+ nEmptyLines = 0;
if (StrLength(Mime->Data) > 0)
do
{
if (i > 0) StrBufCutLeft(Line, i);
if (StrLength(Line) == 0) {
- StrBufAppendBufPlain(Target, HKEY("<tt></tt><br />\n"), 0);
+ if (Linecount == 0)
+ continue;
+ StrBufAppendBufPlain(Target, HKEY("<tt></tt><br>\n"), 0);
+
+ nEmptyLines ++;
continue;
}
-
+ nEmptyLines = 0;
for (i = bn; i < bq; i++)
StrBufAppendBufPlain(Target, HKEY("<blockquote>"), 0);
for (i = bq; i < bn; i++)
UrlizeText(Line1, Line, Line2);
StrEscAppend(Target, Line1, NULL, 0, 0);
- StrBufAppendBufPlain(Target, HKEY("</tt><br />\n"), 0);
+ StrBufAppendBufPlain(Target, HKEY("</tt><br>\n"), 0);
bn = bq;
+ Linecount ++;
}
while ((BufPtr != StrBufNOTNULL) &&
(BufPtr != NULL));
+ if (nEmptyLines > 0)
+ StrBufCutRight(Target, nEmptyLines * (sizeof ("<tt></tt><br>\n") - 1));
for (i = 0; i < bn; i++)
StrBufAppendBufPlain(Target, HKEY("</blockquote>"), 0);
- StrBufAppendBufPlain(Target, HKEY("</i><br />"), 0);
+ StrBufAppendBufPlain(Target, HKEY("</i><br>"), 0);
#ifdef HAVE_ICONV
if (ic != (iconv_t)(-1) ) {
iconv_close(ic);
FlushStrBuf(Mime->Data);
StrBufAppendBufPlain(Mime->Data, _("I don't know how to display "), -1, 0);
StrBufAppendBuf(Mime->Data, Mime->ContentType, 0);
- StrBufAppendBufPlain(Mime->Data, HKEY("<br />\n"), 0);
+ StrBufAppendBufPlain(Mime->Data, HKEY("<br>\n"), 0);
}
return WC->attachments;
}
+void get_registered_Attachments_Count(StrBuf *Target, WCTemplputParams *TP)
+{
+ StrBufAppendPrintf(Target, "%ld", GetCount (WC->attachments));
+}
+
void servcmd_do_search(char *buf, long bufsize)
{
snprintf(buf, bufsize, "MSGS SEARCH|%s", bstr("query"));
StrBuf *ConversionBuffer)
{
wcsession *WCC = WC;
+ long len;
+ long totallen;
CheckConvertBufs(WCC);
- Msg->from = NewStrBufPlain(NULL, StrLength(Line));
- StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
- if (StrLength(ConversionBuffer) != 0) {
+ totallen = StrLength(Line);
+ Msg->from = NewStrBufPlain(NULL, totallen);
+ len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+ if (len > 0) {
/* Handle senders with RFC2047 encoding */
StrBuf_RFC822_2_Utf8(Msg->from,
ConversionBuffer,
}
/* node name */
- StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
- if ((StrLength(ConversionBuffer) !=0 ) &&
- ( ((WCC->CurRoom.QRFlags & QR_NETWORK)
+ len = StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
+ if ((len > 0 ) &&
+ ( ((WCC->CurRoom.QRFlags & QR_NETWORK)
|| ((strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_nodename))
&& (strcasecmp(ChrPtr(ConversionBuffer), ChrPtr(WCC->serv_info->serv_fqdn))))))))
{
* StrBufExtract_token(Msg->inetaddr, Line, 4, '|');
*/
StrBufSkip_NTokenS(Line, pos, '|', 1);
- Msg->subj = NewStrBufPlain(NULL, StrLength(Line));
+ Msg->subj = NewStrBufPlain(NULL, totallen);
FlushStrBuf(ConversionBuffer);
/* we assume the subject is the last parameter inside of the list;
* on tokenizer chars inside of the subjects
StrBufExtract_NextToken(ConversionBuffer, Line, pos, '|');
*/
+ len = 0;
if (*pos != StrBufNOTNULL) {
- StrBufPlain(ConversionBuffer, *pos,
- StrLength(Line) - (*pos - ChrPtr(Line)));
+ len = totallen - (*pos - ChrPtr(Line));
+ StrBufPlain(ConversionBuffer, *pos, len);
*pos = StrBufNOTNULL;
- if ((StrLength(ConversionBuffer) > 0) &&
- (*(ChrPtr(ConversionBuffer) +
- StrLength(ConversionBuffer) - 1) == '|'))
+ if ((len > 0) &&
+ (*(ChrPtr(ConversionBuffer) + len - 1) == '|'))
StrBufCutRight(ConversionBuffer, 1);
}
- if (StrLength(ConversionBuffer) == 0)
+ if (len == 0)
StrBufAppendBufPlain(Msg->subj, _("(no subject)"), -1,0);
else {
StrBuf_RFC822_2_Utf8(Msg->subj,
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);
-}
-
int mailview_GetParamsGetServerCall(SharedMessageStatus *Stat,
void **ViewSpecific,
long oper,
char *cmd,
- long len)
-{
- if (!WC->is_ajax) {
- new_summary_view();
- return 200;
- } else {
- Stat->defaultsortorder = 2;
- Stat->sortit = 1;
- Stat->load_seen = 1;
- /* Generally using maxmsgs|startmsg is not required
- in mailbox view, but we have a 'safemode' for clients
- (*cough* Exploder) that simply can't handle too many */
- if (havebstr("maxmsgs")) Stat->maxmsgs = ibstr("maxmsgs");
- else Stat->maxmsgs = 9999999;
- if (havebstr("startmsg")) Stat->startmsg = lbstr("startmsg");
- snprintf(cmd, len, "MSGS %s|%s||1",
- (oper == do_search) ? "SEARCH" : "ALL",
- (oper == do_search) ? bstr("query") : ""
- );
- }
+ long len,
+ char *filter,
+ long flen)
+{
+ DoTemplate(HKEY("msg_listview"),NULL,&NoCtx);
+
return 200;
}
-int mailview_RenderView_or_Tail(SharedMessageStatus *Stat,
+int mailview_Cleanup(void **ViewSpecific)
+{
+ /* Note: wDumpContent() will output one additional </div> tag. */
+ /* We ought to move this out into template */
+ wDumpContent(1);
+
+ return 0;
+}
+
+
+int json_GetParamsGetServerCall(SharedMessageStatus *Stat,
void **ViewSpecific,
- long oper)
+ long oper,
+ char *cmd,
+ long len,
+ char *filter,
+ long flen)
+{
+ Stat->defaultsortorder = 2;
+ Stat->sortit = 1;
+ Stat->load_seen = 1;
+ /* Generally using maxmsgs|startmsg is not required
+ in mailbox view, but we have a 'safemode' for clients
+ (*cough* Exploder) that simply can't handle too many */
+ if (havebstr("maxmsgs")) Stat->maxmsgs = ibstr("maxmsgs");
+ else Stat->maxmsgs = 9999999;
+ if (havebstr("startmsg")) Stat->startmsg = lbstr("startmsg");
+ snprintf(cmd, len, "MSGS %s|%s||1",
+ (oper == do_search) ? "SEARCH" : "ALL",
+ (oper == do_search) ? bstr("query") : ""
+ );
+
+ return 200;
+}
+int json_MessageListHdr(SharedMessageStatus *Stat, void **ViewSpecific)
+{
+ /* TODO: make a generic function */
+ hprintf("HTTP/1.1 200 OK\r\n");
+ hprintf("Content-type: application/json; charset=utf-8\r\n");
+ hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
+ hprintf("Connection: close\r\n");
+ hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
+ begin_burst();
+ return 0;
+}
+
+int json_RenderView_or_Tail(SharedMessageStatus *Stat,
+ void **ViewSpecific,
+ long oper)
{
WCTemplputParams SubTP;
- if (WC->is_ajax)
- DoTemplate(HKEY("mailsummary_json"),NULL, &SubTP);
+ memset(&SubTP, 0, sizeof(WCTemplputParams));
+ DoTemplate(HKEY("mailsummary_json"),NULL, &SubTP);
return 0;
}
-int mailview_Cleanup(void **ViewSpecific)
+int json_Cleanup(void **ViewSpecific)
{
/* Note: wDumpContent() will output one additional </div> tag. */
/* We ought to move this out into template */
- if (WC->is_ajax)
- end_burst();
- else
- wDumpContent(1);
+ end_burst();
return 0;
}
RegisterReadLoopHandlerset(
VIEW_MAILBOX,
mailview_GetParamsGetServerCall,
- NULL, /// TODO: is this right?
+ NULL, /* TODO: is this right? */
+ NULL,
ParseMessageListHeaders_Detail,
- NULL, //// ""
- mailview_RenderView_or_Tail,
+ NULL,
+ NULL,
mailview_Cleanup);
+ RegisterReadLoopHandlerset(
+ VIEW_JSON_LIST,
+ json_GetParamsGetServerCall,
+ json_MessageListHdr,
+ NULL, /* TODO: is this right? */
+ ParseMessageListHeaders_Detail,
+ NULL,
+ json_RenderView_or_Tail,
+ json_Cleanup);
+
RegisterSortFunc(HKEY("date"),
NULL, 0,
summcmp_date,
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);
RegisterNamespace("MAIL:SUMM:N", 0, 0, tmplput_MAIL_SUMM_N, NULL, CTX_MAILSUM);
+ RegisterNamespace("MAIL:SUMM:PERMALINK", 0, 0, tmplput_MAIL_SUMM_PERMALINK, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:FROM", 0, 2, tmplput_MAIL_SUMM_FROM, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:TO", 0, 2, tmplput_MAIL_SUMM_TO, NULL, CTX_MAILSUM);
RegisterNamespace("MAIL:SUMM:SUBJECT", 0, 4, tmplput_MAIL_SUMM_SUBJECT, NULL, CTX_MAILSUM);
RegisterIterator("MSG:ATTACHNAMES", 0, NULL, iterate_get_registered_Attachments,
NULL, NULL, CTX_MIME_ATACH, CTX_NONE, IT_NOFLAG);
+ RegisterNamespace("MSG:NATTACH", 0, 0, get_registered_Attachments_Count, NULL, CTX_NONE);
+
/* mime renderers translate an attachment into webcit viewable html text */
RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 0, 150);
RegisterMimeRenderer(HKEY("text/vnote"), render_MIME_VNote, 1, 300);
RegisterMimeRenderer(HKEY("text"), render_MAIL_text_plain, 1, 1);
RegisterMimeRenderer(HKEY("text/html"), render_MAIL_html, 1, 100);
RegisterMimeRenderer(HKEY(""), render_MAIL_UNKNOWN, 0, 0);
- /* and finalize the anouncement to the server... */
- CreateMimeStr();
/* these headers are citserver replies to MSG4 and friends. one evaluator for each */
RegisterMsgHdr(HKEY("nhdr"), examine_nhdr, 0);
RegisterMsgHdr(HKEY("path"), examine_path, 0);
}
+void
+InitModule2_MSGRENDERERS
+(void)
+{
+ /* and finalize the anouncement to the server... */
+ CreateMimeStr();
+}
void
ServerStartModule_MSGRENDERERS
(void)