[evolution] Encode the path part of folder URIs.



commit eeb642c416a847a81c1aa85548bdcabc0c30b716
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun May 8 22:01:19 2011 -0400

    Encode the path part of folder URIs.
    
    Wasn't sure if this was necessary, but it -is- in order to handle the
    local Junk and Trash vfolder names correctly:
    
        .#evolution/Junk
        .#evolution/Trash
    
    If we don't escape the path and we feed camel_url_new() something like
    "folder://local/.#evolution/Trash", it's gonna think the path is '.' and
    the rest of it's a fragment.

 mail/e-mail-folder-utils.c |   24 ++++++++++++++++--------
 1 files changed, 16 insertions(+), 8 deletions(-)
---
diff --git a/mail/e-mail-folder-utils.c b/mail/e-mail-folder-utils.c
index fbd2dd3..d73f13a 100644
--- a/mail/e-mail-folder-utils.c
+++ b/mail/e-mail-folder-utils.c
@@ -176,6 +176,7 @@ e_mail_folder_uri_build (CamelStore *store,
                          const gchar *folder_name)
 {
 	const gchar *uid;
+	gchar *encoded_name;
 	gchar *encoded_uid;
 	gchar *uri;
 
@@ -187,11 +188,14 @@ e_mail_folder_uri_build (CamelStore *store,
 		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, folder_name);
+	uri = g_strdup_printf ("folder://%s/%s", encoded_uid, encoded_name);
 
 	g_free (encoded_uid);
+	g_free (encoded_name);
 
 	return uri;
 }
@@ -230,7 +234,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 {
 	CamelURL *url;
 	CamelService *service = NULL;
-	const gchar *folder_name = NULL;
+	gchar *folder_name = NULL;
 	gboolean success = FALSE;
 
 	g_return_val_if_fail (CAMEL_IS_SESSION (session), FALSE);
@@ -251,7 +255,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 		}
 
 		if (url->path != NULL && *url->path == '/')
-			folder_name = url->path + 1;
+			folder_name = camel_url_decode_path (url->path + 1);
 
 	/* This style was used to reference accounts by UID before
 	 * CamelServices themselves had UIDs.  Some examples are:
@@ -295,7 +299,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 		}
 
 		if (url->path != NULL && *url->path == '/')
-			folder_name = url->path + 1;
+			folder_name = g_strdup (url->path + 1);
 
 	/* CamelFolderInfo URIs used to embed the store's URI, so the
 	 * folder name is appended as either a path part or a fragment
@@ -312,9 +316,9 @@ e_mail_folder_uri_parse (CamelSession *session,
 			provider = camel_service_get_provider (service);
 
 			if (provider->url_flags & CAMEL_URL_FRAGMENT_IS_PATH)
-				folder_name = url->fragment;
+				folder_name = g_strdup (url->fragment);
 			else if (url->path != NULL && *url->path == '/')
-				folder_name = url->path + 1;
+				folder_name = g_strdup (url->path + 1);
 		}
 	}
 
@@ -322,8 +326,10 @@ e_mail_folder_uri_parse (CamelSession *session,
 		if (out_store != NULL)
 			*out_store = g_object_ref (service);
 
-		if (out_folder_name != NULL)
-			*out_folder_name = g_strdup (folder_name);
+		if (out_folder_name != NULL) {
+			*out_folder_name = folder_name;
+			folder_name = NULL;
+		}
 
 		success = TRUE;
 	} else {
@@ -334,6 +340,8 @@ e_mail_folder_uri_parse (CamelSession *session,
 			folder_uri);
 	}
 
+	g_free (folder_name);
+
 	camel_url_free (url);
 
 	return success;



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