// FIXME: is this an item set method? static gboolean itemlist_filter_check_item (itemPtr item) { /* use search folder rule list in case of a search folder */ if (itemlist->priv->currentNode && IS_VFOLDER (itemlist->priv->currentNode)) { vfolderPtr vfolder = (vfolderPtr)itemlist->priv->currentNode->data; return itemset_check_item (vfolder->itemset, item); } /* apply the item list filter if available */ if (itemlist->priv->filter) return itemset_check_item (itemlist->priv->filter, item); /* otherwise keep the item */ return TRUE; }
void vfolder_merge_item (vfolderPtr vfolder, itemPtr item) { gboolean found = itemset_has_item_id (vfolder->itemset, item->id); if (itemset_check_item (vfolder->itemset, item)) { if (!found) vfolder_add_item (vfolder, item); } else { if (found) vfolder_remove_item (vfolder, item); } }
static gboolean vfolder_loader_fetch_cb (gpointer user_data, GSList **resultItems) { vfolderPtr vfolder = (vfolderPtr)user_data; itemSetPtr items = g_new0 (struct itemSet, 1); GList *iter; gboolean result; /* 1. Fetch a batch of items */ result = db_itemset_get (items, vfolder->loadOffset, VFOLDER_LOADER_BATCH_SIZE); vfolder->loadOffset += VFOLDER_LOADER_BATCH_SIZE; if (result) { /* 2. Match all items against search folder */ iter = items->ids; while (iter) { gulong id = GPOINTER_TO_UINT (iter->data); itemPtr item = db_item_load (id); if (itemset_check_item (vfolder->itemset, item)) *resultItems = g_slist_append (*resultItems, item); else item_unload (item); iter = g_list_next (iter); } } else { debug1 (DEBUG_CACHE, "search folder '%s' reload complete", vfolder->node->title); vfolder->reloading = FALSE; } itemset_free (items); /* 3. Save items to DB and update UI (except for search results) */ if (vfolder->node) { db_search_folder_add_items (vfolder->node->id, *resultItems); node_update_counters (vfolder->node); ui_node_update (vfolder->node->id); } return result; /* FALSE on last fetch */ }