]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/imap/imap_fetch.c
* speed up imap_pick_range by getting the Imap-Context once.
[citadel.git] / citadel / modules / imap / imap_fetch.c
index 3af4e8cb7447533f631861acd4eb5d39cc14c287..6a8104b969cf8f927c1a09c4636d91f360b3fa9a 100644 (file)
@@ -219,11 +219,14 @@ void imap_fetch_rfc822(long msgnum, char *whichfmt) {
                text_size = 0;
        }
 
-       lprintf(CTDL_DEBUG, "RFC822: headers=%d, text=%d, total=%d\n",
+       lprintf(CTDL_DEBUG, 
+               "RFC822: headers=" SIZE_T_FMT 
+               ", text=" SIZE_T_FMT
+               ", total=" SIZE_T_FMT "\n",
                headers_size, text_size, total_size);
 
        if (!strcasecmp(whichfmt, "RFC822.SIZE")) {
-               cprintf("RFC822.SIZE %d", total_size);
+               cprintf("RFC822.SIZE " SIZE_T_FMT, total_size);
                return;
        }
 
@@ -242,7 +245,7 @@ void imap_fetch_rfc822(long msgnum, char *whichfmt) {
                bytes_to_send = text_size;
        }
 
-       cprintf("%s {%d}\r\n", whichfmt, bytes_to_send);
+       cprintf("%s {" SIZE_T_FMT "}\r\n", whichfmt, bytes_to_send);
        client_write(ptr, bytes_to_send);
 }
 
@@ -694,16 +697,16 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
        }
 
        if (is_partial == 0) {
-               cprintf("BODY[%s] {%d}\r\n", section, IMAP->cached_body_len);
+               cprintf("BODY[%s] {" SIZE_T_FMT "}\r\n", section, IMAP->cached_body_len);
                pstart = 0;
                pbytes = IMAP->cached_body_len;
        }
        else {
-               sscanf(partial, "%d.%d", &pstart, &pbytes);
+               sscanf(partial, SIZE_T_FMT "." SIZE_T_FMT, &pstart, &pbytes);
                if (pbytes > (IMAP->cached_body_len - pstart)) {
                        pbytes = IMAP->cached_body_len - pstart;
                }
-               cprintf("BODY[%s]<%d> {%d}\r\n", section, pstart, pbytes);
+               cprintf("BODY[%s]<" SIZE_T_FMT "> {" SIZE_T_FMT "}\r\n", section, pstart, pbytes);
        }
 
        /* Here we go -- output it */
@@ -793,6 +796,10 @@ void imap_fetch_bodystructure_part(
 
        cprintf("(");                                                   /* begin body parameter list */
 
+       /* "NAME" must appear as the first parameter.  This is not required by IMAP,
+        * but the Asterisk voicemail application blindly assumes that NAME will be in
+        * the first position.  If it isn't, it rejects the message.
+        */
        if (name != NULL) if (!IsEmptyStr(name)) {
                cprintf("\"NAME\" ");
                imap_strout(name);
@@ -930,7 +937,7 @@ void imap_fetch_bodystructure (long msgnum, char *item,
 
                cprintf("BODYSTRUCTURE (\"TEXT\" \"PLAIN\" "
                        "(\"CHARSET\" \"US-ASCII\") NIL NIL "
-                       "\"7BIT\" %d %d)", rfc822_body_len, lines);
+                       "\"7BIT\" " SIZE_T_FMT " %d)", rfc822_body_len, lines);
 
                return;
        }
@@ -1072,16 +1079,19 @@ void imap_do_fetch(int num_items, char **itemlist) {
  */
 void imap_macro_replace(char *str, char *find, char *replace) {
        char holdbuf[SIZ];
+       int findlen;
+
+       findlen = strlen(find);
 
-       if (!strncasecmp(str, find, strlen(find))) {
-               if (str[strlen(find)]==' ') {
-                       strcpy(holdbuf, &str[strlen(find)+1]);
+       if (!strncasecmp(str, find, findlen)) {
+               if (str[findlen]==' ') {
+                       strcpy(holdbuf, &str[findlen+1]);
                        strcpy(str, replace);
                        strcat(str, " ");
                        strcat(str, holdbuf);
                }
-               if (str[strlen(find)]==0) {
-                       strcpy(holdbuf, &str[strlen(find)+1]);
+               if (str[findlen]==0) {
+                       strcpy(holdbuf, &str[findlen+1]);
                        strcpy(str, replace);
                }
        }
@@ -1212,6 +1222,7 @@ void imap_pick_range(char *supplied_range, int is_uid) {
        char setstr[SIZ], lostr[SIZ], histr[SIZ];
        long lo, hi;
        char actual_range[SIZ];
+       struct citimap *Imap;
 
        /* 
         * Handle the "ALL" macro
@@ -1223,11 +1234,12 @@ void imap_pick_range(char *supplied_range, int is_uid) {
                safestrncpy(actual_range, supplied_range, sizeof actual_range);
        }
 
+       Imap = IMAP;
        /*
         * Clear out the IMAP_SELECTED flags for all messages.
         */
-       for (i = 0; i < IMAP->num_msgs; ++i) {
-               IMAP->flags[i] = IMAP->flags[i] & ~IMAP_SELECTED;
+       for (i = 0; i < Imap->num_msgs; ++i) {
+               Imap->flags[i] = Imap->flags[i] & ~IMAP_SELECTED;
        }
 
        /*
@@ -1249,16 +1261,16 @@ void imap_pick_range(char *supplied_range, int is_uid) {
                hi = atol(histr);
 
                /* Loop through the array, flipping bits where appropriate */
-               for (i = 1; i <= IMAP->num_msgs; ++i) {
+               for (i = 1; i <= Imap->num_msgs; ++i) {
                        if (is_uid) {   /* fetch by sequence number */
-                               if ( (IMAP->msgids[i-1]>=lo)
-                                  && (IMAP->msgids[i-1]<=hi)) {
-                                       IMAP->flags[i-1] |= IMAP_SELECTED;
+                               if ( (Imap->msgids[i-1]>=lo)
+                                  && (Imap->msgids[i-1]<=hi)) {
+                                       Imap->flags[i-1] |= IMAP_SELECTED;
                                }
                        }
                        else {          /* fetch by uid */
                                if ( (i>=lo) && (i<=hi)) {
-                                       IMAP->flags[i-1] |= IMAP_SELECTED;
+                                       Imap->flags[i-1] |= IMAP_SELECTED;
                                }
                        }
                }