changeset 19559:94c83436a1f4

lib-storage: Added mailbox_list_[un]escape_name_params() This allows calling the mailbox_list_[un]escape_name() with wanted parameters instead of taking them from mailbox_list.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 14 Jan 2016 18:47:40 +0200
parents 464859d22302
children 5e6afd3b67b6
files src/lib-storage/mailbox-list-private.h src/lib-storage/mailbox-list.c
diffstat 2 files changed, 44 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mailbox-list-private.h	Thu Jan 14 16:28:06 2016 +0200
+++ b/src/lib-storage/mailbox-list-private.h	Thu Jan 14 18:47:40 2016 +0200
@@ -178,7 +178,15 @@
 const char *
 mailbox_list_escape_name(struct mailbox_list *list, const char *vname);
 const char *
+mailbox_list_escape_name_params(const char *vname, const char *ns_prefix,
+				char ns_sep, char list_sep, char escape_char,
+				const char *maildir_name);
+const char *
 mailbox_list_unescape_name(struct mailbox_list *list, const char *src);
+const char *
+mailbox_list_unescape_name_params(const char *src, const char *ns_prefix,
+				  char ns_sep, char list_sep, char escape_char);
+
 const char *mailbox_list_default_get_storage_name(struct mailbox_list *list,
 						  const char *vname);
 const char *mailbox_list_default_get_vname(struct mailbox_list *list,
--- a/src/lib-storage/mailbox-list.c	Thu Jan 14 16:28:06 2016 +0200
+++ b/src/lib-storage/mailbox-list.c	Thu Jan 14 18:47:40 2016 +0200
@@ -427,23 +427,23 @@
 }
 
 const char *
-mailbox_list_escape_name(struct mailbox_list *list, const char *vname)
+mailbox_list_escape_name_params(const char *vname, const char *ns_prefix,
+				char ns_sep, char list_sep, char escape_char,
+				const char *maildir_name)
 {
-	char ns_sep = mail_namespace_get_sep(list->ns);
-	char list_sep = mailbox_list_get_hierarchy_sep(list);
+	unsigned int ns_prefix_len = strlen(ns_prefix);
 	string_t *escaped_name = t_str_new(64);
 	char dirstart = TRUE;
 
 	/* no escaping of namespace prefix */
-	if (strncmp(list->ns->prefix, vname, list->ns->prefix_len) == 0) {
-		str_append_n(escaped_name, vname, list->ns->prefix_len);
-		vname += list->ns->prefix_len;
+	if (strncmp(ns_prefix, vname, ns_prefix_len) == 0) {
+		str_append_n(escaped_name, vname, ns_prefix_len);
+		vname += ns_prefix_len;
 	}
 
 	/* escape the mailbox name */
 	if (*vname == '~') {
-		str_printfa(escaped_name, "%c%02x",
-			    list->set.escape_char, *vname);
+		str_printfa(escaped_name, "%c%02x", escape_char, *vname);
 		vname++;
 		dirstart = FALSE;
 	}
@@ -451,12 +451,12 @@
 		if (*vname == ns_sep)
 			str_append_c(escaped_name, list_sep);
 		else if (*vname == list_sep ||
-			 *vname == list->set.escape_char ||
+			 *vname == escape_char ||
 			 *vname == '/' ||
 			 (dirstart &&
-			  need_escape_dirstart(vname, list->set.maildir_name))) {
+			  need_escape_dirstart(vname, maildir_name))) {
 			str_printfa(escaped_name, "%c%02x",
-				    list->set.escape_char, *vname);
+				    escape_char, *vname);
 		} else {
 			str_append_c(escaped_name, *vname);
 		}
@@ -465,6 +465,15 @@
 	return str_c(escaped_name);
 }
 
+const char *
+mailbox_list_escape_name(struct mailbox_list *list, const char *vname)
+{
+	return mailbox_list_escape_name_params(vname, list->ns->prefix,
+				mail_namespace_get_sep(list->ns),
+				mailbox_list_get_hierarchy_sep(list),
+				list->set.escape_char, list->set.maildir_name);
+}
+
 static int
 mailbox_list_unescape_broken_chars(struct mailbox_list *list, char *name)
 {
@@ -595,20 +604,20 @@
 }
 
 const char *
-mailbox_list_unescape_name(struct mailbox_list *list, const char *src)
+mailbox_list_unescape_name_params(const char *src, const char *ns_prefix,
+				  char ns_sep, char list_sep, char escape_char)
 {
-	char ns_sep = mail_namespace_get_sep(list->ns);
-	char list_sep = mailbox_list_get_hierarchy_sep(list);
+	unsigned int ns_prefix_len = strlen(ns_prefix);
 	string_t *dest = t_str_new(strlen(src));
 	unsigned int num;
 
-	if (strncmp(src, list->ns->prefix, list->ns->prefix_len) == 0) {
-		str_append_n(dest, src, list->ns->prefix_len);
-		src += list->ns->prefix_len;
+	if (strncmp(src, ns_prefix, ns_prefix_len) == 0) {
+		str_append_n(dest, src, ns_prefix_len);
+		src += ns_prefix_len;
 	}
 
 	for (; *src != '\0'; src++) {
-		if (*src == list->set.escape_char &&
+		if (*src == escape_char &&
 		    i_isxdigit(src[1]) && i_isxdigit(src[2])) {
 			if (src[1] >= '0' && src[1] <= '9')
 				num = src[1] - '0';
@@ -630,6 +639,15 @@
 	return str_c(dest);
 }
 
+const char *
+mailbox_list_unescape_name(struct mailbox_list *list, const char *src)
+{
+	return mailbox_list_unescape_name_params(src, list->ns->prefix,
+				mail_namespace_get_sep(list->ns),
+				mailbox_list_get_hierarchy_sep(list),
+				list->set.escape_char);
+}
+
 static void
 mailbox_list_escape_broken_chars(struct mailbox_list *list, string_t *str)
 {