コード例 #1
0
static int mbox_initialize(mailmessage * msg_info)
{
  struct generic_message_t * msg;
  int r;
  char * uid;
  char static_uid[PATH_MAX];
  struct mailmbox_msg_info * info;
  struct mailmbox_folder * folder;
  int res;
  chashdatum key;
  chashdatum data;

  folder = get_mbox_session(msg_info);
  if (folder == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }
    
  key.data = (char *) &msg_info->msg_index;
  key.len = sizeof(msg_info->msg_index);
  
  r = chash_get(folder->mb_hash, &key, &data);
  if (r < 0) {
    res = MAIL_ERROR_MSG_NOT_FOUND;
    goto err;
  }
  
  info = (struct mailmbox_msg_info *) data.data;
  
  snprintf(static_uid, PATH_MAX, "%u-%lu",
      msg_info->msg_index, (unsigned long) info->msg_body_len);
  uid = strdup(static_uid);
  if (uid == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  
  r = mailmessage_generic_initialize(msg_info);
  if (r != MAIL_NO_ERROR) {
    free(uid);
    res = r;
    goto err;
  }

  msg = msg_info->msg_data;

  msg->msg_prefetch = mbox_prefetch;
  msg->msg_prefetch_free = mbox_prefetch_free;
  msg_info->msg_uid = uid;

  return MAIL_NO_ERROR;

 err:
  return res;
}
コード例 #2
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int mboxdriver_remove_message(mailsession * session, uint32_t num)
{
  int r;
  struct mailmbox_folder * folder;

  folder = get_mbox_session(session);
  if (folder == NULL)
    return MAIL_ERROR_DELETE;

  r = mailmbox_delete_msg(folder, num);

  return mboxdriver_mbox_error_to_mail_error(r);
}
コード例 #3
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int mboxdriver_get_messages_list(mailsession * session,
					struct mailmessage_list ** result)
{
  struct mailmbox_folder * folder;
  int res;

  folder = get_mbox_session(session);
  if (folder == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }

  return mbox_get_messages_list(folder, session, mbox_message_driver, result);

 err:
  return res;
}
コード例 #4
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int mboxdriver_get_message_by_uid(mailsession * session,
    const char * uid,
    mailmessage ** result)
{
  uint32_t num;
  char * p;
  chashdatum key;
  chashdatum data;
  struct mailmbox_msg_info * info;
  struct mailmbox_folder * folder;
  int r;

  if (uid == NULL)
    return MAIL_ERROR_INVAL;

  num = strtoul(uid, &p, 10);
  if (p == uid || * p != '-')
    return MAIL_ERROR_INVAL;

  folder = get_mbox_session(session);
  if (folder == NULL)
    return MAIL_ERROR_BAD_STATE;

  key.data = &num;
  key.len = sizeof(num);

  r = chash_get(folder->mb_hash, &key, &data);
  if (r == 0) {
    char * body_len_p = p + 1;
    size_t body_len;

    info = data.data;
    /* Check if the cached message has the same UID */
    body_len = strtoul(body_len_p, &p, 10);
    if (p == body_len_p || * p != '\0')
      return MAIL_ERROR_INVAL;

    if (body_len == info->msg_body_len)
      return mboxdriver_get_message(session, num, result);
  }

  return MAIL_ERROR_MSG_NOT_FOUND;
}
コード例 #5
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int mboxdriver_append_message(mailsession * session,
				     const char * message, size_t size)
{
  int r;
  struct mailmbox_folder * folder;

  folder = get_mbox_session(session);
  if (folder == NULL)
    return MAIL_ERROR_APPEND;

  r = mailmbox_append_message(folder, message, size);

  switch (r) {
  case MAILMBOX_ERROR_FILE:
    return MAIL_ERROR_DISKSPACE;
  default:
    return mboxdriver_mbox_error_to_mail_error(r);
  }
}
コード例 #6
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int mboxdriver_messages_number(mailsession * session, const char * mb,
				      uint32_t * result)
{
  struct mailmbox_folder * folder;
  int r;
  UNUSED(mb);

  folder = get_mbox_session(session);
  if (folder == NULL)
    return MAIL_ERROR_STATUS;

  r = mailmbox_validate_read_lock(folder);
  if (r != MAIL_NO_ERROR)
    return r;

  mailmbox_read_unlock(folder);

  * result = carray_count(folder->mb_tab) - folder->mb_deleted_count;

  return MAILMBOX_NO_ERROR;
}
コード例 #7
0
ファイル: mboxdriver.c プロジェクト: lysannschlegel/libetpan
static int
mboxdriver_get_envelopes_list(mailsession * session,
			      struct mailmessage_list * env_list)
{
  struct mailmbox_folder * folder;
  unsigned int i;
  int r;
  int res;

  folder = get_mbox_session(session);
  if (folder == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }

  r = mailmbox_validate_read_lock(folder);
  if (r != MAILMBOX_NO_ERROR) {
    res = mboxdriver_mbox_error_to_mail_error(r);
    goto err;
  }

  for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) {
    mailmessage * msg;
    struct mailimf_fields * fields;
    char * headers;
    size_t headers_len;
    size_t cur_token;

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

    if (msg->msg_fields != NULL)
      continue;

    r = mailmbox_fetch_msg_headers_no_lock(folder,
        msg->msg_index, &headers, &headers_len);
    if (r != MAILMBOX_NO_ERROR) {
      res = mboxdriver_mbox_error_to_mail_error(r);
      goto unlock;
    }

    cur_token = 0;
    r = mailimf_envelope_fields_parse(headers, headers_len,
				      &cur_token, &fields);

    if (r != MAILIMF_NO_ERROR)
      continue;

    msg->msg_fields = fields;
  }

  mailmbox_read_unlock(folder);

  return MAIL_NO_ERROR;

 unlock:
  mailmbox_read_unlock(folder);
 err:
  return res;
}
コード例 #8
0
static int mbox_get_flags(mailmessage * msg_info,
			  struct mail_flags ** result)
{
  int r;
  struct mail_flags * flags;
  struct mail_cache_db * cache_db_flags;
  char filename_flags[PATH_MAX];
  int res;
  struct mbox_cached_session_state_data * cached_data;
  MMAPString * mmapstr;
  struct mailmbox_folder * folder;

  if (msg_info->msg_flags != NULL) {
    * result = msg_info->msg_flags;
    
    return MAIL_NO_ERROR;
  }

  flags = mail_flags_store_get(get_cached_session_data(msg_info)->mbox_flags_store,
      msg_info->msg_index);

  if (flags == NULL) {
    folder = get_mbox_session(msg_info);
    if (folder == NULL) {
      res = MAIL_ERROR_BAD_STATE;
      goto err;
    }
    
    cached_data = get_cached_session_data(msg_info);
    if (cached_data->mbox_quoted_mb == NULL) {
      res = MAIL_ERROR_BAD_STATE;
      goto err;
    }
    
    snprintf(filename_flags, PATH_MAX, "%s/%s/%s",
        cached_data->mbox_flags_directory,
        cached_data->mbox_quoted_mb, FLAGS_NAME);
    
    r = mail_cache_db_open_lock(filename_flags, &cache_db_flags);
    if (r < 0) {
      res = MAIL_ERROR_FILE;
      goto err;
    }
    
    mmapstr = mmap_string_new("");
    if (mmapstr == NULL) {
      res = MAIL_ERROR_MEMORY;
      goto close_db_flags;
    }
    
    if (msg_info->msg_index > folder->mb_written_uid) {
      flags = mail_flags_new_empty();
    }
    else {
      r = mboxdriver_get_cached_flags(cache_db_flags, mmapstr,
          msg_info->msg_session,
          msg_info->msg_index, &flags);
      if (r != MAIL_NO_ERROR) {
	flags = mail_flags_new_empty();
	if (flags == NULL) {
	  res = MAIL_ERROR_MEMORY;
	  goto free_mmapstr;
	}
      }
    }

    mmap_string_free(mmapstr);
    mail_cache_db_close_unlock(filename_flags, cache_db_flags);
  }
  
  msg_info->msg_flags = flags;

  * result = flags;

  return MAIL_NO_ERROR;

 free_mmapstr:
  mmap_string_free(mmapstr);
 close_db_flags:
  mail_cache_db_close_unlock(filename_flags, cache_db_flags);
 err:
  return res;
}