예제 #1
0
파일: frm-tree.c 프로젝트: AlexKar/libetpan
static void print_message_list(mailsession * session)
{
  int r;
  struct mailmessage_list * env_list;
  struct mailmessage_tree * env_tree;
  unsigned int count;
  
  /* get the list of messages numbers of the folder */

  r = mailsession_get_messages_list(session, &env_list);
  if (r != MAIL_NO_ERROR) {
    printf("error message list\n");
    goto err;
  }

  /* get fields content of these messages */

  r = mailsession_get_envelopes_list(session, env_list);
  if (r != MAIL_NO_ERROR) {
    printf("error envelopes list\n");
    goto free_msg_list;
  }

  /* build threads */

  r = mail_build_thread(MAIL_THREAD_REFERENCES_NO_SUBJECT,
      DEST_CHARSET,
      env_list, &env_tree,
      mailthread_tree_timecomp);
  if (r != MAIL_NO_ERROR) {
    printf("can't build tree\n");
    goto free_msg_list;
  }

  /* display message tree */
  
  count = 0;
  display_tree(env_tree, &count);

  printf("  %i messages\n", count);

  /* free structure */

  mailmessage_tree_free_recursive(env_tree);
  mailmessage_list_free(env_list);

  return;

 free_msg_list:
  mailmessage_list_free(env_list);
 err:
  {}
}
예제 #2
0
static void print_message_list(mailsession * session)
{
  int r;
  uint32_t i;
  struct mailmessage_list * env_list;
  unsigned int count;
  
  /* get the list of messages numbers of the folder */

  r = mailsession_get_messages_list(session, &env_list);
  if (r != MAIL_NO_ERROR) {
    printf("error message list\n");
    goto err;
  }

  /* get fields content of these messages */

  r = mailsession_get_envelopes_list(session, env_list);
  if (r != MAIL_NO_ERROR) {
    printf("error envelopes list\n");
    goto free_msg_list;
  }

  /* display all the messages */
  
  count = 0;
  for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) {
    mailmessage * msg;
    
    msg = carray_get(env_list->msg_tab, i);

    if (msg->msg_fields == NULL) {
      printf("could not fetch envelope of message %i\n", i);
    }
    else {
      simple_print_mail_info(msg);
      count ++;
    }
  }
  printf("  %i messages\n", count);

  /* free structure */

  mailmessage_list_free(env_list);

  return;

 free_msg_list:
  mailmessage_list_free(env_list);
 err:
  {}
}
예제 #3
0
static int get_messages_list(mailsession * session,
    struct mailmessage_list ** result)
{
  struct maildir * md;
  int r;
  struct mailmessage_list * env_list;
  int res;

  md = get_maildir_session(session);
  if (md == NULL)
    return MAIL_ERROR_BAD_STATE;

  r = maildir_update(md);
  if (r != MAILDIR_NO_ERROR) {
    res = maildirdriver_maildir_error_to_mail_error(r);
    goto err;
  }

  r = maildir_get_messages_list(session, md,
      maildir_message_driver, &env_list);
  if (r != MAILDIR_NO_ERROR) {
    res = r;
    goto free_list;
  }

  * result = env_list;

  return MAIL_NO_ERROR;

 free_list:
  mailmessage_list_free(env_list);
 err:
  return res;
}
예제 #4
0
static void folder_free_msg_list(struct folder_ref_info * ref_info,
                                 struct mailmessage_list * env_list)
{
    unsigned int i;

    for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) {
        mailmessage * msg;
        int count;

        msg = carray_get(env_list->msg_tab, i);

        count = folder_message_unref(ref_info, msg);
    }
    carray_set_size(env_list->msg_tab, 0);
    mailmessage_list_free(env_list);
}
예제 #5
0
int maildriver_generic_search_messages(mailsession * session, char * charset,
    struct mail_search_key * key,
    struct mail_search_result ** result)
{
  int header;
  clist * list;
  struct mail_search_result * search_result;
  int r;
  struct mailmessage_list * env_list;
  int res;
  unsigned int i;

  header = is_search_header_only(key);

  r = mailsession_get_messages_list(session, &env_list);
  if (r != MAIL_NO_ERROR)
    return r;

  list = NULL;
  for(i = 0 ; i < carray_count(env_list->tab) ; i ++) {
    char * message;
    size_t length;
    struct mail_info * info;
    uint32_t flags;
    struct mailimf_fields * fields;
    size_t cur_token;

    info = carray_get(env_list->tab, i);

    if (!header) {
      r = mailsession_fetch_message(session, info->indx, &message, &length);
      if (r != MAIL_NO_ERROR) {
	res = r;
	goto free_list;
      }

      cur_token = 0;
      r = mailimf_optional_fields_parse(message, length,
					&cur_token, &fields);
      if (r != MAILIMF_NO_ERROR) {
	res = MAIL_ERROR_PARSE;
	goto free_list;
      }
    }
    else {
      char * msg_header;
      int r;
      size_t cur_token;
      size_t header_len;

      r = mailsession_fetch_message_header(session, info->indx, &msg_header,
					   &header_len);
      if (r != MAIL_NO_ERROR) {
	res = r;
	goto free_list;
      }

      message = NULL;
      cur_token = 0;
      r = mailimf_optional_fields_parse(msg_header, header_len,
					&cur_token, &fields);
      if (r != MAILIMF_NO_ERROR) {
	res = MAIL_ERROR_PARSE;
	goto free_list;
      }

      mailsession_fetch_result_free(session, msg_header);
    }

    r = mailsession_get_message_flags(session, info->indx, &flags);
    if (r != MAIL_NO_ERROR) {
      res = r;
      goto free_list;
    }

    if (match_messages(message, info->size, fields, flags,
		       charset, key)) {
      uint32_t * pnum;

      pnum = malloc(sizeof(* pnum));
      if (pnum == NULL) {
	if (message != NULL)
	  mailsession_fetch_result_free(session, message);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      * pnum = info->indx;

      r = clist_append(list, pnum);
      if (r < 0) {
	free(pnum);
	if (message != NULL)
	  mailsession_fetch_result_free(session, message);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }
    }

    if (message != NULL)
      mailsession_fetch_result_free(session, message);
  }

  search_result =  mail_search_result_new(list);
  if (search_result == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free_list;
  }

  * result = search_result;

  return MAIL_NO_ERROR;

 free_list:
  clist_foreach(list, (clist_func) free, NULL);
  clist_free(list);
  mailmessage_list_free(env_list);
  return res;
}
예제 #6
0
static int folder_update_msg_list(struct folder_ref_info * ref_info,
                                  struct mailmessage_list ** p_new_msg_list,
                                  struct mailmessage_list ** p_lost_msg_list)
{
    int r;
    int res;
    struct mailmessage_list * new_env_list;
    unsigned int i;
    carray * lost_msg_tab;
    struct mailmessage_list * lost_msg_list;
    unsigned int free_start_index;
    chashiter * iter;
    unsigned int lost_count;

    r = mailfolder_get_messages_list(ref_info->folder, &new_env_list);
    if (r != MAIL_NO_ERROR) {
        res = r;
        goto err;
    }

    for(iter = chash_begin(ref_info->msg_hash) ; iter != NULL ;
            iter = chash_next(ref_info->msg_hash, iter)) {
        struct message_ref_elt * msg_ref;
        chashdatum data;

        chash_value(iter, &data);
        msg_ref = data.data;
        msg_ref->lost = 1;
    }

    lost_count = chash_count(ref_info->msg_hash);

    for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) {
        mailmessage * msg;
        mailmessage * old_msg;

        msg = carray_get(new_env_list->msg_tab, i);

        if (msg->msg_uid == NULL)
            continue;

        old_msg = folder_info_get_msg_by_uid(ref_info, msg->msg_uid);
        if (old_msg != NULL) {
            struct message_ref_elt * msg_ref;

            /* replace old message */
            old_msg->msg_index = msg->msg_index;
            carray_set(new_env_list->msg_tab, i, old_msg);
            mailmessage_free(msg);

            msg_ref = folder_info_get_msg_ref(ref_info, old_msg);
            msg_ref->lost = 0;
            lost_count --;
        }
        else {
            /* set new message */
            r = folder_message_add(ref_info, msg);
            if (r != MAIL_NO_ERROR) {
                free_start_index = i;
                res = r;
                goto free_remaining;
            }
        }
    }

    /* build the table of lost messages */
    lost_msg_tab = carray_new(lost_count);
    if (lost_msg_tab == NULL) {
        res = MAIL_ERROR_MEMORY;
        goto free_env_list;
    }

    carray_set_size(lost_msg_tab, lost_count);

    i = 0;
    for(iter = chash_begin(ref_info->msg_hash) ; iter != NULL ;
            iter = chash_next(ref_info->msg_hash, iter)) {
        struct message_ref_elt * msg_ref;
        chashdatum key;
        chashdatum value;
        mailmessage * msg;

        chash_key(iter, &key);
        memcpy(&msg, key.data, sizeof(msg));

        chash_value(iter, &value);
        msg_ref = value.data;
        if (msg_ref->lost) {
            carray_set(lost_msg_tab, i, msg);
            i ++;
        }
    }

    lost_msg_list = mailmessage_list_new(lost_msg_tab);
    if (lost_msg_list == NULL) {
        res = MAIL_ERROR_MEMORY;
        goto free_lost_msg_tab;
    }

    /* reference messages */
    for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) {
        mailmessage * msg;

        msg = carray_get(new_env_list->msg_tab, i);
        folder_message_ref(ref_info, msg);
    }

    * p_new_msg_list = new_env_list;
    * p_lost_msg_list = lost_msg_list;

    return MAIL_NO_ERROR;

free_lost_msg_tab:
    carray_free(lost_msg_tab);
free_env_list:
    for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) {
        mailmessage * msg;
        struct message_ref_elt * msg_ref;

        msg = carray_get(new_env_list->msg_tab, i);
        msg_ref = folder_info_get_msg_ref(ref_info, msg);
        if (msg_ref != NULL) {
            if (msg_ref->ref_count == 0)
                folder_message_remove(ref_info, msg);
        }
    }
    carray_set_size(new_env_list->msg_tab, 0);
    mailmessage_list_free(new_env_list);
    goto err;
free_remaining:
    for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) {
        mailmessage * msg;
        struct message_ref_elt * msg_ref;

        msg = carray_get(new_env_list->msg_tab, i);
        msg_ref = folder_info_get_msg_ref(ref_info, msg);
        if (msg_ref != NULL) {
            if (msg_ref->ref_count == 0)
                folder_message_remove(ref_info, msg);
        }
    }
    for(i = free_start_index ; i < carray_count(new_env_list->msg_tab) ; i ++) {
        mailmessage * msg;

        msg = carray_get(new_env_list->msg_tab, i);
        mailmessage_free(msg);
    }
    carray_set_size(new_env_list->msg_tab, 0);
    mailmessage_list_free(new_env_list);
err:
    return res;
}