aboutsummaryrefslogtreecommitdiffstats
path: root/e-util
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-01-29 00:26:14 +0800
committerMilan Crha <mcrha@redhat.com>2014-01-29 00:26:14 +0800
commit6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7 (patch)
treed2f452b3ceaf303f2dcfc6e532b9fa7e474d9878 /e-util
parent64b2c69bd64d51f8afd112ad8cf4809ceac261a5 (diff)
downloadgsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.gz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.bz2
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.lz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.xz
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.tar.zst
gsoc2013-evolution-6c0dfdc7c04ebc695ced5ac1007cf4e7416ebcc7.zip
Bug #722951 - Check for empty rule values
Diffstat (limited to 'e-util')
-rw-r--r--e-util/e-filter-input.c49
-rw-r--r--e-util/e-filter-input.h1
-rw-r--r--e-util/e-filter-rule.c2
-rw-r--r--e-util/filter.error.xml5
4 files changed, 54 insertions, 3 deletions
diff --git a/e-util/e-filter-input.c b/e-util/e-filter-input.c
index 3e38410a59..512cf2dce1 100644
--- a/e-util/e-filter-input.c
+++ b/e-util/e-filter-input.c
@@ -106,6 +106,28 @@ filter_input_validate (EFilterElement *element,
}
regfree (&regexpat);
+ } else if (!input->allow_empty && (!input->values || !input->values->next)) {
+ const gchar *value = input->values->data;
+ gboolean is_empty = value == NULL;
+
+ if (value) {
+ gint ii;
+
+ is_empty = TRUE;
+
+ for (ii = 0; value[ii]; ii++) {
+ if (!g_ascii_isspace (value[ii])) {
+ is_empty = FALSE;
+ break;
+ }
+ }
+ }
+
+ if (is_empty) {
+ valid = FALSE;
+ if (alert)
+ *alert = e_alert_new ("filter:not-allow-empty", NULL);
+ }
}
return valid;
@@ -142,7 +164,23 @@ filter_input_eq (EFilterElement *element_a,
if (link_a != NULL || link_b != NULL)
return FALSE;
- return TRUE;
+ return input_a->allow_empty == input_b->allow_empty;
+}
+
+static void
+filter_input_xml_create (EFilterElement *element,
+ xmlNodePtr node)
+{
+ EFilterInput *input = E_FILTER_INPUT (element);
+ gchar *allow_empty;
+
+ /* Chain up to parent's method. */
+ E_FILTER_ELEMENT_CLASS (e_filter_input_parent_class)->xml_create (element, node);
+
+ allow_empty = (gchar *) xmlGetProp (node, (xmlChar *) "allow-empty");
+
+ input->allow_empty = !allow_empty || g_strcmp0 (allow_empty, "true") == 0;
+ xmlFree (allow_empty);
}
static xmlNodePtr
@@ -158,6 +196,7 @@ filter_input_xml_encode (EFilterElement *element)
value = xmlNewNode (NULL, (xmlChar *) "value");
xmlSetProp (value, (xmlChar *) "name", (xmlChar *) element->name);
xmlSetProp (value, (xmlChar *) "type", (xmlChar *) type);
+ xmlSetProp (value, (xmlChar *) "allow-empty", (xmlChar *) (input->allow_empty ? "true" : "false"));
for (link = input->values; link != NULL; link = g_list_next (link)) {
xmlChar *str = link->data;
@@ -178,7 +217,7 @@ filter_input_xml_decode (EFilterElement *element,
xmlNodePtr node)
{
EFilterInput *input = (EFilterInput *) element;
- gchar *name, *str, *type;
+ gchar *name, *str, *type, *allow_empty;
xmlNodePtr child;
g_list_foreach (input->values, (GFunc) g_free, NULL);
@@ -187,6 +226,7 @@ filter_input_xml_decode (EFilterElement *element,
name = (gchar *) xmlGetProp (node, (xmlChar *) "name");
type = (gchar *) xmlGetProp (node, (xmlChar *) "type");
+ allow_empty = (gchar *) xmlGetProp (node, (xmlChar *) "allow-empty");
xmlFree (element->name);
element->name = name;
@@ -194,6 +234,9 @@ filter_input_xml_decode (EFilterElement *element,
xmlFree (input->type);
input->type = type;
+ input->allow_empty = !allow_empty || g_strcmp0 (allow_empty, "true") == 0;
+ xmlFree (allow_empty);
+
child = node->children;
while (child != NULL) {
if (!strcmp ((gchar *) child->name, type)) {
@@ -254,6 +297,7 @@ e_filter_input_class_init (EFilterInputClass *class)
filter_element_class = E_FILTER_ELEMENT_CLASS (class);
filter_element_class->validate = filter_input_validate;
filter_element_class->eq = filter_input_eq;
+ filter_element_class->xml_create = filter_input_xml_create;
filter_element_class->xml_encode = filter_input_xml_encode;
filter_element_class->xml_decode = filter_input_xml_decode;
filter_element_class->get_widget = filter_input_get_widget;
@@ -264,6 +308,7 @@ static void
e_filter_input_init (EFilterInput *input)
{
input->values = g_list_prepend (NULL, g_strdup (""));
+ input->allow_empty = TRUE;
}
/**
diff --git a/e-util/e-filter-input.h b/e-util/e-filter-input.h
index 28f7096507..456da413d6 100644
--- a/e-util/e-filter-input.h
+++ b/e-util/e-filter-input.h
@@ -60,6 +60,7 @@ struct _EFilterInput {
gchar *type; /* name of type */
GList *values; /* strings */
+ gboolean allow_empty; /* whether can have empty value */
};
struct _EFilterInputClass {
diff --git a/e-util/e-filter-rule.c b/e-util/e-filter-rule.c
index 5d0b1943a0..d339efde03 100644
--- a/e-util/e-filter-rule.c
+++ b/e-util/e-filter-rule.c
@@ -400,7 +400,7 @@ filter_rule_validate (EFilterRule *rule,
parts = parts->next;
}
- if (!valid && !parts && alert)
+ if (!valid && !rule->parts && alert)
*alert = e_alert_new ("filter:no-condition", NULL);
return valid;
diff --git a/e-util/filter.error.xml b/e-util/filter.error.xml
index 0b35f059be..dbce98dabe 100644
--- a/e-util/filter.error.xml
+++ b/e-util/filter.error.xml
@@ -36,4 +36,9 @@
<_secondary>Filter should have at least one condition.</_secondary>
</error>
+ <error id="not-allow-empty" type="error">
+ <_primary>Missing value.</_primary>
+ <_secondary>One or more values cannot be empty.</_secondary>
+ </error>
+
</error-list>