From b64f547cdd71098035e9b055ee7f0ec4de2b9e1c Mon Sep 17 00:00:00 2001 From: JP Rosevear Date: Wed, 19 Dec 2001 15:16:32 +0000 Subject: go slow and clear the map if the last uri and the current uri do not match 2001-12-18 JP Rosevear * conduit/address-conduit.c (check_for_slow_setting): go slow and clear the map if the last uri and the current uri do not match (post_sync): save the last uri * conduits/address-conduit-config.h: handle a last uri config option 2001-12-18 Chris Toshok * gui/component/addressbook.c (addressbook_default_book_open): change this to match its e-book counterpart, and only failover to the local addressbook if the protocol wasn't supported. that way errors like "failure to connect" are still reported to the user. * backend/ebook/e-book-util.h: add prototypes for e_book_load_default_book and e_book_get_config_database. * backend/ebook/e-book-util.c (e_book_default_book_open): new function, basically cut and paste addressbook_default_book_open from addressbook.c here. (e_book_load_default_book): cut and past addressbook_load_default_book here, pretty much, except leave off the auth stuff. (e_book_get_config_database): new function, returns the Bonobo_ConfigDatabase for e_book_load_default_book to use. * conduit/address-conduit.c (start_addressbook_server): use e_book_load_default_book here. svn path=/trunk/; revision=15178 --- addressbook/ChangeLog | 31 ++++++++++++ addressbook/backend/ebook/e-book-util.c | 74 ++++++++++++++++++++++++++++ addressbook/backend/ebook/e-book-util.h | 10 ++++ addressbook/conduit/address-conduit-config.h | 11 ++++- addressbook/conduit/address-conduit.c | 33 ++++++++----- addressbook/gui/component/addressbook.c | 7 ++- 6 files changed, 151 insertions(+), 15 deletions(-) diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 63aeffcfdd..370e4c0569 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,34 @@ +2001-12-18 JP Rosevear + + * conduit/address-conduit.c (check_for_slow_setting): go slow and + clear the map if the last uri and the current uri do not match + (post_sync): save the last uri + + * conduits/address-conduit-config.h: handle a last uri config + option + +2001-12-18 Chris Toshok + + * gui/component/addressbook.c (addressbook_default_book_open): + change this to match its e-book counterpart, and only failover to + the local addressbook if the protocol wasn't supported. that way + errors like "failure to connect" are still reported to the user. + + * backend/ebook/e-book-util.h: add prototypes for + e_book_load_default_book and e_book_get_config_database. + + * backend/ebook/e-book-util.c (e_book_default_book_open): new + function, basically cut and paste addressbook_default_book_open + from addressbook.c here. + (e_book_load_default_book): cut and past + addressbook_load_default_book here, pretty much, except leave off + the auth stuff. + (e_book_get_config_database): new function, returns the + Bonobo_ConfigDatabase for e_book_load_default_book to use. + + * conduit/address-conduit.c (start_addressbook_server): use + e_book_load_default_book here. + 2001-12-17 Chris Toshok [ fixes bug 17355 ] diff --git a/addressbook/backend/ebook/e-book-util.c b/addressbook/backend/ebook/e-book-util.c index f141deb791..04f8a88131 100644 --- a/addressbook/backend/ebook/e-book-util.c +++ b/addressbook/backend/ebook/e-book-util.c @@ -33,6 +33,17 @@ #include #include "e-card-compare.h" +Bonobo_ConfigDatabase +e_book_get_config_database (CORBA_Environment *ev) +{ + static Bonobo_ConfigDatabase config_db; + + if (config_db == NULL) + config_db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", ev); + + return config_db; +} + gboolean e_book_load_local_address_book (EBook *book, EBookCallback open_response, gpointer closure) { @@ -120,6 +131,69 @@ e_book_use_local_address_book (EBookCommonCallback cb, gpointer closure) } } +typedef struct { + gpointer closure; + EBookCallback open_response; +} DefaultBookClosure; + +static void +e_book_default_book_open (EBook *book, EBookStatus status, gpointer closure) +{ + DefaultBookClosure *default_book_closure = closure; + gpointer user_closure = default_book_closure->closure; + EBookCallback user_response = default_book_closure->open_response; + + g_free (default_book_closure); + + /* special case the protocol not supported error, since we + really only want to failover to the local book in the case + where there's no installed backend for that protocol. all + other errors (failure to connect, etc.) should get reported + to the caller as normal. */ + if (status == E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED) { + e_book_load_local_address_book (book, user_response, user_closure); + } + else { + user_response (book, status, user_closure); + } +} + +gboolean +e_book_load_default_book (EBook *book, EBookCallback open_response, gpointer closure) +{ + char *val; + gboolean rv; + CORBA_Environment ev; + Bonobo_ConfigDatabase config_db; + + g_return_val_if_fail (book != NULL, FALSE); + g_return_val_if_fail (E_IS_BOOK (book), FALSE); + g_return_val_if_fail (open_response != NULL, FALSE); + + CORBA_exception_init (&ev); + config_db = e_book_get_config_database (&ev); + val = bonobo_config_get_string (config_db, "/Addressbook/default_book_uri", &ev); + CORBA_exception_free (&ev); + + if (val) { + DefaultBookClosure *default_book_closure = g_new (DefaultBookClosure, 1); + default_book_closure->closure = closure; + default_book_closure->open_response = open_response; + rv = e_book_load_uri (book, val, + e_book_default_book_open, default_book_closure); + g_free (val); + } + else { + rv = e_book_load_local_address_book (book, open_response, closure); + } + + if (!rv) { + g_warning ("Couldn't load default addressbook"); + } + + return rv; +} + /* * * Simple Query Stuff diff --git a/addressbook/backend/ebook/e-book-util.h b/addressbook/backend/ebook/e-book-util.h index 2fad0d9e9c..39e32e633d 100644 --- a/addressbook/backend/ebook/e-book-util.h +++ b/addressbook/backend/ebook/e-book-util.h @@ -29,6 +29,9 @@ #include #include "e-book.h" +#include +#include +#include BEGIN_GNOME_DECLS @@ -43,6 +46,13 @@ gboolean e_book_load_local_address_book (EBook *book, void e_book_use_local_address_book (EBookCommonCallback cb, gpointer closure); +gboolean e_book_load_default_book (EBook *book, + EBookCallback open_response, + gpointer closure); + +/* Bonoboconf database interface. */ +Bonobo_ConfigDatabase e_book_get_config_database (CORBA_Environment *ev); + /* Simple Query Interface. */ guint e_book_simple_query (EBook *book, diff --git a/addressbook/conduit/address-conduit-config.h b/addressbook/conduit/address-conduit-config.h index 4042eff423..2387f67ef3 100644 --- a/addressbook/conduit/address-conduit-config.h +++ b/addressbook/conduit/address-conduit-config.h @@ -32,9 +32,11 @@ /* Configuration info */ typedef struct _EAddrConduitCfg EAddrConduitCfg; struct _EAddrConduitCfg { - gboolean open_secret; guint32 pilot_id; - GnomePilotConduitSyncType sync_type; /* only used by capplet */ + GnomePilotConduitSyncType sync_type; + + gboolean open_secret; + gchar *last_uri; }; #ifdef ADDR_CONFIG_LOAD @@ -63,6 +65,7 @@ addrconduit_load_configuration (EAddrConduitCfg **c, guint32 pilot_id) gnome_config_push_prefix (prefix); (*c)->open_secret = gnome_config_get_bool ("open_secret=FALSE"); + (*c)->last_uri = gnome_config_get_string ("last_uri"); gnome_config_pop_prefix (); } @@ -80,6 +83,7 @@ addrconduit_save_configuration (EAddrConduitCfg *c) gnome_config_push_prefix (prefix); gnome_config_set_bool ("open_secret", c->open_secret); + gnome_config_set_string ("last_uri", c->last_uri); gnome_config_pop_prefix (); gnome_config_sync (); @@ -99,7 +103,9 @@ addrconduit_dupe_configuration (EAddrConduitCfg *c) retval = g_new0 (EAddrConduitCfg, 1); retval->sync_type = c->sync_type; retval->open_secret = c->open_secret; + retval->pilot_id = c->pilot_id; + retval->last_uri = g_strdup (c->last_uri); return retval; } @@ -113,6 +119,7 @@ addrconduit_destroy_configuration (EAddrConduitCfg **c) g_return_if_fail (c != NULL); g_return_if_fail (*c != NULL); + g_free ((*c)->last_uri); g_free (*c); *c = NULL; } diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c index 6791d0e445..3d6e3eca1f 100644 --- a/addressbook/conduit/address-conduit.c +++ b/addressbook/conduit/address-conduit.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -38,9 +39,11 @@ #include #define ADDR_CONFIG_LOAD 1 +#define ADDR_CONFIG_SAVE 1 #define ADDR_CONFIG_DESTROY 1 #include "address-conduit-config.h" #undef ADDR_CONFIG_LOAD +#undef ADDR_CONFIG_SAVE #undef ADDR_CONFIG_DESTROY #include "address-conduit.h" @@ -311,25 +314,18 @@ book_open_cb (EBook *book, EBookStatus status, gpointer closure) static int start_addressbook_server (EAddrConduitContext *ctxt) { - gchar *uri, *path; - + gboolean result; + g_return_val_if_fail(ctxt!=NULL,-2); ctxt->ebook = e_book_new (); - path = g_concat_dir_and_file (g_get_home_dir (), - "evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", path); - g_free (path); - - e_book_load_uri (ctxt->ebook, uri, book_open_cb, ctxt); - + result = e_book_load_default_book (ctxt->ebook, book_open_cb, ctxt); + /* run a sub event loop to turn ebook's async loading into a synchronous call */ gtk_main (); - g_free (uri); - if (ctxt->address_load_success) return 0; @@ -956,11 +952,20 @@ check_for_slow_setting (GnomePilotConduit *c, EAddrConduitContext *ctxt) { GnomePilotConduitStandard *conduit = GNOME_PILOT_CONDUIT_STANDARD (c); int map_count; - + const char *uri; + map_count = g_hash_table_size (ctxt->map->pid_map); if (map_count == 0) gnome_pilot_conduit_standard_set_slow (conduit, TRUE); + /* Or if the URI's don't match */ + uri = e_book_get_uri (ctxt->ebook); + LOG(" Current URI %s (%s)\n", uri, ctxt->cfg->last_uri ? ctxt->cfg->last_uri : ""); + if (ctxt->cfg->last_uri != NULL && strcmp (ctxt->cfg->last_uri, uri)) { + gnome_pilot_conduit_standard_set_slow (conduit, TRUE); + e_pilot_map_clear (ctxt->map); + } + if (gnome_pilot_conduit_standard_get_slow (conduit)) { ctxt->map->write_touched_only = TRUE; LOG (" doing slow sync\n"); @@ -1148,6 +1153,10 @@ post_sync (GnomePilotConduit *conduit, LOG ("post_sync: Address Conduit v.%s", CONDUIT_VERSION); + g_free (ctxt->cfg->last_uri); + ctxt->cfg->last_uri = g_strdup (e_book_get_uri (ctxt->ebook)); + addrconduit_save_configuration (ctxt->cfg); + filename = map_name (ctxt); e_pilot_map_write (filename, ctxt->map); g_free (filename); diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c index 4741e5196a..619a89cdd5 100644 --- a/addressbook/gui/component/addressbook.c +++ b/addressbook/gui/component/addressbook.c @@ -699,7 +699,12 @@ addressbook_default_book_open (EBook *book, EBookStatus status, gpointer closure g_free (default_book_closure); - if (status != E_BOOK_STATUS_SUCCESS) { + /* special case the protocol not supported error, since we + really only want to failover to the local book in the case + where there's no installed backend for that protocol. all + other errors (failure to connect, etc.) should get reported + to the caller as normal. */ + if (status == E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED) { e_book_load_local_address_book (book, user_response, user_closure); } else { -- cgit