Exemplo n.º 1
0
static int match_messages(char * message,
    size_t size,
    struct mailimf_fields * fields,
    int32_t flags,
    char * charset,
    struct mail_search_key * key)
{
  clistiter * cur;
  size_t length;
  size_t cur_token;
  int r;

  switch (key->type) {

    /* flags */
  case MAIL_SEARCH_KEY_ANSWERED:
    return ((flags & MAIL_FLAG_ANSWERED) != 0);

  case MAIL_SEARCH_KEY_FLAGGED:
    return ((flags & MAIL_FLAG_FLAGGED) != 0);

  case MAIL_SEARCH_KEY_DELETED:
    return ((flags & MAIL_FLAG_DELETED) != 0);

  case MAIL_SEARCH_KEY_RECENT:
    return ((flags & MAIL_FLAG_NEW) != 0) &&
      ((flags & MAIL_FLAG_SEEN) == 0);

  case MAIL_SEARCH_KEY_SEEN:
    return ((flags & MAIL_FLAG_SEEN) != 0);

  case MAIL_SEARCH_KEY_NEW:
    return ((flags & MAIL_FLAG_NEW) != 0);

  case MAIL_SEARCH_KEY_OLD:
    return ((flags & MAIL_FLAG_NEW) == 0);

  case MAIL_SEARCH_KEY_UNANSWERED:
    return ((flags & MAIL_FLAG_ANSWERED) == 0);

  case MAIL_SEARCH_KEY_UNDELETED:
    return ((flags & MAIL_FLAG_DELETED) == 0);

  case MAIL_SEARCH_KEY_UNFLAGGED:
    return ((flags & MAIL_FLAG_FLAGGED) == 0);

  case MAIL_SEARCH_KEY_UNSEEN:
    return ((flags & MAIL_FLAG_SEEN) == 0);

    /* headers */
  case MAIL_SEARCH_KEY_BCC:
    return match_header(fields, "Bcc", key->bcc);

  case MAIL_SEARCH_KEY_CC:
    return match_header(fields, "Cc", key->cc);

  case MAIL_SEARCH_KEY_FROM:
    return match_header(fields, "From", key->from);

  case MAIL_SEARCH_KEY_SUBJECT:
    return match_header(fields, "Subject", key->subject);

  case MAIL_SEARCH_KEY_TO:
    return match_header(fields, "To", key->to);

  case MAIL_SEARCH_KEY_HEADER:
    return match_header(fields, key->header_name, key->header_value);

    /* date */
  case MAIL_SEARCH_KEY_BEFORE:
    return (comp_date(fields, key->before) <= 0);

  case MAIL_SEARCH_KEY_ON:
    return (comp_date(fields, key->before) == 0);

  case MAIL_SEARCH_KEY_SINCE:
    return (comp_date(fields, key->before) >= 0);
    
    /* boolean */
  case MAIL_SEARCH_KEY_NOT:
    return (!match_messages(message, size, fields, flags, charset, key->not));
  case MAIL_SEARCH_KEY_OR:
    return (match_messages(message, size, fields, flags, charset, key->or1) ||
	    match_messages(message, size, fields, flags, charset, key->or2));

  case MAIL_SEARCH_KEY_MULTIPLE:
    for(cur = clist_begin(key->multiple) ; cur != NULL ;
        cur = clist_next(cur)) {
      if (!match_messages(message, size, fields, flags, charset,
              clist_content(cur)))
	return FALSE;
    }

    return TRUE;

    /* size */
  case MAIL_SEARCH_KEY_SMALLER:
    return (size <= key->smaller);

  case MAIL_SEARCH_KEY_LARGER:
    return (size >= key->larger);

  case MAIL_SEARCH_KEY_BODY:
    length = strlen(message);

    cur_token = 0;
    while (1) {
      r = mailimf_ignore_field_parse(message, length, &cur_token);
      if (r == MAILIMF_NO_ERROR) {
	/* do nothing */
      }
      else
	break;
    }

    return (strstr(message + cur_token, key->body) != NULL);

  case MAIL_SEARCH_KEY_TEXT:
    return (strstr(message, key->body) != NULL);
    
  case MAIL_SEARCH_KEY_ALL:
  default:
    return TRUE;
  }
}
int get_week(date &start,date &rear)
{
    int flag=comp_date(start,rear);
    if(flag>0)
    {
        int total_day=0;
        //start target to start 1/1
        if(start.year>rear.year)
        {
            //complete month
            for(int mi=1;mi<=start.month-1;mi++)
            {
                total_day+=month_day[mi];
                //leap year
                if(mi==2&&is_leap(start.year)) total_day+=1; 
                //special cover the non-existent days
                if(start.year==1582&&mi==10) total_day-=10;
                if(start.year==1752&&mi==9) total_day-=11;
            }
            //complete day
            for(int di=1;di<=start.day-1;di++) total_day++;
            //special cover the non-existent days
            if(start.year==1582&&start.month==10&&start.day>=15&&1<=4) total_day-=10;
            if(start.year==1752&&start.month==9&&start.day>=14&&1<=2) total_day-=11;
        }
        else if(start.year==rear.year)//the dis days is on the same year
        {
            //front
            if(start.month>rear.month)
            {
                for(int di=1;di<=start.day-1;di++) total_day++;
                //special cover the non-existent days
                if(start.year==1582&&start.month==10&&start.day>=15&&1<=4) total_day-=10;
                if(start.year==1752&&start.month==9&&start.day>=14&&1<=2) total_day-=11;
            }
            else if(start.month==rear.month)
            {
                for(int di=start.day-1;di>=rear.day;di--) total_day++;
                //special cover the non-existent days
                if(start.year==1582&&start.month==10&&start.day>=15&&rear.day<=4) total_day-=10;
                if(start.year==1752&&start.month==9&&start.day>=14&&rear.day<=2) total_day-=11;
            }
            //middle
            if(start.month-1>rear.month)
            {
                for(int mi=start.month-1;mi>=rear.month+1;mi--)
                {
                    total_day+=month_day[mi];
                    //leap
                    if(mi==2&&is_leap(start.year)) total_day+=1;
                    //special cover the non-existent days
                    if(start.year==1582&&mi==10) total_day-=10;
                    if(start.year==1752&&mi==9) total_day-=11;
                }
            }
            //rear
            if(start.month>rear.month)
            {
                for(int di=month_day[rear.month];di>=rear.day;di--) total_day++;
                //leap
                if(is_leap(rear.year)&&rear.month==2) total_day+=1;
                //special cover the non-existent days
                if(rear.year==1582&&rear.month==10&&rear.day<=4&&month_day[rear.month]>=15) total_day-=10;
                if(rear.year==1752&&rear.month==9&&rear.day<=2&&month_day[rear.month]>=14) total_day-=11;
            }
        }
        //start to end  complete year
        if(start.year-1>rear.year)
        {
            for(int yi=start.year-1;yi>=rear.year+1;yi--) 
            {
                total_day+=is_leap(yi)? 366 : 365;
                //special cover the non-existent days
                if(yi==1582) total_day-=10;
                if(yi==1752) total_day-=11;
            }
        }
        //end 12/31 to end target
        if(start.year>rear.year)
        {
            for(int mi=12;mi>=rear.month+1;mi--)
            {
                total_day+=month_day[mi];
                //leap
                if(is_leap(rear.year)&&mi==2) total_day+=1;
                //special cover the non-existent days
                if(start.year==1582&&mi==10) total_day-=10;
                if(start.year==1752&&mi==9) total_day-=11;
            }
            for(int di=month_day[rear.month];di>=rear.day;di--) total_day++;
            //leap
            if(is_leap(rear.year)&&rear.month==2) total_day+=1;
            //special cover the non-existent days
            if(rear.year==1582&&rear.month==10&&rear.day<=4&&month_day[rear.month]>=15) total_day-=10;
            if(rear.year==1752&&rear.month==9&&rear.day<=2&&month_day[rear.month]>=14) total_day-=11;
        }
        //calculate the rear's week according to total days
        rear.week=week_mod(week_sub(start.week,week_mod(total_day,7)),7);
    }
    else if(flag<0)
    {
        int total_day=0;
        //start target to end 12/31 the start.day is not in total days not in Dis
        if(start.year<rear.year)
        {
            //complete day
            for(int di=start.day+1;di<=month_day[start.month];di++) total_day++;
            //leap
            if(is_leap(start.year)&&start.month==2) total_day+=1;
            //special cover the non-existent days
            if(start.year==1582&&start.month==10&&month_day[start.month]>=15&&start.day<=4) total_day-=10;
            if(start.year==1752&&start.month==9&&month_day[start.month]>=14&&start.day<=2) total_day-=11;
            //complete month
            for(int mi=start.month+1;mi<=12;mi++)
            {
                total_day+=month_day[mi];
                //leap
                if(is_leap(start.month)&&mi==2) total_day+=1;
                //special cover the non-existent days
                if(start.year==1582&&mi==10) total_day-=10;
                if(start.year==1752&&mi==9) total_day-=11;
            }
        }
        else if(start.year==rear.year)//the dis days is on the same year
        {
            //front
            if(start.month<rear.month)
            {
                for(int di=start.day+1;di<=month_day[start.month];di++) total_day++;
                //leap
                if(is_leap(start.year)&&start.month==2) total_day+=1;
                //special cover the non-existent days
                if(start.year==1582&&start.month==10&&month_day[start.month]>=15&&start.day<=4) total_day-=10;
                if(start.year==1752&&start.month==9&&month_day[start.month]>=14&&start.day<=2) total_day-=11;
            }
            else if(start.month==rear.month)
            {
                for(int di=start.day+1;di<=rear.day;di++) total_day++;
                //special cover the non-existent days
                if(start.year==1582&&start.month==10&&rear.day>=15&&start.day<=4) total_day-=10;
                if(start.year==1752&&start.month==9&&rear.day>=14&&start.day<=2) total_day-=11;
            }
            //middle
            if(start.month+1<rear.month)
            {
                for(int mi=start.month+1;mi<=rear.month-1;mi++)
                {
                    total_day+=month_day[mi];
                    //leap
                    if(is_leap(start.year)&&mi==2) total_day+=1;
                    //special cover the non-existent days
                    if(start.year==1582&&mi==10) total_day-=10;
                    if(start.year==1752&&mi==9) total_day-=11;
                }
            }
            //rear
            if(start.month<rear.month)
            {
                for(int di=1;di<=rear.day;di++) total_day++;
                //special cover the non-existent days
                if(rear.year==1582&&rear.month==10&&1<=4&&rear.day>=15) total_day-=10;
                if(rear.year==1752&&rear.month==9&&1<=2&&rear.day>=14) total_day-=11;
            }
        }
        //start to end  complete year
        if(start.year+1<rear.year)
        {
            for(int yi=start.year+1;yi<=rear.year-1;yi++) 
            {
                total_day+=is_leap(yi)? 366 : 365;
                //special cover the non-existent days
                if(yi==1582) total_day-=10;
                if(yi==1752) total_day-=11;
            }
        }
        //end 12/31 to end target
        if(start.year<rear.year)
        {
            for(int mi=1;mi<=rear.month-1;mi++)
            {
                total_day+=month_day[mi];
                //leap
                if(is_leap(rear.year)&&mi==2) total_day+=1;
                //special cover the non-existent days
                if(start.year==1582&&mi==10) total_day-=10;
                if(start.year==1752&&mi==9) total_day-=11;
            }
            for(int di=1;di<=rear.day;di++) total_day++;
            //special cover the non-existent days
            if(rear.year==1582&&rear.month==10&&1<=4&&rear.day>=15) total_day-=10;
            if(rear.year==1752&&rear.month==9&&1<=2&&rear.day>=14) total_day-=11;
        }
        //calculate the rear's week according to total days
        rear.week=week_mod(week_add(start.week,week_mod(total_day,7)),7);
    }
    else//start == rear
    {
        rear.week=start.week;
    }
    return(0);
}