From 3f9703a3fd35f7d8b835c62869c0db74bd213e2f Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 10 Feb 2010 09:31:53 +0000 Subject: added a new filter match type: is (not) in addressbook. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2461 ee746299-78ed-0310-b773-934348b2243d --- src/addressbook.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 4 deletions(-) (limited to 'src/addressbook.c') diff --git a/src/addressbook.c b/src/addressbook.c index f7d9e9b5..2c95c580 100644 --- a/src/addressbook.c +++ b/src/addressbook.c @@ -333,6 +333,9 @@ static void addressbook_list_select_set (GList *row_list); static void addressbook_import_ldif_cb (void); static void addressbook_import_csv_cb (void); +static void addressbook_modified (void); + + static GtkItemFactoryEntry addressbook_entries[] = { {N_("/_File"), NULL, NULL, 0, ""}, @@ -408,6 +411,7 @@ static GtkItemFactoryEntry addressbook_list_popup_entries[] = {N_("/_Paste"), NULL, addressbook_paste_address_cb, 0, NULL} }; + void addressbook_open(Compose *target) { if (!addrbook.window) { @@ -2181,7 +2185,7 @@ static void addressbook_edit_address_cb(gpointer data, guint action, GtkWidget * if (addressbook_edit_person(abf, NULL, person, TRUE) == NULL) return; addressbook_reopen(); - invalidate_address_completion(); + addressbook_modified(); return; } } else if (obj->type == ADDR_ITEM_PERSON) { @@ -2191,7 +2195,7 @@ static void addressbook_edit_address_cb(gpointer data, guint action, GtkWidget * if (addressbook_edit_person(abf, NULL, person, FALSE) == NULL) return; addressbook_reopen(); - invalidate_address_completion(); + addressbook_modified(); return; } else if (obj->type == ADDR_ITEM_GROUP) { ItemGroup *itemGrp = (ItemGroup *)obj; @@ -3237,7 +3241,7 @@ void addressbook_export_to_file( void ) { } /* Notify address completion of new data */ - invalidate_address_completion(); + addressbook_modified(); } } @@ -4151,7 +4155,7 @@ static void addressbook_import_ldif_cb(void) } /* Notify address completion */ - invalidate_address_completion(); + addressbook_modified(); } /* @@ -4191,9 +4195,84 @@ static void addressbook_import_csv_cb(void) } /* Notify address completion */ + addressbook_modified(); +} + +/* ********************************************************************** +* Address Book Fast Search. +* *********************************************************************** +*/ + +static GHashTable *addr_table; + +static gint load_address(const gchar *name, const gchar *address, + const gchar *nickname) +{ + gchar *addr; + + if (!address) + return -1; + + addr = g_ascii_strdown(address, -1); + + if (g_hash_table_lookup(addr_table, addr) == NULL) + g_hash_table_insert(addr_table, addr, addr); + else + g_free(addr); + + return 0; +} + +static void addressbook_modified(void) +{ + if (addr_table) { + hash_free_strings(addr_table); + g_hash_table_destroy(addr_table); + addr_table = NULL; + } + invalidate_address_completion(); } +gboolean addressbook_has_address(const gchar *address) +{ + GSList *list, *cur; + gchar *addr; + gboolean found = FALSE; + + if (!address) + return FALSE; + + debug_print("addressbook_has_address: check if addressbook has address: %s\n", address); + + list = address_list_append(NULL, address); + if (!list) + return FALSE; + + if (!addr_table) { + addr_table = g_hash_table_new(g_str_hash, g_str_equal); + addressbook_load_completion(load_address); + } + + for (cur = list; cur != NULL; cur = cur->next) { + addr = g_ascii_strdown((gchar *)cur->data, -1); + + if (g_hash_table_lookup(addr_table, addr)) { + found = TRUE; + debug_print("'%s' is in addressbook\n", addr); + } else { + found = FALSE; + g_free(addr); + break; + } + g_free(addr); + } + + slist_free_strings(list); + + return found; +} + /* * End of Source. */ -- cgit v1.2.3