コード例 #1
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
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);
}
コード例 #2
0
ファイル: mailmh.c プロジェクト: Applexis/libetpan
struct mailmh_folder * mailmh_folder_find(struct mailmh_folder * root,
					  const char * filename)
{
  int r;
  char pathname[PATH_MAX];
  char * p;
  chashdatum key;
  chashdatum data;
  struct mailmh_folder * folder;
  char * start;

  if (strcmp(root->fl_filename, filename) == 0)
    return root;

  strncpy(pathname, filename, PATH_MAX);
  pathname[PATH_MAX - 1] = 0;
  start = pathname + strlen(root->fl_filename) + 1;

  p = strchr(start, MAIL_DIR_SEPARATOR);
  if (p != NULL) {
    * p = 0;

    root = mailmh_folder_find(root, pathname);
    if (root != NULL) {
      folder = mailmh_folder_find(root, filename);
      if (folder == NULL)
	return NULL;
      return folder;
    }

    return NULL;
  }
  else {
    key.data = pathname;
    key.len = strlen(pathname);
    r = chash_get(root->fl_subfolders_hash, &key, &data);
    if (r < 0)
      return NULL;

    return data.data;
  }
}
コード例 #3
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
static int get_parent(mailsession * session, const char * mb,
		      struct mailmh_folder ** result_folder,
		      const char ** result_name)
{
  const char * name;
  size_t length;
  size_t i;
  char * parent_name;
  struct mailmh_folder * parent;
  struct mailmh * mh;

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

  length = strlen(mb);
  if (length > 0) {
    i = length - 1;
    while (1) {
      if (i == 0)
        return MAIL_ERROR_INVAL;
      if (mb[i] == '/')
        break;
      i --;
    }
    name = mb + i + 1;
  }
  else {
    return MAIL_ERROR_INVAL;
  }
  
  parent_name = malloc(i + 1);
  /* strndup(mb, i) */
  if (parent_name == NULL)
    return MAIL_ERROR_MEMORY;

  strncpy(parent_name, mb, i);
  parent_name[i] = '\0';

  parent = mailmh_folder_find(mh->mh_main, parent_name);
  free(parent_name);
  if (parent == NULL)
    return MAIL_ERROR_FOLDER_NOT_FOUND;

  * result_folder = parent;
  * result_name = name;

  return MAIL_NO_ERROR;
}
コード例 #4
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
static int mhdriver_copy_message(mailsession * session,
				 uint32_t num, const char * mb)
{
  int fd;
  int r;
  struct mailmh_folder * folder;
  struct mailmh * mh;
  int res;

  mh = get_mh_session(session);
  if (mh == NULL) {
    res = MAIL_ERROR_BAD_STATE;
    goto err;
  }

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

  r = mailmh_folder_get_message_fd(folder, num, O_RDONLY, &fd);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto err;
  }

  folder = mailmh_folder_find(mh->mh_main, mb);
  if (folder == NULL) {
    res = MAIL_ERROR_FOLDER_NOT_FOUND;
    goto close;
  }

  r = mailmh_folder_add_message_file(folder, fd);
  if (r != MAIL_NO_ERROR) {
    res = MAIL_ERROR_COPY;
    goto close;
  }

  close(fd);

  return MAIL_NO_ERROR;
  
 close:
  close(fd);
 err:
  return res;
}
コード例 #5
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
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);
}
コード例 #6
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
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);
}
コード例 #7
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
static int mhdriver_messages_number(mailsession * session, const char * mb,
				    uint32_t * result)
{
  struct mailmh_folder * folder;
  uint32_t count;
  struct mailmh * mh;
  unsigned int i;

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

  if (mb != NULL) {
    folder = mailmh_folder_find(mh->mh_main, mb);
    if (folder == NULL)
      return MAIL_ERROR_FOLDER_NOT_FOUND;
  }
  else {
    folder = get_mh_cur_folder(session);
    if (folder == NULL)
      return MAIL_ERROR_BAD_STATE;
  }

  mailmh_folder_update(folder);
  count = 0;
  for (i = 0 ; i < carray_count(folder->fl_msgs_tab) ; i ++) {
    struct mailmh_msg_info * msg_info;
    
    msg_info = carray_get(folder->fl_msgs_tab, i);
    if (msg_info != NULL)
      count ++;
  }
  
  * result = count;

  return MAIL_NO_ERROR;
}
コード例 #8
0
ファイル: mhdriver.c プロジェクト: AlexKar/libetpan
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);
}