]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/ctdlproto/serv_messages.c
oops, I left a debug printf in there that I shouldn't have.
[citadel.git] / citadel / modules / ctdlproto / serv_messages.c
index a6ebdc4e14cc392bff78a1fd2658e8f41f753a9c..0ef0b033fdf862cd569cbd1d0465eddcdf421376 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * represent messages to the citadel clients
  *
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2017 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 version 3.
@@ -40,14 +40,26 @@ void simple_listing(long msgnum, void *userdata)
 void headers_listing(long msgnum, void *userdata)
 {
        struct CtdlMessage *msg;
+       int output_mode =  *(int *)userdata;
 
        msg = CtdlFetchMessage(msgnum, 0, 1);
        if (msg == NULL) {
-               cprintf("%ld|0|||||\n", msgnum);
+               cprintf("%ld|0|||||||\n", msgnum);
                return;
        }
 
-       cprintf("%ld|%s|%s|%s|%s|%s|\n",
+       // change all vertical bars in the subject to hyphens so it doesn't screw up the protocol
+       if (!CM_IsEmpty(msg, eMsgSubject)) {
+               char *p;
+               for (p=msg->cm_fields[eMsgSubject]; *p; p++) {
+                       if (*p == '|') {
+                               *p = '-';
+                       }
+               }
+       }
+
+       // output all fields except the references hash
+       cprintf("%ld|%s|%s|%s|%s|%s",
                msgnum,
                (!CM_IsEmpty(msg, eTimestamp) ? msg->cm_fields[eTimestamp] : "0"),
                (!CM_IsEmpty(msg, eAuthor) ? msg->cm_fields[eAuthor] : ""),
@@ -55,6 +67,32 @@ void headers_listing(long msgnum, void *userdata)
                (!CM_IsEmpty(msg, erFc822Addr) ? msg->cm_fields[erFc822Addr] : ""),
                (!CM_IsEmpty(msg, eMsgSubject) ? msg->cm_fields[eMsgSubject] : "")
        );
+
+       if (output_mode == MSG_HDRS_THREADS) {          // field view with thread hashes
+
+               // output the references hash
+               cprintf ("|%d|", 
+                       (!CM_IsEmpty(msg, emessageId) ? HashLittle(msg->cm_fields[emessageId],strlen(msg->cm_fields[emessageId])) : 0)
+               );
+       
+               // output the references hash (yes it's ok that we're trashing the source buffer by doing this)
+               if (!CM_IsEmpty(msg, eWeferences)) {
+                       char *token;
+                       char *rest = msg->cm_fields[eWeferences];
+                       char *prev = rest;
+                       while((token = strtok_r(rest, "|", &rest))) {
+                               cprintf("%d%s", HashLittle(token,rest-prev-(*rest==0?0:1)), (*rest==0?"":","));
+                               prev = rest;
+                       }
+               }
+       
+               cprintf("|\n");
+       }
+
+       else {                                          // field view with no threads, subject extends out forever
+               cprintf("\n");
+       }
+
        CM_Free(msg);
 }
 
@@ -142,22 +180,23 @@ void cmd_msgs(char *cmdbuf)
        cm_ref = extract_int(cmdbuf, 1);
        extract_token(search_string, cmdbuf, 1, '|', sizeof search_string);
        with_template = extract_int(cmdbuf, 2);
-       switch (extract_int(cmdbuf, 3))
-       {
-       default:
-       case MSG_HDRS_BRIEF:
-               CallBack = simple_listing;
-               break;
-       case MSG_HDRS_ALL:
-               CallBack = headers_listing;
-               break;
-       case MSG_HDRS_EUID:
-               CallBack = headers_euid;
-               break;
-       case MSG_HDRS_BRIEFFILTER:
-               with_template = 2;
-               CallBack = headers_brief_filter;
-               break;
+       int output_mode = extract_int(cmdbuf, 3);
+       switch (output_mode) {
+               default:
+               case MSG_HDRS_BRIEF:
+                       CallBack = simple_listing;
+                       break;
+               case MSG_HDRS_ALL:
+               case MSG_HDRS_THREADS:
+                       CallBack = headers_listing;
+                       break;
+               case MSG_HDRS_EUID:
+                       CallBack = headers_euid;
+                       break;
+               case MSG_HDRS_BRIEFFILTER:
+                       with_template = 2;
+                       CallBack = headers_brief_filter;
+                       break;
        }
 
        strcat(which, "   ");
@@ -240,7 +279,7 @@ void cmd_msgs(char *cmdbuf)
                                   NULL,
                                   template,
                                   CallBack,
-                                  NULL);
+                                  &output_mode);
                if (template != NULL) CM_Free(template);
        }
        else {