From 1ffacfeee95b69419b96423afef91b66be2a7d34 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 5 May 2011 16:02:56 -0400 Subject: Introduce a new, simpler folder URI format. Folder URIs shall henceforth be exclusive to Evolution. The new format is: 'folder://' CAMEL_STORE_UID '/' CAMEL_FOLDER_PATH Add e_mail_folder_uri_build() to construct such a URI from a CamelStore and folder path string, change e_mail_folder_uri_from_folder() to build the new URI, and teach e_mail_folder_uri_parse() to parse it. e_mail_folder_uri_parse() will continue to know how to parse the older URI formats still present in config files and GConf keys. This captures the legacy knowledge neatly into one function. --- mail/e-mail-folder-utils.c | 71 ++++++++++++++++++++++++++++++++++++++++------ mail/e-mail-folder-utils.h | 2 ++ 2 files changed, 65 insertions(+), 8 deletions(-) (limited to 'mail') diff --git a/mail/e-mail-folder-utils.c b/mail/e-mail-folder-utils.c index 3c87ca4de0..fbd2dd3055 100644 --- a/mail/e-mail-folder-utils.c +++ b/mail/e-mail-folder-utils.c @@ -162,6 +162,40 @@ e_mail_folder_append_message_finish (CamelFolder *folder, return !g_simple_async_result_propagate_error (simple, error); } +/** + * e_mail_folder_uri_build: + * @store: a #CamelStore + * @folder_name: a folder name + * + * Builds a folder URI string from @store and @folder_name. + * + * Returns: a newly-allocated folder URI string + **/ +gchar * +e_mail_folder_uri_build (CamelStore *store, + const gchar *folder_name) +{ + const gchar *uid; + 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, ":;@/"); + + uri = g_strdup_printf ("folder://%s/%s", encoded_uid, folder_name); + + g_free (encoded_uid); + + return uri; +} + /** * e_mail_folder_uri_parse: * @session: a #CamelSession @@ -170,16 +204,21 @@ e_mail_folder_append_message_finish (CamelFolder *folder, * @out_folder_name: return location for a folder name, or %NULL * @error: return location for a #GError, or %NULL * - * Parses a folder URI and returns the corresponding #CamelStore instance - * in @out_store and folder name string in @out_folder_name. If the URI - * is malformed or no corresponding store exists, the function sets @error - * and returns %FALSE. + * Parses a folder URI generated by e_mail_folder_uri_build() and + * returns the corresponding #CamelStore instance in @out_store and + * folder name string in @out_folder_name. If the URI is malformed + * or no corresponding store exists, the function sets @error and + * returns %FALSE. * * If the function is able to parse the URI, the #CamelStore instance * set in @out_store should be unreferenced with g_object_unref() when * done with it, and the folder name string set in @out_folder_name * should be freed with g_free(). * + * The function also handles older style URIs, such as ones where the + * #CamelStore's #CamelStore::uri string was embedded directly in the + * folder URI, and account-based URIs that used an "email://" prefix. + * * Returns: %TRUE if @folder_uri could be parsed, %FALSE otherwise **/ gboolean @@ -201,6 +240,19 @@ e_mail_folder_uri_parse (CamelSession *session, if (url == NULL) return FALSE; + /* Current URI Format: 'folder://' STORE_UID '/' FOLDER_PATH */ + if (g_strcmp0 (url->protocol, "folder") == 0) { + + if (url->host != NULL) { + gchar *uid = g_strdup (url->host); + camel_url_decode (uid); + service = camel_session_get_service (session, uid); + g_free (uid); + } + + if (url->path != NULL && *url->path == '/') + folder_name = url->path + 1; + /* This style was used to reference accounts by UID before * CamelServices themselves had UIDs. Some examples are: * @@ -217,7 +269,7 @@ e_mail_folder_uri_parse (CamelSession *session, * the STORE_UIDs for the special cases are 'local' * and 'vfolder'. */ - if (g_strcmp0 (url->protocol, "email") == 0) { + } else if (g_strcmp0 (url->protocol, "email") == 0) { gchar *uid = NULL; /* Handle the special cases. */ @@ -360,10 +412,13 @@ exit: gchar * e_mail_folder_uri_from_folder (CamelFolder *folder) { + CamelStore *store; + const gchar *folder_name; + g_return_val_if_fail (CAMEL_IS_FOLDER (folder), NULL); - /* XXX This looks silly because it's just a temporary - * implementation. I have other plans in store. */ + store = camel_folder_get_parent_store (folder); + folder_name = camel_folder_get_full_name (folder); - return g_strdup (camel_folder_get_uri (folder)); + return e_mail_folder_uri_build (store, folder_name); } diff --git a/mail/e-mail-folder-utils.h b/mail/e-mail-folder-utils.h index 3187acfdf2..0d2f0ca0f9 100644 --- a/mail/e-mail-folder-utils.h +++ b/mail/e-mail-folder-utils.h @@ -45,6 +45,8 @@ gboolean e_mail_folder_append_message_finish gchar **appended_uid, GError **error); +gchar * e_mail_folder_uri_build (CamelStore *store, + const gchar *folder_name); gboolean e_mail_folder_uri_parse (CamelSession *session, const gchar *folder_uri, CamelStore **out_store, -- cgit