/[imapfilter]/imapfilter/match.c
ViewVC logotype

Diff of /imapfilter/match.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by lefcha, Thu Jul 31 15:46:02 2003 UTC revision 1.1.2.1 by lefcha, Sat Nov 8 16:59:54 2003 UTC
# Line 15  int match_filter(filter_t * filter, char Line 15  int match_filter(filter_t * filter, char
15    
16  char *generate_filter_and(mask_t * mask, unsigned int masknum, unsigned int masklen);  char *generate_filter_and(mask_t * mask, unsigned int masknum, unsigned int masklen);
17  char *generate_filter_or(mask_t * mask, unsigned int masknum, unsigned int masklen);  char *generate_filter_or(mask_t * mask, unsigned int masknum, unsigned int masklen);
18    char *normalize_mask(char *body);
19    void convert_date(char *body);
20    
21  void empty_fifo(mask_t ** mfifo);  void empty_fifo(mask_t ** mfifo);
22  void queue_fifo(mask_t ** mfifo, mask_t * mask);  void queue_fifo(mask_t ** mfifo, mask_t * mask);
# Line 117  generate_filter_and(mask_t * mask, unsig Line 119  generate_filter_and(mask_t * mask, unsig
119                          strncat(search, "OR (", searchbuf - len - 1);                          strncat(search, "OR (", searchbuf - len - 1);
120                          len += 4;                          len += 4;
121    
122                          strncat(search, tmp->body, searchbuf - len - 1);                          strncat(search, normalize_mask(tmp->body),
123                                searchbuf - len - 1);
124                          len = strlen(search);                          len = strlen(search);
125                          search[len] = ' ';                          search[len] = ' ';
126                          search[++len] = '\0';                          search[++len] = '\0';
# Line 130  generate_filter_and(mask_t * mask, unsig Line 133  generate_filter_and(mask_t * mask, unsig
133                              mask->next->type != MASK_TYPE_OR) {                              mask->next->type != MASK_TYPE_OR) {
134                                  search[len] = '(';                                  search[len] = '(';
135                                  search[++len] = '\0';                                  search[++len] = '\0';
136                                  strncat(search, mask->body,                                  strncat(search, normalize_mask(mask->body),
137                                      searchbuf - len - 1);                                      searchbuf - len - 1);
138                                  len = strlen(search);                                  len = strlen(search);
139                                  search[len] = ')';                                  search[len] = ')';
# Line 139  generate_filter_and(mask_t * mask, unsig Line 142  generate_filter_and(mask_t * mask, unsig
142                                  mask = mask->next;                                  mask = mask->next;
143                          }                          }
144                  } else {                  } else {
145                          strncat(search, tmp->body, searchbuf - len - 1);                          strncat(search, normalize_mask(tmp->body),
146                                searchbuf - len - 1);
147                          len = strlen(search);                          len = strlen(search);
148                          search[len] = ' ';                          search[len] = ' ';
149                          search[++len] = '\0';                          search[++len] = '\0';
# Line 199  generate_filter_or(mask_t * mask, unsign Line 203  generate_filter_or(mask_t * mask, unsign
203                          search[++len] = '\0';                          search[++len] = '\0';
204                  }                  }
205                  while ((mf = dequeue_fifo(mfifo)) != NULL) {                  while ((mf = dequeue_fifo(mfifo)) != NULL) {
206                          strncat(search, mf->body, searchbuf - len - 1);                          strncat(search, normalize_mask(mf->body), searchbuf - len - 1);
207                          len = strlen(search);                          len = strlen(search);
208                          search[len] = ' ';                          search[len] = ' ';
209                          search[++len] = '\0';                          search[++len] = '\0';
# Line 222  generate_filter_or(mask_t * mask, unsign Line 226  generate_filter_or(mask_t * mask, unsign
226    
227    
228  /*  /*
229     * Make any necessary conversions to the mask body before sending it to server.
230     */
231    char *
232    normalize_mask(char *body)
233    {
234            static char nb[MASK_BODY_LEN];
235    
236    
237            if (strstr(body, "OLDER") ||
238                strstr(body, "NEWER")) {
239                    xstrncpy(nb, body, MASK_BODY_LEN - 1);
240                    convert_date(nb);
241    
242                    return nb;
243            }
244            return body;
245    }
246    
247    
248    /*
249     * Converts masks related to date filtering, because IMAP servers do not
250     * understand for example "OLDER 3", but "BEFORE 18-Oct-2001" (if
251     * hypothetically current date was 21-Oct-2001).
252     */
253    void
254    convert_date(char *body)
255    {
256            char *cp, *c;
257            char s[16];
258            time_t te;
259            struct tm *tl;
260    
261            cp = xstrdup(body);
262            body[0] = '\0';
263    
264            if (strstr(cp, "NOT"))
265                    strncat(body, "NOT ", 4);
266    
267            if ((c = strstr(cp, "OLDER")))
268                    strncat(body, "BEFORE ", 7);
269            else if ((c = strstr(cp, "NEWER")))
270                    strncat(body, "SINCE ", 6);
271    
272            c += 6;
273    
274            te = time(NULL) - (time_t) (strtoul(c, NULL, 10) * 24 * 60 * 60);
275            tl = localtime(&te);
276    
277            if (strftime(s, 15, "%d-%b-%Y", tl))
278                    strncat(body, s, 15);
279    
280            xfree(cp);
281    }
282    
283    
284    
285    
286    
287    
288    /*
289   * Empty the FIFO inventory.   * Empty the FIFO inventory.
290   */   */
291  void  void

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.2.1

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26