Exemple #1
0
static int get_list_folders(struct mailmh_folder * folder, clist ** result)
{
  unsigned int i;
  clist * list;
  char * new_filename;
  int res;
  int r;

  list = * result;

  new_filename = strdup(folder->fl_filename);
  if (new_filename == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free;
  }

  r = mailmh_folder_update(folder);

  switch (r) {
  case MAILMH_NO_ERROR:
    break;

  default:
    res = mhdriver_mh_error_to_mail_error(r);
    free(new_filename);
    goto free;
  }

  r = clist_append(list, new_filename);
  if (r < 0) {
    free(new_filename);
    res = MAIL_ERROR_MEMORY;
    goto free;
  }
  
  if (folder->fl_subfolders_tab != NULL) {
    for(i = 0 ; i < carray_count(folder->fl_subfolders_tab) ; i++) {
      struct mailmh_folder * subfolder;

      subfolder = carray_get(folder->fl_subfolders_tab, i);

      r = get_list_folders(subfolder, &list);
      if (r != MAIL_NO_ERROR) {
		    free(new_filename);
	res = MAIL_ERROR_MEMORY;
	goto free;
      }
    }
  }

  * result = list;
  
  free(new_filename);
  return MAIL_NO_ERROR;

 free:
  clist_foreach(list, (clist_func) free, NULL);
  clist_free(list);
  return res;
}
Exemple #2
0
static int mhdriver_rename_folder(mailsession * session, const char * mb,
				  const char * new_name)
{
  struct mailmh_folder * src_folder;
  struct mailmh_folder * dst_folder;
  const char * name;
  struct mailmh * mh;
  int r;

  r = get_parent(session, new_name, &dst_folder, &name);
  if (r != MAIL_NO_ERROR)
    return r;

  mh = get_mh_session(session);
  if (mh == NULL)
    return MAIL_ERROR_BAD_STATE;

  src_folder = mailmh_folder_find(mh->mh_main, mb);
  if (src_folder == NULL)
    return MAIL_ERROR_FOLDER_NOT_FOUND;

  if (get_mh_cur_folder(session) == src_folder)
    get_data(session)->mh_cur_folder = NULL;
  
  r = mailmh_folder_rename_subfolder(src_folder, dst_folder, name);  

  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #3
0
static int mhdriver_remove_message(mailsession * session, uint32_t num)
{
  int r;
  struct mailmh_folder * folder;

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

  r = mailmh_folder_remove_message(folder, num);

  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #4
0
static int mhdriver_create_folder(mailsession * session, const char * mb)
{
  int r;
  struct mailmh_folder * parent;
  const char * name;
  
  r = get_parent(session, mb, &parent, &name);
  if (r != MAIL_NO_ERROR)
    return r;

  r = mailmh_folder_add_subfolder(parent, name);
  
  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #5
0
static int mhdriver_append_message(mailsession * session,
				   const char * message, size_t size)
{
  int r;
  struct mailmh_folder * folder;

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

  r = mailmh_folder_add_message(folder, message, size);

  switch (r) {
  case MAILMH_ERROR_FILE:
    return MAIL_ERROR_DISKSPACE;

  default:
    return mhdriver_mh_error_to_mail_error(r);
  }
}
Exemple #6
0
static int mhdriver_select_folder(mailsession * session, const char * mb)
{
  struct mailmh_folder * folder;
  struct mailmh * mh;
  int r;

  mh = get_mh_session(session);
  if (mh == NULL)
    return MAIL_ERROR_BAD_STATE;

  r = mailmh_folder_update(mh->mh_main);
  
  folder = mailmh_folder_find(mh->mh_main, mb);
  if (folder == NULL)
    return MAIL_ERROR_FOLDER_NOT_FOUND;

  get_data(session)->mh_cur_folder = folder;
  r = mailmh_folder_update(folder);

  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #7
0
static int mhdriver_delete_folder(mailsession * session, const char * mb)
{
  int r;
  struct mailmh_folder * folder;
  struct mailmh * mh;

  mh = get_mh_session(session);
  if (mh == NULL)
    return MAIL_ERROR_BAD_STATE;

  folder = mailmh_folder_find(mh->mh_main, mb);
  if (folder == NULL)
    return MAIL_ERROR_FOLDER_NOT_FOUND;

  if (get_mh_cur_folder(session) == folder)
    get_data(session)->mh_cur_folder = NULL;

  r = mailmh_folder_remove_subfolder(folder);

  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #8
0
static int mhdriver_move_message(mailsession * session,
				 uint32_t num, const char * mb)
{
  int r;
  struct mailmh_folder * src_folder;
  struct mailmh_folder * dest_folder;
  struct mailmh * mh;
  
  mh = get_mh_session(session);
  if (mh == NULL)
    return MAIL_ERROR_BAD_STATE;

  src_folder = get_mh_cur_folder(session);
  if (src_folder == NULL)
    return MAIL_ERROR_BAD_STATE;

  dest_folder = mailmh_folder_find(mh->mh_main, mb);
  if (dest_folder == NULL)
    return MAIL_ERROR_FOLDER_NOT_FOUND;

  r = mailmh_folder_move_message(dest_folder, src_folder, num);

  return mhdriver_mh_error_to_mail_error(r);
}
Exemple #9
0
static int mhdriver_cached_append_message_flags(mailsession * session,
    const char * message, size_t size, struct mail_flags * flags)
{ 
  int r;
  struct mailmh_folder * folder;
  struct mailmh_msg_info * msg_info;
  chashdatum key;
  chashdatum value;
  uint32_t uid;
  struct mh_cached_session_state_data * data;
  char filename_flags[PATH_MAX];
  struct mail_cache_db * cache_db_flags;
  MMAPString * mmapstr;
  char keyname[PATH_MAX];
  
  folder = get_mh_cur_folder(session);
  if (folder == NULL)
    return MAIL_ERROR_BAD_STATE;
  
  r = mailmh_folder_add_message_uid(folder,
      message, size, &uid);
  
  switch (r) {
  case MAILMH_ERROR_FILE:
    return MAIL_ERROR_DISKSPACE;
    
  case MAILMH_NO_ERROR:
    break;
    
  default:
    return mhdriver_mh_error_to_mail_error(r);
  }
  
  if (flags == NULL)
    goto exit;
  
  key.data = &uid;
  key.len = sizeof(uid);
  r = chash_get(folder->fl_msgs_hash, &key, &value);
  if (r < 0)
    return MAIL_ERROR_CACHE_MISS;
  
  msg_info = value.data;
  
  data = get_cached_data(session);
  
  snprintf(filename_flags, PATH_MAX, "%s/%s/%s",
      data->mh_flags_directory, data->mh_quoted_mb, FLAGS_NAME);
  
  r = mail_cache_db_open_lock(filename_flags, &cache_db_flags);
  if (r < 0)
    goto exit;
  
  mmapstr = mmap_string_new("");
  if (mmapstr == NULL)
    goto close_db_flags;
  
  snprintf(keyname, PATH_MAX, "%u-%lu-%lu-flags",
      uid, (unsigned long) msg_info->msg_mtime,
      (unsigned long) msg_info->msg_size);
  
  r = mhdriver_write_cached_flags(cache_db_flags, mmapstr, keyname, flags);
  
  mmap_string_free(mmapstr);
  mail_cache_db_close_unlock(filename_flags, cache_db_flags);
  
  if (r != MAIL_NO_ERROR)
    goto exit;
  
  return MAIL_NO_ERROR;
  
 close_db_flags:
  mail_cache_db_close_unlock(filename_flags, cache_db_flags);
 exit:
  return MAIL_NO_ERROR;
}