fix bug 2979, 'claws fails to load (empty) folderlist.xml and shows account wizard'
[claws.git] / src / folder.c
index c596f9f0b7487966d8eecea1f8ab441f6471f435..1b4ec03903d676eec50a8113deee414fbacac9de 100644 (file)
@@ -88,7 +88,6 @@ void folder_init              (Folder         *folder,
 static gchar *folder_item_get_cache_file       (FolderItem     *item);
 static gchar *folder_item_get_mark_file        (FolderItem     *item);
 static gchar *folder_item_get_tags_file        (FolderItem     *item);
-static gchar *folder_get_list_path     (void);
 static GNode *folder_get_xml_node      (Folder         *folder);
 static Folder *folder_get_from_xml     (GNode          *node);
 static void folder_update_op_count_rec (GNode          *node);
@@ -2802,7 +2801,7 @@ MsgInfo *folder_item_get_msginfo_by_msgid(FolderItem *item, const gchar *msgid)
        cm_return_val_if_fail(item != NULL, NULL);
        cm_return_val_if_fail(msgid != NULL, NULL);
        if (item->no_select)
-               return FALSE;
+               return NULL;
        
        if (!item->cache)
                folder_item_read_cache(item);
@@ -2817,7 +2816,7 @@ GSList *folder_item_get_msg_list(FolderItem *item)
 {
        cm_return_val_if_fail(item != NULL, NULL);
        if (item->no_select)
-               return FALSE;
+               return NULL;
        
        if (item->cache == 0)
                folder_item_read_cache(item);
@@ -4122,7 +4121,7 @@ static Folder *folder_get_from_xml(GNode *node)
        return folder;
 }
 
-static gchar *folder_get_list_path(void)
+gchar *folder_get_list_path(void)
 {
        static gchar *filename = NULL;
 
@@ -4689,6 +4688,22 @@ gboolean folder_has_parent_of_type(FolderItem *item,
        return FALSE;
 }
 
+gboolean folder_is_child_of(FolderItem *item, FolderItem *parent)
+{
+       if (item == NULL || parent == NULL)
+               return FALSE;
+
+       while (item != NULL) {
+               if (parent == item)
+                       return TRUE;
+
+               item = folder_item_parent(item);
+       }
+
+       return FALSE;
+}
+
+
 gboolean folder_subscribe (const gchar *uri)
 {
        GList *cur;
@@ -4715,3 +4730,92 @@ gboolean folder_get_sort_type            (Folder         *folder,
        folder->klass->get_sort_type(folder, sort_key, sort_type); 
        return TRUE;
 }
+
+gint folder_item_search_msgs   (Folder                 *folder,
+                                FolderItem             *container,
+                                MsgNumberList          **msgs,
+                                gboolean               *on_server,
+                                MatcherList            *predicate,
+                                SearchProgressNotify   progress_cb,
+                                gpointer               progress_data)
+{
+       gint result = -1;
+       
+       folder_item_update_freeze();
+
+       if (folder->klass->search_msgs)
+               result = folder->klass->search_msgs(folder, container,
+                               msgs, on_server, predicate, progress_cb, progress_data);
+       if (result < 0)
+               result = folder_item_search_msgs_local(folder, container,
+                               msgs, on_server, predicate, progress_cb, progress_data);
+       
+       folder_item_update_thaw();
+
+       return result;
+}
+
+MsgNumberList *folder_item_get_number_list(FolderItem *item)
+{
+       GSList *nums = NULL;
+       GSList *msglist = folder_item_get_msg_list(item);
+
+       nums = procmsg_get_number_list_for_msgs(msglist);
+       procmsg_msg_list_free(msglist);
+       
+       return nums;
+}
+
+gint folder_item_search_msgs_local     (Folder                 *folder,
+                                        FolderItem             *container,
+                                        MsgNumberList          **msgs,
+                                        gboolean               *on_server,
+                                        MatcherList            *predicate,
+                                        SearchProgressNotify   progress_cb,
+                                        gpointer               progress_data)
+{
+       GSList *result = NULL;
+       GSList *cur = NULL;
+       gint matched_count = 0;
+       guint processed_count = 0;
+       gint msgcount;
+       GSList *nums = NULL;
+
+       if (*msgs == NULL) {
+               nums = folder_item_get_number_list(container);
+       } else {
+               nums = *msgs;
+       }
+
+       msgcount = g_slist_length(nums);
+
+       if (msgcount < 0)
+               return -1;
+
+       for (cur = nums; cur != NULL; cur = cur->next) {
+               guint msgnum = GPOINTER_TO_UINT(cur->data);
+               MsgInfo *msg = folder_item_get_msginfo(container, msgnum);
+
+               if (msg == NULL) {
+                       g_slist_free(result);
+                       return -1;
+               }
+
+               if (matcherlist_match(predicate, msg)) {
+                       result = g_slist_prepend(result, GUINT_TO_POINTER(msg->msgnum));
+                       matched_count++;
+               }
+               processed_count++;
+
+               if (progress_cb != NULL
+                   && !progress_cb(progress_data, FALSE, processed_count,
+                           matched_count, msgcount))
+                       break;
+       }
+
+       g_slist_free(nums);
+       *msgs = g_slist_reverse(result);
+
+       return matched_count;
+}
+