From 24446cde6be0c3edcdb41520e0a433c99d17f9f9 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 11 Oct 2010 10:57:56 -0400 Subject: [PATCH] Add a CamelFolder:uri property. Replaces mail_tools_folder_to_url() in Evolution. The URI is computed on-demand and then cached, so the return value is const. Renaming the folder invalidates the cached URI and emits a "notify::uri" signal. --- camel/camel-folder.c | 88 ++++++++++++++++++++++++++++- camel/camel-folder.h | 1 + docs/reference/camel/camel-sections.txt | 1 + docs/reference/camel/tmpl/camel-folder.sgml | 5 ++ 4 files changed, 93 insertions(+), 2 deletions(-) diff --git a/camel/camel-folder.c b/camel/camel-folder.c index 00b7aaf..bf580f5 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -65,6 +65,7 @@ struct _CamelFolderPrivate { gchar *name; gchar *full_name; gchar *description; + gchar *uri; }; struct _AsyncContext { @@ -110,7 +111,8 @@ enum { PROP_DESCRIPTION, PROP_FULL_NAME, PROP_NAME, - PROP_PARENT_STORE + PROP_PARENT_STORE, + PROP_URI }; enum { @@ -472,6 +474,12 @@ folder_get_property (GObject *object, value, camel_folder_get_parent_store ( CAMEL_FOLDER (object))); return; + + case PROP_URI: + g_value_set_string ( + value, camel_folder_get_uri ( + CAMEL_FOLDER (object))); + return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -511,6 +519,7 @@ folder_finalize (GObject *object) g_free (priv->name); g_free (priv->full_name); g_free (priv->description); + g_free (priv->uri); camel_folder_change_info_free (priv->changed_frozen); @@ -1567,6 +1576,23 @@ camel_folder_class_init (CamelFolderClass *class) G_PARAM_CONSTRUCT_ONLY)); /** + * CamelFolder:uri + * + * The folder's URI. + * + * Since: 2.92 + **/ + g_object_class_install_property ( + object_class, + PROP_URI, + g_param_spec_string ( + "uri", + "URI", + "The folder's URI", + NULL, + G_PARAM_READABLE)); + + /** * CamelFolder::changed * @folder: the #CamelFolder which emitted the signal **/ @@ -1744,12 +1770,22 @@ void camel_folder_set_full_name (CamelFolder *folder, const gchar *full_name) { + GObject *object; + g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_free (folder->priv->full_name); folder->priv->full_name = g_strdup (full_name); - g_object_notify (G_OBJECT (folder), "full-name"); + /* The URI property will need to be reconstructed. */ + g_free (folder->priv->uri); + folder->priv->uri = NULL; + + object = G_OBJECT (folder); + g_object_freeze_notify (object); + g_object_notify (object, "full-name"); + g_object_notify (object, "uri"); + g_object_thaw_notify (object); } /** @@ -1810,6 +1846,54 @@ camel_folder_get_parent_store (CamelFolder *folder) } /** + * camel_folder_get_uri: + * @folder: a #CamelFolder + * + * Returns the folder's URI. + * + * Returns: the folder's URI + * + * Since: 2.92 + **/ +const gchar * +camel_folder_get_uri (CamelFolder *folder) +{ + CamelService *service; + CamelStore *parent_store; + const gchar *full_name; + CamelURL *url; + + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); + + /* The URI is constructed on demand and then cached. */ + + if (folder->priv->uri != NULL) + goto exit; + + full_name = camel_folder_get_full_name (folder); + parent_store = camel_folder_get_parent_store (folder); + service = CAMEL_SERVICE (parent_store); + + url = camel_url_copy (service->url); + + if (service->provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH) { + camel_url_set_fragment (url, full_name); + } else { + gchar *path = g_strdup_printf ("/%s", full_name); + camel_url_set_path (url, path); + g_free (path); + } + + g_free (folder->priv->uri); + folder->priv->uri = camel_url_to_string (url, CAMEL_URL_HIDE_ALL); + + camel_url_free (url); + +exit: + return folder->priv->uri; +} + +/** * camel_folder_get_message_count: * @folder: a #CamelFolder * diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 01abda3..9024344 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -347,6 +347,7 @@ void camel_folder_set_full_name (CamelFolder *folder, const gchar * camel_folder_get_description (CamelFolder *folder); void camel_folder_set_description (CamelFolder *folder, const gchar *description); +const gchar * camel_folder_get_uri (CamelFolder *folder); CamelMessageFlags camel_folder_get_permanent_flags (CamelFolder *folder); diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt index c80f936..ff9c217 100644 --- a/docs/reference/camel/camel-sections.txt +++ b/docs/reference/camel/camel-sections.txt @@ -436,6 +436,7 @@ camel_folder_get_full_name camel_folder_set_full_name camel_folder_get_description camel_folder_set_description +camel_folder_get_uri camel_folder_get_permanent_flags camel_folder_get_message_flags camel_folder_set_message_flags diff --git a/docs/reference/camel/tmpl/camel-folder.sgml b/docs/reference/camel/tmpl/camel-folder.sgml index bd7c5ba..7362fb3 100644 --- a/docs/reference/camel/tmpl/camel-folder.sgml +++ b/docs/reference/camel/tmpl/camel-folder.sgml @@ -82,6 +82,11 @@ CamelFolder + + + + + -- 2.7.4