[evolution-data-server] Bug 227536 - Add "Message Location" filter option



commit e6b3f2ae3a3207ae457d62d369747bf50f9d725f
Author: Milan Crha <mcrha redhat com>
Date:   Thu Jun 5 19:13:22 2014 +0200

    Bug 227536 - Add "Message Location" filter option

 camel/camel-filter-driver.c |    2 +-
 camel/camel-filter-search.c |   68 +++++++++++++++++++++++++++++++++++++++++++
 camel/camel-filter-search.h |    6 ++--
 3 files changed, 72 insertions(+), 4 deletions(-)
---
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index e972f27..c82562b 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -1741,7 +1741,7 @@ camel_filter_driver_filter_message (CamelFilterDriver *driver,
 
                result = camel_filter_search_match (
                        driver->priv->session, get_message_cb, &data, driver->priv->info,
-                       original_store_uid, rule->match, &driver->priv->error);
+                       original_store_uid, source, rule->match, &driver->priv->error);
 
                switch (result) {
                case CAMEL_SEARCH_ERROR:
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 18672b6..9943d1f 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -61,6 +61,7 @@ typedef struct {
        gpointer get_message_data;
        CamelMimeMessage *message;
        CamelMessageInfo *info;
+       CamelFolder *folder;
        const gchar *source;
        GError **error;
 } FilterMessageSearch;
@@ -89,6 +90,7 @@ static CamelSExpResult *header_source (struct _CamelSExp *f, gint argc, struct _
 static CamelSExpResult *get_size (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, 
FilterMessageSearch *fms);
 static CamelSExpResult *pipe_message (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, 
FilterMessageSearch *fms);
 static CamelSExpResult *junk_test (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, 
FilterMessageSearch *fms);
+static CamelSExpResult *message_location (struct _CamelSExp *f, gint argc, struct _CamelSExpResult **argv, 
FilterMessageSearch *fms);
 
 /* builtin functions */
 static struct {
@@ -120,6 +122,7 @@ static struct {
        { "get-size",           (CamelSExpFunc) get_size,           0 },
        { "pipe-message",       (CamelSExpFunc) pipe_message,       0 },
        { "junk-test",          (CamelSExpFunc) junk_test,          0 },
+       { "message-location",   (CamelSExpFunc) message_location,   0 }
 };
 
 static CamelMimeMessage *
@@ -989,6 +992,68 @@ exit:
        return r;
 }
 
+/* this is copied from Evolution's libemail-engine/e-mail-folder-utils.c */
+static gchar *
+mail_folder_uri_build (CamelStore *store,
+                       const gchar *folder_name)
+{
+       const gchar *uid;
+       gchar *encoded_name;
+       gchar *encoded_uid;
+       gchar *uri;
+
+       g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
+       g_return_val_if_fail (folder_name != NULL, NULL);
+
+       /* Skip the leading slash, if present. */
+       if (*folder_name == '/')
+               folder_name++;
+
+       uid = camel_service_get_uid (CAMEL_SERVICE (store));
+
+       encoded_uid = camel_url_encode (uid, ":;@/");
+       encoded_name = camel_url_encode (folder_name, "#");
+
+       uri = g_strdup_printf ("folder://%s/%s", encoded_uid, encoded_name);
+
+       g_free (encoded_uid);
+       g_free (encoded_name);
+
+       return uri;
+}
+
+static CamelSExpResult *
+message_location (struct _CamelSExp *f,
+                 gint argc,
+                 struct _CamelSExpResult **argv,
+                 FilterMessageSearch *fms)
+{
+       CamelSExpResult *r;
+       gboolean same = FALSE;
+
+       if (argc != 1 || argv[0]->type != CAMEL_SEXP_RES_STRING)
+               camel_sexp_fatal_error (f, _("Invalid arguments to (message-location)"));
+
+       if (fms->folder && argv[0]->value.string) {
+               CamelStore *store;
+               const gchar *name;
+               gchar *uri;
+
+               store = camel_folder_get_parent_store (fms->folder);
+               name = camel_folder_get_full_name (fms->folder);
+               uri = mail_folder_uri_build (store, name);
+
+               same = g_str_equal (uri, argv[0]->value.string);
+
+               g_free (uri);
+       }
+
+       r = camel_sexp_result_new (f, CAMEL_SEXP_RES_BOOL);
+       r->value.boolean = same;
+
+       return r;
+}
+
 /**
  * camel_filter_search_match:
  * @session:
@@ -996,6 +1061,7 @@ exit:
  * @data: data for above
  * @info:
  * @source:
+ * @folder: in which folder the message is stored
  * @expression:
  * @error: return location for a #GError, or %NULL
  *
@@ -1008,6 +1074,7 @@ camel_filter_search_match (CamelSession *session,
                            gpointer data,
                            CamelMessageInfo *info,
                            const gchar *source,
+                          CamelFolder *folder,
                            const gchar *expression,
                            GError **error)
 {
@@ -1023,6 +1090,7 @@ camel_filter_search_match (CamelSession *session,
        fms.message = NULL;
        fms.info = info;
        fms.source = source;
+       fms.folder = folder;
        fms.error = error;
 
        sexp = camel_sexp_new ();
diff --git a/camel/camel-filter-search.h b/camel/camel-filter-search.h
index 57a6441..0b68086 100644
--- a/camel/camel-filter-search.h
+++ b/camel/camel-filter-search.h
@@ -41,9 +41,9 @@ enum {
 typedef CamelMimeMessage * (*CamelFilterSearchGetMessageFunc) (gpointer data, GError **error);
 
 gint camel_filter_search_match (struct _CamelSession *session,
-                              CamelFilterSearchGetMessageFunc get_message, gpointer data,
-                              CamelMessageInfo *info, const gchar *source,
-                              const gchar *expression, GError **error);
+                               CamelFilterSearchGetMessageFunc get_message, gpointer data,
+                               CamelMessageInfo *info, const gchar *source, struct _CamelFolder *folder,
+                               const gchar *expression, GError **error);
 
 G_END_DECLS
 


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