return folder;
}
-void imap_folder_destroy(IMAPFolder *folder)
+void imap_folder_destroy(Folder *folder)
{
+ gchar *dir;
+
+ dir = folder_get_path(folder);
+ if (is_dir_exist(dir))
+ remove_dir_recursive(dir);
+ g_free(dir);
+
folder_remote_folder_destroy(REMOTE_FOLDER(folder));
}
{
folder->type = F_IMAP;
- folder_remote_folder_init(folder, name, path);
+ folder_remote_folder_init((Folder *)folder, name, path);
/*
folder->get_msg_list = imap_get_msg_list;
folder->create_folder = imap_create_folder;
folder->rename_folder = imap_rename_folder;
folder->remove_folder = imap_remove_folder;
+ folder->destroy = imap_folder_destroy;
folder->check_msgnum_validity = imap_check_msgnum_validity;
folder->get_num_list = imap_get_num_list;
folder->fetch_msginfo = imap_fetch_msginfo;
+
+ ((IMAPFolder *)folder)->selected_folder = NULL;
}
FolderItem *imap_folder_item_new()
static void imap_reset_uid_lists(Folder *folder)
{
+ if(folder->node == NULL)
+ return;
+
/* Destroy all uid lists and rest last uid */
g_node_traverse(folder->node, G_IN_ORDER, G_TRAVERSE_ALL, -1, imap_reset_uid_lists_func, NULL);
}
imap_parse_namespace(IMAP_SESSION(rfolder->session),
IMAP_FOLDER(folder));
rfolder->session->last_access_time = time(NULL);
+ g_free(((IMAPFolder *)folder)->selected_folder);
+ ((IMAPFolder *)folder)->selected_folder = NULL;
imap_reset_uid_lists(folder);
}
statusbar_pop_all();
if (rfolder->session) {
imap_parse_namespace(IMAP_SESSION(rfolder->session),
IMAP_FOLDER(folder));
+ g_free(((IMAPFolder *)folder)->selected_folder);
+ ((IMAPFolder *)folder)->selected_folder = NULL;
imap_reset_uid_lists(folder);
}
}
}
session = g_new(IMAPSession, 1);
+
SESSION(session)->type = SESSION_IMAP;
SESSION(session)->server = g_strdup(account->recv_server);
SESSION(session)->sock = imap_sock;
SESSION(session)->phase = SESSION_READY;
SESSION(session)->last_access_time = time(NULL);
SESSION(session)->data = NULL;
+
+ SESSION(session)->destroy = imap_session_destroy;
+
session->mbox = NULL;
session_list = g_list_append(session_list, session);
return SESSION(session);
}
-void imap_session_destroy(IMAPSession *session)
+void imap_session_destroy(Session *session)
{
- sock_close(SESSION(session)->sock);
- SESSION(session)->sock = NULL;
+ sock_close(session->sock);
+ session->sock = NULL;
- g_free(session->mbox);
+ g_free(IMAP_SESSION(session)->mbox);
session_list = g_list_remove(session_list, session);
}
if (!session) {
mlist = procmsg_read_cache(item, FALSE);
- item->last_num = procmsg_get_last_num_in_cache(mlist);
+ item->last_num = procmsg_get_last_num_in_msg_list(mlist);
procmsg_set_flags(mlist, item);
statusbar_pop_all();
return mlist;
mlist = procmsg_read_cache(item, FALSE);
procmsg_set_flags(mlist, item);
- cache_last = procmsg_get_last_num_in_cache(mlist);
+ cache_last = procmsg_get_last_num_in_msg_list(mlist);
/* calculating the range of envelope to get */
if (item->mtime != uid_validity) {
g_free(path);
if (is_file_exist(filename)) {
- debug_print(_("message %d has been already cached.\n"), uid);
+ debug_print("message %d has been already cached.\n", uid);
return filename;
}
return NULL;
}
- debug_print(_("getting message %d...\n"), uid);
+ debug_print("getting message %d...\n", uid);
ok = imap_cmd_fetch(SESSION(session)->sock, (guint32)uid, filename);
statusbar_pop_all();
destdir = imap_get_real_path(IMAP_FOLDER(folder), dest->path);
if (remove_source)
- debug_print(_("Moving message %s%c%d to %s ...\n"),
+ debug_print("Moving message %s%c%d to %s ...\n",
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, destdir);
else
- debug_print(_("Copying message %s%c%d to %s ...\n"),
+ debug_print("Copying message %s%c%d to %s ...\n",
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, destdir);
}
if (remove_source)
- debug_print(_("Moving message %s%c%d to %s ...\n"),
+ debug_print("Moving message %s%c%d to %s ...\n",
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, destdir);
else
- debug_print(_("Copying message %s%c%d to %s ...\n"),
+ debug_print("Copying message %s%c%d to %s ...\n",
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, destdir);
guint32 uid_validity;
gint ok;
IMAPSession *session;
+ gchar *dir;
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(folder->type == F_IMAP, -1);
return ok;
}
+ dir = folder_item_get_path(item);
+ remove_numbered_files(dir, uid, uid);
+ g_free(dir);
+
return IMAP_SUCCESS;
}
guint32 uid_validity;
gint ok;
IMAPSession *session;
+ gchar *dir;
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(item != NULL, -1);
return ok;
}
+ dir = folder_item_get_path(item);
+ remove_all_numbered_files(dir);
+ g_free(dir);
+
return IMAP_SUCCESS;
}
g_return_if_fail(folder->account != NULL);
session = imap_session_get(folder);
- if (!session) return;
+ if (!session) {
+ if (!folder->node) {
+ folder_tree_destroy(folder);
+ item = folder_item_new(folder, folder->name, NULL);
+ item->folder = folder;
+ folder->node = g_node_new(item);
+ }
+ return;
+ }
if (folder->account->imap_dir && *folder->account->imap_dir) {
Xstrdup_a(root_folder, folder->account->imap_dir, return);
debug_print("IMAP root directory: %s\n", root_folder);
}
- folder_tree_destroy(folder);
item = folder_item_new(folder, folder->name, root_folder);
item->folder = folder;
+ item->no_select = TRUE;
folder->node = g_node_new(item);
imap_scan_tree_recursive(session, item);
g_return_val_if_fail(item->folder != NULL, mlist);
g_return_val_if_fail(item->folder->type == F_IMAP, mlist);
- debug_print(_("Deleting cached messages %u - %u ... "),
+ debug_print("Deleting cached messages %u - %u ... ",
first_uid, last_uid);
dir = folder_item_get_path(item);
cur = next;
}
- debug_print(_("done.\n"));
+ debug_print("done.\n");
return mlist;
}
g_return_if_fail(item->folder != NULL);
g_return_if_fail(item->folder->type == F_IMAP);
- debug_print(_("Deleting all cached messages... "));
+ debug_print("Deleting all cached messages...\n");
dir = folder_item_get_path(item);
remove_all_numbered_files(dir);
g_free(dir);
- debug_print(_("done.\n"));
+ debug_print("done.\n");
}
#if USE_SSL
session->mbox = g_strdup(path);
g_free(real_path);
+ g_free(folder->selected_folder);
+ folder->selected_folder = g_strdup(path);
+
return ok;
}
if (ok != IMAP_SUCCESS)
return NULL;
- if(item->item.mtime != uid_validity) {
- item->lastuid = 0;
- g_slist_free(item->uid_list);
- item->uid_list = NULL;
-
- item->item.mtime = uid_validity;
- }
-
argbuf = g_ptr_array_new();
if(item->lastuid) {
cmdbuf = g_strdup_printf("UID FETCH %d:* (UID)", (item->lastuid + 1));
return msgnum_list;
}
-MsgInfo *imap_fetch_msginfo(Folder *folder, FolderItem *item, gint num)
+MsgInfo *imap_fetch_msginfo(Folder *_folder, FolderItem *item, gint num)
{
+ IMAPFolder *folder = (IMAPFolder *)_folder;
gchar *tmp;
IMAPSession *session;
GString *str;
MsgInfo *msginfo;
- gint ok, exists = 0, recent = 0, unseen = 0;
- guint32 uid_validity = 0;
+ int same_folder;
g_return_val_if_fail(folder != NULL, NULL);
g_return_val_if_fail(item != NULL, NULL);
g_return_val_if_fail(item->folder != NULL, NULL);
g_return_val_if_fail(item->folder->type == F_IMAP, NULL);
- session = imap_session_get(folder);
+ session = imap_session_get(_folder);
g_return_val_if_fail(session != NULL, NULL);
- ok = imap_select(session, IMAP_FOLDER(folder), item->path,
- &exists, &recent, &unseen, &uid_validity);
- if (ok != IMAP_SUCCESS)
- return NULL;
+ same_folder = FALSE;
+ if (folder->selected_folder != NULL)
+ if (strcmp(folder->selected_folder, item->path) == 0)
+ same_folder = TRUE;
+
+ if (!same_folder) {
+ gint ok, exists = 0, recent = 0, unseen = 0;
+ guint32 uid_validity = 0;
+
+ ok = imap_select(session, IMAP_FOLDER(folder), item->path,
+ &exists, &recent, &unseen, &uid_validity);
+ if (ok != IMAP_SUCCESS)
+ return NULL;
+ }
if (imap_cmd_envelope(SESSION(session)->sock, num, num)
!= IMAP_SUCCESS) {
g_string_assign(str, tmp);
g_free(tmp);
- msginfo = imap_parse_envelope(SESSION(session)->sock, item, str);
- if (!msginfo) {
- log_warning(_("can't parse envelope: %s\n"), str->str);
+ /* if the server did not return a envelope */
+ if (str->str[0] != '*') {
+ g_string_free(str, TRUE);
+ return NULL;
}
+ msginfo = imap_parse_envelope(SESSION(session)->sock,
+ item, str);
+
+ /* Read all data on the socket until the server is read for a new command */
tmp = NULL;
do {
g_free(tmp);
tmp = sock_getline(SESSION(session)->sock);
} while (!(tmp == NULL || tmp[0] != '*' || tmp[1] != ' '));
-
- msginfo->folder = item;
+ g_free(tmp);
+
+ /* if message header could not be parsed */
+ if (!msginfo) {
+ log_warning(_("can't parse envelope: %s\n"), str->str);
+ return NULL;
+ }
g_string_free(str, TRUE);
-
+
+ msginfo->folder = item;
+
return msginfo;
}
if (ok != IMAP_SUCCESS)
return FALSE;
- return item->item.mtime == uid_validity;
+ if(item->item.mtime == uid_validity)
+ return TRUE;
+
+ debug_print("Freeing imap uid cache");
+ item->lastuid = 0;
+ g_slist_free(item->uid_list);
+ item->uid_list = NULL;
+
+ item->item.mtime = uid_validity;
+
+ imap_delete_all_cached_messages((FolderItem *)item);
+
+ return FALSE;
}