sync all the fields we can, with out overwriting

2001-10-17  JP Rosevear  <jpr@ximian.com>

	* conduit/address-conduit.c (ecard_from_remote_record): sync all
	the fields we can, with out overwriting
	(local_record_from_ecard): write the fields to the pilot in
	priority order unless there are fields on the pilot we can't
	store, then fill in the fields as they are on the pilot

svn path=/trunk/; revision=13728
This commit is contained in:
JP Rosevear
2001-10-17 18:46:38 +00:00
committed by JP Rosevear
parent ff5c5f8970
commit b2b835cae7
2 changed files with 366 additions and 107 deletions

View File

@ -1,3 +1,11 @@
2001-10-17 JP Rosevear <jpr@ximian.com>
* conduit/address-conduit.c (ecard_from_remote_record): sync all
the fields we can, with out overwriting
(local_record_from_ecard): write the fields to the pilot in
priority order unless there are fields on the pilot we can't
store, then fill in the fields as they are on the pilot
2001-10-17 Christopher James Lahey <clahey@ximian.com>
* backend/ebook/e-card.c (e_card_get_vobject): Did a bit of clean

View File

@ -84,6 +84,43 @@ typedef struct
CardObjectChangeType type;
} CardObjectChange;
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 char *priority_label [] = {
"Work",
"Home",
"Fax",
"E-mail",
"Pager",
"Mobile",
"Work",
"Home",
"Fax",
"E-mail",
"Other",
"Main",
"Fax",
"E-Mail",
NULL
};
/* Debug routines */
static char *
print_local (EAddrLocalRecord *local)
@ -274,6 +311,148 @@ next_changed_item (EAddrConduitContext *ctxt, GList *changes)
return NULL;
}
static int
get_label (EAddrConduitContext *ctxt, const char *label)
{
int i;
for (i = 0; i < 8; i++) {
if (!strcmp (ctxt->ai.phoneLabels[i], label))
return i;
}
return 0;
}
static ECardSimpleField
get_next_mail (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_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;
default:
}
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_home (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_HOME;
switch (*field) {
case E_CARD_SIMPLE_FIELD_PHONE_HOME:
return E_CARD_SIMPLE_FIELD_PHONE_HOME_2;
default:
}
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_work (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_BUSINESS;
switch (*field) {
case E_CARD_SIMPLE_FIELD_PHONE_BUSINESS:
return E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2;
default:
}
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_fax (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_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;
default:
}
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_other (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_OTHER;
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_main (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_PRIMARY;
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_pager (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_PAGER;
return E_CARD_SIMPLE_FIELD_LAST;
}
static ECardSimpleField
get_next_mobile (ECardSimpleField *field)
{
if (field == NULL)
return E_CARD_SIMPLE_FIELD_PHONE_MOBILE;
return E_CARD_SIMPLE_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)
{
*next_mail = get_next_mail (NULL);
*next_home = get_next_home (NULL);
*next_work = get_next_work (NULL);
*next_fax = get_next_fax (NULL);
*next_other = get_next_other (NULL);
*next_main = get_next_main (NULL);
*next_pager = get_next_pager (NULL);
*next_mobile = get_next_mobile (NULL);
}
static gboolean
is_next_done (ECardSimpleField field)
{
if (field == E_CARD_SIMPLE_FIELD_LAST)
return TRUE;
return FALSE;
}
static char *
get_entry_text (struct Address address, int field)
{
@ -340,6 +519,9 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
ECardSimple *simple;
const ECardDeliveryAddress *delivery;
int phone = entryPhone1;
ECardSimpleField next_mail, next_home, next_work, next_fax;
ECardSimpleField next_other, next_main, next_pager, next_mobile;
gboolean syncable;
int i;
g_return_if_fail (local != NULL);
@ -392,35 +574,139 @@ local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitCont
}
/* Phone numbers */
for (i = 0; i <= 7 && phone <= entryPhone5; i++) {
get_next_init (&next_mail, &next_home, &next_work, &next_fax,
&next_other, &next_main, &next_pager, &next_mobile);
/* See if everything is syncable */
syncable = TRUE;
for (i = entryPhone1; i <= entryPhone5; i++) {
char *phonelabel = ctxt->ai.phoneLabels[local->addr->phoneLabel[i - entryPhone1]];
const char *phone_str = NULL;
char *phonelabel = ctxt->ai.phoneLabels[i];
if (!strcmp (phonelabel, "E-mail"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_EMAIL);
else if (!strcmp (phonelabel, "Home"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_HOME);
else if (!strcmp (phonelabel, "Work"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS);
else if (!strcmp (phonelabel, "Fax"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX);
else if (!strcmp (phonelabel, "Other"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_OTHER);
else if (!strcmp (phonelabel, "Main"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_PRIMARY);
else if (!strcmp (phonelabel, "Pager"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_PAGER);
else if (!strcmp (phonelabel, "Mobile"))
phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_MOBILE);
if (!strcmp (phonelabel, "E-mail")) {
if (is_next_done (next_mail)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_home);
if (phone_str && *phone_str)
next_mail = get_next_mail (&next_mail);
} else if (!strcmp (phonelabel, "Home")) {
if (is_next_done (next_home)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_home);
if (phone_str && *phone_str)
next_home = get_next_home (&next_home);
} else if (!strcmp (phonelabel, "Work")) {
if (is_next_done (next_work)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_work);
if (phone_str && *phone_str)
next_work = get_next_work (&next_work);
} else if (!strcmp (phonelabel, "Fax")) {
if (is_next_done (next_fax)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_fax);
if (phone_str && *phone_str)
next_fax = get_next_fax (&next_fax);
} else if (!strcmp (phonelabel, "Other")) {
if (is_next_done (next_other)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_other);
if (phone_str && *phone_str)
next_other = get_next_other (&next_other);
} else if (!strcmp (phonelabel, "Main")) {
if (is_next_done (next_main)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_main);
if (phone_str && *phone_str)
next_main = get_next_main (&next_main);
} else if (!strcmp (phonelabel, "Pager")) {
if (is_next_done (next_pager)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_pager);
if (phone_str && *phone_str)
next_pager = get_next_pager (&next_pager);
} else if (!strcmp (phonelabel, "Mobile")) {
if (is_next_done (next_mobile)) {
syncable = FALSE;
break;
}
phone_str = e_card_simple_get_const (simple, next_mobile);
if (phone_str && *phone_str)
next_mobile = get_next_mobile (&next_mobile);
}
}
if (syncable) {
INFO ("Syncable");
/* Sync by priority */
for (i = 0, phone = entryPhone1;
priority[i] != E_CARD_SIMPLE_FIELD_LAST && phone <= entryPhone5; i++) {
const char *phone_str;
phone_str = e_card_simple_get_const (simple, priority[i]);
if (phone_str && *phone_str) {
local->addr->entry[phone] = e_pilot_utf8_to_pchar (phone_str);
local->addr->phoneLabel[phone - entryPhone1] = i;
local->addr->phoneLabel[phone - entryPhone1] =
get_label (ctxt, priority_label[i]);
phone++;
}
}
for ( ; phone <= entryPhone5; phone++)
local->addr->phoneLabel[phone - entryPhone1] = phone - entryPhone1;
} else {
INFO ("Not Syncable");
get_next_init (&next_mail, &next_home, &next_work, &next_fax,
&next_other, &next_main, &next_pager, &next_mobile);
/* Not completely syncable, so do the best we can */
for (i = entryPhone1; i <= entryPhone5; i++) {
char *phonelabel = ctxt->ai.phoneLabels[local->addr->phoneLabel[i - entryPhone1]];
const char *phone_str = NULL;
if (!strcmp (phonelabel, "E-mail") && !is_next_done (next_mail)) {
phone_str = e_card_simple_get_const (simple, next_mail);
next_mail = get_next_mail (&next_mail);
} else if (!strcmp (phonelabel, "Home") && !is_next_done (next_home)) {
phone_str = e_card_simple_get_const (simple, next_home);
next_home = get_next_home (&next_home);
} else if (!strcmp (phonelabel, "Work") && !is_next_done (next_work)) {
phone_str = e_card_simple_get_const (simple, next_work);
next_work = get_next_work (&next_work);
} else if (!strcmp (phonelabel, "Fax") && !is_next_done (next_fax)) {
phone_str = e_card_simple_get_const (simple, next_fax);
next_fax = get_next_fax (&next_fax);
} else if (!strcmp (phonelabel, "Other") && !is_next_done (next_other)) {
phone_str = e_card_simple_get_const (simple, next_other);
next_other = get_next_other (&next_other);
} else if (!strcmp (phonelabel, "Main") && !is_next_done (next_main)) {
phone_str = e_card_simple_get_const (simple, next_main);
next_main = get_next_main (&next_main);
} else if (!strcmp (phonelabel, "Pager") && !is_next_done (next_pager)) {
phone_str = e_card_simple_get_const (simple, next_pager);
next_pager = get_next_pager (&next_pager);
} else if (!strcmp (phonelabel, "Mobile") && !is_next_done (next_mobile)) {
phone_str = e_card_simple_get_const (simple, next_mobile);
next_mobile = get_next_mobile (&next_mobile);
}
if (phone_str && *phone_str)
local->addr->entry[i] = e_pilot_utf8_to_pchar (phone_str);
}
}
/* Note */
local->addr->entry[entryNote] = e_pilot_utf8_to_pchar (ecard->note);
@ -464,12 +750,12 @@ ecard_from_remote_record(EAddrConduitContext *ctxt,
struct Address address;
ECard *ecard;
ECardSimple *simple;
ECardDeliveryAddress delivery;
ECardAddrLabel label;
ECardDeliveryAddress *delivery;
ECardAddrLabel *label;
char *txt;
char *stringparts[3];
ECardSimpleField last_business, last_home, last_fax;
ECardSimpleEmailId last_email;
ECardSimpleField next_mail, next_home, next_work, next_fax;
ECardSimpleField next_other, next_main, next_pager, next_mobile;
int i;
g_return_val_if_fail(remote!=NULL,NULL);
@ -505,93 +791,58 @@ ecard_from_remote_record(EAddrConduitContext *ctxt,
g_free (txt);
/* Address */
memset (&delivery, 0, sizeof (ECardDeliveryAddress));
delivery.flags = E_CARD_ADDR_WORK;
delivery.street = get_entry_text (address, entryAddress);
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);
delivery = e_card_delivery_address_new ();
delivery->flags = E_CARD_ADDR_WORK;
delivery->street = get_entry_text (address, entryAddress);
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.flags = E_CARD_ADDR_WORK;
label.data = e_card_delivery_address_to_string (&delivery);
label = e_card_address_label_new ();
label->flags = E_CARD_ADDR_WORK;
label->data = e_card_delivery_address_to_string (delivery);
e_card_simple_set_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, &label);
e_card_simple_set_delivery_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, &delivery);
e_card_simple_set_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, label);
e_card_simple_set_delivery_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, delivery);
free (delivery.street);
free (delivery.city);
free (delivery.region);
free (delivery.country);
free (delivery.code);
g_free (label.data);
last_business = E_CARD_SIMPLE_FIELD_PHONE_BUSINESS;
last_home = E_CARD_SIMPLE_FIELD_PHONE_HOME;
last_fax = E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX;
last_email = E_CARD_SIMPLE_EMAIL_ID_EMAIL;
e_card_delivery_address_unref (delivery);
e_card_address_label_unref (label);
/* Phone numbers */
get_next_init (&next_mail, &next_home, &next_work, &next_fax,
&next_other, &next_main, &next_pager, &next_mobile);
for (i = entryPhone1; i <= entryPhone5; i++) {
char *phonelabel = ctxt->ai.phoneLabels[address.phoneLabel[i - entryPhone1]];
char *phonenum = get_entry_text (address, i);
if (!strcmp (phonenum, "")) {
g_free (phonenum);
continue;
if (!strcmp (phonelabel, "E-mail") && !is_next_done (next_mail)) {
e_card_simple_set (simple, next_mail, phonenum);
next_mail = get_next_mail (&next_mail);
} else if (!strcmp (phonelabel, "Home") && !is_next_done (next_home)) {
e_card_simple_set (simple, next_home, phonenum);
next_home = get_next_home (&next_home);
} else if (!strcmp (phonelabel, "Work") && !is_next_done (next_work)) {
e_card_simple_set (simple, next_work, phonenum);
next_work = get_next_work (&next_work);
} else if (!strcmp (phonelabel, "Fax") && !is_next_done (next_fax)) {
e_card_simple_set (simple, next_fax, phonenum);
next_fax = get_next_fax (&next_fax);
} else if (!strcmp (phonelabel, "Other") && !is_next_done (next_other)) {
e_card_simple_set (simple, next_other, phonenum);
next_other = get_next_other (&next_other);
} else if (!strcmp (phonelabel, "Main") && !is_next_done (next_main)) {
e_card_simple_set (simple, next_main, phonenum);
next_main = get_next_main (&next_main);
} else if (!strcmp (phonelabel, "Pager") && !is_next_done (next_pager)) {
e_card_simple_set (simple, next_pager, phonenum);
next_pager = get_next_pager (&next_pager);
} else if (!strcmp (phonelabel, "Mobile") && !is_next_done (next_mobile)) {
e_card_simple_set (simple, next_mobile, phonenum);
next_mobile = get_next_mobile (&next_mobile);
}
if (!strcmp (phonelabel, "E-mail")) {
e_card_simple_set_email(simple, last_email, phonenum);
switch (last_email) {
case E_CARD_SIMPLE_EMAIL_ID_EMAIL:
last_email = E_CARD_SIMPLE_EMAIL_ID_EMAIL_2;
break;
case E_CARD_SIMPLE_EMAIL_ID_EMAIL_2:
last_email = E_CARD_SIMPLE_EMAIL_ID_EMAIL_3;
break;
default:
}
} else if (!strcmp (phonelabel, "Home")) {
e_card_simple_set(simple, last_home, phonenum);
switch (last_home) {
case E_CARD_SIMPLE_FIELD_PHONE_HOME:
last_home = E_CARD_SIMPLE_FIELD_PHONE_HOME_2;
break;
default:
}
} else if (!strcmp (phonelabel, "Work")) {
e_card_simple_set(simple, last_business, phonenum);
switch (last_business) {
case E_CARD_SIMPLE_FIELD_PHONE_BUSINESS:
last_business = E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2;
break;
default:
}
} else if (!strcmp (phonelabel, "Fax")) {
e_card_simple_set(simple, last_fax, phonenum);
switch (last_fax) {
case E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX:
last_fax = E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX;
break;
case E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX:
last_fax = E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX;
break;
default:
}
} else if (!strcmp (phonelabel, "Other"))
e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_OTHER, phonenum);
else if (!strcmp (phonelabel, "Main"))
e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, phonenum);
else if (!strcmp (phonelabel, "Pager"))
e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PAGER, phonenum);
else if (!strcmp (phonelabel, "Mobile"))
e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_MOBILE, phonenum);
g_free (phonenum);
}