#include "imap_gtk.h"
#include "inc.h"
#include "xml.h"
+#include "alertpanel.h"
#ifdef HAVE_LIBETPAN
#include "inputdialog.h"
#include "log.h"
#include "remotefolder.h"
-#include "alertpanel.h"
#include "claws.h"
#include "statusbar.h"
#include "msgcache.h"
IMAPAuthType type);
static gint imap_scan_tree_recursive (IMAPSession *session,
- FolderItem *item);
+ FolderItem *item,
+ gboolean subs_only);
static void imap_create_missing_folders (Folder *folder);
static FolderItem *imap_create_special_folder
g_node_traverse(folder->node, G_IN_ORDER, G_TRAVERSE_ALL, -1, imap_reset_uid_lists_func, NULL);
}
-int imap_get_capabilities(IMAPSession *session)
+static int imap_get_capabilities(IMAPSession *session)
{
struct mailimap_capability_data *capabilities = NULL;
clistiter *cur;
return MAILIMAP_NO_ERROR;
}
-gboolean imap_has_capability(IMAPSession *session, const gchar *cap)
+static gboolean imap_has_capability(IMAPSession *session, const gchar *cap)
{
GSList *cur;
for (cur = session->capability; cur; cur = cur->next) {
if (session) { \
debug_print("locking session %p (%d)\n", session, session->busy); \
if (session->busy) \
- g_warning(" SESSION WAS LOCKED !! "); \
+ debug_print(" SESSION WAS LOCKED !! \n"); \
session->busy = TRUE;\
} else {\
debug_print("can't lock null session\n"); \
g_relation_destroy(uid_mapping);
imap_lep_set_free(seq_list);
unlock_session();
+ statusbar_pop_all();
return -1;
}
}
return 0;
}
-static gint imap_scan_tree(Folder *folder)
+gint imap_scan_tree_real(Folder *folder, gboolean subs_only)
{
FolderItem *item = NULL;
IMAPSession *session;
return -1;
}
mailimap_list_result_free(lep_list);
-
+
g_free(real_path);
}
if (folder->node)
item = FOLDER_ITEM(folder->node->data);
+
+ if (item && !item->path && root_folder) {
+ item->path = g_strdup(root_folder);
+ }
+
if (!item || ((item->path || root_folder) &&
strcmp2(item->path, root_folder) != 0)) {
folder_tree_destroy(folder);
folder->node = item->node = g_node_new(item);
}
- imap_scan_tree_recursive(session, FOLDER_ITEM(folder->node->data));
+ imap_scan_tree_recursive(session, FOLDER_ITEM(folder->node->data), subs_only);
imap_create_missing_folders(folder);
unlock_session();
return 0;
}
-static gint imap_scan_tree_recursive(IMAPSession *session, FolderItem *item)
+static gint imap_scan_tree(Folder *folder)
+{
+ gboolean subs_only = FALSE;
+ if (folder->account) {
+ debug_print(" scanning only subs %d\n", folder->account->imap_subsonly);
+ subs_only = folder->account->imap_subsonly;
+ }
+ return imap_scan_tree_real(folder, subs_only);
+}
+
+static gint imap_scan_tree_recursive(IMAPSession *session, FolderItem *item, gboolean subs_only)
{
Folder *folder;
IMAPFolder *imapfolder;
Xstrcat_a(wildcard_path, real_path, wildcard,
{g_free(real_path); return IMAP_ERROR;});
lep_list = NULL;
- r = imap_threaded_list(folder, "", wildcard_path, &lep_list);
+
+ if (subs_only)
+ r = imap_threaded_lsub(folder, "", wildcard_path, &lep_list);
+ else
+ r = imap_threaded_list(folder, "", wildcard_path, &lep_list);
+
if (r != MAILIMAP_NO_ERROR) {
item_list = NULL;
}
}
}
if (!new_item) {
- debug_print("folder '%s' not found. removing...\n",
- old_item->path);
- folder_item_remove(old_item);
+ if (old_item && old_item->path && !strcmp(old_item->path, "INBOX")) {
+ debug_print("not removing INBOX\n");
+ } else {
+ debug_print("folder '%s' not found. removing...\n",
+ old_item->path);
+ folder_item_remove(old_item);
+ }
} else {
old_item->no_sub = new_item->no_sub;
old_item->no_select = new_item->no_select;
}
if (new_item->no_sub == FALSE)
- imap_scan_tree_recursive(session, new_item);
+ imap_scan_tree_recursive(session, new_item, subs_only);
}
g_slist_free(item_list);
return IMAP_SUCCESS;
}
+GList *imap_scan_subtree(Folder *folder, FolderItem *item, gboolean unsubs_only, gboolean recursive)
+{
+ IMAPSession *session = imap_session_get(folder);
+ gchar *real_path;
+ gchar *wildcard_path;
+ gchar separator;
+ gchar wildcard[3];
+ clist * lep_list;
+ GSList *item_list = NULL, *cur;
+ GList *child_list = NULL, *tmplist = NULL;
+ GSList *sub_list = NULL;
+ int r;
+
+ if (!session)
+ return NULL;
+
+ separator = imap_get_path_separator(session, IMAP_FOLDER(folder), item->path);
+
+ if (item->path) {
+ wildcard[0] = separator;
+ wildcard[1] = '%';
+ wildcard[2] = '\0';
+ real_path = imap_get_real_path(session, IMAP_FOLDER(folder), item->path);
+ } else {
+ wildcard[0] = '%';
+ wildcard[1] = '\0';
+ real_path = g_strdup("");
+ }
+
+ Xstrcat_a(wildcard_path, real_path, wildcard,
+ {g_free(real_path); return NULL;});
+ lep_list = NULL;
+
+ if (unsubs_only)
+ statusbar_print_all(_("Looking for unsubscribed folders in %s..."),
+ item->path?item->path:item->name);
+ else
+ statusbar_print_all(_("Looking for subfolders of %s..."),
+ item->path?item->path:item->name);
+
+ r = imap_threaded_list(folder, "", wildcard_path, &lep_list);
+ if (r) {
+ statusbar_pop_all();
+ return NULL;
+ }
+ item_list = imap_list_from_lep(IMAP_FOLDER(folder),
+ lep_list, real_path, FALSE);
+ mailimap_list_result_free(lep_list);
+
+ for (cur = item_list; cur != NULL; cur = cur->next) {
+ FolderItem *cur_item = FOLDER_ITEM(cur->data);
+ if (recursive) {
+ tmplist = imap_scan_subtree(folder, cur_item,
+ unsubs_only, recursive);
+ if (tmplist)
+ child_list = g_list_concat(child_list, tmplist);
+ }
+ child_list = g_list_prepend(child_list,
+ imap_get_real_path(session,
+ IMAP_FOLDER(folder), cur_item->path));
+
+ folder_item_destroy(cur_item);
+ }
+ child_list = g_list_reverse(child_list);
+ g_slist_free(item_list);
+
+ if (unsubs_only) {
+ r = imap_threaded_lsub(folder, "", wildcard_path, &lep_list);
+ if (r) {
+ statusbar_pop_all();
+ return NULL;
+ }
+ sub_list = imap_list_from_lep(IMAP_FOLDER(folder),
+ lep_list, real_path, FALSE);
+ mailimap_list_result_free(lep_list);
+
+ for (cur = sub_list; cur != NULL; cur = cur->next) {
+ FolderItem *cur_item = FOLDER_ITEM(cur->data);
+ GList *oldlitem = NULL;
+ gchar *tmp = imap_get_real_path(session,
+ IMAP_FOLDER(folder), cur_item->path);
+ folder_item_destroy(cur_item);
+ oldlitem = g_list_find_custom(
+ child_list, tmp, (GCompareFunc)strcmp2);
+ if (oldlitem) {
+ child_list = g_list_remove_link(child_list, oldlitem);
+ g_free(oldlitem->data);
+ g_list_free(oldlitem);
+ }
+ g_free(tmp);
+ }
+ }
+
+ statusbar_pop_all();
+
+ return child_list;
+}
+
static gint imap_create_tree(Folder *folder)
{
g_return_val_if_fail(folder != NULL, -1);
const gchar *p;
gint ok;
gboolean no_select = FALSE, no_sub = FALSE;
+ gboolean exist = FALSE;
g_return_val_if_fail(folder != NULL, NULL);
g_return_val_if_fail(folder->account != NULL, NULL);
if (strcmp(dirpath, "INBOX") != 0) {
GPtrArray *argbuf;
- gboolean exist = FALSE;
int r;
clist * lep_list;
}
mailimap_list_result_free(lep_list);
}
-
}
+ imap_threaded_subscribe(folder, imap_path, TRUE);
} else {
clist *lep_list;
int r;
make_dir_hier(dirpath);
g_free(dirpath);
unlock_session();
+
+ if (exist) {
+ /* folder existed, scan it */
+ folder_item_scan_full(new_item, FALSE);
+ }
+
return new_item;
}
return 0;
}
+gint imap_subscribe(Folder *folder, FolderItem *item, gchar *rpath, gboolean sub)
+{
+ gchar *path;
+ gint r = -1;
+ IMAPSession *session;
+ debug_print("getting session...\n");
+
+ session = imap_session_get(folder);
+ if (!session) {
+ return -1;
+ }
+ if (item && item->path) {
+ path = imap_get_real_path(session, IMAP_FOLDER(folder), item->path);
+ if (!path)
+ return -1;
+ if (!strcmp(path, "INBOX") && sub == FALSE)
+ return -1;
+ debug_print("%ssubscribing %s\n", sub?"":"un", path);
+ r = imap_threaded_subscribe(folder, path, sub);
+ g_free(path);
+ } else if (rpath) {
+ r = imap_threaded_subscribe(folder, rpath, sub);
+ } else
+ return -1;
+ return r;
+}
+
static gint imap_remove_folder_real(Folder *folder, FolderItem *item)
{
gint ok;
}
path = imap_get_real_path(session, IMAP_FOLDER(folder), item->path);
+ imap_threaded_subscribe(folder, path, FALSE);
ok = imap_cmd_delete(session, path);
if (ok != IMAP_SUCCESS) {
gchar *tmp = g_strdup_printf("%s%c", path,
free(dup_name);
continue;
}
-
if (!all && path_cmp(name, real_path) == 0) {
g_free(base);
free(dup_name);
{
}
+gint imap_scan_tree_real(Folder *folder, gboolean subs_only)
+{
+ return -1;
+}
+
+gint imap_subscribe(Folder *folder, FolderItem *item, gchar *rpath, gboolean sub)
+{
+ return -1;
+}
+
+GList * imap_scan_subtree(Folder *folder, FolderItem *item, gboolean unsubs_only, gboolean recursive)
+{
+ return -1;
+}
#endif
void imap_synchronise(FolderItem *item)