aboutsummaryrefslogtreecommitdiff
path: root/libsylph/filter.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-12-19 06:41:50 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-12-19 06:41:50 +0000
commitd55459c79d6ddfa0b006c5696d408a7e388cf8c8 (patch)
tree98e8ea35bfce5bc235adbc544de8aba1f754b8ac /libsylph/filter.c
parent1ca5b9aa126b860d9198f85e44104f857513bef5 (diff)
implemented query search and virtual folder (merged from newsearch branch).
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@836 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph/filter.c')
-rw-r--r--libsylph/filter.c108
1 files changed, 76 insertions, 32 deletions
diff --git a/libsylph/filter.c b/libsylph/filter.c
index a7533bcc..dc2be18b 100644
--- a/libsylph/filter.c
+++ b/libsylph/filter.c
@@ -304,7 +304,6 @@ gboolean filter_match_rule(FilterRule *rule, MsgInfo *msginfo, GSList *hlist,
gboolean matched;
g_return_val_if_fail(rule->cond_list != NULL, FALSE);
- g_return_val_if_fail(rule->action_list != NULL, FALSE);
switch (rule->timing) {
case FLT_TIMING_ANY:
@@ -485,6 +484,8 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data)
gboolean enabled = TRUE;
FilterRule *rule;
FilterBoolOp bool_op = FLT_OR;
+ const gchar *target_folder = NULL;
+ gboolean recursive = FALSE;
GSList *cond_list = NULL;
GSList *action_list = NULL;
GNode *child, *cond_child, *action_child;
@@ -558,6 +559,12 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data)
type = attr->value;
else if (!strcmp(attr->name, "name"))
name = attr->value;
+ else if (!strcmp(attr->name, "recursive")) {
+ if (!strcmp(attr->value, "true"))
+ recursive = TRUE;
+ else
+ recursive = FALSE;
+ }
}
if (type) {
@@ -583,6 +590,9 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data)
cond_type = FLT_COND_AGE_GREATER;
STR_CASE("account-id")
cond_type = FLT_COND_ACCOUNT;
+ STR_CASE("target-folder")
+ target_folder = value;
+ continue;
STR_CASE_END
cond = filter_cond_new(cond_type, match_type, match_flag,
@@ -641,10 +651,14 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data)
action_list = g_slist_append(action_list, action);
}
- if (name && cond_list && action_list) {
+ if (name && cond_list) {
rule = filter_rule_new(name, bool_op, cond_list, action_list);
rule->timing = timing;
rule->enabled = enabled;
+ if (target_folder) {
+ rule->target_folder = g_strdup(target_folder);
+ rule->recursive = recursive;
+ }
*fltlist = g_slist_prepend(*fltlist, rule);
}
@@ -670,17 +684,41 @@ GSList *filter_xml_node_to_filter_list(GNode *node)
return fltlist;
}
+GSList *filter_read_file(const gchar *file)
+{
+ GNode *node;
+ GSList *list;
+
+ g_return_val_if_fail(file != NULL, NULL);
+
+ debug_print("Reading %s\n", file);
+
+ if (!is_file_exist(file))
+ return NULL;
+
+ node = xml_parse_file(file);
+ if (!node) {
+ g_warning("Can't parse %s\n", file);
+ return NULL;
+ }
+
+ list = filter_xml_node_to_filter_list(node);
+
+ xml_free_tree(node);
+
+ return list;
+}
+
void filter_read_config(void)
{
gchar *rcpath;
- GNode *node;
- FilterRule *rule;
debug_print("Reading filter configuration...\n");
/* remove all previous filter list */
while (prefs_common.fltlist != NULL) {
- rule = (FilterRule *)prefs_common.fltlist->data;
+ FilterRule *rule = (FilterRule *)prefs_common.fltlist->data;
+
filter_rule_free(rule);
prefs_common.fltlist = g_slist_remove(prefs_common.fltlist,
rule);
@@ -688,22 +726,8 @@ void filter_read_config(void)
rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, FILTER_LIST,
NULL);
- if (!is_file_exist(rcpath)) {
- g_free(rcpath);
- return;
- }
-
- node = xml_parse_file(rcpath);
- if (!node) {
- g_warning("Can't parse %s\n", rcpath);
- g_free(rcpath);
- return;
- }
+ prefs_common.fltlist = filter_read_file(rcpath);
g_free(rcpath);
-
- prefs_common.fltlist = filter_xml_node_to_filter_list(node);
-
- xml_free_tree(node);
}
#define NODE_NEW(tag, text) \
@@ -711,26 +735,23 @@ void filter_read_config(void)
#define ADD_ATTR(name, value) \
xml_tag_add_attr(node->tag, xml_attr_new(name, value))
-void filter_write_config(void)
+void filter_write_file(GSList *list, const gchar *file)
{
- gchar *rcpath;
PrefFile *pfile;
GSList *cur;
- debug_print("Writing filter configuration...\n");
+ g_return_if_fail(file != NULL);
- rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, FILTER_LIST,
- NULL);
- if ((pfile = prefs_file_open(rcpath)) == NULL) {
- g_warning("failed to write filter configuration to file\n");
- g_free(rcpath);
+ if ((pfile = prefs_file_open(file)) == NULL) {
+ g_warning("failed to write filter configuration to file: %s\n",
+ file);
return;
}
xml_file_put_xml_decl(pfile->fp);
fputs("\n<filter>\n", pfile->fp);
- for (cur = prefs_common.fltlist; cur != NULL; cur = cur->next) {
+ for (cur = list; cur != NULL; cur = cur->next) {
FilterRule *rule = (FilterRule *)cur->data;
GSList *cur_cond;
GSList *cur_action;
@@ -820,6 +841,17 @@ void filter_write_config(void)
}
}
+ if (rule->target_folder) {
+ XMLNode *node;
+
+ NODE_NEW("target-folder", rule->target_folder);
+ ADD_ATTR("recursive", rule->recursive
+ ? "true" : "false");
+ fputs(" ", pfile->fp);
+ xml_file_put_node(pfile->fp, node);
+ xml_free_node(node);
+ }
+
fputs(" </condition-list>\n", pfile->fp);
fputs(" <action-list>\n", pfile->fp);
@@ -888,14 +920,25 @@ void filter_write_config(void)
fputs("</filter>\n", pfile->fp);
- g_free(rcpath);
-
if (prefs_file_close(pfile) < 0) {
- g_warning(_("failed to write configuration to file\n"));
+ g_warning("failed to write filter configuration to file: %s\n",
+ file);
return;
}
}
+void filter_write_config(void)
+{
+ gchar *rcpath;
+
+ debug_print("Writing filter configuration...\n");
+
+ rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, FILTER_LIST,
+ NULL);
+ filter_write_file(prefs_common.fltlist, rcpath);
+ g_free(rcpath);
+}
+
#undef NODE_NEW
#undef ADD_ATTR
@@ -1399,6 +1442,7 @@ void filter_rule_free(FilterRule *rule)
if (!rule) return;
g_free(rule->name);
+ g_free(rule->target_folder);
filter_cond_list_free(rule->cond_list);
filter_action_list_free(rule->action_list);