* make readloop long-controlled
authorWilfried Göesgens <willi@citadel.org>
Sun, 7 Dec 2008 23:27:13 +0000 (23:27 +0000)
committerWilfried Göesgens <willi@citadel.org>
Sun, 7 Dec 2008 23:27:13 +0000 (23:27 +0000)
* move param-dependant code into callback hooks
* migrate all places to the new enums fed into readloop

13 files changed:
webcit/calendar.c
webcit/event.c
webcit/messages.c
webcit/msg_renderers.c
webcit/notes.c
webcit/roomops.c
webcit/static/t/msg_listselector.html
webcit/static/t/select_messageindex.html
webcit/static/t/select_messageindex_all.html
webcit/static/t/summary_trailer.html [new file with mode: 0644]
webcit/vcard_edit.c
webcit/webcit.c
webcit/webcit.h

index 33864203efa7fba6c2d6f282f4e3b15b272ede58..9dc2b07330ad9182b62cb4e5d6115e41641140ef 100644 (file)
@@ -932,7 +932,7 @@ void save_individual_task(icalcomponent *supplied_vtodo, long msgnum, char* from
        }
 
        /** Go back to the task list */
-       readloop("readfwd");
+       readloop(readfwd);
 }
 
 
index ae3417462b3f6ae17fa57cfcf02cdb6fd5663679..0258c2ffc828b1ff459fae8a85f88dd67ca0831c 100644 (file)
@@ -1147,6 +1147,6 @@ STARTOVER:        for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDE
 
        /* If this was a save or delete, go back to the calendar view. */
        if (!havebstr("check_button")) {
-               readloop("readfwd");
+               readloop(readfwd);
        }
 }
index 269d1da7945bb1a57480cdf058e1e92f16a4a695..7a2bc8bdefbbad8c87b1c33be850bf1200ace91f 100644 (file)
@@ -938,10 +938,13 @@ int load_msg_ptrs(char *servcmd, int with_headers)
 
 inline message_summary* GetMessagePtrAt(int n, HashList *Summ)
 {
+       const char *Key;
+       long HKLen;
        void *vMsg;
+
        if (Summ == NULL)
                return NULL;
-       GetHash(Summ, (const char*)&n, sizeof(n), &vMsg);
+       GetHashAt(Summ, n, &HKLen, &Key, &vMsg);
        return (message_summary*) vMsg;
 }
 
@@ -1000,15 +1003,18 @@ void DrawMessageSummarySelector(StrBuf *BBViewToolBar, long maxmsgs, long startm
        FlushStrBuf(BBViewToolBar);
        DoTemplate(HKEY("msg_listselector"), BBViewToolBar, Selector, CTX_STRBUF);
        FreeStrBuf(&Selector);
+       DeleteHashPos(&At);
 }
 
 
+extern readloop_struct rlid[];
+
 /*
  * command loop for reading messages
  *
  * Set oper to "readnew" or "readold" or "readfwd" or "headers"
  */
-void readloop(char *oper)
+void readloop(long oper)
 {
        StrBuf *BBViewToolBar = NULL;
        void *vMsg;
@@ -1020,7 +1026,7 @@ void readloop(char *oper)
        ///int b = 0;
        int nummsgs;
        long startmsg = 0;
-       int maxmsgs;
+       int maxmsgs = 0;
        long *displayed_msgs = NULL;
        int num_displayed = 0;
        int is_summary = 0;
@@ -1071,7 +1077,7 @@ void readloop(char *oper)
                is_singlecard = ibstr("is_singlecard");
                if (maxmsgs > 1) {
                        is_addressbook = 1;
-                       if (!strcmp(oper, "do_search")) {
+                       if (oper == do_search) {
                                snprintf(cmd, sizeof(cmd), "MSGS SEARCH|%s", bstr("query"));
                        }
                        else {
@@ -1095,25 +1101,11 @@ void readloop(char *oper)
                 * When in summary mode, always show ALL messages instead of just
                 * new or old.  Otherwise, show what the user asked for.
                 */
-               if (!strcmp(oper, "readnew")) {
-                       strcpy(cmd, "MSGS NEW");
-               }
-               else if (!strcmp(oper, "readold")) {
-                       strcpy(cmd, "MSGS OLD");
-               }
-               else if (!strcmp(oper, "do_search")) {
-                       snprintf(cmd, sizeof(cmd), "MSGS SEARCH|%s", bstr("query"));
-               }
-               else {
-                       strcpy(cmd, "MSGS ALL");
-               }
+               rlid[oper].cmd(cmd, sizeof(cmd));
                
                if ((WCC->wc_view == VIEW_MAILBOX) && (maxmsgs > 1) && !WCC->is_mobile) {
                        is_summary = 1;
-                       if (!strcmp(oper, "do_search")) {
-                               snprintf(cmd, sizeof(cmd), "MSGS SEARCH|%s", bstr("query"));
-                       }
-                       else {
+                       if (oper != do_search) {
                                strcpy(cmd, "MSGS ALL");
                        }
                }
@@ -1122,12 +1114,15 @@ void readloop(char *oper)
                if (is_summary) {                       /**< fetch header summary */
                        load_seen = 1;
                        snprintf(cmd, sizeof(cmd), "MSGS %s|%s||1",
-                                (!strcmp(oper, "do_search") ? "SEARCH" : "ALL"),
-                                (!strcmp(oper, "do_search") ? bstr("query") : "")
+                                (oper == do_search) ? "SEARCH" : "ALL",
+                                (oper == do_search) ? bstr("query") : ""
                                );
                        startmsg = 1;
                        maxmsgs = 9999999;
                } 
+
+               bbs_reverse = is_bbview && (lbstr("SortOrder") == 2);
+
                if (startmsg == 0L) {
                        if (bbs_reverse) {
                                Msg = GetMessagePtrAt((nummsgs >= maxmsgs) ? (nummsgs - maxmsgs) : 0, WCC->summ);
@@ -1165,11 +1160,14 @@ void readloop(char *oper)
        if (nummsgs == 0) {
                if (care_for_empty_list) {
                        wprintf("<div align=\"center\"><br /><em>");
-                       if (!strcmp(oper, "readnew")) {
+                       switch (oper) {
+                       case readnew:
                                wprintf(_("No new messages."));
-                       } else if (!strcmp(oper, "readold")) {
+                               break;
+                       case readold:
                                wprintf(_("No old messages."));
-                       } else {
+                               break;
+                       default:
                                wprintf(_("No messages here."));
                        }
                        wprintf("</em><br /></div>\n");
@@ -1292,18 +1290,7 @@ void readloop(char *oper)
        }
 
        if (is_summary) {
-               wprintf("</table>"
-                       "</div>\n");                    /**< end of 'fix_scrollbar_bug' div */
-               wprintf("</div>");                      /**< end of 'message_list' div */
-               
-               /** Here's the grab-it-to-resize-the-message-list widget */
-               wprintf("<div id=\"resize_msglist\" "
-                       "onMouseDown=\"CtdlResizeMsgListMouseDown(event)\">"
-                       "<div class=\"fix_scrollbar_bug\"> <hr>"
-                       "</div></div>\n"
-               );
-
-               wprintf("<div id=\"preview_pane\">");   /**< The preview pane will initially be empty */
+               do_template("summary_trailer", NULL);
        } else if (WCC->is_mobile) {
                wprintf("</div>");
        }
@@ -1640,7 +1627,7 @@ void post_message(void)
         *  Otherwise, just go to the "read messages" loop.
         */
        else {
-               readloop("readnew");
+               readloop(readnew);
        }
 }
 
@@ -1684,7 +1671,7 @@ void display_enter(void)
        }
        else if (buf[0] != '2') {               /** Any other error means that we cannot continue */
                sprintf(WCC->ImportantMessage, "%s", &buf[4]);
-               readloop("readnew");
+               readloop(readnew);
                return;
        }
 
@@ -1801,7 +1788,7 @@ void delete_msg(void)
        serv_getln(buf, sizeof buf);
        sprintf(WC->ImportantMessage, "%s", &buf[4]);
 
-       readloop("readnew");
+       readloop(readnew);
 }
 
 
@@ -1824,7 +1811,7 @@ void move_msg(void)
                sprintf(WC->ImportantMessage, (_("The message was not moved.")));
        }
 
-       readloop("readnew");
+       readloop(readnew);
 }
 
 
@@ -1884,11 +1871,11 @@ void confirm_move_msg(void)
        wDumpContent(1);
 }
 
-void readnew(void) { readloop("readnew");}
-void readold(void) { readloop("readold");}
-void readfwd(void) { readloop("readfwd");}
-void headers(void) { readloop("headers");}
-void do_search(void) { readloop("do_search");}
+void h_readnew(void) { readloop(readnew);}
+void h_readold(void) { readloop(readold);}
+void h_readfwd(void) { readloop(readfwd);}
+void h_headers(void) { readloop(headers);}
+void h_do_search(void) { readloop(do_search);}
 
 
 
@@ -1899,11 +1886,11 @@ void
 InitModule_MSG
 (void)
 {
-       WebcitAddUrlHandler(HKEY("readnew"), readnew, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readold"), readold, NEED_URL);
-       WebcitAddUrlHandler(HKEY("readfwd"), readfwd, NEED_URL);
-       WebcitAddUrlHandler(HKEY("headers"), headers, NEED_URL);
-       WebcitAddUrlHandler(HKEY("do_search"), do_search, 0);
+       WebcitAddUrlHandler(HKEY("readnew"), h_readnew, NEED_URL);
+       WebcitAddUrlHandler(HKEY("readold"), h_readold, NEED_URL);
+       WebcitAddUrlHandler(HKEY("readfwd"), h_readfwd, NEED_URL);
+       WebcitAddUrlHandler(HKEY("headers"), h_headers, NEED_URL);
+       WebcitAddUrlHandler(HKEY("do_search"), h_do_search, 0);
        WebcitAddUrlHandler(HKEY("display_enter"), display_enter, 0);
        WebcitAddUrlHandler(HKEY("post"), post_message, 0);
        WebcitAddUrlHandler(HKEY("move_msg"), move_msg, 0);
index 11a2613a0a59878efa6dad8e3cbf40a2f4e2c665..005288380fe1db905e0835e707f704e524210115 100644 (file)
@@ -938,6 +938,46 @@ void tmplput_ATT_FileName(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, vo
 }
 
 
+void servcmd_do_search(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS SEARCH|%s", bstr("query"));
+}
+
+void servcmd_headers(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS ALL");
+}
+
+void servcmd_readfwd(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS ALL");
+}
+
+void servcmd_readnew(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS NEW");
+}
+
+void servcmd_readold(char *buf, long bufsize)
+{
+       snprintf(buf, bufsize, "MSGS OLD");
+}
+
+
+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}
+};
+
+
+
+
+               
+
+
 
 
 void 
index 82b6c9262489af64b9f92802a60c9776ad937967..48582a9fb2b9f79c939fd990d7f107cf504a7df4 100644 (file)
@@ -382,7 +382,7 @@ void add_new_note(void) {
                vnote_free(v);
        }
        
-       readloop("readfwd");
+       readloop(readfwd);
 }
 
 
index 24bf10eaf2be3d61169b1c159e91273b858fcf31..f8a5e4c0efd872c823e49e915717dadeffe7efd2 100644 (file)
@@ -927,7 +927,7 @@ void gotonext(void)
  */
 void smart_goto(char *next_room) {
        gotoroom(next_room);
-       readloop("readnew");
+       readloop(readnew);
 }
 
 
index ef6bd03b5764b2735a37682a768aea87a1936540..d6cb5989126e87c3c0f9b1a156b8fba6a1afe2f0 100644 (file)
@@ -6,8 +6,8 @@
 </select>
 
 <input type="radio" name="direction" value="" 
-  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=0'"
-  <?%("COND:BSTR", 1, "SortOrder", 1, "", "checked")>
+  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=2'"
+  <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
 >
 <?_("oldest to newest")> 
 
@@ -15,7 +15,7 @@
 
 <input type="radio" name="direction" value="" 
   OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=1'"
-  <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
+  <?%("COND:BSTR", 1, "SortOrder", 1, "", "checked")>
 >
 <?_("newest to oldest")>
 </p>
index a6db1fbc36406bcbb7135a27fdaa9cc964e76d87..4bcd213a1e068f51085f0c5b8045c5d8546bf3fd 100644 (file)
@@ -1 +1 @@
-<option <?%("COND:LONGVECTOR", 1, 1, 6, "selected", "")> value="<?URLPART(1)>&startmsg=<?LONGVECTOR(6)>&maxmsgs=<?LONGVECTOR(4)>&is_summary=0&SortBy=date&SortOrder=<?BSTR("SortOrder")>"><?LONGVECTOR(4)>-<?LONGVECTOR(5)></option>
+<option <?%("COND:LONGVECTOR", 1, 1, 6, "selected", "")> value="<?URLPART(0)>?startmsg=<?LONGVECTOR(6)>&maxmsgs=<?LONGVECTOR(4)>&is_summary=0&SortBy=date&SortOrder=<?BSTR("SortOrder")>"><?LONGVECTOR(4)>-<?LONGVECTOR(5)></option>
index 2a69b1c1a9fd6ee26c86d3a9aaede7e71986e969..a57429be7cbb1aa7f106721920d7c8c4081f3562 100644 (file)
@@ -1 +1 @@
-<option <?%("COND:LONGVECTOR", 1, 1, 6, "selected", "")> value="<?URLPART(1)>&startmsg=<?LONGVECTOR(6)>&maxmsgs=9999999&is_summary=0&SortBy=date&SortOrder=<?BSTR("SortOrder")>"><?_("All")></option>
+<option <?%("COND:LONGVECTOR", 1, 1, 6, "selected", "")> value="<?URLPART(0)>?startmsg=<?LONGVECTOR(6)>&maxmsgs=9999999&is_summary=0&SortBy=date&SortOrder=<?BSTR("SortOrder")>"><?_("All")></option>
diff --git a/webcit/static/t/summary_trailer.html b/webcit/static/t/summary_trailer.html
new file mode 100644 (file)
index 0000000..49e2f2c
--- /dev/null
@@ -0,0 +1,7 @@
+</table>
+</div>
+</div>
+<div id="resize_msglist" onMouseDown="CtdlResizeMsgListMouseDown(event)">
+<div class="fix_scrollbar_bug"> <hr>
+</div></div>
+<div id="preview_pane">
index 47032cfc28713c8ae17ad6cd697f49cf9c663fdf..ae699c6608053d7f384a8cb3ad85b39e57ebaeaf 100644 (file)
@@ -889,7 +889,7 @@ void submit_vcard(void) {
        int i;
 
        if (!havebstr("ok_button")) { 
-               readloop("readnew");
+               readloop(readnew);
                return;
        }
 
@@ -979,7 +979,7 @@ void submit_vcard(void) {
                do_welcome();
        }
        else {
-               readloop("readnew");
+               readloop(readnew);
        }
 }
 
index 095082ccb8b55a5998de9b9348b0c462fa0f2c7d..1bd1e1ee582eaeb17f58b3614d9d4f847961cb62 100644 (file)
@@ -1811,8 +1811,8 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
                                                WCC->UrlFragment1 = NewStrBuf();
                                        if (WCC->UrlFragment2 == NULL)
                                                WCC->UrlFragment2 = NewStrBuf();
-                                       StrBufPrintf(WCC->UrlFragment1, "%s", index[1]);
-                                       StrBufPrintf(WCC->UrlFragment2, "%s", index[2]);
+                                       StrBufPrintf(WCC->UrlFragment1, "%s", index[0]);
+                                       StrBufPrintf(WCC->UrlFragment2, "%s", index[1]);
                                }
                                if ((Handler->Flags & AJAX) != 0)
                                        begin_ajax_response();
index 1303daf8b732271c4ded77cb02cc94c31c2c0cf0..371aac8dadc48a3dd1dc616ab11e0f376d84b7c0 100644 (file)
@@ -806,7 +806,22 @@ void stripout(char *str, char leftboundary, char rightboundary);
 void dump_vars(void);
 void embed_main_menu(void);
 void serv_read(char *buf, int bytes);
-void readloop(char *oper);
+
+enum {
+       do_search,
+       headers,
+       readfwd,
+       readnew,
+       readold
+};
+
+typedef void (*readloop_servcmd)(char *buf, long bufsize);
+
+typedef struct _readloopstruct {
+       ConstStr name;
+       readloop_servcmd cmd;
+} readloop_struct;
+void readloop(long oper);
 int  read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section);
 void do_addrbook_view(addrbookent *addrbook, int num_ab);
 void display_vcard(StrBuf *Target, const char *vcard_source, char alpha, int full, char *storename, long msgnum);