]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* More vCard-related debugging
[citadel.git] / citadel / msgbase.c
index fc08f614bf6f6326508d97104546131ec7f4ce2b..796c725e7424a5fcc522a7471a16391ed5ccabc4 100644 (file)
@@ -561,6 +561,13 @@ struct CtdlMessage *CtdlFetchMessage(long msgnum)
        } while ((field_length > 0) && (field_header != 'M'));
 
        cdb_free(dmsgtext);
+
+       /* Perform "before read" hooks (aborting if any return nonzero) */
+       if (PerformMessageHooks(ret, EVT_BEFOREREAD) > 0) {
+               CtdlFreeMessage(ret);
+               return NULL;
+       }
+
        return (ret);
 }
 
@@ -739,6 +746,9 @@ void output_message(char *msgid, int mode, int headers_only)
                if (TheMessage->cm_fields['U']) {
                        cprintf("subj=%s\n", TheMessage->cm_fields['U']);
                }
+               if (TheMessage->cm_fields['Z']) {
+                       cprintf("zaps=%s\n", TheMessage->cm_fields['Z']);
+               }
        }
 
        /* begin header processing loop for RFC822 transfer format */
@@ -912,7 +922,7 @@ void cmd_msg3(char *cmdbuf)
 {
        long msgnum;
        struct CtdlMessage *msg;
-       struct sermsgret smr;
+       struct ser_ret smr;
 
        if (CC->internal_pgm == 0) {
                cprintf("%d This command is for internal programs only.\n",
@@ -986,7 +996,7 @@ long send_message(struct CtdlMessage *msg,  /* pointer to buffer */
        long newmsgid;
        long retval;
        char msgidbuf[32];
-        struct sermsgret smr;
+        struct ser_ret smr;
 
        /* Get a new message number */
        newmsgid = get_new_message_number();
@@ -1036,11 +1046,11 @@ long send_message(struct CtdlMessage *msg,      /* pointer to buffer */
 /*
  * Serialize a struct CtdlMessage into the format used on disk and network.
  * 
- * This function returns a "struct sermsgret" (defined in msgbase.h) which
+ * This function loads up a "struct ser_ret" (defined in server.h) which
  * contains the length of the serialized message and a pointer to the
  * serialized message in memory.  THE LATTER MUST BE FREED BY THE CALLER.
  */
-void serialize_message(struct sermsgret *ret,          /* return values */
+void serialize_message(struct ser_ret *ret,            /* return values */
                        struct CtdlMessage *msg)        /* unserialized msg */
 {
        size_t wlen;
@@ -1071,8 +1081,8 @@ void serialize_message(struct sermsgret *ret,             /* return values */
        ret->ser[1] = msg->cm_anon_type;
        ret->ser[2] = msg->cm_format_type;
        wlen = 3;
-       lprintf(9, "stuff\n");
 
+       lprintf(9, "stuff\n");
        for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) {
                ret->ser[wlen++] = (char)forder[i];
                strcpy(&ret->ser[wlen], msg->cm_fields[(int)forder[i]]);
@@ -1080,6 +1090,7 @@ void serialize_message(struct sermsgret *ret,             /* return values */
        }
        if (ret->len != wlen) lprintf(3, "ERROR: len=%d wlen=%d\n",
                ret->len, wlen);
+       lprintf(9, "done serializing\n");
 
        return;
 }
@@ -1172,6 +1183,9 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
                }
        }
 
+       /* Perform "before save" hooks (aborting if any return nonzero) */
+       if (PerformMessageHooks(msg, EVT_BEFORESAVE) > 0) return;
+
        /* Network mail - send a copy to the network program. */
        if ((strlen(recipient) > 0) && (mailtype != MES_LOCAL)) {
                sprintf(aaa, "./network/spoolin/netmail.%04lx.%04x.%04x",
@@ -1267,6 +1281,9 @@ void CtdlSaveMsg(struct CtdlMessage *msg, /* message to save */
        smi.smi_refcount = successful_local_recipients;
        safestrncpy(smi.smi_content_type, content_type, 64);
        PutSuppMsgInfo(&smi);
+
+       /* Perform "after save" hooks */
+       PerformMessageHooks(msg, EVT_AFTERSAVE);
 }
 
 
@@ -1903,9 +1920,10 @@ void AdjRefCount(long msgnum, int incr)
 void CtdlWriteObject(char *req_room,           /* Room to stuff it in */
                        char *content_type,     /* MIME type of this object */
                        char *tempfilename,     /* Where to fetch it from */
-                       int is_mailbox,         /* Private mailbox room? */
+                       struct usersupp *is_mailbox,    /* Mailbox room? */
                        int is_binary,          /* Is encoding necessary? */
-                       int is_unique           /* Del others of this type? */
+                       int is_unique,          /* Del others of this type? */
+                       unsigned int flags      /* Internal save flags */
                        )
 {
 
@@ -1918,12 +1936,11 @@ void CtdlWriteObject(char *req_room,            /* Room to stuff it in */
        struct CtdlMessage *msg;
        size_t len;
 
-       lprintf(9, "CtdlWriteObject() called\n");
-
-       if (is_mailbox)
-               MailboxName(roomname, &CC->usersupp, req_room);
+       if (is_mailbox != NULL)
+               MailboxName(roomname, is_mailbox, req_room);
        else
                safestrncpy(roomname, req_room, sizeof(roomname));
+       lprintf(9, "CtdlWriteObject() to <%s> (flags=%d)\n", roomname, flags);
 
        strcpy(filename, tmpnam(NULL));
        fp = fopen(filename, "w");
@@ -1963,9 +1980,10 @@ void CtdlWriteObject(char *req_room,             /* Room to stuff it in */
        msg->cm_anon_type = MES_NORMAL;
        msg->cm_format_type = 4;
        msg->cm_fields['A'] = strdoop(CC->usersupp.fullname);
-       msg->cm_fields['O'] = strdoop(roomname);
+       msg->cm_fields['O'] = strdoop(req_room);
        msg->cm_fields['N'] = strdoop(config.c_nodename);
        msg->cm_fields['H'] = strdoop(config.c_humannode);
+       msg->cm_flags = flags;
        
        lprintf(9, "Loading\n");
        fp = fopen(filename, "rb");