From efa9a6294d55c0c9f857e1c26390898c84ce0784 Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Mon, 11 Jun 2001 05:43:48 +0000 Subject: Added this function to let you do slightly more complicated searches. 2001-06-11 Christopher James Lahey * 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 --- addressbook/backend/ebook/e-card-compare.c | 62 +++++++++++++++++++++++++++--- addressbook/backend/ebook/e-card-compare.h | 2 + 2 files changed, 59 insertions(+), 5 deletions(-) (limited to 'addressbook/backend') 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); -- cgit v1.2.3