diff options
author | Christopher James Lahey <clahey@ximian.com> | 2001-06-11 13:43:48 +0800 |
---|---|---|
committer | Chris Lahey <clahey@src.gnome.org> | 2001-06-11 13:43:48 +0800 |
commit | efa9a6294d55c0c9f857e1c26390898c84ce0784 (patch) | |
tree | e0cde43394efdc84f05b38cb98432b5a9c3ee470 /addressbook/backend | |
parent | 56132926ca2d4f308a903937f16b0ecfa447b251 (diff) | |
download | gsoc2013-evolution-efa9a6294d55c0c9f857e1c26390898c84ce0784.tar.gz gsoc2013-evolution-efa9a6294d55c0c9f857e1c26390898c84ce0784.tar.zst gsoc2013-evolution-efa9a6294d55c0c9f857e1c26390898c84ce0784.zip |
Added this function to let you do slightly more complicated searches.
2001-06-11 Christopher James Lahey <clahey@ximian.com>
* backend/ebook/e-card-compare.c, backend/ebook/e-card-compare.h
(e_card_locate_match_full): Added this function to let you do
slightly more complicated searches.
* gui/merging/e-card-merging.c (e_card_merging_book_add_card): Use
e_card_locate_match_full to check if the card exists in the book
it's being added to instead of in the default book.
svn path=/trunk/; revision=10178
Diffstat (limited to 'addressbook/backend')
-rw-r--r-- | addressbook/backend/ebook/e-card-compare.c | 62 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-card-compare.h | 2 |
2 files changed, 59 insertions, 5 deletions
diff --git a/addressbook/backend/ebook/e-card-compare.c b/addressbook/backend/ebook/e-card-compare.c index f249c1727b..136535409b 100644 --- a/addressbook/backend/ebook/e-card-compare.c +++ b/addressbook/backend/ebook/e-card-compare.c @@ -326,6 +326,7 @@ e_card_compare (ECard *card1, ECard *card2) typedef struct _MatchSearchInfo MatchSearchInfo; struct _MatchSearchInfo { ECard *card; + GList *avoid; ECardMatchQueryCallback cb; gpointer closure; }; @@ -375,6 +376,7 @@ use_common_book_cb (EBook *book, gpointer closure) gchar *query_parts[MAX_QUERY_PARTS]; gint p=0; gchar *query, *qj; + int i; if (book == NULL) { info->cb (info->card, NULL, E_CARD_MATCH_NONE, info->closure); @@ -409,7 +411,7 @@ use_common_book_cb (EBook *book, gpointer closure) } ++s; } - query_parts[p++] = g_strdup_printf ("beginswith \"email\" \"%s\")", addr); + query_parts[p++] = g_strdup_printf ("(beginswith \"email\" \"%s\")", addr); g_free (addr); } e_iterator_next (iter); @@ -421,18 +423,34 @@ use_common_book_cb (EBook *book, gpointer closure) /* Build up our full query from the parts. */ query_parts[p] = NULL; qj = g_strjoinv (" ", query_parts); + for(i = 0; query_parts[i] != NULL; i++) + g_free(query_parts[i]); if (p > 0) { query = g_strdup_printf ("(or %s)", qj); + g_free (qj); } else { query = qj; - qj = NULL; + } + + if (info->avoid) { + GList *iterator; + p = 0; + query_parts[p++] = query; + for (iterator = info->avoid; iterator; iterator = iterator->next) { + query_parts[p++] = g_strdup_printf("(not (is \"id\" \"%s\"))", e_card_get_id (iterator->data)); + } + query_parts[p] = 0; + qj = g_strjoinv (" ", query_parts); + for(i = 0; query_parts[i] != NULL; i++) + g_free(query_parts[i]); + query = g_strdup_printf ("(and %s)", qj); + g_list_foreach (info->avoid, (GFunc) gtk_object_unref, NULL); + g_list_free (info->avoid); + info->avoid = NULL; } e_book_simple_query (book, query, simple_query_cb, info); - for (p=0; query_parts[p]; ++p) - g_free (query_parts[p]); - g_free (qj); g_free (query); } @@ -449,7 +467,41 @@ e_card_locate_match (ECard *card, ECardMatchQueryCallback cb, gpointer closure) gtk_object_ref (GTK_OBJECT (card)); info->cb = cb; info->closure = closure; + info->avoid = NULL; e_book_use_local_address_book (use_common_book_cb, info); } +/** + * e_card_locate_match_full: + * @book: The book to look in. If this is NULL, use the main local + * addressbook. + * @card: The card to compare to. + * @avoid: A list of cards to not match. These will not show up in the search. + * @cb: The function to call. + * @closure: The closure to add to the call. + * + * Look for the best match and return it using the ECardMatchQueryCallback. + **/ +void +e_card_locate_match_full (EBook *book, ECard *card, GList *avoid, ECardMatchQueryCallback cb, gpointer closure) +{ + MatchSearchInfo *info; + + g_return_if_fail (card && E_IS_CARD (card)); + g_return_if_fail (cb != NULL); + + info = g_new (MatchSearchInfo, 1); + info->card = card; + gtk_object_ref (GTK_OBJECT (card)); + info->cb = cb; + info->closure = closure; + info->avoid = g_list_copy (avoid); + g_list_foreach (info->avoid, (GFunc) gtk_object_ref, NULL); + + if (book) + use_common_book_cb (book, info); + else + e_book_use_local_address_book (use_common_book_cb, info); +} + diff --git a/addressbook/backend/ebook/e-card-compare.h b/addressbook/backend/ebook/e-card-compare.h index 7c55dabeab..e5f034600b 100644 --- a/addressbook/backend/ebook/e-card-compare.h +++ b/addressbook/backend/ebook/e-card-compare.h @@ -28,6 +28,7 @@ #ifndef __E_CARD_COMPARE_H__ #define __E_CARD_COMPARE_H__ +#include "e-book.h" #include "e-card.h" typedef enum { @@ -49,6 +50,7 @@ ECardMatchType e_card_compare_telephone (ECard *card1, ECard *card2); ECardMatchType e_card_compare (ECard *card1, ECard *card2); void e_card_locate_match (ECard *card, ECardMatchQueryCallback cb, gpointer closure); +void e_card_locate_match_full (EBook *book, ECard *card, GList *avoid, ECardMatchQueryCallback cb, gpointer closure); |