aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/ebook/e-card-compare.c
diff options
context:
space:
mode:
authorJon Trowbridge <trow@ximian.com>2001-09-20 10:23:41 +0800
committerJon Trowbridge <trow@src.gnome.org>2001-09-20 10:23:41 +0800
commit9ae341104ad563c81b2a8d14db9ae3af74a2b803 (patch)
tree038aae4dbec8e89d73d7149ed111ff11aaa7df51 /addressbook/backend/ebook/e-card-compare.c
parent808bbced26ba3d2960c001725468849bba703f05 (diff)
downloadgsoc2013-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.c71
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;