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);
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);
{
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);
return folder;
}
-static gchar *folder_get_list_path(void)
+gchar *folder_get_list_path(void)
{
static gchar *filename = NULL;
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;
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;
+}
+