aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog33
-rw-r--r--addressbook/backend/ebook/e-book-listener.c6
-rw-r--r--addressbook/backend/ebook/e-book-types.h4
-rw-r--r--addressbook/backend/ebook/e-book.c2
-rw-r--r--addressbook/backend/ebook/tests/ebook/test-changes.c2
-rw-r--r--addressbook/backend/idl/addressbook.idl10
-rw-r--r--addressbook/backend/pas/pas-backend-file.c23
-rw-r--r--addressbook/backend/pas/pas-backend.c14
-rw-r--r--addressbook/backend/pas/pas-book.c12
-rw-r--r--addressbook/conduit/address-conduit.c861
10 files changed, 402 insertions, 565 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 75919f4713..34c2c58ae9 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -34,6 +34,39 @@
"evolution:button_label" property on the component for use in the
shell.
+2003-10-21 JP Rosevear <jpr@ximian.com>
+
+ * conduit/address-conduit.c: make it work with the new ebook api
+
+ * backend/pas/pas-book.c (pas_book_respond_get_changes): put the
+ vcard in for every change
+
+ * backend/pas/pas-backend.c (pas_backend_change_add_new): just use
+ the vcard field
+ (pas_backend_change_modify_new): ditto
+ (pas_backend_change_delete_new): ditto
+
+ * backend/pas/pas-backend-file.c
+ (pas_backend_file_changes_foreach_key): create a fake contact with
+ the uid
+ (pas_backend_file_get_changes): add the card to the changes
+
+ * backend/ebook/tests/ebook/test-changes.c (main): just print the
+ uid
+
+ * backend/ebook/e-book.c (e_book_free_change_list): unref the
+ contact
+
+ * backend/ebook/e-book-types.h: the change struct contains an
+ EContact now
+
+ * backend/ebook/e-book-listener.c
+ (impl_BookListener_respond_get_changes): create the contact from
+ the vcard string
+
+ * backend/idl/addressbook.idl: Book change item is no longer a
+ union, it always gives back a card
+
2003-10-21 Chris Toshok <toshok@ximian.com>
* tools/evolution-addressbook-abuse.c: use the synchronous api for
diff --git a/addressbook/backend/ebook/e-book-listener.c b/addressbook/backend/ebook/e-book-listener.c
index 0bb5193376..f3a7de266c 100644
--- a/addressbook/backend/ebook/e-book-listener.c
+++ b/addressbook/backend/ebook/e-book-listener.c
@@ -187,20 +187,18 @@ impl_BookListener_respond_get_changes (PortableServer_Servant servant,
EBookChange *change = g_new (EBookChange, 1);
GNOME_Evolution_Addressbook_BookChangeItem corba_change = changes->_buffer[i];
- switch (corba_change._d) {
+ switch (corba_change.changeType) {
case GNOME_Evolution_Addressbook_ContactAdded:
change->change_type = E_BOOK_CHANGE_CARD_ADDED;
- change->vcard = g_strdup (corba_change._u.add_vcard);
break;
case GNOME_Evolution_Addressbook_ContactDeleted:
change->change_type = E_BOOK_CHANGE_CARD_DELETED;
- change->id = g_strdup (corba_change._u.del_id);
break;
case GNOME_Evolution_Addressbook_ContactModified:
change->change_type = E_BOOK_CHANGE_CARD_MODIFIED;
- change->vcard = g_strdup (corba_change._u.mod_vcard);
break;
}
+ change->contact = e_contact_new_from_vcard (corba_change.vcard);
response.list = g_list_prepend (response.list, change);
}
diff --git a/addressbook/backend/ebook/e-book-types.h b/addressbook/backend/ebook/e-book-types.h
index 4ca69bd516..9bbc66e622 100644
--- a/addressbook/backend/ebook/e-book-types.h
+++ b/addressbook/backend/ebook/e-book-types.h
@@ -13,6 +13,7 @@
#define __E_BOOK_TYPES_H__
#include <glib.h>
+#include <ebook/e-contact.h>
G_BEGIN_DECLS
@@ -59,8 +60,7 @@ typedef enum {
typedef struct {
EBookChangeType change_type;
- char *vcard; /* used in the ADDED/MODIFIED case */
- char *id; /* used in the DELETED case */
+ EContact *contact;
} EBookChange;
G_END_DECLS
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c
index c84b4c3f83..b551c8727b 100644
--- a/addressbook/backend/ebook/e-book.c
+++ b/addressbook/backend/ebook/e-book.c
@@ -1244,7 +1244,7 @@ e_book_free_change_list (GList *change_list)
for (l = change_list; l; l = l->next) {
EBookChange *change = l->data;
- g_free (change->vcard);
+ g_object_unref (change->contact);
g_free (change);
}
diff --git a/addressbook/backend/ebook/tests/ebook/test-changes.c b/addressbook/backend/ebook/tests/ebook/test-changes.c
index 0c91f30cf4..f1e65adaa0 100644
--- a/addressbook/backend/ebook/tests/ebook/test-changes.c
+++ b/addressbook/backend/ebook/tests/ebook/test-changes.c
@@ -71,7 +71,7 @@ main (int argc, char **argv)
exit(0);
}
- printf ("got changed vcard back: %s\n", change->vcard);
+ printf ("got changed vcard back: %s\n", e_contact_get_const (change->contact, E_CONTACT_UID));
e_book_free_change_list (changes);
diff --git a/addressbook/backend/idl/addressbook.idl b/addressbook/backend/idl/addressbook.idl
index bfdbae6882..193d1246ab 100644
--- a/addressbook/backend/idl/addressbook.idl
+++ b/addressbook/backend/idl/addressbook.idl
@@ -24,13 +24,9 @@ module Addressbook {
ContactDeleted
};
- union BookChangeItem switch (BookChangeType) {
- case ContactAdded:
- VCard add_vcard;
- case ContactModified:
- VCard mod_vcard;
- case ContactDeleted:
- ContactId del_id;
+ struct BookChangeItem {
+ BookChangeType changeType;
+ VCard vcard;
};
typedef sequence<BookChangeItem> BookChangeList;
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index 923c7e907d..73f1797320 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -515,6 +515,7 @@ typedef struct {
GList *mod_cards;
GList *mod_ids;
GList *del_ids;
+ GList *del_cards;
} PASBackendFileChangeContext;
static void
@@ -530,10 +531,21 @@ pas_backend_file_changes_foreach_key (const char *key, gpointer user_data)
db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
if (db_error != 0) {
+ EContact *contact;
char *id = id_dbt.data;
+ char *vcard_string;
+
+ contact = e_contact_new ();
+ e_contact_set (contact, E_CONTACT_UID, id);
+
+ vcard_string = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
ctx->del_ids = g_list_append (ctx->del_ids,
g_strdup (id));
+ ctx->del_cards = g_list_append (ctx->del_cards,
+ vcard_string);
+
+ g_object_unref (contact);
}
}
@@ -645,14 +657,17 @@ pas_backend_file_get_changes (PASBackendSync *backend,
g_free (i->data);
g_free (v->data);
- }
- for (i = ctx.del_ids; i != NULL; i = i->next){
+ }
+ for (i = ctx.del_ids, v = ctx.del_cards; i != NULL; i = i->next, v = v->next){
char *id = i->data;
-
+ char *vcard = v->data;
+
e_dbhash_remove (ehash, id);
+
changes = g_list_prepend (changes,
- pas_backend_change_delete_new (id));
+ pas_backend_change_delete_new (vcard));
g_free (i->data);
+ g_free (v->data);
}
e_dbhash_write (ehash);
diff --git a/addressbook/backend/pas/pas-backend.c b/addressbook/backend/pas/pas-backend.c
index 5b559940d1..a447d64851 100644
--- a/addressbook/backend/pas/pas-backend.c
+++ b/addressbook/backend/pas/pas-backend.c
@@ -448,8 +448,8 @@ pas_backend_change_add_new (const char *vcard)
{
GNOME_Evolution_Addressbook_BookChangeItem* new_change = GNOME_Evolution_Addressbook_BookChangeItem__alloc();
- new_change->_d = GNOME_Evolution_Addressbook_ContactAdded;
- new_change->_u.add_vcard = CORBA_string_dup (vcard);
+ new_change->changeType= GNOME_Evolution_Addressbook_ContactAdded;
+ new_change->vcard = CORBA_string_dup (vcard);
return new_change;
}
@@ -459,19 +459,19 @@ pas_backend_change_modify_new (const char *vcard)
{
GNOME_Evolution_Addressbook_BookChangeItem* new_change = GNOME_Evolution_Addressbook_BookChangeItem__alloc();
- new_change->_d = GNOME_Evolution_Addressbook_ContactModified;
- new_change->_u.mod_vcard = CORBA_string_dup (vcard);
+ new_change->changeType= GNOME_Evolution_Addressbook_ContactModified;
+ new_change->vcard = CORBA_string_dup (vcard);
return new_change;
}
GNOME_Evolution_Addressbook_BookChangeItem*
-pas_backend_change_delete_new (const char *id)
+pas_backend_change_delete_new (const char *vcard)
{
GNOME_Evolution_Addressbook_BookChangeItem* new_change = GNOME_Evolution_Addressbook_BookChangeItem__alloc();
- new_change->_d = GNOME_Evolution_Addressbook_ContactDeleted;
- new_change->_u.del_id = CORBA_string_dup (id);
+ new_change->changeType= GNOME_Evolution_Addressbook_ContactDeleted;
+ new_change->vcard = CORBA_string_dup (vcard);
return new_change;
}
diff --git a/addressbook/backend/pas/pas-book.c b/addressbook/backend/pas/pas-book.c
index 08078887b6..346b37ceed 100644
--- a/addressbook/backend/pas/pas-book.c
+++ b/addressbook/backend/pas/pas-book.c
@@ -612,17 +612,7 @@ pas_book_respond_get_changes (PASBook *book,
for (i = 0, l = changes; l; l = l->next, i ++) {
GNOME_Evolution_Addressbook_BookChangeItem *change = (GNOME_Evolution_Addressbook_BookChangeItem*)l->data;
changelist._buffer[i] = *change;
- switch (change->_d) {
- case GNOME_Evolution_Addressbook_ContactAdded:
- changelist._buffer[i]._u.add_vcard = CORBA_string_dup (change->_u.add_vcard);
- break;
- case GNOME_Evolution_Addressbook_ContactModified:
- changelist._buffer[i]._u.mod_vcard = CORBA_string_dup (change->_u.mod_vcard);
- break;
- case GNOME_Evolution_Addressbook_ContactDeleted:
- changelist._buffer[i]._u.del_id = CORBA_string_dup (change->_u.del_id);
- break;
- }
+ changelist._buffer[i].vcard = CORBA_string_dup (change->vcard);
}
g_list_foreach (changes, (GFunc)CORBA_free, NULL);
diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c
index 4bc3226903..a85dda4587 100644
--- a/addressbook/conduit/address-conduit.c
+++ b/addressbook/conduit/address-conduit.c
@@ -32,11 +32,6 @@
#include <pi-dlp.h>
#include <pi-address.h>
#include <ebook/e-book.h>
-#include <ebook/e-book-util.h>
-#include <ebook/e-card-types.h>
-#include <ebook/e-card-cursor.h>
-#include <ebook/e-card.h>
-#include <ebook/e-card-simple.h>
#include <gpilotd/gnome-pilot-conduit.h>
#include <gpilotd/gnome-pilot-conduit-sync-abs.h>
#include <libgpilotdCM/gnome-pilot-conduit-management.h>
@@ -63,23 +58,6 @@ void conduit_destroy_gpilot_conduit (GnomePilotConduit*);
#define WARN g_warning
#define INFO g_message
-typedef struct {
- EBookStatus status;
- char *id;
-} CardObjectChangeStatus;
-
-typedef enum {
- CARD_ADDED,
- CARD_MODIFIED,
- CARD_DELETED
-} CardObjectChangeType;
-
-typedef struct
-{
- ECard *card;
- CardObjectChangeType type;
-} CardObjectChange;
-
enum {
LABEL_WORK,
LABEL_HOME,
@@ -91,22 +69,22 @@ enum {
LABEL_MOBILE
};
-static ECardSimpleField priority [] = {
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS,
- E_CARD_SIMPLE_FIELD_PHONE_HOME,
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX,
- E_CARD_SIMPLE_FIELD_EMAIL,
- E_CARD_SIMPLE_FIELD_PHONE_PAGER,
- E_CARD_SIMPLE_FIELD_PHONE_MOBILE,
- E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2,
- E_CARD_SIMPLE_FIELD_PHONE_HOME_2,
- E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX,
- E_CARD_SIMPLE_FIELD_EMAIL_2,
- E_CARD_SIMPLE_FIELD_PHONE_OTHER,
- E_CARD_SIMPLE_FIELD_PHONE_PRIMARY,
- E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX,
- E_CARD_SIMPLE_FIELD_EMAIL_3,
- E_CARD_SIMPLE_FIELD_LAST
+static EContactField priority [] = {
+ E_CONTACT_PHONE_BUSINESS,
+ E_CONTACT_PHONE_HOME,
+ E_CONTACT_PHONE_BUSINESS_FAX,
+ E_CONTACT_EMAIL,
+ E_CONTACT_PHONE_PAGER,
+ E_CONTACT_PHONE_MOBILE,
+ E_CONTACT_PHONE_BUSINESS_2,
+ E_CONTACT_PHONE_HOME_2,
+ E_CONTACT_PHONE_HOME_FAX,
+ E_CONTACT_EMAIL_2,
+ E_CONTACT_PHONE_OTHER,
+ E_CONTACT_PHONE_PRIMARY,
+ E_CONTACT_PHONE_OTHER_FAX,
+ E_CONTACT_EMAIL_3,
+ E_CONTACT_FIELD_LAST
};
static int priority_label [] = {
@@ -141,7 +119,7 @@ struct _EAddrLocalRecord {
GnomePilotDesktopRecord local;
/* The corresponding ECard object */
- ECard *ecard;
+ EContact *contact;
/* pilot-link address structure, used for implementing Transmit. */
struct Address *addr;
@@ -151,7 +129,7 @@ struct _EAddrLocalRecord {
static void
addrconduit_destroy_record (EAddrLocalRecord *local)
{
- g_object_unref (local->ecard);
+ g_object_unref (local->contact);
free_Address (local->addr);
g_free (local->addr);
g_free (local);
@@ -163,7 +141,7 @@ struct _EAddrConduitCfg {
GnomePilotConduitSyncType sync_type;
gboolean secret;
- ECardSimpleAddressId default_address;
+ EContactField default_address;
gchar *last_uri;
};
@@ -199,11 +177,11 @@ addrconduit_load_configuration (guint32 pilot_id)
c->secret = gnome_config_get_bool ("secret=FALSE");
address = gnome_config_get_string ("default_address=business");
if (!strcmp (address, "business"))
- c->default_address = E_CARD_SIMPLE_ADDRESS_ID_BUSINESS;
+ c->default_address = E_CONTACT_ADDRESS_WORK;
else if (!strcmp (address, "home"))
- c->default_address = E_CARD_SIMPLE_ADDRESS_ID_HOME;
+ c->default_address = E_CONTACT_ADDRESS_HOME;
else if (!strcmp (address, "other"))
- c->default_address = E_CARD_SIMPLE_ADDRESS_ID_OTHER;
+ c->default_address = E_CONTACT_ADDRESS_OTHER;
g_free (address);
c->last_uri = gnome_config_get_string ("last_uri");
@@ -223,13 +201,13 @@ addrconduit_save_configuration (EAddrConduitCfg *c)
gnome_config_push_prefix (prefix);
gnome_config_set_bool ("secret", c->secret);
switch (c->default_address) {
- case E_CARD_SIMPLE_ADDRESS_ID_BUSINESS:
+ case E_CONTACT_ADDRESS_WORK:
gnome_config_set_string ("default_address", "business");
break;
- case E_CARD_SIMPLE_ADDRESS_ID_HOME:
+ case E_CONTACT_ADDRESS_HOME:
gnome_config_set_string ("default_address", "home");
break;
- case E_CARD_SIMPLE_ADDRESS_ID_OTHER:
+ case E_CONTACT_ADDRESS_OTHER:
gnome_config_set_string ("default_address", "other");
break;
default:
@@ -314,9 +292,9 @@ e_addr_gui_new (EPilotSettings *ps)
}
static const int default_address_map[] = {
- E_CARD_SIMPLE_ADDRESS_ID_BUSINESS,
- E_CARD_SIMPLE_ADDRESS_ID_HOME,
- E_CARD_SIMPLE_ADDRESS_ID_OTHER,
+ E_CONTACT_ADDRESS_WORK,
+ E_CONTACT_ADDRESS_HOME,
+ E_CONTACT_ADDRESS_OTHER,
-1
};
@@ -363,9 +341,6 @@ struct _EAddrConduitContext {
GList *changed;
GHashTable *changed_hash;
GList *locals;
-
- gboolean address_load_tried;
- gboolean address_load_success;
EPilotMap *map;
};
@@ -415,17 +390,8 @@ e_addr_context_destroy (EAddrConduitContext *ctxt)
if (ctxt->changed_hash != NULL)
g_hash_table_destroy (ctxt->changed_hash);
- if (ctxt->changed != NULL) {
- CardObjectChange *coc;
-
- for (l = ctxt->changed; l != NULL; l = l->next) {
- coc = l->data;
-
- g_object_unref (coc->card);
- g_free (coc);
- }
- g_list_free (ctxt->changed);
- }
+ if (ctxt->changed != NULL)
+ e_book_free_change_list (ctxt->changed);
if (ctxt->locals != NULL) {
for (l = ctxt->locals; l != NULL; l = l->next)
@@ -490,87 +456,6 @@ static char *print_remote (GnomePilotRecord *remote)
return buff;
}
-/* Addressbok Server routines */
-static void
-add_card_cb (EBook *ebook, EBookStatus status, const char *id, gpointer closure)
-{
- CardObjectChangeStatus *cons = closure;
-
- cons->status = status;
- cons->id = g_strdup (id);
-
- gtk_main_quit();
-}
-
-static void
-status_cb (EBook *ebook, EBookStatus status, gpointer closure)
-{
- (*(EBookStatus*)closure) = status;
- gtk_main_quit();
-}
-
-static void
-cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure)
-{
- EAddrConduitContext *ctxt = (EAddrConduitContext*)closure;
-
- if (status == E_BOOK_STATUS_SUCCESS) {
- long length;
- int i;
-
- ctxt->address_load_success = TRUE;
-
- length = e_card_cursor_get_length (cursor);
- ctxt->cards = NULL;
- for (i = 0; i < length; i ++) {
- ECard *card = e_card_cursor_get_nth (cursor, i);
-
- if (e_card_evolution_list (card))
- continue;
-
- ctxt->cards = g_list_append (ctxt->cards, card);
- }
-
- gtk_main_quit(); /* end the sub event loop */
- }
- else {
- WARN (_("Cursor could not be loaded\n"));
- gtk_main_quit(); /* end the sub event loop */
- }
-}
-
-static void
-book_open_cb (EBook *book, EBookStatus status, gpointer closure)
-{
- EAddrConduitContext *ctxt = (EAddrConduitContext*)closure;
-
- if (status == E_BOOK_STATUS_SUCCESS) {
- e_book_get_cursor (book, "(contains \"full_name\" \"\")", cursor_cb, ctxt);
- } else {
- WARN (_("EBook not loaded\n"));
- gtk_main_quit(); /* end the sub event loop */
- }
-}
-
-static int
-start_addressbook_server (EAddrConduitContext *ctxt)
-{
- g_return_val_if_fail(ctxt!=NULL,-2);
-
- ctxt->ebook = e_book_new ();
-
- 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 ();
-
- if (ctxt->address_load_success)
- return 0;
-
- return -1;
-}
-
/* Utility routines */
static char *
map_name (EAddrConduitContext *ctxt)
@@ -585,128 +470,128 @@ map_name (EAddrConduitContext *ctxt)
static GList *
next_changed_item (EAddrConduitContext *ctxt, GList *changes)
{
- CardObjectChange *coc;
+ EBookChange *ebc;
GList *l;
for (l = changes; l != NULL; l = l->next) {
- coc = l->data;
+ ebc = l->data;
- if (g_hash_table_lookup (ctxt->changed_hash, e_card_get_id (coc->card)))
+ if (g_hash_table_lookup (ctxt->changed_hash, e_contact_get_const (ebc->contact, E_CONTACT_UID)))
return l;
}
return NULL;
}
-static ECardSimpleField
-get_next_mail (ECardSimpleField *field)
+static EContactField
+get_next_mail (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_EMAIL;
+ return E_CONTACT_EMAIL;
switch (*field) {
- case E_CARD_SIMPLE_FIELD_EMAIL:
- return E_CARD_SIMPLE_FIELD_EMAIL_2;
- case E_CARD_SIMPLE_FIELD_EMAIL_2:
- return E_CARD_SIMPLE_FIELD_EMAIL_3;
+ case E_CONTACT_EMAIL:
+ return E_CONTACT_EMAIL_2;
+ case E_CONTACT_EMAIL_2:
+ return E_CONTACT_EMAIL_3;
default:
}
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_home (ECardSimpleField *field)
+static EContactField
+get_next_home (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_HOME;
+ return E_CONTACT_PHONE_HOME;
switch (*field) {
- case E_CARD_SIMPLE_FIELD_PHONE_HOME:
- return E_CARD_SIMPLE_FIELD_PHONE_HOME_2;
+ case E_CONTACT_PHONE_HOME:
+ return E_CONTACT_PHONE_HOME_2;
default:
}
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_work (ECardSimpleField *field)
+static EContactField
+get_next_work (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_BUSINESS;
+ return E_CONTACT_PHONE_BUSINESS;
switch (*field) {
- case E_CARD_SIMPLE_FIELD_PHONE_BUSINESS:
- return E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2;
+ case E_CONTACT_PHONE_BUSINESS:
+ return E_CONTACT_PHONE_BUSINESS_2;
default:
}
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_fax (ECardSimpleField *field)
+static EContactField
+get_next_fax (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX;
+ return E_CONTACT_PHONE_BUSINESS_FAX;
switch (*field) {
- case E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX:
- return E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX;
- case E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX:
- return E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX;
+ case E_CONTACT_PHONE_BUSINESS_FAX:
+ return E_CONTACT_PHONE_HOME_FAX;
+ case E_CONTACT_PHONE_HOME_FAX:
+ return E_CONTACT_PHONE_OTHER_FAX;
default:
}
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_other (ECardSimpleField *field)
+static EContactField
+get_next_other (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_OTHER;
+ return E_CONTACT_PHONE_OTHER;
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_main (ECardSimpleField *field)
+static EContactField
+get_next_main (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_PRIMARY;
+ return E_CONTACT_PHONE_PRIMARY;
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_pager (ECardSimpleField *field)
+static EContactField
+get_next_pager (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_PAGER;
+ return E_CONTACT_PHONE_PAGER;
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
-static ECardSimpleField
-get_next_mobile (ECardSimpleField *field)
+static EContactField
+get_next_mobile (EContactField *field)
{
if (field == NULL)
- return E_CARD_SIMPLE_FIELD_PHONE_MOBILE;
+ return E_CONTACT_PHONE_MOBILE;
- return E_CARD_SIMPLE_FIELD_LAST;
+ return E_CONTACT_FIELD_LAST;
}
static void
-get_next_init (ECardSimpleField *next_mail,
- ECardSimpleField *next_home,
- ECardSimpleField *next_work,
- ECardSimpleField *next_fax,
- ECardSimpleField *next_other,
- ECardSimpleField *next_main,
- ECardSimpleField *next_pager,
- ECardSimpleField *next_mobile)
+get_next_init (EContactField *next_mail,
+ EContactField *next_home,
+ EContactField *next_work,
+ EContactField *next_fax,
+ EContactField *next_other,
+ EContactField *next_main,
+ EContactField *next_pager,
+ EContactField *next_mobile)
{
*next_mail = get_next_mail (NULL);
*next_home = get_next_home (NULL);
@@ -719,9 +604,9 @@ get_next_init (ECardSimpleField *next_mail,
}
static gboolean
-is_next_done (ECardSimpleField field)
+is_next_done (EContactField field)
{
- if (field == E_CARD_SIMPLE_FIELD_LAST)
+ if (field == E_CONTACT_FIELD_LAST)
return TRUE;
return FALSE;
@@ -730,8 +615,8 @@ is_next_done (ECardSimpleField field)
static gboolean
is_syncable (EAddrConduitContext *ctxt, EAddrLocalRecord *local)
{
- ECardSimpleField next_mail, next_home, next_work, next_fax;
- ECardSimpleField next_other, next_main, next_pager, next_mobile;
+ EContactField next_mail, next_home, next_work, next_fax;
+ EContactField next_other, next_main, next_pager, next_mobile;
gboolean syncable = TRUE;
int i, l = 0;
@@ -810,13 +695,26 @@ is_syncable (EAddrConduitContext *ctxt, EAddrLocalRecord *local)
return syncable;
}
-static char *
-get_entry_text (struct Address address, int field)
+static void
+set_contact_text (EContact *contact, EContactField field, struct Address address, int entry)
{
- if (address.entry[field])
- return e_pilot_utf8_from_pchar (address.entry[field]);
+ char *text = NULL;
+
+ if (address.entry[entry])
+ text = e_pilot_utf8_from_pchar (address.entry[entry]);
+
+ e_contact_set (contact, field, text);
- return g_strdup ("");
+ g_free (text);
+}
+
+static char *
+get_entry_text (struct Address address, int entry)
+{
+ if (address.entry[entry])
+ return e_pilot_utf8_from_pchar (address.entry[entry]);
+
+ return NULL;
}
static void
@@ -831,26 +729,26 @@ clear_entry_text (struct Address address, int field)
static void
compute_status (EAddrConduitContext *ctxt, EAddrLocalRecord *local, const char *uid)
{
- CardObjectChange *coc;
+ EBookChange *ebc;
local->local.archived = FALSE;
local->local.secret = FALSE;
- coc = g_hash_table_lookup (ctxt->changed_hash, uid);
+ ebc = g_hash_table_lookup (ctxt->changed_hash, uid);
- if (coc == NULL) {
+ if (ebc == NULL) {
local->local.attr = GnomePilotRecordNothing;
return;
}
- switch (coc->type) {
- case CARD_ADDED:
+ switch (ebc->change_type) {
+ case E_BOOK_CHANGE_CARD_ADDED:
local->local.attr = GnomePilotRecordNew;
break;
- case CARD_MODIFIED:
+ case E_BOOK_CHANGE_CARD_MODIFIED:
local->local.attr = GnomePilotRecordModified;
break;
- case CARD_DELETED:
+ case E_BOOK_CHANGE_CARD_DELETED:
local->local.attr = GnomePilotRecordDeleted;
break;
}
@@ -881,26 +779,22 @@ local_record_to_pilot_record (EAddrLocalRecord *local,
}
static void
-local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitContext *ctxt)
+local_record_from_ecard (EAddrLocalRecord *local, EContact *contact, EAddrConduitContext *ctxt)
{
- ECardSimple *simple;
- const ECardDeliveryAddress *delivery;
- ECardSimpleAddressId mailing_address;
+ const EContactAddress *address;
+ EContactField mailing_address;
int phone = entryPhone1;
gboolean syncable;
int i;
g_return_if_fail (local != NULL);
- g_return_if_fail (ecard != NULL);
+ g_return_if_fail (contact != NULL);
- local->ecard = ecard;
- g_object_ref (ecard);
- simple = e_card_simple_new (ecard);
-
- local->local.ID = e_pilot_map_lookup_pid (ctxt->map, ecard->id, TRUE);
+ local->contact = g_object_ref (contact);
+ local->local.ID = e_pilot_map_lookup_pid (ctxt->map, e_contact_get_const (contact, E_CONTACT_UID), TRUE);
- compute_status (ctxt, local, ecard->id);
+ compute_status (ctxt, local, e_contact_get_const (contact, E_CONTACT_UID));
local->addr = g_new0 (struct Address, 1);
@@ -935,41 +829,46 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
}
}
- if (ecard->name) {
- local->addr->entry[entryFirstname] = e_pilot_utf8_to_pchar (ecard->name->given);
- local->addr->entry[entryLastname] = e_pilot_utf8_to_pchar (ecard->name->family);
- }
-
- local->addr->entry[entryCompany] = e_pilot_utf8_to_pchar (ecard->org);
- local->addr->entry[entryTitle] = e_pilot_utf8_to_pchar (ecard->title);
-
+ local->addr->entry[entryFirstname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_GIVEN_NAME));
+ local->addr->entry[entryLastname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_FAMILY_NAME));
+ local->addr->entry[entryCompany] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_ORG));
+ local->addr->entry[entryTitle] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_TITLE));
+
+ /* See if the default has something in it */
mailing_address = -1;
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) {
- const ECardAddrLabel *address;
-
- address = e_card_simple_get_address(simple, i);
- if (address && (address->flags & E_CARD_ADDR_DEFAULT))
- mailing_address = i;
+ if (e_contact_get_const (contact, ctxt->cfg->default_address))
+ mailing_address = ctxt->cfg->default_address;
+
+ /* If it doesn't, look for any address */
+ if (mailing_address == -1) {
+ for (i = E_CONTACT_FIRST_LABEL_ID; i < E_CONTACT_LAST_LABEL_ID; i++) {
+ if (e_contact_get_const (contact, i)) {
+ mailing_address = i;
+ break;
+ }
+ }
}
+
+ /* If all else fails, use the default */
if (mailing_address == -1)
mailing_address = ctxt->cfg->default_address;
- delivery = e_card_simple_get_delivery_address (simple, mailing_address);
- if (delivery) {
+ address = e_contact_get_const (contact, mailing_address);
+ if (address) {
char *add;
/* If the address has 2 lines, make sure both get added */
- if (delivery->ext != NULL)
- add = g_strconcat (delivery->street, "\n", delivery->ext, NULL);
+ if (address->ext != NULL)
+ add = g_strconcat (address->street, "\n", address->ext, NULL);
else
- add = g_strdup (delivery->street);
+ add = g_strdup (address->street);
local->addr->entry[entryAddress] = e_pilot_utf8_to_pchar (add);
g_free (add);
- local->addr->entry[entryCity] = e_pilot_utf8_to_pchar (delivery->city);
- local->addr->entry[entryState] = e_pilot_utf8_to_pchar (delivery->region);
- local->addr->entry[entryZip] = e_pilot_utf8_to_pchar (delivery->code);
- local->addr->entry[entryCountry] = e_pilot_utf8_to_pchar (delivery->country);
+ local->addr->entry[entryCity] = e_pilot_utf8_to_pchar (address->locality);
+ local->addr->entry[entryState] = e_pilot_utf8_to_pchar (address->region);
+ local->addr->entry[entryZip] = e_pilot_utf8_to_pchar (address->code);
+ local->addr->entry[entryCountry] = e_pilot_utf8_to_pchar (address->country);
}
/* Phone numbers */
@@ -982,10 +881,10 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
/* Sync by priority */
for (i = 0, phone = entryPhone1;
- priority[i] != E_CARD_SIMPLE_FIELD_LAST && phone <= entryPhone5; i++) {
+ priority[i] != E_CONTACT_FIELD_LAST && phone <= entryPhone5; i++) {
const char *phone_str;
- phone_str = e_card_simple_get_const (simple, priority[i]);
+ phone_str = e_contact_get_const (contact, priority[i]);
if (phone_str && *phone_str) {
clear_entry_text (*local->addr, phone);
local->addr->entry[phone] = e_pilot_utf8_to_pchar (phone_str);
@@ -997,8 +896,8 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
local->addr->phoneLabel[phone - entryPhone1] = phone - entryPhone1;
local->addr->showPhone = 0;
} else {
- ECardSimpleField next_mail, next_home, next_work, next_fax;
- ECardSimpleField next_other, next_main, next_pager, next_mobile;
+ EContactField next_mail, next_home, next_work, next_fax;
+ EContactField next_other, next_main, next_pager, next_mobile;
INFO ("Not Syncable");
get_next_init (&next_mail, &next_home, &next_work, &next_fax,
@@ -1010,28 +909,28 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
const char *phone_str = NULL;
if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) {
- phone_str = e_card_simple_get_const (simple, next_mail);
+ phone_str = e_contact_get_const (contact, next_mail);
next_mail = get_next_mail (&next_mail);
} else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) {
- phone_str = e_card_simple_get_const (simple, next_home);
+ phone_str = e_contact_get_const (contact, next_home);
next_home = get_next_home (&next_home);
} else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) {
- phone_str = e_card_simple_get_const (simple, next_work);
+ phone_str = e_contact_get_const (contact, next_work);
next_work = get_next_work (&next_work);
} else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) {
- phone_str = e_card_simple_get_const (simple, next_fax);
+ phone_str = e_contact_get_const (contact, next_fax);
next_fax = get_next_fax (&next_fax);
} else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) {
- phone_str = e_card_simple_get_const (simple, next_other);
+ phone_str = e_contact_get_const (contact, next_other);
next_other = get_next_other (&next_other);
} else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) {
- phone_str = e_card_simple_get_const (simple, next_main);
+ phone_str = e_contact_get_const (contact, next_main);
next_main = get_next_main (&next_main);
} else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) {
- phone_str = e_card_simple_get_const (simple, next_pager);
+ phone_str = e_contact_get_const (contact, next_pager);
next_pager = get_next_pager (&next_pager);
} else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) {
- phone_str = e_card_simple_get_const (simple, next_mobile);
+ phone_str = e_contact_get_const (contact, next_mobile);
next_mobile = get_next_mobile (&next_mobile);
}
@@ -1043,9 +942,7 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
}
/* Note */
- local->addr->entry[entryNote] = e_pilot_utf8_to_pchar (ecard->note);
-
- g_object_unref (simple);
+ local->addr->entry[entryNote] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_NOTE));
}
static void
@@ -1053,118 +950,104 @@ local_record_from_uid (EAddrLocalRecord *local,
const char *uid,
EAddrConduitContext *ctxt)
{
- ECard *ecard = NULL;
+ EContact *contact = NULL;
GList *l;
g_assert (local != NULL);
for (l = ctxt->cards; l != NULL; l = l->next) {
- ecard = l->data;
+ contact = l->data;
- if (ecard->id && !strcmp (ecard->id, uid))
+ /* FIXME Do we need to check for the empty string? */
+ if (e_contact_get_const (contact, E_CONTACT_UID));
break;
- ecard = NULL;
+ contact = NULL;
}
- if (ecard != NULL) {
- local_record_from_ecard (local, ecard, ctxt);
+ if (contact != NULL) {
+ local_record_from_ecard (local, contact, ctxt);
} else {
- ecard = e_card_new ("");
- e_card_set_id (ecard, uid);
- local_record_from_ecard (local, ecard, ctxt);
- g_object_unref (ecard);
+ contact = e_contact_new ();
+ e_contact_set (contact, E_CONTACT_UID, (gpointer) uid);
+ local_record_from_ecard (local, contact, ctxt);
+ g_object_unref (contact);
}
}
-static ECard *
+static EContact *
ecard_from_remote_record(EAddrConduitContext *ctxt,
GnomePilotRecord *remote,
- ECard *in_card)
+ EContact *in_contact)
{
struct Address address;
- ECard *ecard;
- ECardSimple *simple;
- ECardName *name;
- ECardDeliveryAddress *delivery;
- ECardAddrLabel *label;
- ECardSimpleAddressId mailing_address;
+ EContact *contact;
+ EContactName *name;
+ EContactAddress *eaddress;
+ EContactField mailing_address;
char *txt, *find;
- ECardSimpleField next_mail, next_home, next_work, next_fax;
- ECardSimpleField next_other, next_main, next_pager, next_mobile;
+ EContactField next_mail, next_home, next_work, next_fax;
+ EContactField next_other, next_main, next_pager, next_mobile;
int i;
g_return_val_if_fail(remote!=NULL,NULL);
memset (&address, 0, sizeof (struct Address));
unpack_Address (&address, remote->record, remote->length);
- if (in_card == NULL)
- ecard = e_card_new("");
+ if (in_contact == NULL)
+ contact = e_contact_new ();
else
- ecard = e_card_duplicate (in_card);
+ contact = e_contact_duplicate (in_contact);
/* Name */
- name = e_card_name_copy (ecard->name);
+ name = e_contact_name_new ();
name->given = get_entry_text (address, entryFirstname);
name->family = get_entry_text (address, entryLastname);
- simple = e_card_simple_new (ecard);
- txt = e_card_name_to_string (name);
- e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_FULL_NAME, txt);
- e_card_simple_set_name (simple, name);
-
+ e_contact_set (contact, E_CONTACT_NAME, name);
+ e_contact_name_free (name);
+
/* File as */
- if (!(txt && *txt))
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FILE_AS,
- address.entry[entryCompany]);
-
- g_free (txt);
- e_card_name_unref (name);
+ if (!e_contact_get_const (contact, E_CONTACT_FULL_NAME))
+ set_contact_text (contact, E_CONTACT_FILE_AS, address, entryCompany);
/* Title and Company */
- txt = get_entry_text (address, entryTitle);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_TITLE, txt);
- g_free (txt);
-
- txt = get_entry_text (address, entryCompany);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_ORG, txt);
- g_free (txt);
+ set_contact_text (contact, E_CONTACT_TITLE, address, entryTitle);
+ set_contact_text (contact, E_CONTACT_ORG, address, entryCompany);
/* Address */
mailing_address = -1;
- for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) {
- const ECardAddrLabel *addr;
+ if (e_contact_get_const (contact, ctxt->cfg->default_address))
+ mailing_address = ctxt->cfg->default_address;
- addr = e_card_simple_get_address(simple, i);
- if (addr && (addr->flags & E_CARD_ADDR_DEFAULT))
- mailing_address = i;
+ if (mailing_address == -1) {
+ for (i = E_CONTACT_FIRST_LABEL_ID; i < E_CONTACT_LAST_LABEL_ID; i++) {
+ if (e_contact_get_const (contact, i)) {
+ mailing_address = i;
+ break;
+ }
+ }
}
+
if (mailing_address == -1)
mailing_address = ctxt->cfg->default_address;
- delivery = e_card_delivery_address_new ();
- delivery->flags |= E_CARD_ADDR_DEFAULT;
+ eaddress = g_new0 (EContactAddress, 1);
+
txt = get_entry_text (address, entryAddress);
if ((find = strchr (txt, '\n')) != NULL) {
*find = '\0';
find++;
- }
- delivery->street = txt;
- delivery->ext = find != NULL ? g_strdup (find) : g_strdup ("");
- delivery->city = get_entry_text (address, entryCity);
- delivery->region = get_entry_text (address, entryState);
- delivery->country = get_entry_text (address, entryCountry);
- delivery->code = get_entry_text (address, entryZip);
-
- label = e_card_address_label_new ();
- label->flags |= E_CARD_ADDR_DEFAULT;
- label->data = e_card_delivery_address_to_string (delivery);
-
- e_card_simple_set_address (simple, mailing_address, label);
- e_card_simple_set_delivery_address (simple, mailing_address, delivery);
+ }
+ eaddress->street = txt;
+ eaddress->ext = find != NULL ? g_strdup (find) : g_strdup ("");
+ eaddress->locality = get_entry_text (address, entryCity);
+ eaddress->region = get_entry_text (address, entryState);
+ eaddress->country = get_entry_text (address, entryCountry);
+ eaddress->code = get_entry_text (address, entryZip);
- e_card_delivery_address_unref (delivery);
- e_card_address_label_unref (label);
+ e_contact_set (contact, mailing_address, eaddress);
+ e_contact_address_free (eaddress);
/* Phone numbers */
get_next_init (&next_mail, &next_home, &next_work, &next_fax,
@@ -1175,28 +1058,28 @@ ecard_from_remote_record(EAddrConduitContext *ctxt,
char *phonenum = get_entry_text (address, i);
if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) {
- e_card_simple_set (simple, next_mail, phonenum);
+ e_contact_set (contact, next_mail, phonenum);
next_mail = get_next_mail (&next_mail);
} else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) {
- e_card_simple_set (simple, next_home, phonenum);
+ e_contact_set (contact, next_home, phonenum);
next_home = get_next_home (&next_home);
} else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) {
- e_card_simple_set (simple, next_work, phonenum);
+ e_contact_set (contact, next_work, phonenum);
next_work = get_next_work (&next_work);
} else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) {
- e_card_simple_set (simple, next_fax, phonenum);
+ e_contact_set (contact, next_fax, phonenum);
next_fax = get_next_fax (&next_fax);
} else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) {
- e_card_simple_set (simple, next_other, phonenum);
+ e_contact_set (contact, next_other, phonenum);
next_other = get_next_other (&next_other);
} else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) {
- e_card_simple_set (simple, next_main, phonenum);
+ e_contact_set (contact, next_main, phonenum);
next_main = get_next_main (&next_main);
} else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) {
- e_card_simple_set (simple, next_pager, phonenum);
+ e_contact_set (contact, next_pager, phonenum);
next_pager = get_next_pager (&next_pager);
} else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) {
- e_card_simple_set (simple, next_mobile, phonenum);
+ e_contact_set (contact, next_mobile, phonenum);
next_mobile = get_next_mobile (&next_mobile);
}
@@ -1204,16 +1087,11 @@ ecard_from_remote_record(EAddrConduitContext *ctxt,
}
/* Note */
- txt = get_entry_text (address, entryNote);
- e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_NOTE, txt);
- g_free (txt);
-
- e_card_simple_sync_card (simple);
- g_object_unref(simple);
+ set_contact_text (contact, E_CONTACT_NOTE, address, entryNote);
free_Address(&address);
- return ecard;
+ return contact;
}
static void
@@ -1243,112 +1121,6 @@ check_for_slow_setting (GnomePilotConduit *c, EAddrConduitContext *ctxt)
}
}
-static void
-card_added (EBookView *book_view, const GList *cards, EAddrConduitContext *ctxt)
-{
- const GList *l;
-
- for (l = cards; l != NULL; l = l->next) {
- ECard *card = E_CARD (l->data);
- CardObjectChange *coc;
-
- if (e_card_evolution_list (card))
- continue;
-
- coc = g_new0 (CardObjectChange, 1);
- coc->card = card;
- coc->type = CARD_ADDED;
-
- g_object_ref (coc->card);
- ctxt->changed = g_list_prepend (ctxt->changed, coc);
- if (!e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (coc->card)))
- g_hash_table_insert (ctxt->changed_hash, (gpointer)e_card_get_id (coc->card), coc);
- }
-}
-
-static void
-card_changed (EBookView *book_view, const GList *cards, EAddrConduitContext *ctxt)
-{
- const GList *l;
-
- for (l = cards; l != NULL; l = l->next) {
- ECard *card = E_CARD (l->data);
- CardObjectChange *coc;
-
- if (e_card_evolution_list (card))
- continue;
-
- coc = g_new0 (CardObjectChange, 1);
- coc->card = E_CARD (l->data);
- coc->type = CARD_MODIFIED;
-
- g_object_ref (coc->card);
- ctxt->changed = g_list_prepend (ctxt->changed, coc);
- if (!e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (coc->card)))
- g_hash_table_insert (ctxt->changed_hash, (gpointer)e_card_get_id (coc->card), coc);
- }
-}
-
-
-static void
-card_removed (EBookView *book_view, GList *ids, EAddrConduitContext *ctxt)
-{
- GList *l;
-
- for (l = ids; l != NULL; l = l->next) {
- const char *id = l->data;
- CardObjectChange *coc;
- gboolean archived;
-
- archived = e_pilot_map_uid_is_archived (ctxt->map, id);
-
- /* If its deleted, not in the archive and not in the map its a list */
- if (!archived && e_pilot_map_lookup_pid (ctxt->map, id, FALSE) == 0)
- return;
-
- coc = g_new0 (CardObjectChange, 1);
- coc->card = e_card_new ("");
- e_card_set_id (coc->card, id);
- coc->type = CARD_DELETED;
-
- ctxt->changed = g_list_prepend (ctxt->changed, coc);
-
- if (!archived)
- g_hash_table_insert (ctxt->changed_hash, (gpointer)e_card_get_id (coc->card), coc);
- else
- e_pilot_map_remove_by_uid (ctxt->map, id);
- }
-}
-
-static void
-sequence_complete (EBookView *book_view, EBookViewStatus status, EAddrConduitContext *ctxt)
-{
- g_signal_handlers_disconnect_matched(book_view,
- G_SIGNAL_MATCH_DATA,
- 0, 0,
- NULL, NULL, ctxt);
- g_object_unref (book_view);
- gtk_main_quit ();
-}
-
-static void
-view_cb (EBook *book, EBookStatus status, EBookView *book_view, gpointer data)
-{
- EAddrConduitContext *ctxt = data;
-
- g_object_ref (book_view);
-
- g_signal_connect (book_view, "card_added",
- G_CALLBACK (card_added), ctxt);
- g_signal_connect (book_view, "card_changed",
- G_CALLBACK (card_changed), ctxt);
- g_signal_connect (book_view, "card_removed",
- G_CALLBACK (card_removed), ctxt);
- g_signal_connect (book_view, "sequence_complete",
- G_CALLBACK (sequence_complete), ctxt);
-
-}
-
/* Pilot syncing callbacks */
static gint
pre_sync (GnomePilotConduit *conduit,
@@ -1356,12 +1128,13 @@ pre_sync (GnomePilotConduit *conduit,
EAddrConduitContext *ctxt)
{
GnomePilotConduitSyncAbs *abs_conduit;
-/* GList *l; */
+ EBookQuery *query;
+ GList *l;
int len;
unsigned char *buf;
char *filename;
char *change_id;
-/* gint num_records; */
+ gint num_records, add_records = 0, mod_records = 0, del_records = 0;
abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit);
@@ -1370,11 +1143,13 @@ pre_sync (GnomePilotConduit *conduit,
/* g_message ("Addressbook Conduit v.%s", CONDUIT_VERSION); */
ctxt->dbi = dbi;
- ctxt->ebook = NULL;
- if (start_addressbook_server (ctxt) != 0) {
- WARN(_("Could not start wombat server"));
- gnome_pilot_conduit_error (conduit, _("Could not start wombat"));
+ /* FIXME Need to allow our own concept of "local" */
+ ctxt->ebook = e_book_new ();
+ if (!e_book_load_local_addressbook (ctxt->ebook, NULL)) {
+ WARN(_("Could not load addressbook"));
+ gnome_pilot_conduit_error (conduit, _("Could not load addressbook"));
+
return -1;
}
@@ -1383,21 +1158,53 @@ pre_sync (GnomePilotConduit *conduit,
e_pilot_map_read (filename, &ctxt->map);
g_free (filename);
+ /* Get a list of all contacts */
+ query = e_book_query_from_string ("#t");
+ if (!e_book_get_contacts (ctxt->ebook, query, &ctxt->cards, NULL)) {
+ g_object_unref (query);
+
+ return -1;
+ }
+ g_object_unref (query);
+
/* Count and hash the changes */
change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id);
+ if (!e_book_get_changes (ctxt->ebook, change_id, &ctxt->changed, NULL))
+ return -1;
ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal);
- e_book_get_changes (ctxt->ebook, change_id, view_cb, ctxt);
-
- /* Force the view loading to be synchronous */
- gtk_main ();
- g_free (change_id);
+ g_free (change_id);
+
+ for (l = ctxt->changed; l != NULL; l = l->next) {
+ EBookChange *ebc = l->data;
+ const char *uid;
+
+ uid = e_contact_get_const (ebc->contact, E_CONTACT_UID);
+ if (!e_pilot_map_uid_is_archived (ctxt->map, uid)) {
+
+ g_hash_table_insert (ctxt->changed_hash, g_strdup (uid), ebc);
+
+ switch (ebc->change_type) {
+ case E_BOOK_CHANGE_CARD_ADDED:
+ add_records++;
+ break;
+ case E_BOOK_CHANGE_CARD_MODIFIED:
+ mod_records++;
+ break;
+ case E_BOOK_CHANGE_CARD_DELETED:
+ del_records++;
+ break;
+ }
+ } else if (ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
+ e_pilot_map_remove_by_uid (ctxt->map, uid);
+ }
+ }
/* Set the count information */
-/* num_records = cal_client_get_n_objects (ctxt->client, CALOBJ_TYPE_TODO); */
-/* gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records); */
-/* gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records); */
-/* gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records); */
-/* gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records); */
+ num_records = g_list_length (ctxt->cards);
+ gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records);
+ gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records);
+ gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records);
+ gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records);
buf = (unsigned char*)g_malloc (0xffff);
len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0,
@@ -1426,6 +1233,7 @@ post_sync (GnomePilotConduit *conduit,
GnomePilotDBInfo *dbi,
EAddrConduitContext *ctxt)
{
+ GList *changed;
gchar *filename, *change_id;
LOG (g_message ( "post_sync: Address Conduit v.%s", CONDUIT_VERSION ));
@@ -1442,9 +1250,9 @@ post_sync (GnomePilotConduit *conduit,
* a race condition if anyone changes a record elsewhere during sycnc
*/
change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id);
- e_book_get_changes (ctxt->ebook, change_id, view_cb, ctxt);
+ if (e_book_get_changes (ctxt->ebook, change_id, &changed, NULL))
+ e_book_free_change_list (changed);
g_free (change_id);
- gtk_main ();
LOG (g_message ( "---------------------------------------------------------\n" ));
@@ -1459,7 +1267,7 @@ set_pilot_id (GnomePilotConduitSyncAbs *conduit,
{
LOG (g_message ( "set_pilot_id: setting to %d\n", ID ));
- e_pilot_map_insert (ctxt->map, ID, local->ecard->id, FALSE);
+ e_pilot_map_insert (ctxt->map, ID, e_contact_get_const (local->contact, E_CONTACT_UID), FALSE);
return 0;
}
@@ -1471,7 +1279,7 @@ set_status_cleared (GnomePilotConduitSyncAbs *conduit,
{
LOG (g_message ( "set_status_cleared: clearing status\n" ));
- g_hash_table_remove (ctxt->changed_hash, e_card_get_id (local->ecard));
+ g_hash_table_remove (ctxt->changed_hash, e_contact_get_const (local->contact, E_CONTACT_UID));
return 0;
}
@@ -1545,12 +1353,12 @@ for_each_modified (GnomePilotConduitSyncAbs *conduit,
iterator = next_changed_item (ctxt, iterator);
if (iterator != NULL) {
- CardObjectChange *coc = iterator->data;
+ EBookChange *ebc = iterator->data;
- LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash) ));
+ LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash)));
*local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, coc->card, ctxt);
+ local_record_from_ecard (*local, ebc->contact, ctxt);
g_list_prepend (ctxt->locals, *local);
} else {
LOG (g_message ( "no events" ));
@@ -1561,10 +1369,10 @@ for_each_modified (GnomePilotConduitSyncAbs *conduit,
count++;
iterator = g_list_next (iterator);
if (iterator && (iterator = next_changed_item (ctxt, iterator))) {
- CardObjectChange *coc = iterator->data;
+ EBookChange *ebc = iterator->data;
*local = g_new0 (EAddrLocalRecord, 1);
- local_record_from_ecard (*local, coc->card, ctxt);
+ local_record_from_ecard (*local, ebc->contact, ctxt);
g_list_prepend (ctxt->locals, *local);
} else {
LOG (g_message ( "for_each_modified ending" ));
@@ -1613,30 +1421,26 @@ add_record (GnomePilotConduitSyncAbs *conduit,
GnomePilotRecord *remote,
EAddrConduitContext *ctxt)
{
- ECard *ecard;
- CardObjectChangeStatus cons;
+ EContact *contact;
int retval = 0;
g_return_val_if_fail (remote != NULL, -1);
LOG (g_message ( "add_record: adding %s to desktop\n", print_remote (remote) ));
- ecard = ecard_from_remote_record (ctxt, remote, NULL);
+ contact = ecard_from_remote_record (ctxt, remote, NULL);
/* add the ecard to the server */
- e_book_add_card (ctxt->ebook, ecard, add_card_cb, &cons);
-
- gtk_main(); /* enter sub mainloop */
-
- if (cons.status != E_BOOK_STATUS_SUCCESS) {
+ if (!e_book_add_contact (ctxt->ebook, contact, NULL)) {
WARN ("add_record: failed to add card to ebook\n");
+ g_object_unref (contact);
+
return -1;
}
- e_card_set_id (ecard, cons.id);
- e_pilot_map_insert (ctxt->map, remote->ID, ecard->id, FALSE);
+ e_pilot_map_insert (ctxt->map, remote->ID, e_contact_get (contact, E_CONTACT_UID), FALSE);
- g_object_unref (ecard);
+ g_object_unref (contact);
return retval;
}
@@ -1647,10 +1451,8 @@ replace_record (GnomePilotConduitSyncAbs *conduit,
GnomePilotRecord *remote,
EAddrConduitContext *ctxt)
{
- ECard *new_ecard;
- EBookStatus commit_status;
- CardObjectChange *coc;
- CardObjectChangeStatus cons;
+ EContact *new_contact;
+ EBookChange *ebc;
char *old_id;
int retval = 0;
@@ -1659,41 +1461,46 @@ replace_record (GnomePilotConduitSyncAbs *conduit,
LOG (g_message ("replace_record: replace %s with %s\n",
print_local (local), print_remote (remote)));
- old_id = g_strdup (e_card_get_id (local->ecard));
- coc = g_hash_table_lookup (ctxt->changed_hash, old_id);
+ old_id = e_contact_get (local->contact, E_CONTACT_UID);
+ ebc = g_hash_table_lookup (ctxt->changed_hash, old_id);
- new_ecard = ecard_from_remote_record (ctxt, remote, local->ecard);
- g_object_unref (local->ecard);
- local->ecard = new_ecard;
+ new_contact = ecard_from_remote_record (ctxt, remote, local->contact);
+ g_object_unref (local->contact);
+ local->contact = new_contact;
- if (coc && coc->type == CARD_DELETED)
- e_book_add_card (ctxt->ebook, local->ecard, add_card_cb, &cons);
- else
- e_book_commit_card (ctxt->ebook, local->ecard, status_cb, &commit_status);
-
- gtk_main (); /* enter sub mainloop */
+ if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
+ if (!e_book_add_contact (ctxt->ebook, local->contact, NULL)) {
+ WARN (G_STRLOC ": failed to add card\n");
+
+ return -1;
+ }
+
+ } else {
+ if (!e_book_commit_contact (ctxt->ebook, local->contact, NULL)) {
+ WARN (G_STRLOC ": failed to commit card\n");
+
+ return -1;
+ }
+ }
/* Adding a record causes wombat to assign a new uid so we must tidy */
- if (coc && coc->type == CARD_DELETED) {
- gboolean arch = e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (local->ecard));
+ if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) {
+ const char *uid = e_contact_get_const (local->contact, E_CONTACT_UID);
+ gboolean arch;
- e_card_set_id (local->ecard, cons.id);
- e_pilot_map_insert (ctxt->map, remote->ID, cons.id, arch);
-
- coc = g_hash_table_lookup (ctxt->changed_hash, old_id);
- if (coc) {
- g_hash_table_remove (ctxt->changed_hash, e_card_get_id (coc->card));
- g_object_unref (coc->card);
- g_object_ref (local->ecard);
- coc->card = local->ecard;
- g_hash_table_insert (ctxt->changed_hash, (gpointer)e_card_get_id (coc->card), coc);
+ arch = e_pilot_map_uid_is_archived (ctxt->map, uid);
+ e_pilot_map_insert (ctxt->map, remote->ID, uid, arch);
+
+ ebc = g_hash_table_lookup (ctxt->changed_hash, old_id);
+ if (ebc) {
+ g_hash_table_remove (ctxt->changed_hash, old_id);
+ g_object_unref (ebc->contact);
+ g_object_ref (local->contact);
+ ebc->contact = local->contact;
+ /* FIXME We should possibly be duplicating the uid */
+ g_hash_table_insert (ctxt->changed_hash, (gpointer) uid, ebc);
}
-
- commit_status = cons.status;
}
-
- if (commit_status != E_BOOK_STATUS_SUCCESS)
- WARN ("replace_record: failed to update card in ebook\n");
return retval;
}
@@ -1703,21 +1510,19 @@ delete_record (GnomePilotConduitSyncAbs *conduit,
EAddrLocalRecord *local,
EAddrConduitContext *ctxt)
{
- EBookStatus commit_status;
int retval = 0;
g_return_val_if_fail (local != NULL, -1);
- g_return_val_if_fail (local->ecard != NULL, -1);
+ g_return_val_if_fail (local->contact != NULL, -1);
LOG (g_message ( "delete_record: delete %s\n", print_local (local) ));
- e_pilot_map_remove_by_uid (ctxt->map, local->ecard->id);
- e_book_remove_card_by_id (ctxt->ebook, local->ecard->id, status_cb, &commit_status);
-
- gtk_main (); /* enter sub mainloop */
-
- if (commit_status != E_BOOK_STATUS_SUCCESS && commit_status != E_BOOK_STATUS_CARD_NOT_FOUND)
+ e_pilot_map_remove_by_uid (ctxt->map, e_contact_get_const (local->contact, E_CONTACT_UID));
+ if (!e_book_remove_contact (ctxt->ebook, e_contact_get_const (local->contact, E_CONTACT_UID), NULL)) {
WARN ("delete_record: failed to delete card in ebook\n");
+
+ retval = -1;
+ }
return retval;
}
@@ -1734,7 +1539,7 @@ archive_record (GnomePilotConduitSyncAbs *conduit,
LOG (g_message ( "archive_record: %s\n", archive ? "yes" : "no" ));
- e_pilot_map_insert (ctxt->map, local->local.ID, local->ecard->id, archive);
+ e_pilot_map_insert (ctxt->map, local->local.ID, e_contact_get_const (local->contact, E_CONTACT_UID), archive);
return retval;
}