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)

Reply via email to