From 31f1562d1435fd8b99f9b7f5b19bc93b3210bab4 Mon Sep 17 00:00:00 2001 From: Jon Trowbridge Date: Wed, 26 Sep 2001 19:40:02 +0000 Subject: Properly handle names when the individual elements (given, addition, 2001-09-26 Jon Trowbridge * backend/ebook/e-card-compare.c (e_card_compare_name_to_string): Properly handle names when the individual elements (given, addition, family) contain whitespace. (Bug #10502) * backend/ebook/e-destination.c (e_destination_set_name): Reset textrep when we change the name. (e_destination_set_email): Reset textrep when we change the email. (e_destination_get_textrep): Make sure that the textrep version of the address is properly quoted if it contains unsafe characters. (All related to bug #10796) * gui/component/select-names/e-select-names-completion.c (match_nickname): Fix nickname matching. (bug #9698) (make_match): Use e_completion_match_new when building our match, rather than ad hoc manipulation of the struct. svn path=/trunk/; revision=13158 --- addressbook/backend/ebook/e-card-compare.c | 75 ++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 20 deletions(-) (limited to 'addressbook/backend/ebook/e-card-compare.c') diff --git a/addressbook/backend/ebook/e-card-compare.c b/addressbook/backend/ebook/e-card-compare.c index 7ccfae0aa7..5cdc745dba 100644 --- a/addressbook/backend/ebook/e-card-compare.c +++ b/addressbook/backend/ebook/e-card-compare.c @@ -105,40 +105,72 @@ name_fragment_match (const gchar *a, const gchar *b) ECardMatchType e_card_compare_name_to_string (ECard *card, const gchar *str) { - gchar **namev; + gchar **namev, **givenv = NULL, **addv = NULL, **familyv = NULL; gboolean matched_given = FALSE, matched_additional = FALSE, matched_family = FALSE, mismatch = FALSE; ECardMatchType match_type; - gint i; + gint match_count = 0; + gint i, j; + gchar *str_cpy, *s; g_return_val_if_fail (E_IS_CARD (card), E_CARD_MATCH_NOT_APPLICABLE); g_return_val_if_fail (card->name != NULL, E_CARD_MATCH_NOT_APPLICABLE); g_return_val_if_fail (str != NULL, E_CARD_MATCH_NOT_APPLICABLE); - namev = g_strsplit (str, " ", 0); + /* FIXME: utf-8 */ + str_cpy = s = g_strdup (str); + while (*s) { + if (*s == ',' || *s == '"') + *s = ' '; + ++s; + } + namev = g_strsplit (str_cpy, " ", 0); + g_free (str_cpy); + + if (card->name->given) + givenv = g_strsplit (card->name->given, " ", 0); + if (card->name->additional) + addv = g_strsplit (card->name->additional, " ", 0); + if (card->name->family) + familyv = g_strsplit (card->name->family, " ", 0); for (i = 0; namev[i] && !mismatch; ++i) { - - if (card->name->given - && !matched_given - && name_fragment_match (card->name->given, namev[i])) { - - matched_given = TRUE; - } else if (card->name->additional - && !matched_additional - && name_fragment_match (card->name->additional, namev[i])) { + if (*namev[i]) { - matched_additional = TRUE; - - } else if (card->name->family - && !matched_family - && !g_utf8_strcasecmp (card->name->family, namev[i])) { + mismatch = TRUE; - matched_family = TRUE; + if (mismatch && givenv) { + for (j = 0; givenv[j]; ++j) { + if (name_fragment_match (givenv[j], namev[i])) { + matched_given = TRUE; + mismatch = FALSE; + ++match_count; + break; + } + } + } - } else { + if (mismatch && addv) { + for (j = 0; addv[j]; ++j) { + if (name_fragment_match (addv[j], namev[i])) { + matched_additional = TRUE; + mismatch = FALSE; + ++match_count; + break; + } + } + } - mismatch = TRUE; + if (mismatch && familyv) { + for (j = 0; familyv[j]; ++j) { + if (!g_utf8_strcasecmp (familyv[j], namev[i])) { + matched_family = TRUE; + mismatch = FALSE; + ++match_count; + break; + } + } + } } } @@ -163,6 +195,9 @@ e_card_compare_name_to_string (ECard *card, const gchar *str) } g_strfreev (namev); + g_strfreev (givenv); + g_strfreev (addv); + g_strfreev (familyv); return match_type; } -- cgit v1.2.3