X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmessages.c;h=cd10b6a74091279cb7f603d78e7ad9b4f601b2ae;hb=63cbcbf7992bdf6e0b0eb04db4b92476a609d543;hp=fd9c6e8b075de8f5ad5cd96aeace44e3eb173310;hpb=f53035ceb017c0f02a978077bc1607e73a25068f;p=citadel.git diff --git a/webcit/messages.c b/webcit/messages.c index fd9c6e8b0..cd10b6a74 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -12,28 +12,22 @@ HashList *MsgHeaderHandler = NULL; HashList *MsgEvaluators = NULL; HashList *MimeRenderHandler = NULL; +HashList *ReadLoopHandler = NULL; int dbg_analyze_msg = 0; -#define SUBJ_COL_WIDTH_PCT 50 /**< Mailbox view column width */ -#define SENDER_COL_WIDTH_PCT 30 /**< Mailbox view column width */ -#define DATE_PLUS_BUTTONS_WIDTH_PCT 20 /**< Mailbox view column width */ +#define SUBJ_COL_WIDTH_PCT 50 /* Mailbox view column width */ +#define SENDER_COL_WIDTH_PCT 30 /* Mailbox view column width */ +#define DATE_PLUS_BUTTONS_WIDTH_PCT 20 /* Mailbox view column width */ void jsonMessageListHdr(void); void display_enter(void); -/*----------------------------------------------------------------------------*/ - - typedef void (*MsgPartEvaluatorFunc)(message_summary *Sum, StrBuf *Buf); typedef struct _MsgPartEvaluatorStruct { MsgPartEvaluatorFunc f; -}MsgPartEvaluatorStruct; - - -/*----------------------------------------------------------------------------*/ - +} MsgPartEvaluatorStruct; int load_message(message_summary *Msg, StrBuf *FoundCharset, @@ -49,11 +43,13 @@ int load_message(message_summary *Msg, int state=0; Buf = NewStrBuf(); - lprintf(1, "-------------------MSG4 %ld|%s--------------\n", Msg->msgnum, ChrPtr(Msg->PartNum)); - if (Msg->PartNum != NULL) + lprintf(9, "MSG4 %ld|%s\n", Msg->msgnum, ChrPtr(Msg->PartNum)); + if (Msg->PartNum != NULL) { serv_printf("MSG4 %ld|%s", Msg->msgnum, ChrPtr(Msg->PartNum)); - else + } + else { serv_printf("MSG4 %ld", Msg->msgnum); + } StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, NULL) != 1) { @@ -65,9 +61,9 @@ int load_message(message_summary *Msg, return 0; } - /** begin everythingamundo table */ + /* begin everythingamundo table */ HdrToken = NewStrBuf(); - while ((StrBuf_ServGetln(Buf)>=0) && !Done) { + while (!Done && StrBuf_ServGetln(Buf)>=0) { if ( (StrLength(Buf)==3) && !strcmp(ChrPtr(Buf), "000")) { @@ -206,7 +202,7 @@ int load_message(message_summary *Msg, * printable_view Nonzero to display a printable view * section Optional for encapsulated message/rfc822 submessage */ -int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, const StrBuf *PartNum) +int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, const StrBuf *PartNum, const StrBuf **OutMime) { StrBuf *Buf; StrBuf *FoundCharset; @@ -234,10 +230,12 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co FreeStrBuf(&Error); } - /* strip the bare contenttype, so we ommit charset etc. */ + /* Extract just the content-type (omit attributes such as "charset") */ StrBufExtract_token(Buf, Msg->MsgBody->ContentType, 0, ';'); StrBufTrim(Buf); - /* look up the renderer, that will convert this mimeitem into the htmlized form */ + StrBufLowerCase(Buf); + + /* Locate a renderer capable of converting this MIME part into HTML */ if (GetHash(MimeRenderHandler, SKEY(Buf), &vHdr) && (vHdr != NULL)) { RenderMimeFuncStruct *Render; @@ -267,7 +265,7 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co memset(&SubTP, 0, sizeof(WCTemplputParams)); SubTP.Filter.ContextType = CTX_MAILSUM; SubTP.Context = Msg; - DoTemplate(tmpl, tmpllen, Target, &SubTP); + *OutMime = DoTemplate(tmpl, tmpllen, Target, &SubTP); DestroyMessageSummary(Msg); FreeStrBuf(&FoundCharset); @@ -276,38 +274,199 @@ int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, co } +void +HttpStatus(long CitadelStatus) +{ + long httpstatus = 502; + + switch (MAJORCODE(CitadelStatus)) + { + case LISTING_FOLLOWS: + case CIT_OK: + httpstatus = 201; + break; + case ERROR: + switch (MINORCODE(CitadelStatus)) + { + case INTERNAL_ERROR: + httpstatus = 403; + break; + + case TOO_BIG: + case ILLEGAL_VALUE: + case HIGHER_ACCESS_REQUIRED: + case MAX_SESSIONS_EXCEEDED: + case RESOURCE_BUSY: + case RESOURCE_NOT_OPEN: + case NOT_HERE: + case INVALID_FLOOR_OPERATION: + case FILE_NOT_FOUND: + case ROOM_NOT_FOUND: + httpstatus = 409; + break; + case MESSAGE_NOT_FOUND: + case ALREADY_EXISTS: + httpstatus = 403; + break; + case NO_SUCH_SYSTEM: + httpstatus = 502; + break; + + default: + case CMD_NOT_SUPPORTED: + case PASSWORD_REQUIRED: + case ALREADY_LOGGED_IN: + case USERNAME_REQUIRED: + case NOT_LOGGED_IN: + case SERVER_SHUTTING_DOWN: + case NO_SUCH_USER: + case ASYNC_GEXP: + httpstatus = 502; + break; + } + break; + + default: + case BINARY_FOLLOWS: + case SEND_BINARY: + case START_CHAT_MODE: + case ASYNC_MSG: + case MORE_DATA: + case SEND_LISTING: + httpstatus = 502; /* aeh... whut? */ + break; + } + + +} + +/* + * Unadorned HTML output of an individual message, suitable + * for placing in a hidden iframe, for printing, or whatever + */ +void handle_one_message(void) +{ + long CitStatus; + int CopyMessage = 0; + const StrBuf *Destination; + void *vLine; + const StrBuf *Mime; + long msgnum = 0L; + wcsession *WCC = WC; + const StrBuf *Tmpl; + StrBuf *CmdBuf = NULL; + const char *pMsg; + + + pMsg = strchr(ChrPtr(WCC->Hdr->HR.ReqLine), '/'); + if (pMsg == NULL) { + HttpStatus(CitStatus); + return; + } + + msgnum = atol(pMsg + 1); + StrBufCutAt(WCC->Hdr->HR.ReqLine, 0, pMsg); + gotoroom(WCC->Hdr->HR.ReqLine); + switch (WCC->Hdr->HR.eReqType) + { + case eGET: + case ePOST: + Tmpl = sbstr("template"); + if (StrLength(Tmpl) > 0) + read_message(WCC->WBuf, SKEY(Tmpl), msgnum, NULL, &Mime); + else + read_message(WCC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime); + http_transmit_thing(ChrPtr(Mime), 0); + break; + case eDELETE: + CmdBuf = NewStrBuf (); + if (WCC->wc_is_trash) { /* Delete from Trash is a real delete */ + serv_printf("DELE %ld", msgnum); + } + else { /* Otherwise move it to Trash */ + serv_printf("MOVE %ld|_TRASH_|0", msgnum); + } + StrBuf_ServGetln(CmdBuf); + FlushStrBuf(WCC->ImportantMsg); + StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4); + GetServerStatus(CmdBuf, &CitStatus); + HttpStatus(CitStatus); + break; + case eCOPY: + CopyMessage = 1; + case eMOVE: + if (GetHash(WCC->Hdr->HTTPHeaders, HKEY("DESTINATION"), &vLine) && + (vLine!=NULL)) { + Destination = (StrBuf*) vLine; + serv_printf("MOVE %ld|%s|%d", msgnum, ChrPtr(Destination), CopyMessage); + StrBuf_ServGetln(CmdBuf); + FlushStrBuf(WCC->ImportantMsg); + StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4); + GetServerStatus(CmdBuf, &CitStatus); + HttpStatus(CitStatus); + } + else + HttpStatus(500); + break; + default: + break; + + } +} /* * Unadorned HTML output of an individual message, suitable * for placing in a hidden iframe, for printing, or whatever - * - * msgnum_as_string == Message number, as a string instead of as a long int */ void embed_message(void) { + const StrBuf *Mime; long msgnum = 0L; wcsession *WCC = WC; - const StrBuf *Tmpl = sbstr("template"); + const StrBuf *Tmpl; + StrBuf *CmdBuf = NULL; - msgnum = StrTol(WCC->UrlFragment2); - if (StrLength(Tmpl) > 0) - read_message(WCC->WBuf, SKEY(Tmpl), msgnum, NULL); - else - read_message(WCC->WBuf, HKEY("view_message"), msgnum, NULL); + msgnum = StrBufExtract_long(WCC->Hdr->HR.ReqLine, 0, '/'); + switch (WCC->Hdr->HR.eReqType) + { + case eGET: + case ePOST: + Tmpl = sbstr("template"); + if (StrLength(Tmpl) > 0) + read_message(WCC->WBuf, SKEY(Tmpl), msgnum, NULL, &Mime); + else + read_message(WCC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime); + http_transmit_thing(ChrPtr(Mime), 0); + break; + case eDELETE: + CmdBuf = NewStrBuf (); + if (WCC->wc_is_trash) { /* Delete from Trash is a real delete */ + serv_printf("DELE %ld", msgnum); + } + else { /* Otherwise move it to Trash */ + serv_printf("MOVE %ld|_TRASH_|0", msgnum); + } + StrBuf_ServGetln(CmdBuf); + FlushStrBuf(WCC->ImportantMsg); + StrBufAppendBuf(WCC->ImportantMsg, CmdBuf, 4); + break; + default: + break; + + } } /* * Printable view of a message - * - * msgnum_as_string == Message number, as a string instead of as a long int */ void print_message(void) { long msgnum = 0L; + const StrBuf *Mime; - msgnum = StrTol(WC->UrlFragment2); + msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/'); output_headers(0, 0, 0, 0, 0, 0); hprintf("Content-type: text/html\r\n" @@ -316,36 +475,35 @@ void print_message(void) { begin_burst(); - read_message(WC->WBuf, HKEY("view_message_print"), msgnum, NULL); + read_message(WC->WBuf, HKEY("view_message_print"), msgnum, NULL, &Mime); wDumpContent(0); } /* * Mobile browser view of message - * - * @param msg_num_as_string Message number as a string instead of as a long int */ -void mobile_message_view(void) { - long msgnum = 0L; - msgnum = StrTol(WC->UrlFragment2); - output_headers(1, 0, 0, 0, 0, 1); - begin_burst(); - do_template("msgcontrols", NULL); - read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL); - wDumpContent(0); +void mobile_message_view(void) +{ + long msgnum = 0L; + const StrBuf *Mime; + + msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/'); + output_headers(1, 0, 0, 0, 0, 1); + begin_burst(); + do_template("msgcontrols", NULL); + read_message(WC->WBuf, HKEY("view_message"), msgnum, NULL, &Mime); + wDumpContent(0); } -/** - * \brief Display a message's headers - * - * \param msgnum_as_string Message number, as a string instead of as a long int +/* + * Display a message's headers */ void display_headers(void) { long msgnum = 0L; char buf[1024]; - msgnum = StrTol(WC->UrlFragment2); + msgnum = StrBufExtract_long(WC->Hdr->HR.ReqLine, 0, '/'); output_headers(0, 0, 0, 0, 0, 0); hprintf("Content-type: text/plain\r\n" @@ -358,7 +516,7 @@ void display_headers(void) { serv_getln(buf, sizeof buf); if (buf[0] == '1') { while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - wprintf("%s\n", buf); + wc_printf("%s\n", buf); } } @@ -413,40 +571,37 @@ message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSu * load message pointers from the server for a "read messages" operation * * servcmd: the citadel command to send to the citserver - * with_headers: also include some of the headers with the message numbers (more expensive) */ -int load_msg_ptrs(const char *servcmd, int with_headers) +int load_msg_ptrs(const char *servcmd, SharedMessageStatus *Stat) { StrBuf* FoundCharset = NULL; wcsession *WCC = WC; message_summary *Msg; StrBuf *Buf, *Buf2; - int nummsgs = 0; - int maxload = 0; long len; int n; int skipit; const char *Ptr = NULL; + Stat->lowest_found = LONG_MAX; + Stat->highest_found = LONG_MIN; + if (WCC->summ != NULL) { DeleteHash(&WCC->summ); } WCC->summ = NewHash(1, Flathash); - maxload = 10000; Buf = NewStrBuf(); serv_puts(servcmd); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, NULL) != 1) { FreeStrBuf(&Buf); - return (nummsgs); + return (Stat->nummsgs); } Buf2 = NewStrBuf(); - while (len = StrBuf_ServGetln(Buf), - ((len != 3) || - strcmp(ChrPtr(Buf), "000")!= 0)) + while (len = StrBuf_ServGetln(Buf), ((len != 3) || strcmp(ChrPtr(Buf), "000")!= 0)) { - if (nummsgs < maxload) { + if (Stat->nummsgs < Stat->maxload) { skipit = 0; Ptr = NULL; Msg = (message_summary*)malloc(sizeof(message_summary)); @@ -454,12 +609,27 @@ int load_msg_ptrs(const char *servcmd, int with_headers) Msg->msgnum = StrBufExtractNext_long(Buf, &Ptr, '|'); Msg->date = StrBufExtractNext_long(Buf, &Ptr, '|'); + + if (Stat->nummsgs == 0) { + if (Msg->msgnum < Stat->lowest_found) { + Stat->lowest_found = Msg->msgnum; + } + if (Msg->msgnum > Stat->highest_found) { + Stat->highest_found = Msg->msgnum; + } + } + + if ((Msg->msgnum == 0) && (StrLength(Buf) < 32)) { + free(Msg); + continue; + } + /* * as citserver probably gives us messages in forward date sorting * nummsgs should be the same order as the message date. */ if (Msg->date == 0) { - Msg->date = nummsgs; + Msg->date = Stat->nummsgs; if (StrLength(Buf) < 32) skipit = 1; } @@ -467,11 +637,11 @@ int load_msg_ptrs(const char *servcmd, int with_headers) Msg->from = NewStrBufPlain(NULL, StrLength(Buf)); StrBufExtract_NextToken(Buf2, Buf, &Ptr, '|'); if (StrLength(Buf2) != 0) { - /** Handle senders with RFC2047 encoding */ + /* Handle senders with RFC2047 encoding */ StrBuf_RFC822_to_Utf8(Msg->from, Buf2, WCC->DefaultCharset, FoundCharset); } - /** Nodename */ + /* node name */ StrBufExtract_NextToken(Buf2, Buf, &Ptr, '|'); if ((StrLength(Buf2) !=0 ) && ( ((WCC->room_flags & QR_NETWORK) @@ -482,9 +652,9 @@ int load_msg_ptrs(const char *servcmd, int with_headers) StrBufAppendBuf(Msg->from, Buf2, 0); } - /** Not used: - StrBufExtract_token(Msg->inetaddr, Buf, 4, '|'); - */ + /* Internet address (not used) + * StrBufExtract_token(Msg->inetaddr, Buf, 4, '|'); + */ StrBufSkip_NTokenS(Buf, &Ptr, '|', 1); Msg->subj = NewStrBufPlain(NULL, StrLength(Buf)); StrBufExtract_NextToken(Buf2, Buf, &Ptr, '|'); @@ -499,7 +669,6 @@ int load_msg_ptrs(const char *servcmd, int with_headers) } } - if ((StrLength(Msg->from) > 25) && (StrBuf_Utf8StrLen(Msg->from) > 25)) { StrBuf_Utf8StrCut(Msg->from, 23); @@ -509,11 +678,11 @@ int load_msg_ptrs(const char *servcmd, int with_headers) n = Msg->msgnum; Put(WCC->summ, (const char *)&n, sizeof(n), Msg, DestroyMessageSummary); } - nummsgs++; + Stat->nummsgs++; } FreeStrBuf(&Buf2); FreeStrBuf(&Buf); - return (nummsgs); + return (Stat->nummsgs); } @@ -530,93 +699,6 @@ inline message_summary* GetMessagePtrAt(int n, HashList *Summ) } -long DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg, int nMessages) -{ - StrBuf *TmpBuf; - wcsession *WCC = WC; - void *vMsg; - int lo, hi; - long ret; - long hklen; - const char *key; - int done = 0; - int nItems; - HashPos *At; - long vector[16]; - WCTemplputParams SubTP; - - memset(&SubTP, 0, sizeof(WCTemplputParams)); - SubTP.Filter.ContextType = CTX_LONGVECTOR; - SubTP.Context = &vector; - TmpBuf = NewStrBuf(); - At = GetNewHashPos(WCC->summ, nMessages); - nItems = GetCount(WCC->summ); - ret = nMessages; - vector[0] = 7; - vector[2] = 1; - vector[1] = startmsg; - vector[3] = 0; - - while (!done) { - vector[3] = abs(nMessages); - lo = GetHashPosCounter(At); - 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; - } - } - done = !GetNextHashPos(WCC->summ, At, &hklen, &key, &vMsg); - - /** - * 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; -} void load_seen_flags(void) { @@ -640,7 +722,7 @@ void load_seen_flags(void) } at = GetNewHashPos(WCC->summ, 0); while (GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) { - /** Are you a new message, or an old message? */ + /* Are you a new message, or an old message? */ Msg = (message_summary*) vMsg; if (is_msg_in_mset(ChrPtr(OldMsg), Msg->msgnum)) { Msg->is_new = 0; @@ -655,334 +737,155 @@ void load_seen_flags(void) extern readloop_struct rlid[]; +typedef struct _RoomRenderer{ + int RoomType; + + GetParamsGetServerCall_func GetParamsGetServerCall; + PrintViewHeader_func PrintViewHeader; + LoadMsgFromServer_func LoadMsgFromServer; + RenderView_or_Tail_func RenderView_or_Tail; + View_Cleanup_func ViewCleanup; +} RoomRenderer; + + /* * command loop for reading messages * - * Set oper to "readnew" or "readold" or "readfwd" or "headers" + * Set oper to "readnew" or "readold" or "readfwd" or "headers" or "readgt" or "do_search" */ void readloop(long oper) { - StrBuf *MessageDropdown = NULL; - StrBuf *BBViewToolBar = NULL; + RoomRenderer *ViewMsg; + void *vViewMsg; void *vMsg; message_summary *Msg; char cmd[256] = ""; - char buf[SIZ]; - int a = 0; - int with_headers = 0; - int nummsgs; - long startmsg = 0; - int maxmsgs = 0; - long *displayed_msgs = NULL; - int num_displayed = 0; - int is_singlecard = 0; - struct calview calv; - int i; - int lowest_displayed = (-1); - int highest_displayed = 0; - addrbookent *addrbook = NULL; - int num_ab = 0; - int bbs_reverse = 0; + int i, r; wcsession *WCC = WC; HashPos *at; const char *HashKey; long HKLen; - int care_for_empty_list = 0; - int load_seen = 0; - int sortit = 0; - int defaultsortorder = 0; WCTemplputParams SubTP; - char *ab_name; + SharedMessageStatus Stat; + void *ViewSpecific; - if (havebstr("is_summary") && (1 == (ibstr("is_summary")))) + if (havebstr("is_summary") && (1 == (ibstr("is_summary")))) { WCC->wc_view = VIEW_MAILBOX; - - if (!WCC->is_ajax) { - output_headers(1, 1, 1, 0, 0, 0); - } else if (WCC->wc_view == VIEW_MAILBOX) { - jsonMessageListHdr(); } - switch (WCC->wc_view) { - case VIEW_WIKI: - sprintf(buf, "wiki?room=%s&page=home", ChrPtr(WCC->wc_roomname)); - http_redirect(buf); + if ((oper == do_search) && (WCC->wc_view == VIEW_WIKI)) { + display_wiki_pagelist(); return; - case VIEW_CALBRIEF: - case VIEW_CALENDAR: - load_seen = 1; - strcpy(cmd, "MSGS ALL"); - maxmsgs = 32767; - parse_calendar_view_request(&calv); - break; - case VIEW_TASKS: - strcpy(cmd, "MSGS ALL"); - maxmsgs = 32767; - break; - case VIEW_NOTES: - strcpy(cmd, "MSGS ALL"); - maxmsgs = 32767; - wprintf("
\n"); - break; - case VIEW_ADDRESSBOOK: - is_singlecard = ibstr("is_singlecard"); - if (is_singlecard != 1) { - if (oper == do_search) { - snprintf(cmd, sizeof(cmd), "MSGS SEARCH|%s", bstr("query")); - } - else { - strcpy(cmd, "MSGS ALL"); - } - maxmsgs = 9999999; - break; - } - break; - case VIEW_MAILBOX: - if (!WCC->is_ajax) { - new_summary_view(); - return; - } else { - defaultsortorder = 2; - sortit = 1; - load_seen = 1; - care_for_empty_list = 0; - with_headers = 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")) maxmsgs = ibstr("maxmsgs"); - else maxmsgs = 9999999; - if (havebstr("startmsg")) startmsg = lbstr("startmsg"); - snprintf(cmd, sizeof(cmd), "MSGS %s|%s||1", - (oper == do_search) ? "SEARCH" : "ALL", - (oper == do_search) ? bstr("query") : "" - ); - } - break; - case VIEW_BBS: - default: - defaultsortorder = 1; - startmsg = -1; - sortit = 1; - care_for_empty_list = 1; - - rlid[oper].cmd(cmd, sizeof(cmd)); - SetAccessCommand(oper); + } - if (havebstr("maxmsgs")) - maxmsgs = ibstr("maxmsgs"); - if (maxmsgs == 0) maxmsgs = DEFAULT_MAXMSGS; + memset(&Stat, 0, sizeof(SharedMessageStatus)); + Stat.maxload = 10000; + Stat.lowest_found = (-1); + Stat.highest_found = (-1); + GetHash(ReadLoopHandler, IKEY(WCC->wc_view), &vViewMsg); + if (vViewMsg == NULL) { + WCC->wc_view = VIEW_BBS; + GetHash(ReadLoopHandler, IKEY(WCC->wc_view), &vViewMsg); + } + if (vViewMsg == NULL) { + return; // TODO: print message + } - if (havebstr("startmsg")) { - startmsg = lbstr("startmsg"); - } - + ViewMsg = (RoomRenderer*) vViewMsg; + if (!WCC->is_ajax) { + output_headers(1, 1, 1, 0, 0, 0); + } else if (WCC->wc_view == VIEW_MAILBOX) { + jsonMessageListHdr(); } - nummsgs = load_msg_ptrs(cmd, with_headers); - if (nummsgs == 0) { - if (care_for_empty_list) { - wprintf("