]> code.citadel.org Git - citadel.git/commitdiff
Supplying a content type to CtdlDeleteMessages() in order
authorArt Cancro <ajc@citadel.org>
Fri, 16 Mar 2007 15:21:09 +0000 (15:21 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 16 Mar 2007 15:21:09 +0000 (15:21 +0000)
to delete all messages of a particular content type, now supports the
use of regular expressions.
serv_vcard.c now uses a regular expression to replace messages of
both types 'text/x-vcard' and 'text/vcard' in order to support the
transition.

citadel/msgbase.c
citadel/serv_vcard.c

index f5bb72c1fa70bd7e59897ce223369dba24c55842..2ec3668c0197f1778d6d2932b9b913b413367926 100644 (file)
@@ -29,6 +29,8 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <regex.h>
 #include "citadel.h"
 #include "server.h"
 #include "serv_extensions.h"
@@ -3505,10 +3507,9 @@ void cmd_ent0(char *entargs)
 int CtdlDeleteMessages(char *room_name,                /* which room */
                        long *dmsgnums,         /* array of msg numbers to be deleted */
                        int num_dmsgnums,       /* number of msgs to be deleted, or 0 for "any" */
-                       char *content_type      /* or "" for any */
+                       char *content_type      /* or "" for any.  regular expressions expected. */
 )
 {
-
        struct ctdlroom qrbuf;
        struct cdbdata *cdbfr;
        long *msglist = NULL;
@@ -3518,7 +3519,12 @@ int CtdlDeleteMessages(char *room_name,          /* which room */
        int num_deleted = 0;
        int delete_this;
        struct MetaData smi;
+       regex_t re;
+       regmatch_t pm;
 
+       if (content_type) if (strlen(content_type) > 0) {
+               regcomp(&re, content_type, 0);
+       }
        lprintf(CTDL_DEBUG, "CtdlDeleteMessages(%s, %d msgs, %s)\n",
                room_name, num_dmsgnums, content_type);
 
@@ -3561,8 +3567,7 @@ int CtdlDeleteMessages(char *room_name,           /* which room */
                                delete_this |= 0x02;
                        } else {
                                GetMetaData(&smi, msglist[i]);
-                               if (!strcasecmp(smi.meta_content_type,
-                                               content_type)) {
+                               if (regexec(&re, smi.meta_content_type, 1, &pm, 0) == 0) {
                                        delete_this |= 0x02;
                                }
                        }
index d2c0de74cecab9bb2e4608f2301b1e28be9efece..ed31981b3ec479edb3001597cd9327b325ea464b 100644 (file)
@@ -369,9 +369,8 @@ int vcard_upload_beforesave(struct CtdlMessage *msg) {
                 * want to make sure there is absolutely only one
                 * vCard in the user's config room at all times.
                 *
-                * FIXME also handle text/vcard by implementing regexp
                 */
-               CtdlDeleteMessages(CC->room.QRname, NULL, 0, "text/x-vcard");
+               CtdlDeleteMessages(CC->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) {