43
44
debug_enter ("vfolder_new");
45
46
vfolder = g_new0 (struct vfolder, 1);
47
vfolder->itemset = g_new0 (struct itemSet, 1);
48
vfolder->itemset->nodeId = node->id;
49
vfolder->itemset->ids = NULL;
50
vfolder->itemset->anyMatch = TRUE;
46
51
vfolder->node = node;
47
vfolder->anyMatch = TRUE;
48
52
vfolders = g_slist_append (vfolders, vfolder);
65
69
matchType = xmlGetProp (cur, BAD_CAST"matchType");
67
/* currently we now only OR or AND'ing the rules,
71
/* currently we only OR or AND the rules,
68
72
"any" is the value for OR'ing, "all" for AND'ing */
69
vfolder->anyMatch = (0 != xmlStrcmp (matchType, BAD_CAST"all"));
73
vfolder->itemset->anyMatch = (0 != xmlStrcmp (matchType, BAD_CAST"all"));
71
vfolder->anyMatch = TRUE;
75
vfolder->itemset->anyMatch = TRUE;
73
77
xmlFree (matchType);
87
91
debug2 (DEBUG_CACHE, "loading rule \"%s\" \"%s\"", ruleId, value);
89
93
if (additive && !xmlStrcmp (additive, BAD_CAST"true"))
90
vfolder_add_rule (vfolder, ruleId, value, TRUE);
94
itemset_add_rule (vfolder->itemset, ruleId, value, TRUE);
92
vfolder_add_rule (vfolder, ruleId, value, FALSE);
96
itemset_add_rule (vfolder->itemset, ruleId, value, FALSE);
94
98
g_warning ("ignoring invalid rule entry for vfolder \"%s\"...\n", node_get_title (vfolder->node));
107
111
static itemSetPtr
108
112
vfolder_load (nodePtr node)
110
return db_view_load (node->id);
114
vfolder_update_counters (nodePtr node)
116
114
vfolderPtr vfolder = (vfolderPtr)node->data;
118
/* Avoid throwing a "view unread count failed (error code 101, not an error)"
119
warning in the database when there are no rules yet. */
120
if (vfolder->rules) {
121
node->unreadCount = db_view_get_unread_count (node->id);
122
node->itemCount = db_view_get_item_count (node->id);
124
node->unreadCount = 0;
127
ui_node_update (node->id);
131
vfolder_refresh (vfolderPtr vfolder)
133
g_return_if_fail (NULL != vfolder->node);
135
if (0 != g_slist_length (vfolder->rules))
136
rules_to_view (vfolder->rules, vfolder->anyMatch, vfolder->node->id);
138
vfolder_update_counters (vfolder->node);
142
vfolder_is_affected (vfolderPtr vfolder, const gchar *ruleName)
144
GSList *iter = vfolder->rules;
146
rulePtr rule = (rulePtr)iter->data;
147
if (g_str_equal (rule->ruleInfo->ruleId, ruleName))
149
iter = g_slist_next(iter);
116
return vfolder->itemset;
155
120
vfolder_foreach (nodeActionFunc func)
157
vfolder_foreach_with_rule (NULL, func);
161
vfolder_foreach_with_rule (const gchar *ruleName, nodeActionFunc func)
163
GSList *iter = vfolders;
165
g_assert (NULL != func);
167
vfolderPtr vfolder = (vfolderPtr)iter->data;
168
if (!ruleName || vfolder_is_affected (vfolder, ruleName))
169
(*func) (vfolder->node);
170
iter = g_slist_next (iter);
175
vfolder_foreach_with_item (gulong itemId, nodeActionFunc func)
177
GSList *iter = vfolders;
180
vfolderPtr vfolder = (vfolderPtr)iter->data;
181
if (db_view_contains_item (vfolder->node->id, itemId))
182
(*func) (vfolder->node);
183
iter = g_slist_next (iter);
122
GSList *iter = vfolders;
124
g_assert (NULL != func);
126
vfolderPtr vfolder = (vfolderPtr)iter->data;
127
(*func)(vfolder->node);
128
iter = g_slist_next (iter);
133
vfolder_foreach_data (vfolderActionDataFunc func, itemPtr item)
135
GSList *iter = vfolders;
137
g_assert (NULL != func);
139
vfolderPtr vfolder = (vfolderPtr)iter->data;
140
(*func) (vfolder, item);
141
iter = g_slist_next (iter);
146
vfolder_remove_item (vfolderPtr vfolder, itemPtr item)
148
if (!vfolder->itemset->ids)
151
vfolder->itemset->ids = g_list_remove (vfolder->itemset->ids, GUINT_TO_POINTER (item->id));
152
vfolder->node->needsUpdate = TRUE;
156
vfolder_add_item (vfolderPtr vfolder, itemPtr item)
158
vfolder->itemset->ids = g_list_append (vfolder->itemset->ids, GUINT_TO_POINTER (item->id));
159
vfolder->node->needsUpdate = TRUE;
163
vfolder_merge_item (vfolderPtr vfolder, itemPtr item)
165
gboolean found = itemset_has_item_id (vfolder->itemset, item->id);
167
if (itemset_check_item (vfolder->itemset, item)) {
169
vfolder_add_item (vfolder, item);
172
vfolder_remove_item (vfolder, item);
177
vfolder_get_all_with_item_id (gulong id)
179
GSList *result = NULL;
180
GSList *iter = vfolders;
183
vfolderPtr vfolder = (vfolderPtr)iter->data;
184
if (g_list_find (vfolder->itemset->ids, GUINT_TO_POINTER (id)))
185
result = g_slist_append (result, vfolder);
186
iter = g_slist_next (iter);
240
vfolder_add_existing_rule (vfolderPtr vfolder, rulePtr rule)
242
vfolder->rules = g_slist_append (vfolder->rules, rule);
246
vfolder_add_rule (vfolderPtr vfolder,
253
rule = rule_new (vfolder, ruleId, value, additive);
255
vfolder_add_existing_rule (vfolder, rule);
257
g_warning ("unknown search folder rule id: \"%s\"", ruleId);
261
vfolder_remove_rule (vfolderPtr vfolder, rulePtr rule)
263
vfolder->rules = g_slist_remove (vfolder->rules, rule);
246
vfolder_reset (vfolderPtr vfolder)
248
itemlist_unload (FALSE);
250
g_list_free (vfolder->itemset->ids);
251
vfolder->itemset->ids = NULL;
252
db_search_folder_reset (vfolder->node->id);
256
vfolder_rebuild (nodePtr node)
258
vfolderPtr vfolder = (vfolderPtr)node->data;
260
vfolder_reset (vfolder);
261
itemlist_add_loader (vfolder_loader_new (node));
267
265
vfolder_free (nodePtr node)
269
267
vfolderPtr vfolder = (vfolderPtr) node->data;
272
269
debug_enter ("vfolder_free");
274
271
vfolders = g_slist_remove (vfolders, vfolder);
276
/* free vfolder rules */
277
rule = vfolder->rules;
279
rule_free (rule->data);
280
rule = g_slist_next (rule);
282
g_slist_free (vfolder->rules);
283
vfolder->rules = NULL;
272
itemset_free (vfolder->itemset);
285
274
debug_exit ("vfolder_free");
290
279
static void vfolder_save (nodePtr node) { }
293
vfolder_update_unread_count (nodePtr node)
282
vfolder_update_counters (nodePtr node)
295
g_warning("Should never be called!");
284
vfolderPtr vfolder = (vfolderPtr) node->data;
286
/* There is no unread handling for search folders
287
for performance reasons. So set everything to 0
288
here and don't bother with GUI updates... */
289
vfolder->node->needsUpdate = TRUE;
290
vfolder->node->unreadCount = 0;
291
vfolder->node->itemCount = g_list_length (vfolder->itemset->ids);
299
295
vfolder_remove (nodePtr node)
301
db_view_remove (node->id);
297
vfolder_reset (node->data);