[evolution-data-server] Bug #529743 - Add "Any header" filter and search folder condition



commit db51f791e18b5f30b0da4a6a91042afb49b53840
Author: Milan Crha <mcrha redhat com>
Date:   Mon Dec 3 13:27:33 2012 +0100

    Bug #529743 - Add "Any header" filter and search folder condition

 camel/camel-filter-search.c |   33 +++++++++++++++++++++++++++++----
 camel/camel-folder-search.c |    8 +++++---
 2 files changed, 34 insertions(+), 7 deletions(-)
---
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 0c5e3ad..6366437 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -171,15 +171,39 @@ check_header_in_message_info (CamelMessageInfo *info,
 	name = argv[0]->value.string;
 	g_return_val_if_fail (name != NULL, FALSE);
 
+	/* test against any header */
+	if (!*name) {
+		gint jj;
+
+		for (jj = 0; jj < G_N_ELEMENTS (known_headers); jj++) {
+			value = camel_message_info_ptr (info, known_headers[jj].info_key);
+			if (!value)
+				continue;
+
+			if (known_headers[jj].info_key == CAMEL_MESSAGE_INFO_SUBJECT)
+				type = CAMEL_SEARCH_TYPE_ENCODED;
+			else
+				type = CAMEL_SEARCH_TYPE_ADDRESS_ENCODED;
+
+			for (ii = 1; ii < argc && !*matched; ii++) {
+				if (argv[ii]->type == CAMEL_SEXP_RES_STRING)
+					*matched = camel_search_header_match (value, argv[ii]->value.string, how, type, NULL);
+			}
+
+			if (*matched)
+				return TRUE;
+		}
+
+		return FALSE;
+	}
+
 	value = NULL;
 
 	for (ii = 0; ii < G_N_ELEMENTS (known_headers); ii++) {
 		found = g_ascii_strcasecmp (name, known_headers[ii].header_name) == 0;
 		if (found) {
 			value = camel_message_info_ptr (info, known_headers[ii].info_key);
-			if (known_headers[ii].info_key == CAMEL_MESSAGE_INFO_FROM ||
-			    known_headers[ii].info_key == CAMEL_MESSAGE_INFO_TO ||
-			    known_headers[ii].info_key == CAMEL_MESSAGE_INFO_CC)
+			if (known_headers[ii].info_key != CAMEL_MESSAGE_INFO_SUBJECT)
 				type = CAMEL_SEARCH_TYPE_ADDRESS_ENCODED;
 			break;
 		}
@@ -246,7 +270,8 @@ check_header (struct _CamelSExp *f,
 			}
 
 			for (header = mime_part->headers; header && !matched; header = header->next) {
-				if (!g_ascii_strcasecmp (header->name, name)) {
+				/* empty name means any header */
+				if (!name || !*name || !g_ascii_strcasecmp (header->name, name)) {
 					for (i = 1; i < argc && !matched; i++) {
 						if (argv[i]->type == CAMEL_SEXP_RES_STRING)
 							matched = camel_search_header_match (header->value, argv[i]->value.string, how, type, charset);
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 0c78be1..6ef7f98 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -1119,9 +1119,10 @@ check_header (struct _CamelSExp *f,
 					for (j = 0; j < words->len && truth; j++) {
 						if (message) {
 							for (raw_header = ((CamelMimePart *) message)->headers; raw_header; raw_header = raw_header->next) {
-								if (!g_ascii_strcasecmp (raw_header->name, headername)) {
+								/* empty name means any header */
+								if (!headername || !*headername || !g_ascii_strcasecmp (raw_header->name, headername)) {
 									if (camel_search_header_match (raw_header->value, words->words[j]->word, how, type, charset))
-										break;;
+										break;
 								}
 							}
 
@@ -1133,7 +1134,8 @@ check_header (struct _CamelSExp *f,
 				} else {
 					if (message) {
 						for (raw_header = ((CamelMimePart *) message)->headers; raw_header && !truth; raw_header = raw_header->next) {
-							if (!g_ascii_strcasecmp (raw_header->name, headername)) {
+							/* empty name means any header */
+							if (!headername || !*headername || !g_ascii_strcasecmp (raw_header->name, headername)) {
 								truth = camel_search_header_match (raw_header->value, argv[i]->value.string, how, type, charset);
 							}
 						}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]