diff options
author | Jon Trowbridge <trow@ximian.com> | 2001-09-20 10:23:41 +0800 |
---|---|---|
committer | Jon Trowbridge <trow@src.gnome.org> | 2001-09-20 10:23:41 +0800 |
commit | 9ae341104ad563c81b2a8d14db9ae3af74a2b803 (patch) | |
tree | 038aae4dbec8e89d73d7149ed111ff11aaa7df51 /addressbook/backend/ebook/e-card-compare.c | |
parent | 808bbced26ba3d2960c001725468849bba703f05 (diff) | |
download | gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar.gz gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar.bz2 gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar.lz gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar.xz gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.tar.zst gsoc2013-evolution-9ae341104ad563c81b2a8d14db9ae3af74a2b803.zip |
Use the default e-mail address if we have nothing else to go on.
2001-09-19 Jon Trowbridge <trow@ximian.com>
* backend/ebook/e-destination.c (name_and_email_simple_query_cb):
Use the default e-mail address if we have nothing else to go on.
Previously we just failed, which basically meant that name-only
searches would never work properly.
(nickname_simple_query_cb): The logic was a bit tangled here; if
our query status isn't SUCCESS, always give up but don't leak the
destination. And if our nickname query fails and we try the
name-and-email query, use the textrep for a name-only search. The
only reason we are doing a nickname query in the first place is if
we have an obviously invalid e-mail.
(launch_cardify_query): Use e_destination_is_valid to determine
if we should try a nickname query first.
These changes basically fix bug 7728, and generally make the
auto-cardification of addresses a lot more clever and robust.
* backend/ebook/e-book-util.c (name_and_email_cb): Use
e_card_compare_name_to_string instead of e_card_name_match_string.
(e_book_name_and_email_query): The arguments to g_strsplit were
in the wrong order. Doh!
* backend/ebook/e-card-compare.c (e_card_compare_name_to_string):
Added. Replaces e_card_name_match_string, and actually works.
* backend/ebook/e-card.c: Removed e_card_name_match_string
function, which didn't work particularly well.
svn path=/trunk/; revision=13003
Diffstat (limited to 'addressbook/backend/ebook/e-card-compare.c')
-rw-r--r-- | addressbook/backend/ebook/e-card-compare.c | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/addressbook/backend/ebook/e-card-compare.c b/addressbook/backend/ebook/e-card-compare.c index d8acbda48e..7ccfae0aa7 100644 --- a/addressbook/backend/ebook/e-card-compare.c +++ b/addressbook/backend/ebook/e-card-compare.c @@ -62,6 +62,8 @@ static gchar *name_synonyms[][2] = { { "elizabeth", "liz" }, { "jeff", "geoff" }, { "jeff", "geoffrey" }, + { "tom", "thomas" }, + { "dave", "david" }, { "jim", "james" }, { "abigal", "abby" }, { "amanda", "amy" }, @@ -101,14 +103,79 @@ name_fragment_match (const gchar *a, const gchar *b) } ECardMatchType +e_card_compare_name_to_string (ECard *card, const gchar *str) +{ + gchar **namev; + gboolean matched_given = FALSE, matched_additional = FALSE, matched_family = FALSE, mismatch = FALSE; + ECardMatchType match_type; + gint i; + + 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); + + 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])) { + + matched_additional = TRUE; + + } else if (card->name->family + && !matched_family + && !g_utf8_strcasecmp (card->name->family, namev[i])) { + + matched_family = TRUE; + + } else { + + mismatch = TRUE; + + } + } + + + match_type = E_CARD_MATCH_NONE; + if (! mismatch) { + + switch ( (matched_family ? 1 : 0) + (matched_additional ? 1 : 0) + (matched_given ? 1 : 0)) { + + case 0: + match_type = E_CARD_MATCH_NONE; + break; + case 1: + match_type = E_CARD_MATCH_VAGUE; + break; + case 2: + case 3: + match_type = E_CARD_MATCH_PARTIAL; + break; + } + } + + g_strfreev (namev); + + return match_type; +} + +ECardMatchType e_card_compare_name (ECard *card1, ECard *card2) { ECardName *a, *b; gint matches=0, possible=0; gboolean given_match = FALSE, additional_match = FALSE, family_match = FALSE; - g_return_val_if_fail (card1 && E_IS_CARD (card1), E_CARD_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (card2 && E_IS_CARD (card2), E_CARD_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (E_IS_CARD (card1), E_CARD_MATCH_NOT_APPLICABLE); + g_return_val_if_fail (E_IS_CARD (card2), E_CARD_MATCH_NOT_APPLICABLE); a = card1->name; b = card2->name; |