Add function to in-memory duplicate a message.
authorWilfried Goesgens <dothebart@citadel.org>
Sun, 20 Jan 2013 15:26:54 +0000 (16:26 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sun, 20 Jan 2013 15:26:54 +0000 (16:26 +0100)
citadel/msgbase.c
citadel/msgbase.h

index 6320144f4c58203a947ed5c6c4ee24ef8538bba6..78fda6fa2b9873b649a05c0e44d01114fbf76950 100644 (file)
@@ -1312,6 +1312,48 @@ void CtdlFreeMessage(struct CtdlMessage *msg)
        free(msg);
 }
 
+int DupCMField(int i, struct CtdlMessage *OrgMsg, struct CtdlMessage *NewMsg)
+{
+       long len;
+       len = strlen(OrgMsg->cm_fields[i]);
+       NewMsg->cm_fields[i] = malloc(len + 1);
+       if (NewMsg->cm_fields[i] == NULL)
+               return 0;
+       memcpy(NewMsg->cm_fields[i], OrgMsg->cm_fields[i], len);
+       return 1;
+}
+
+struct CtdlMessage * CtdlDuplicateMessage(struct CtdlMessage *OrgMsg)
+{
+       int i;
+       struct CtdlMessage *NewMsg;
+
+       if (is_valid_message(OrgMsg) == 0) 
+               return NULL;
+       NewMsg = (struct CtdlMessage *)malloc(sizeof(struct CtdlMessage *));
+       if (NewMsg == NULL)
+               return NULL;
+
+       memcpy(NewMsg, OrgMsg, sizeof(struct CtdlMessage *));
+
+       memset(NewMsg->cm_fields, 0, sizeof(NewMsg->cm_fields));
+       
+       for (i = 0; i < 256; ++i)
+       {
+               if (OrgMsg->cm_fields[i] != NULL)
+               {
+                       if (!DupCMField(i, OrgMsg, NewMsg))
+                       {
+                               CtdlFreeMessage(NewMsg);
+                               return NULL;
+                       }
+               }
+       }
+
+       return NewMsg;
+}
+
+
 
 /*
  * Pre callback function for multipart/alternative
index 888b62725719547e3b1d597a52cbe02d5e5c27ec..838a9792aa3d90e752a5a32803adf23f6d7c3014 100644 (file)
@@ -160,6 +160,7 @@ void CtdlWriteObject(char *req_room,                        /* Room to stuff it in */
                        unsigned int flags              /* Internal save flags */
 );
 struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body);
+struct CtdlMessage * CtdlDuplicateMessage(struct CtdlMessage *OrgMsg);
 void CtdlFreeMessage(struct CtdlMessage *msg);
 void CtdlFreeMessageContents(struct CtdlMessage *msg);
 void serialize_message(struct ser_ret *, struct CtdlMessage *);