Hi, attached patch.
Regards, Sergio Il giorno ven, 28/10/2005 alle 15.59 +0200, Sergio CERLESI ha scritto: > Hi, > > Il giorno ven, 28/10/2005 alle 13.13 +0200, David Eriksson ha scritto: > > On Fri, 2005-10-28 at 12:46 +0200, Sergio CERLESI wrote: > > > Hi all, > > > > Hi! > > > > Thanks for your interest in SynCE! > > > > > I have a problem when I sync my contacts. > > > > > > If I modify the fields of contacts sync works well but, if I empty a > > > field (for example email) from the remote connection my ipaq does > > > nothing, the field continues to have the same value. > > > > > > What can I do to change this behavior? > > > > Ohhh... I had almost forgotten about that bug! It's a (little) known > > shortcoming of the RRA library. > > > > > I tried to write a patch for rra that, when parses the modify vcard, put > > > empty value for not-used fields before send the objects do the ipaq. It > > > works well for string type fields but not for date type fields. There is > > > an empty value for data type to used with add_date or > > > time_fields_to_filetime functions ? > > > > I think it is possible by OR:ing the the propid member of the CEPROPVAL > > struct with 0x400 (called CEVT_FLAG_EMPTY by me in rapi.h). > > I tried this, work! Now I need more time to write a patch. Thank for > suggestion! > > > > > > Another possibility is to delete and add the modified contacts in > > > synce-multisync-plugin! > > > > Please avoid that... :-) > > I agree with you. > > > > > Good luck! > > Regards, > Sergio
--- ./lib/contact_ids.h.orig 2005-10-27 17:55:18.000000000 +0200 +++ ./lib/contact_ids.h 2005-10-28 16:57:47.000000000 +0200 @@ -1,63 +1,129 @@ #ifndef __contact_ids_h__ #define __contact_ids_h__ -#define ID_NOTE 0x0017 - -#define ID_SUFFIX 0x3a05 -#define ID_FIRST_NAME 0x3a06 -#define ID_WORK_TEL 0x3a08 -#define ID_HOME_TEL 0x3a09 -#define ID_LAST_NAME 0x3a11 -#define ID_COMPANY 0x3a16 -#define ID_JOB_TITLE 0x3a17 -#define ID_DEPARTMENT 0x3a18 -#define ID_OFFICE_LOC 0x3a19 -#define ID_MOBILE_TEL 0x3a1c -#define ID_RADIO_TEL 0x3a1d -#define ID_CAR_TEL 0x3a1e -#define ID_WORK_FAX 0x3a24 -#define ID_HOME_FAX 0x3a25 -#define ID_HOME2_TEL 0x3a2f - -#define ID_BIRTHDAY 0x4001 -#define ID_ANNIVERSARY 0x4003 -#define ID_CATEGORY 0x4005 - -#define ID_ASSISTANT 0x4002 -#define ID_ASSISTANT_TEL 0x4004 - -#define ID_CHILDREN 0x4006 - -#define ID_WORK2_TEL 0x4007 -#define ID_WEB_PAGE 0x4008 -#define ID_PAGER 0x4009 -#define ID_SPOUSE 0x400a +typedef enum _field_ids +{ + ID_NOTE, + + ID_SUFFIX, + ID_FIRST_NAME, + ID_WORK_TEL, + ID_HOME_TEL, + ID_LAST_NAME, + ID_COMPANY, + ID_JOB_TITLE, + ID_DEPARTMENT, + ID_OFFICE_LOC, + ID_MOBILE_TEL, + ID_RADIO_TEL, + ID_CAR_TEL, + ID_WORK_FAX, + ID_HOME_FAX, + ID_HOME2_TEL, + + ID_BIRTHDAY, + ID_ANNIVERSARY, + ID_CATEGORY, + + ID_ASSISTANT, + ID_ASSISTANT_TEL, + + ID_CHILDREN, + + ID_WORK2_TEL, + ID_WEB_PAGE, + ID_PAGER, + ID_SPOUSE, -#define ID_FULL_NAME 0x4013 -#define ID_TITLE 0x4023 -#define ID_MIDDLE_NAME 0x4024 - -#define ID_HOME_STREET 0x4040 -#define ID_HOME_LOCALITY 0x4041 -#define ID_HOME_REGION 0x4042 -#define ID_HOME_POSTAL_CODE 0x4043 -#define ID_HOME_COUNTRY 0x4044 - -#define ID_WORK_STREET 0x4045 -#define ID_WORK_LOCALITY 0x4046 -#define ID_WORK_REGION 0x4047 -#define ID_WORK_POSTAL_CODE 0x4048 -#define ID_WORK_COUNTRY 0x4049 - -#define ID_OTHER_STREET 0x404a -#define ID_OTHER_LOCALITY 0x404b -#define ID_OTHER_REGION 0x404c -#define ID_OTHER_POSTAL_CODE 0x404d -#define ID_OTHER_COUNTRY 0x404e - -#define ID_EMAIL 0x4083 -#define ID_EMAIL2 0x4093 -#define ID_EMAIL3 0x40a3 + ID_FULL_NAME, + ID_TITLE, + ID_MIDDLE_NAME, + + ID_HOME_STREET, + ID_HOME_LOCALITY, + ID_HOME_REGION, + ID_HOME_POSTAL_CODE, + ID_HOME_COUNTRY, + + ID_WORK_STREET, + ID_WORK_LOCALITY, + ID_WORK_REGION, + ID_WORK_POSTAL_CODE, + ID_WORK_COUNTRY, + + ID_OTHER_STREET, + ID_OTHER_LOCALITY, + ID_OTHER_REGION, + ID_OTHER_POSTAL_CODE, + ID_OTHER_COUNTRY, + + ID_EMAIL, + ID_EMAIL2, + ID_EMAIL3, + + ID_MAX +} field_ids; + +static const uint32_t value_ids[ID_MAX] = +{ +0x0017, /* ID_NOTE */ + +0x3a05, /* ID_SUFFIX */ +0x3a06, /* ID_FIRST_NAME */ +0x3a08, /* ID_WORK_TEL */ +0x3a09, /* ID_HOME_TEL */ +0x3a11, /* ID_LAST_NAME */ +0x3a16, /* ID_COMPANY */ +0x3a17, /* ID_JOB_TITLE */ +0x3a18, /* ID_DEPARTMENT */ +0x3a19, /* ID_OFFICE_LOC */ +0x3a1c, /* ID_MOBILE_TEL */ +0x3a1d, /* ID_RADIO_TEL */ +0x3a1e, /* ID_CAR_TEL */ +0x3a24, /* ID_WORK_FAX */ +0x3a25, /* ID_HOME_FAX */ +0x3a2f, /* ID_HOME2_TEL */ + +0x4001, /* ID_BIRTHDAY */ +0x4003, /* ID_ANNIVERSARY */ +0x4005, /* ID_CATEGORY */ + +0x4002, /* ID_ASSISTANT */ +0x4004, /* ID_ASSISTANT_TEL */ + +0x4006, /* ID_CHILDREN */ + +0x4007, /* ID_WORK2_TEL */ +0x4008, /* ID_WEB_PAGE */ +0x4009, /* ID_PAGER */ +0x400a, /* ID_SPOUSE */ + +0x4013, /* ID_FULL_NAME */ +0x4023, /* ID_TITLE */ +0x4024, /* ID_MIDDLE_NAME */ + +0x4040, /* ID_HOME_STREET */ +0x4041, /* ID_HOME_LOCALITY */ +0x4042, /* ID_HOME_REGION */ +0x4043, /* ID_HOME_POSTAL_CODE */ +0x4044, /* ID_HOME_COUNTRY */ + +0x4045, /* ID_WORK_STREET */ +0x4046, /* ID_WORK_LOCALITY */ +0x4047, /* ID_WORK_REGION */ +0x4048, /* ID_WORK_POSTAL_CODE */ +0x4049, /* ID_WORK_COUNTRY */ + +0x404a, /* ID_OTHER_STREET */ +0x404b, /* ID_OTHER_LOCALITY */ +0x404c, /* ID_OTHER_REGION */ +0x404d, /* ID_OTHER_POSTAL_CODE */ +0x404e, /* ID_OTHER_COUNTRY */ + +0x4083, /* ID_EMAIL */ +0x4093, /* ID_EMAIL2 */ +0x40a3 /* ID_EMAIL3 */ +}; #define MAX_TEL_WORK 2 #define MAX_TEL_HOME 2 --- ./lib/contact.c.orig 2005-10-27 17:55:18.000000000 +0200 +++ ./lib/contact.c 2005-10-28 17:56:48.000000000 +0200 @@ -272,252 +272,249 @@ for (i = 0; i < count; i++) { + uint32_t propid = pFields[i].propid >> 16; + /* TODO: validate data types */ - switch (pFields[i].propid >> 16) + if (propid == value_ids[ID_ANNIVERSARY]) + { + strbuf_append_date(vcard, "X-EVOLUTION-ANNIVERSARY", &pFields[i].val.filetime); + } + else if (propid == value_ids[ID_BIRTHDAY]) { - case ID_ANNIVERSARY: - strbuf_append_date(vcard, "X-EVOLUTION-ANNIVERSARY", &pFields[i].val.filetime); - break; - - case ID_BIRTHDAY: - strbuf_append_date(vcard, "BDAY", &pFields[i].val.filetime); - break; - + strbuf_append_date(vcard, "BDAY", &pFields[i].val.filetime); + } #if 0 - case ID_NOTE: - { - unsigned j; - for (j = 0; j < pFields[i].val.blob.dwCount && pFields[i].val.blob.lpb[i]; j++) - ; - - if (j == pFields[i].val.blob.dwCount) - { - strbuf_append(vcard, "NOTE:"); - /* XXX: need to handle newlines! */ - strbuf_append(vcard, (const char*)pFields[i].val.blob.lpb); - strbuf_append_crlf(vcard); - } - else - { - synce_warning("Note is not an ASCII string.\n"); - } - } - break; -#endif - - case ID_SUFFIX: - suffix = pFields[i].val.lpwstr; - break; - - case ID_FIRST_NAME: - first_name = pFields[i].val.lpwstr; - break; - - case ID_WORK_TEL: - strbuf_append_tel_type(vcard, "WORK,VOICE,PREF", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_HOME_TEL: - strbuf_append_tel_type(vcard, "HOME,VOICE,PREF", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_LAST_NAME: - last_name = pFields[i].val.lpwstr; - break; - - case ID_COMPANY: - company = pFields[i].val.lpwstr; - break; + else if (propid == value_ids[ID_NOTE]) + { + unsigned j; + for (j = 0; j < pFields[i].val.blob.dwCount && pFields[i].val.blob.lpb[i]; j++) + ; - case ID_JOB_TITLE: - strbuf_append(vcard, "TITLE:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + if (j == pFields[i].val.blob.dwCount) + { + strbuf_append(vcard, "NOTE:"); + /* XXX: need to handle newlines! */ + strbuf_append(vcard, (const char*)pFields[i].val.blob.lpb); strbuf_append_crlf(vcard); - break; - - case ID_DEPARTMENT: + } + else + { + synce_warning("Note is not an ASCII string.\n"); + } + } +#endif + else if (propid == value_ids[ID_SUFFIX]) + { + suffix = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_FIRST_NAME]) + { + first_name = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_TEL]) + { + strbuf_append_tel_type(vcard, "WORK,VOICE,PREF", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_HOME_TEL]) + { + strbuf_append_tel_type(vcard, "HOME,VOICE,PREF", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_LAST_NAME]) + { + last_name = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_COMPANY]) + { + company = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_JOB_TITLE]) + { + strbuf_append(vcard, "TITLE:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_DEPARTMENT]) + { department = pFields[i].val.lpwstr; - break; - - case ID_MOBILE_TEL: - strbuf_append_tel_type(vcard, "CELL", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_CAR_TEL: - strbuf_append_tel_type(vcard, "CAR", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_WORK_FAX: - strbuf_append_tel_type(vcard, "WORK,FAX", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_HOME_FAX: - strbuf_append_tel_type(vcard, "HOME,FAX", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_HOME2_TEL: - strbuf_append_tel_type(vcard, "HOME,VOICE", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_CATEGORY: - strbuf_append(vcard, "CATEGORIES:"); - strbuf_append_comma_separated_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_WORK2_TEL: - strbuf_append_tel_type(vcard, "WORK,VOICE", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_WEB_PAGE: - strbuf_append(vcard, "URL:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_PAGER: - strbuf_append_tel_type(vcard, "PAGER", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_FULL_NAME: - strbuf_append(vcard, "FN:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - have_fn = true; - break; - - case ID_TITLE: - title = pFields[i].val.lpwstr; - break; - - case ID_MIDDLE_NAME: - middle_name = pFields[i].val.lpwstr; - break; - - case ID_HOME_STREET: - home_street = pFields[i].val.lpwstr; - break; - - case ID_HOME_LOCALITY: - home_locality = pFields[i].val.lpwstr; - break; - - case ID_HOME_REGION: - home_region = pFields[i].val.lpwstr; - break; - - case ID_HOME_POSTAL_CODE: - home_postal_code = pFields[i].val.lpwstr; - break; - - case ID_HOME_COUNTRY: - home_country = pFields[i].val.lpwstr; - break; - - case ID_WORK_STREET: - work_street = pFields[i].val.lpwstr; - break; - - case ID_WORK_LOCALITY: - work_locality = pFields[i].val.lpwstr; - break; - - case ID_WORK_REGION: - work_region = pFields[i].val.lpwstr; - break; - - case ID_WORK_POSTAL_CODE: - work_postal_code = pFields[i].val.lpwstr; - break; - - case ID_WORK_COUNTRY: - work_country = pFields[i].val.lpwstr; - break; - - case ID_OTHER_STREET: - other_street = pFields[i].val.lpwstr; - break; - - case ID_OTHER_LOCALITY: - other_locality = pFields[i].val.lpwstr; - break; - - case ID_OTHER_REGION: - other_region = pFields[i].val.lpwstr; - break; - - case ID_OTHER_POSTAL_CODE: - other_postal_code = pFields[i].val.lpwstr; - break; - - case ID_OTHER_COUNTRY: - other_country = pFields[i].val.lpwstr; - break; - - case ID_EMAIL: - strbuf_append_type(vcard, "EMAIL", "INTERNET,PREF", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_EMAIL2: - case ID_EMAIL3: - strbuf_append_type(vcard, "EMAIL", "INTERNET", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_SPOUSE: - strbuf_append(vcard, "X-EVOLUTION-SPOUSE:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_ASSISTANT: - strbuf_append(vcard, "X-EVOLUTION-ASSISTANT:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_ASSISTANT_TEL: - strbuf_append_tel_type(vcard, "X-EVOLUTION-ASSISTANT", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_OFFICE_LOC: - strbuf_append(vcard, "X-EVOLUTION-OFFICE:"); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - case ID_RADIO_TEL: - strbuf_append_tel_type(vcard, "X-EVOLUTION-RADIO", flags); - strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); - strbuf_append_crlf(vcard); - break; - - default: + } + else if (propid == value_ids[ID_MOBILE_TEL]) + { + strbuf_append_tel_type(vcard, "CELL", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_CAR_TEL]) + { + strbuf_append_tel_type(vcard, "CAR", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_WORK_FAX]) + { + strbuf_append_tel_type(vcard, "WORK,FAX", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_HOME_FAX]) + { + strbuf_append_tel_type(vcard, "HOME,FAX", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_HOME2_TEL]) + { + strbuf_append_tel_type(vcard, "HOME,VOICE", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_CATEGORY]) + { + strbuf_append(vcard, "CATEGORIES:"); + strbuf_append_comma_separated_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_WORK2_TEL]) + { + strbuf_append_tel_type(vcard, "WORK,VOICE", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_WEB_PAGE]) + { + strbuf_append(vcard, "URL:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_PAGER]) + { + strbuf_append_tel_type(vcard, "PAGER", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_FULL_NAME]) + { + strbuf_append(vcard, "FN:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + have_fn = true; + } + else if (propid == value_ids[ID_TITLE]) + { + title = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_MIDDLE_NAME]) + { + middle_name = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_HOME_STREET]) + { + home_street = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_HOME_LOCALITY]) + { + home_locality = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_HOME_REGION]) + { + home_region = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_HOME_POSTAL_CODE]) + { + home_postal_code = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_HOME_COUNTRY]) + { + home_country = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_STREET]) + { + work_street = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_LOCALITY]) + { + work_locality = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_REGION]) + { + work_region = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_POSTAL_CODE]) + { + work_postal_code = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_WORK_COUNTRY]) + { + work_country = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_OTHER_STREET]) + { + other_street = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_OTHER_LOCALITY]) + { + other_locality = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_OTHER_REGION]) + { + other_region = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_OTHER_POSTAL_CODE]) + { + other_postal_code = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_OTHER_COUNTRY]) + { + other_country = pFields[i].val.lpwstr; + } + else if (propid == value_ids[ID_EMAIL]) + { + strbuf_append_type(vcard, "EMAIL", "INTERNET,PREF", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_EMAIL2] || propid == value_ids[ID_EMAIL3]) + { + strbuf_append_type(vcard, "EMAIL", "INTERNET", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_SPOUSE]) + { + strbuf_append(vcard, "X-EVOLUTION-SPOUSE:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_ASSISTANT]) + { + strbuf_append(vcard, "X-EVOLUTION-ASSISTANT:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_ASSISTANT_TEL]) + { + strbuf_append_tel_type(vcard, "X-EVOLUTION-ASSISTANT", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_OFFICE_LOC]) + { + strbuf_append(vcard, "X-EVOLUTION-OFFICE:"); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else if (propid == value_ids[ID_RADIO_TEL]) + { + strbuf_append_tel_type(vcard, "X-EVOLUTION-RADIO", flags); + strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags); + strbuf_append_crlf(vcard); + } + else + { synce_warning("Did not handle field with ID %04x", pFields[i].propid >> 16); - break; } } @@ -841,8 +838,8 @@ if (date_to_struct(value, &time_fields)) { - CEPROPVAL* propval = &parser->fields[parser->field_index++]; - propval->propid = (id << 16) | CEVT_FILETIME; + CEPROPVAL* propval = &parser->fields[id]; + propval->propid = (value_ids[id] << 16) | CEVT_FILETIME; time_fields_to_filetime(&time_fields, &propval->val.filetime); } } @@ -850,11 +847,11 @@ static void add_string(Parser* parser, uint32_t id, const char* type, char* value)/*{{{*/ { char* converted = NULL; - CEPROPVAL* field = &parser->fields[parser->field_index++]; + CEPROPVAL* field = &parser->fields[id]; assert(value); - field->propid = (id << 16) | CEVT_LPWSTR; + field->propid = (value_ids[id] << 16) | CEVT_LPWSTR; if (STR_IN_STR(type, "QUOTED-PRINTABLE")) { @@ -1242,6 +1239,7 @@ size_t max_field_count = *field_count; const char* p = vcard; int state = VCARD_STATE_NEWLINE; + int count; const char* name = NULL; const char* name_end = NULL; const char* type = NULL; @@ -1263,6 +1261,18 @@ parser.field_index = 0; parser.utf8 = flags & RRA_CONTACT_UTF8; + for (count=0; count < ID_MAX; count++) + { + CEPROPVAL* field = &parser.fields[parser.field_index++]; + + if (count == ID_BIRTHDAY || count == ID_ANNIVERSARY) + field->propid = (value_ids[count] << 16) | + CEVT_FLAG_EMPTY | CEVT_FILETIME; + else + field->propid = (value_ids[count] << 16) | + CEVT_FLAG_EMPTY | CEVT_LPWSTR; + } + while (*p && parser.field_index < max_field_count) { switch (state)