From 6f7ec6c07dfe9c01977cf685832871c45d7e2b17 Mon Sep 17 00:00:00 2001 From: Jon Trowbridge Date: Mon, 30 Jul 2001 21:06:45 +0000 Subject: Properly handle the case where our "cleaned" completion is the empty 2001-07-30 Jon Trowbridge * gui/component/select-names/e-select-names-completion.c (e_select_names_completion_do_query): Properly handle the case where our "cleaned" completion is the empty string. This happens, for example, if the query text is the string "\"". (Bug #5610). * backend/ebook/e-destination.c (e_destination_get_address_textv): Reassure fejj that I'm not doing something stupid here. (e_destination_get_address): Fix address quoting. This is a stop-gap measure until I can change this code to use Camel's superior address-handling routines. (Also Bug #5610) svn path=/trunk/; revision=11487 --- addressbook/ChangeLog | 13 +++ addressbook/backend/ebook/e-destination.c | 100 +++++++++++++++++---- .../select-names/e-select-names-completion.c | 9 +- 3 files changed, 102 insertions(+), 20 deletions(-) (limited to 'addressbook') diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index bbbc573933..dd259abd30 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,16 @@ +2001-07-30 Jon Trowbridge + + * gui/component/select-names/e-select-names-completion.c + (e_select_names_completion_do_query): Properly handle the case + where our "cleaned" completion is the empty string. This happens, + for example, if the query text is the string "\"". (Bug #5610). + + * backend/ebook/e-destination.c (e_destination_get_address_textv): + Reassure fejj that I'm not doing something stupid here. + (e_destination_get_address): Fix address quoting. This is a + stop-gap measure until I can change this code to use Camel's + superior address-handling routines. (Also Bug #5610) + 2001-07-30 Jason Leach * gui/component/addressbook-storage.c (load_source_data): Fix a diff --git a/addressbook/backend/ebook/e-destination.c b/addressbook/backend/ebook/e-destination.c index 9b4fbe681b..e5d41ab36d 100644 --- a/addressbook/backend/ebook/e-destination.c +++ b/addressbook/backend/ebook/e-destination.c @@ -40,7 +40,6 @@ #include #include - struct _EDestinationPrivate { gchar *card_uri; @@ -413,6 +412,7 @@ e_destination_get_name (const EDestination *dest) } +/* FIXME: not utf-8 safe */ const gchar * e_destination_get_email (const EDestination *dest) { @@ -454,6 +454,59 @@ e_destination_get_email (const EDestination *dest) return priv->email; } +#define NEEDS_QUOTING(c) ((c) == '.' || (c) == ',' || (c) == '<' || (c) == '>') + +/* FIXME: not utf-8 safe */ +static gboolean +needs_quotes (const gchar *str) +{ + gboolean in_quote = FALSE; + + while (*str) { + if (*str == '"') + in_quote = !in_quote; + else if (NEEDS_QUOTING (*str) && !in_quote) { + return TRUE; + } + ++str; + } + return FALSE; +} + +/* FIXME: not utf-8 safe */ +static gchar * +quote_string (const gchar *str) +{ + gchar *new_str, *t; + const gchar *s; + if (strchr (str, '\"') == NULL) { + + new_str = g_strdup_printf ("\"%s\"", str); + + } else { + + new_str = t = g_malloc (strlen (str)+3); + *t = '\"'; + ++t; + + s = str; + while (*s) { + if (*s != '"') { + *t = *s; + ++t; + } + ++s; + } + + *t = '\"'; + ++t; + *t = '\0'; + + } + + return new_str; +} + const gchar * e_destination_get_address (const EDestination *dest) { @@ -462,7 +515,7 @@ e_destination_get_address (const EDestination *dest) g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - + if (priv->addr == NULL) { if (e_destination_is_evolution_list (dest)) { gchar **strv = g_new0 (gchar *, g_list_length (priv->list_dests) + 1); @@ -479,8 +532,6 @@ e_destination_get_address (const EDestination *dest) priv->addr = g_strjoinv (", ", strv); - g_message ("List address is [%s]", priv->addr); - g_free (strv); } else { const gchar *name = e_destination_get_name (dest); @@ -489,30 +540,37 @@ e_destination_get_address (const EDestination *dest) /* If this isn't set, we return NULL */ if (email) { if (name) { - /* uhm, yea... this'll work. NOT!!! */ - /* what about ','? or any of the other chars that require quoting?? */ const gchar *lt = strchr (name, '<'); - gchar *namecpy = lt ? g_strndup (name, lt-name) : g_strdup (name); - gboolean needs_quotes = (strchr (namecpy, '.') != NULL); + gchar *namestrip = lt ? g_strndup (name, lt-name) : g_strdup (name); + gchar *namecopy; - g_strstrip (namecpy); + g_strstrip (namestrip); + if (needs_quotes (namestrip)) { + namecopy = quote_string (namestrip); + } else { + namecopy = namestrip; + namestrip = NULL; + } + if (namestrip) + g_free (namestrip); - priv->addr = g_strdup_printf ("%s%s%s <%s>", - needs_quotes ? "\"" : "", - namecpy, - needs_quotes ? "\"" : "", - email); - g_free (namecpy); + priv->addr = g_strdup_printf ("%s <%s>", namecopy, email); + g_free (namecopy); + } else { priv->addr = g_strdup (email); } } else { /* Just use the name, which is the best we can do. */ - priv->addr = g_strdup (name); + if (needs_quotes (name)) { + priv->addr = quote_string (name); + } else { + priv->addr = g_strdup (name); + } } } } - + return priv->addr; } @@ -578,9 +636,13 @@ e_destination_get_address_textv (EDestination **destv) g_return_val_if_fail (destv, NULL); - /* FIXME: please tell me this is only for assertion + /* Q: Please tell me this is only for assertion reasons. If this is considered to be ok behavior then you - shouldn't use g_return's. Just a reminder ;-) */ + shouldn't use g_return's. Just a reminder ;-) + + A: Yes, this is just an assertion. (Though it does find the + length of the vector in the process...) + */ while (destv[len]) { g_return_val_if_fail (E_IS_DESTINATION (destv[len]), NULL); ++len; diff --git a/addressbook/gui/component/select-names/e-select-names-completion.c b/addressbook/gui/component/select-names/e-select-names-completion.c index e75f964b4c..1d1cde2489 100644 --- a/addressbook/gui/component/select-names/e-select-names-completion.c +++ b/addressbook/gui/component/select-names/e-select-names-completion.c @@ -926,6 +926,7 @@ e_select_names_completion_start_query (ESelectNamesCompletion *comp, const gchar } else { g_free (comp->priv->query_text); + comp->priv->query_text = NULL; } g_free (sexp); @@ -945,8 +946,14 @@ e_select_names_completion_do_query (ESelectNamesCompletion *comp, const gchar *q g_return_if_fail (comp != NULL); g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - query_is_still_running = comp->priv->book_view_tag || comp->priv->book_view; clean = clean_query_text (query_text); + if (! (clean && *clean)) { + g_free (clean); + e_completion_end_search (E_COMPLETION (comp)); + return; + } + + query_is_still_running = comp->priv->book_view_tag || comp->priv->book_view; if (out) { fprintf (out, "do_query: %s => %s\n", query_text, clean); -- cgit v1.2.3