コード例 #1
0
ファイル: feeddriver.c プロジェクト: AlexandrPonomarev/Gmail
static int feeddriver_get_messages_list(mailsession * session,
    struct mailmessage_list ** result)
{
  unsigned int i;
  struct feed_session_state_data * data;
  unsigned int count;
  struct mailmessage_list * msg_list;
  carray * tab;
  int res;
  int r;
  
  update(session);
  data = get_data(session);
  if (data->feed_error != MAIL_NO_ERROR) {
    res = data->feed_error;
    goto err;
  }
  
  count = newsfeed_item_list_get_count(data->feed_session);
  
  tab = carray_new(count);
  if (tab == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  fprintf(stderr, "count: %i\n", count);
  
  for(i = 0 ; i < count ; i ++) {
    struct newsfeed_item * item;
    mailmessage * msg;
    
    item = newsfeed_get_item(data->feed_session, i);
    msg = feed_item_to_message(session, i, item);
    r = carray_add(tab, msg, NULL);
    if (r < 0) {
      res = MAIL_ERROR_MEMORY;
      goto free_tab;
    }
  }
  
  msg_list = mailmessage_list_new(tab);
  if (msg_list == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free_tab;
  }
  
  * result = msg_list;
  
  return MAIL_NO_ERROR;
  
 free_tab:
  for(i = 0 ; i < carray_count(tab) ; i ++) {
    mailmessage * msg;
    
    msg = carray_get(tab, i);
    mailmessage_free(msg);
  }
 err:
  return res;
}
コード例 #2
0
ファイル: mailengine.c プロジェクト: pencilcheck/etPanKit
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;
}
コード例 #3
0
ファイル: nntpdriver_tools.c プロジェクト: baiwyc119/etPanKit
int nntp_get_messages_list(mailsession * nntp_session,
                           mailsession * session,
                           mailmessage_driver * driver,
                           struct mailmessage_list ** result)
{
    carray * tab;
    struct mailmessage_list * env_list;
    uint32_t i;
    int res;
    int r;
    struct nntp_session_state_data * data;
    struct newsnntp_group_info * group_info;
    uint32_t max;
    unsigned int cur;

    data = session_get_data(nntp_session);

    if (data->nntp_group_name == NULL) {
        res = MAIL_ERROR_BAD_STATE;
        goto err;
    }

    r = nntpdriver_select_folder(nntp_session, data->nntp_group_name);
    if (r != MAIL_NO_ERROR) {
        res = r;
        goto err;
    }

    group_info = data->nntp_group_info;

    if (group_info == NULL) {
        res = MAIL_ERROR_BAD_STATE;
        goto err;
    }

    max = group_info->grp_first;
    if (data->nntp_max_articles != 0) {
        if (group_info->grp_last - data->nntp_max_articles + 1 > max)
            max = group_info->grp_last - data->nntp_max_articles + 1;
    }

    tab = carray_new(128);
    if (tab == NULL) {
        res = MAIL_ERROR_MEMORY;
        goto err;
    }

    for(i = max ; i <= group_info->grp_last ; i++) {
        mailmessage * msg;

        msg = mailmessage_new();
        if (msg == NULL) {
            res = MAIL_ERROR_MEMORY;
            goto free_list;
        }

        r = mailmessage_init(msg, session, driver, i, 0);
        if (r != MAIL_NO_ERROR) {
            mailmessage_free(msg);
            res = r;
            goto free_list;
        }

        r = carray_add(tab, msg, NULL);
        if (r < 0) {
            mailmessage_free(msg);
            res = MAIL_ERROR_MEMORY;
            goto free_list;
        }
    }

    env_list = mailmessage_list_new(tab);
    if (env_list == NULL) {
        res = MAIL_ERROR_MEMORY;
        goto free_list;
    }

    * result = env_list;

    return MAIL_NO_ERROR;

free_list:
    for(cur = 0 ; cur < carray_count(tab) ; cur ++)
        mailmessage_free(carray_get(tab, cur));
    carray_free(tab);
err:
    return res;
}
コード例 #4
0
ファイル: dbdriver.c プロジェクト: mralexgray/etPanKit
static int get_messages_list(mailsession * session,
    struct mailmessage_list ** result)
{
  int r;
  char key[PATH_MAX];
  struct mail_cache_db * maildb;
  struct db_session_state_data * data;
  int res;
  carray * msglist;
  unsigned int i;
  carray * msgtab;
  struct mailmessage_list * driver_msglist;
  
  data = get_data(session);
  
  r = mail_cache_db_open_lock(data->db_filename, &maildb);
  if (r < 0) {
    res = MAIL_ERROR_FILE;
    goto err;
  }
  
  r = db_get_message_list(maildb, &msglist);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto close_db;
  }
  
  msgtab = carray_new(16);
  if (msgtab == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto close_db;
  }
  
  for(i = 0 ; i < carray_count(msglist) ; i ++) {
    uint32_t msg_num;
    uint32_t * pmsg_num;
    mailmessage * msg;
    size_t size;
    
    pmsg_num = carray_get(msglist, i);
    msg_num = * pmsg_num;
    free(pmsg_num);
    carray_set(msglist, i, NULL);
    
    snprintf(key, sizeof(key), "%lu", (unsigned long) msg_num);
    r = mail_cache_db_get_size(maildb, key, strlen(key), &size);
    if (r < 0) {
      continue;
    }
    
    msg = mailmessage_new();
    if (msg == NULL) {
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }
    
    r = mailmessage_init(msg, session, db_message_driver,
        msg_num, size);
    if (r != MAIL_NO_ERROR) {
      mailmessage_free(msg);
      res = r;
      goto free_list;
    }
    
    r = carray_add(msgtab, msg, NULL);
    if (r < 0) {
      mailmessage_free(msg);
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }
  }
  carray_free(msglist);
  
  driver_msglist = mailmessage_list_new(msgtab);
  if (driver_msglist == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free_list;
  }
  
  mail_cache_db_close_unlock(data->db_filename, maildb);
  
  * result = driver_msglist;
  
  return MAIL_NO_ERROR;
  
 free_list:
  for(i = 0 ; i < carray_count(msgtab) ; i ++) {
    mailmessage * msg;
    
    msg = carray_get(msgtab, i);
    mailmessage_free(msg);
  }
  carray_free(msgtab);
  
  for(i = 0 ; i < carray_count(msglist) ; i ++) {
    uint32_t * msg;
    
    msg = carray_get(msglist, i);
    if (msg != NULL)
      free(msg);
  }
  carray_free(msglist);
 close_db:
  mail_cache_db_close_unlock(data->db_filename, maildb);
 err:
  return res;
}