* Got some more parsing in there
[citadel.git] / citadel / msgbase.c
index 5b37783ff42f840e6cc93d905d19b28e602d523e..61488f1faf6a7fd178874e0f29a88cf302d0d2e4 100644 (file)
@@ -1424,8 +1424,12 @@ void CtdlSaveMsg(struct CtdlMessage *msg,        /* message to save */
                msg->cm_fields['T'] = strdoop(aaa);
        }
 
+       lprintf(9, "checkpoint 1      \n");
        /* If this message has no path, we generate one.
         */
+       if (msg->cm_fields['A'] == NULL) {
+               msg->cm_fields['A'] = strdoop("unknown user");
+       }
        if (msg->cm_fields['P'] == NULL) {
                msg->cm_fields['P'] = strdoop(msg->cm_fields['A']);
                for (a=0; a<strlen(msg->cm_fields['P']); ++a) {
@@ -1437,6 +1441,7 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
 
        strcpy(force_room, force);
 
+       lprintf(9, "checkpoint 2      \n");
        /* Strip non-printable characters out of the recipient name */
        strcpy(recipient, rec);
        for (a = 0; a < strlen(recipient); ++a)
@@ -1445,6 +1450,7 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
 
        /* Learn about what's inside, because it's what's inside that counts */
 
+       lprintf(9, "checkpoint 3      \n");
        switch (msg->cm_format_type) {
        case 0:
                strcpy(content_type, "text/x-citadel-variformat");
@@ -1474,32 +1480,39 @@ void CtdlSaveMsg(struct CtdlMessage *msg,       /* message to save */
                }
        }
 
+       lprintf(9, "checkpoint 4      \n");
        /* Goto the correct room */
        strcpy(hold_rm, CC->quickroom.QRname);
        strcpy(actual_rm, CC->quickroom.QRname);
 
+       lprintf(9, "checkpoint 5      \n");
        /* If the user is a twit, move to the twit room for posting */
-       if (TWITDETECT) {
+       if ( (CC->logged_in) && (TWITDETECT) ) {
                if (CC->usersupp.axlevel == 2) {
                        strcpy(hold_rm, actual_rm);
                        strcpy(actual_rm, config.c_twitroom);
                }
        }
 
+       lprintf(9, "checkpoint 6      \n");
        /* ...or if this message is destined for Aide> then go there. */
        if (strlen(force_room) > 0) {
                strcpy(actual_rm, force_room);
        }
 
+       lprintf(9, "checkpoint 7      \n");
        if (strcasecmp(actual_rm, CC->quickroom.QRname))
                getroom(&CC->quickroom, actual_rm);
 
+       lprintf(9, "checkpoint 8      \n");
        /* Perform "before save" hooks (aborting if any return nonzero) */
        if (PerformMessageHooks(msg, EVT_BEFORESAVE) > 0) return;
 
+       lprintf(9, "checkpoint 9      \n");
        /* If this message has an Extended ID, perform replication checks */
        if (ReplicationChecks(msg) > 0) return;
 
+       lprintf(9, "checkpoint 10     \n");
        /* Network mail - send a copy to the network program. */
        if ((strlen(recipient) > 0) && (mailtype != MES_LOCAL)) {
                sprintf(aaa, "./network/spoolin/netmail.%04lx.%04x.%04x",
@@ -1510,6 +1523,7 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
                        lprintf(2, "ERROR: %s\n", strerror(errno));
        }
 
+       lprintf(9, "checkpoint 11     \n");
        /* Save it to disk */
        newmsgid = send_message(msg, generate_id, network_fp);
        if (network_fp != NULL) {
@@ -1519,6 +1533,7 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
 
        if (newmsgid <= 0L) return;
 
+       lprintf(9, "checkpoint 12     \n");
        /* Write a supplemental message info record.  This doesn't have to
         * be a critical section because nobody else knows about this message
         * yet.
@@ -1532,6 +1547,7 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
        /* Now figure out where to store the pointers */
 
 
+       lprintf(9, "checkpoint 13     \n");
        /* If this is being done by the networker delivering a private
         * message, we want to BYPASS saving the sender's copy (because there
         * is no local sender; it would otherwise go to the Trashcan).
@@ -1540,11 +1556,15 @@ void CtdlSaveMsg(struct CtdlMessage *msg,       /* message to save */
                CtdlSaveMsgPointerInRoom(actual_rm, newmsgid, 0);
        }
 
+       lprintf(9, "checkpoint 14     \n");
        /* Bump this user's messages posted counter. */
-       lgetuser(&CC->usersupp, CC->curr_user);
-       CC->usersupp.posted = CC->usersupp.posted + 1;
-       lputuser(&CC->usersupp);
+       if (CC->logged_in) {
+               lgetuser(&CC->usersupp, CC->curr_user);
+               CC->usersupp.posted = CC->usersupp.posted + 1;
+               lputuser(&CC->usersupp);
+       }
 
+       lprintf(9, "checkpoint 15     \n");
        /* If this is private, local mail, make a copy in the
         * recipient's mailbox and bump the reference count.
         */
@@ -1555,9 +1575,11 @@ void CtdlSaveMsg(struct CtdlMessage *msg,        /* message to save */
                }
        }
 
+       lprintf(9, "checkpoint 16     \n");
        /* Perform "after save" hooks */
        PerformMessageHooks(msg, EVT_AFTERSAVE);
 
+       lprintf(9, "checkpoint 17     \n");
        /* */
        if (strcasecmp(hold_rm, CC->quickroom.QRname))
                getroom(&CC->quickroom, hold_rm);
@@ -1590,6 +1612,64 @@ void quickie_message(char *from, char *to, char *room, char *text)
 }
 
 
+
+/*
+ * Back end function used by make_message() and similar functions
+ */
+char *CtdlReadMessageBody(char *terminator, size_t maxlen) {
+       char buf[256];
+       size_t message_len = 0;
+       size_t buffer_len = 0;
+       char *ptr, *append;
+       char *m;
+
+       m = mallok(4096);
+       if (m == NULL) {
+               while ( (client_gets(buf)>0) && strcmp(buf, terminator) ) ;;
+               return(NULL);
+       } else {
+               buffer_len = 4096;
+               m[0] = 0;
+               message_len = 0;
+       }
+       /* read in the lines of message text one by one */
+       append = NULL;
+       while ( (client_gets(buf)>0) && strcmp(buf, terminator) ) {
+
+               /* augment the buffer if we have to */
+               if ((message_len + strlen(buf) + 2) > buffer_len) {
+                       lprintf(9, "realloking\n");
+                       ptr = reallok(m, (buffer_len * 2) );
+                       if (ptr == NULL) {      /* flush if can't allocate */
+                               while ( (client_gets(buf)>0) &&
+                                       strcmp(buf, terminator)) ;;
+                               return(m);
+                       } else {
+                               buffer_len = (buffer_len * 2);
+                               m = ptr;
+                               append = NULL;
+                               lprintf(9, "buffer_len is %d\n", buffer_len);
+                       }
+               }
+
+               if (append == NULL) append = m;
+               while (strlen(append) > 0) ++append;
+               strcpy(append, buf);
+               strcat(append, "\n");
+               message_len = message_len + strlen(buf) + 1;
+
+               /* if we've hit the max msg length, flush the rest */
+               if (message_len >= maxlen) {
+                       while ( (client_gets(buf)>0) && strcmp(buf, terminator)) ;;
+                       return(m);
+               }
+       }
+       return(m);
+}
+
+
+
+
 /*
  * Build a binary message to be saved on disk.
  */
@@ -1607,9 +1687,6 @@ struct CtdlMessage *make_message(
        int a;
        char dest_node[32];
        char buf[256];
-       size_t message_len = 0;
-       size_t buffer_len = 0;
-       char *ptr, *append;
        struct CtdlMessage *msg;
 
        msg = mallok(sizeof(struct CtdlMessage));
@@ -1664,47 +1741,9 @@ struct CtdlMessage *make_message(
        if (dest_node[0] != 0)
                msg->cm_fields['D'] = strdoop(dest_node);
 
-       msg->cm_fields['M'] = mallok(4096);
-       if (msg->cm_fields['M'] == NULL) {
-               while (client_gets(buf), strcmp(buf, "000")) ;; /* flush */
-               return(msg);
-       } else {
-               buffer_len = 4096;
-               msg->cm_fields['M'][0] = 0;
-               message_len = 0;
-       }
-
-       /* read in the lines of message text one by one */
-       append = NULL;
-       while (client_gets(buf), strcmp(buf, "000")) {
-
-               /* augment the buffer if we have to */
-               if ((message_len + strlen(buf) + 2) > buffer_len) {
-                       lprintf(9, "realloking\n");
-                       ptr = reallok(msg->cm_fields['M'], (buffer_len * 2) );
-                       if (ptr == NULL) {      /* flush if can't allocate */
-                               while (client_gets(buf), strcmp(buf, "000")) ;;
-                               return(msg);
-                       } else {
-                               buffer_len = (buffer_len * 2);
-                               msg->cm_fields['M'] = ptr;
-                               append = NULL;
-                               lprintf(9, "buffer_len is %d\n", buffer_len);
-                       }
-               }
 
-               if (append == NULL) append = msg->cm_fields['M'];
-               while (strlen(append) > 0) ++append;
-               strcpy(append, buf);
-               strcat(append, "\n");
-               message_len = message_len + strlen(buf) + 1;
+       msg->cm_fields['M'] = CtdlReadMessageBody("000", config.c_maxmsglen);
 
-               /* if we've hit the max msg length, flush the rest */
-               if (message_len >= config.c_maxmsglen) {
-                       while (client_gets(buf), strcmp(buf, "000")) ;;
-                       return(msg);
-               }
-       }
 
        return(msg);
 }