]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/vcard/serv_vcard.c
Convert CtdlMessages to respect cm_lengths[]
[citadel.git] / citadel / modules / vcard / serv_vcard.c
index 1512c66b7652d77bcaab3400a1641bfe30672881..3d62c83d0b710e97442ab2e25f1af64b4070a0f0 100644 (file)
@@ -63,6 +63,7 @@
 #include "user_ops.h"
 #include "database.h"
 #include "msgbase.h"
+#include "room_ops.h"
 #include "internet_addressing.h"
 #include "serv_vcard.h"
 #include "citadel_ldap.h"
@@ -94,12 +95,12 @@ void vcard_extract_internet_addresses(struct CtdlMessage *msg, int (*callback)(c
        int instance = 0;
        int found_something = 0;
 
-       if (msg->cm_fields['A'] == NULL) return;
-       if (msg->cm_fields['N'] == NULL) return;
+       if (CM_IsEmpty(msg, eAuthor)) return;
+       if (CM_IsEmpty(msg, eNodeName)) return;
        snprintf(citadel_address, sizeof citadel_address, "%s @ %s",
-               msg->cm_fields['A'], msg->cm_fields['N']);
+               msg->cm_fields[eAuthor], msg->cm_fields[eNodeName]);
 
-       v = vcard_load(msg->cm_fields['M']);
+       v = vcard_load(msg->cm_fields[eMesageText]);
        if (v == NULL) return;
 
        /* Go through the vCard searching for *all* instances of
@@ -189,7 +190,7 @@ void vcard_add_to_directory(long msgnum, void *data) {
                vcard_extract_internet_addresses(msg, vcard_directory_add_user);
        }
 
-       CtdlFreeMessage(msg);
+       CM_Free(msg);
 }
 
 
@@ -328,9 +329,8 @@ void vcard_extract_vcard(char *name, char *filename, char *partnum, char *disp,
  * function accordingly (delete the user's existing vCard in the config room
  * and in the global address book).
  */
-int vcard_upload_beforesave(struct CtdlMessage *msg) {
+int vcard_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) {
        struct CitContext *CCC = CC;
-       char *ptr;
        char *s;
        char buf[SIZ];
        struct ctdluser usbuf;
@@ -373,10 +373,9 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
 
        /* Ok, if we got this far, look into the situation further... */
 
-       ptr = msg->cm_fields['M'];
-       if (ptr == NULL) return(0);
+       if (CM_IsEmpty(msg, eMesageText)) return(0);
 
-       mime_parser(msg->cm_fields['M'],
+       mime_parser(msg->cm_fields[eMesageText],
                NULL,
                *vcard_extract_vcard,
                NULL, NULL,
@@ -425,10 +424,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
                CtdlDeleteMessages(CCC->room.QRname, NULL, 0, "[Tt][Ee][Xx][Tt]/.*[Vv][Cc][Aa][Rr][Dd]$");
 
                /* Make the author of the message the name of the user. */
-               if (msg->cm_fields['A'] != NULL) {
-                       free(msg->cm_fields['A']);
-               }
-               msg->cm_fields['A'] = strdup(usbuf.fullname);
+               CM_SetField(msg, eAuthor, usbuf.fullname, strlen(usbuf.fullname));
        }
 
        /* Insert or replace RFC2739-compliant free/busy URL */
@@ -451,23 +447,20 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
 
        /* Enforce local UID policy if applicable */
        if (yes_my_citadel_config) {
-               snprintf(buf, sizeof buf, VCARD_EXT_FORMAT, msg->cm_fields['A'], NODENAME);
+               snprintf(buf, sizeof buf, VCARD_EXT_FORMAT, msg->cm_fields[eAuthor], NODENAME);
                vcard_set_prop(v, "UID", buf, 0);
        }
 
        /* 
         * Set the EUID of the message to the UID of the vCard.
         */
-       if (msg->cm_fields['E'] != NULL)
-       {
-               free(msg->cm_fields['E']);
-               msg->cm_fields['E'] = NULL;
-       }
+       CM_FlushField(msg, eExclusiveID);
+
        s = vcard_get_prop(v, "UID", 1, 0, 0);
        if (s != NULL) {
-               msg->cm_fields['E'] = strdup(s);
-               if (msg->cm_fields['U'] == NULL) {
-                       msg->cm_fields['U'] = strdup(s);
+               CM_SetField(msg, eExclusiveID, s, strlen(s));
+               if (CM_IsEmpty(msg, eMsgSubject)) {
+                       CM_CopyField(msg, eMsgSubject, eExclusiveID);
                }
        }
 
@@ -479,19 +472,22 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
                s = vcard_get_prop(v, "N", 1, 0, 0);
        }
        if (s != NULL) {
-               if (msg->cm_fields['U'] != NULL) {
-                       free(msg->cm_fields['U']);
-               }
-               msg->cm_fields['U'] = strdup(s);
+               CM_SetField(msg, eMsgSubject, s, strlen(s));
        }
 
        /* Re-serialize it back into the msg body */
        ser = vcard_serialize(v);
        if (ser != NULL) {
-               msg->cm_fields['M'] = realloc(msg->cm_fields['M'], strlen(ser) + 1024);
-               sprintf(msg->cm_fields['M'],
-                       "Content-type: " VCARD_MIME_TYPE
-                       "\r\n\r\n%s\r\n", ser);
+               StrBuf *buf;
+               long serlen;
+
+               serlen = strlen(ser);
+               buf = NewStrBufPlain(NULL, serlen + 1024);
+
+               StrBufAppendBufPlain(buf, HKEY("Content-type: " VCARD_MIME_TYPE "\r\n\r\n"), 0);
+               StrBufAppendBufPlain(buf, ser, serlen, 0);
+               StrBufAppendBufPlain(buf, HKEY("\r\n"), 0);
+               CM_SetAsFieldSB(msg, eMesageText, &buf);
                free(ser);
        }
 
@@ -508,7 +504,7 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
  * function accordingly (copy the vCard from the config room to the global
  * address book).
  */
-int vcard_upload_aftersave(struct CtdlMessage *msg) {
+int vcard_upload_aftersave(struct CtdlMessage *msg, recptypes *recp) {
        struct CitContext *CCC = CC;
        char *ptr;
        int linelen;
@@ -538,8 +534,10 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) {
 
        if (!is_UserConf && !is_GAB) return(0);
 
-       ptr = msg->cm_fields['M'];
-       if (ptr == NULL) return(0);
+       if (CM_IsEmpty(msg, eMesageText))
+               return 0;
+
+       ptr = msg->cm_fields[eMesageText];
 
        NewStrBufDupAppendFlush(&CCC->StatusMessage, NULL, NULL, 0);
 
@@ -557,12 +555,12 @@ int vcard_upload_aftersave(struct CtdlMessage *msg) {
                         * copy it to the Global Address Book room.
                         */
 
-                       I = atol(msg->cm_fields['3']);
+                       I = atol(msg->cm_fields[eVltMsgNum]);
                        if (I <= 0L) return(0);
 
                        /* Store our Internet return address in memory */
                        if (is_MY_UserConf) {
-                               v = vcard_load(msg->cm_fields['M']);
+                               v = vcard_load(msg->cm_fields[eMesageText]);
                                extract_inet_email_addrs(CCC->cs_inet_email, sizeof CCC->cs_inet_email,
                                                CCC->cs_inet_other_emails, sizeof CCC->cs_inet_other_emails,
                                                v, 1);
@@ -652,8 +650,8 @@ struct vCard *vcard_get_user(struct ctdluser *u) {
        msg = CtdlFetchMessage(VCmsgnum, 1);
        if (msg == NULL) return vcard_new();
 
-       v = vcard_load(msg->cm_fields['M']);
-       CtdlFreeMessage(msg);
+       v = vcard_load(msg->cm_fields[eMesageText]);
+       CM_Free(msg);
        return v;
 }
 
@@ -897,6 +895,7 @@ void vcard_newuser(struct ctdluser *usbuf) {
 void vcard_purge(struct ctdluser *usbuf) {
        struct CtdlMessage *msg;
        char buf[SIZ];
+       long len;
 
        msg = (struct CtdlMessage *) malloc(sizeof(struct CtdlMessage));
        if (msg == NULL) return;
@@ -905,19 +904,19 @@ void vcard_purge(struct ctdluser *usbuf) {
        msg->cm_magic = CTDLMESSAGE_MAGIC;
        msg->cm_anon_type = MES_NORMAL;
        msg->cm_format_type = 0;
-       msg->cm_fields['A'] = strdup(usbuf->fullname);
-       msg->cm_fields['O'] = strdup(ADDRESS_BOOK_ROOM);
-       msg->cm_fields['N'] = strdup(NODENAME);
-       msg->cm_fields['M'] = strdup("Purge this vCard\n");
+       CM_SetField(msg, eAuthor, usbuf->fullname, strlen(usbuf->fullname));
+       CM_SetField(msg, eOriginalRoom, HKEY(ADDRESS_BOOK_ROOM));
+       CM_SetField(msg, eNodeName, NODENAME, strlen(NODENAME));
+       CM_SetField(msg, eMesageText, HKEY("Purge this vCard\n"));
 
-       snprintf(buf, sizeof buf, VCARD_EXT_FORMAT,
-                       msg->cm_fields['A'], NODENAME);
-       msg->cm_fields['E'] = strdup(buf);
+       len = snprintf(buf, sizeof buf, VCARD_EXT_FORMAT,
+                      msg->cm_fields[eAuthor], NODENAME);
+       CM_SetField(msg, eExclusiveID, buf, len);
 
-       msg->cm_fields['S'] = strdup("CANCEL");
+       CM_SetField(msg, eSpecialField, HKEY("CANCEL"));
 
        CtdlSubmitMsg(msg, NULL, ADDRESS_BOOK_ROOM, QP_EADDR);
-       CtdlFreeMessage(msg);
+       CM_Free(msg);
 }
 
 
@@ -936,8 +935,11 @@ int vcard_extract_from_network(struct CtdlMessage *msg, char *target_room) {
 
        if (msg->cm_format_type != 4) return(0);
 
-       ptr = msg->cm_fields['M'];
-       if (ptr == NULL) return(0);
+       if (CM_IsEmpty(msg, eMesageText))
+               return 0;
+
+       ptr = msg->cm_fields[eMesageText];
+
        while (ptr != NULL) {
        
                linelen = strcspn(ptr, "\n");
@@ -979,8 +981,11 @@ void vcard_delete_remove(char *room, long msgnum) {
        msg = CtdlFetchMessage(msgnum, 1);
        if (msg == NULL) return;
 
-       ptr = msg->cm_fields['M'];
-       if (ptr == NULL) goto EOH;
+       if (CM_IsEmpty(msg, eMesageText))
+               goto EOH;
+
+       ptr = msg->cm_fields[eMesageText];
+
        while (ptr != NULL) {
                linelen = strcspn(ptr, "\n");
                if (linelen == 0) goto EOH;
@@ -994,7 +999,7 @@ void vcard_delete_remove(char *room, long msgnum) {
                if (ptr != NULL) ++ptr;
        }
 
-EOH:   CtdlFreeMessage(msg);
+EOH:   CM_Free(msg);
 }
 
 
@@ -1102,14 +1107,14 @@ void dvca_callback(long msgnum, void *userdata) {
 
        msg = CtdlFetchMessage(msgnum, 1);
        if (msg == NULL) return;
-       mime_parser(msg->cm_fields['M'],
+       mime_parser(msg->cm_fields[eMesageText],
                NULL,
                *dvca_mime_callback,    /* callback function */
                NULL, NULL,
                NULL,                   /* user data */
                0
        );
-       CtdlFreeMessage(msg);
+       CM_Free(msg);
 }
 
 
@@ -1167,7 +1172,7 @@ void check_get(void) {
        
        if (strncasecmp(cmdbuf, "GET ", 4)==0)
        {
-               struct recptypes *rcpt;
+               recptypes *rcpt;
                char *argbuf = &cmdbuf[4];
                
                extract_token(internet_addr, argbuf, 0, '|', sizeof internet_addr);
@@ -1325,8 +1330,8 @@ void strip_addresses_already_have(long msgnum, void *userdata) {
 
        msg = CtdlFetchMessage(msgnum, 1);
        if (msg == NULL) return;
-       v = vcard_load(msg->cm_fields['M']);
-       CtdlFreeMessage(msg);
+       v = vcard_load(msg->cm_fields[eMesageText]);
+       CM_Free(msg);
 
        i = 0;
        while (value = vcard_get_prop(v, "email", 1, i++, 0), value != NULL) {
@@ -1372,26 +1377,34 @@ void store_this_ha(struct addresses_to_be_filed *aptr) {
                striplt(recipient);
                v = vcard_new_from_rfc822_addr(recipient);
                if (v != NULL) {
+                       const char *s;
                        vmsg = malloc(sizeof(struct CtdlMessage));
                        memset(vmsg, 0, sizeof(struct CtdlMessage));
                        vmsg->cm_magic = CTDLMESSAGE_MAGIC;
                        vmsg->cm_anon_type = MES_NORMAL;
                        vmsg->cm_format_type = FMT_RFC822;
-                       vmsg->cm_fields['A'] = strdup("Citadel");
-                       vmsg->cm_fields['E'] =  strdup(vcard_get_prop(v, "UID", 1, 0, 0));
+                       CM_SetField(vmsg, eAuthor, HKEY("Citadel"));
+                       s = vcard_get_prop(v, "UID", 1, 0, 0);
+                       CM_SetField(vmsg, eExclusiveID, s, strlen(s));
                        ser = vcard_serialize(v);
                        if (ser != NULL) {
-                               vmsg->cm_fields['M'] = malloc(strlen(ser) + 1024);
-                               sprintf(vmsg->cm_fields['M'],
-                                       "Content-type: " VCARD_MIME_TYPE
-                                       "\r\n\r\n%s\r\n", ser);
+                               StrBuf *buf;
+                               long serlen;
+                               
+                               serlen = strlen(ser);
+                               buf = NewStrBufPlain(NULL, serlen + 1024);
+
+                               StrBufAppendBufPlain(buf, HKEY("Content-type: " VCARD_MIME_TYPE "\r\n\r\n"), 0);
+                               StrBufAppendBufPlain(buf, ser, serlen, 0);
+                               StrBufAppendBufPlain(buf, HKEY("\r\n"), 0);
+                               CM_SetAsFieldSB(vmsg, eMesageText, &buf);
                                free(ser);
                        }
                        vcard_free(v);
 
                        syslog(LOG_DEBUG, "Adding contact: %s", recipient);
                        CtdlSubmitMsg(vmsg, NULL, aptr->roomname, QP_EADDR);
-                       CtdlFreeMessage(vmsg);
+                       CM_Free(vmsg);
                }
        }