Il giorno dom, 12/03/2006 alle 09.28 +0100, David Eriksson ha scritto:
> On Sun, 2006-03-12 at 03:00 +0100, Nabil Sayegh wrote:
> > Hi list,
> > 
> > we added support for configurable frontends like KDEPIM and EVOLUTION.
> > You have to call e.g. rra_frontend_set(ID_FRONTEND_KDEPIM) from your 
> > syncing 
> > app, ID_FRONTEND_UNKNOWN is default.
> > 
> > With that help we can add support for non-standard fields without colliding.
> 
> Cool! Great work!
> 

Hi Nabil,

I synced my patch with last cvs and changed one to used frontend
implementation (good idea).

Regards
Sergio
--- ./lib/contact.c.Orig	2006-03-13 09:53:58.000000000 +0100
+++ ./lib/contact.c	2006-03-13 11:19:09.000000000 +0100
@@ -43,6 +43,8 @@ static void strbuf_append_escaped(StrBuf
 		switch (*p)
 		{
 			case '\r': 				/* CR */
+      case 19: 		  		/* XOFF */
+      case 31: 		  		/* Unit separator */
 				/* ignore */
 				break;		
 
@@ -286,18 +288,16 @@ static bool rra_contact_to_vcard2(/*{{{*
         strbuf_append_date(vcard, "BDAY", &pFields[i].val.filetime);
         break;
       
-#if 0
 			case ID_NOTE:
 				{
 					unsigned j;
-					for (j = 0; j < pFields[i].val.blob.dwCount && pFields[i].val.blob.lpb[i]; j++)
+          for (j = 0; j < pFields[i].val.blob.dwCount && pFields[i].val.blob.lpb[j]; 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_escaped(vcard, pFields[i].val.blob.lpb, flags);
 						strbuf_append_crlf(vcard);
 					}
 					else
@@ -306,7 +306,6 @@ static bool rra_contact_to_vcard2(/*{{{*
 					}
 				}
 				break;
-#endif
 
 			case ID_SUFFIX:
 				suffix = pFields[i].val.lpwstr;
@@ -869,9 +868,7 @@ typedef struct _Parser
 
 typedef enum _field_index
 {
-/*
   INDEX_NOTE,
-*/
   INDEX_SUFFIX,
   INDEX_FIRST_NAME,
   INDEX_WORK_TEL,
@@ -959,9 +956,7 @@ static uint32_t address_index[ADDRESS_FI
 
 static const uint32_t field_id[ID_COUNT] =
 {
-/*
   ID_NOTE,
-*/
   ID_SUFFIX,
   ID_FIRST_NAME,
   ID_WORK_TEL,
@@ -1154,6 +1149,36 @@ static void add_string(Parser* parser, u
   }
 }/*}}}*/
 
+static void add_blob(Parser* parser, uint32_t index, const char* type, char* data)/*{{{*/
+{
+  char* converted = NULL;
+  CEPROPVAL* field = &parser->fields[index];
+
+  assert(data);
+
+  if (field->propid & CEVT_FLAG_EMPTY)
+  {
+    field->propid = (field_id[index] << 16) | CEVT_BLOB;
+
+    if (STR_IN_STR(type, "QUOTED-PRINTABLE"))
+    {
+      data = converted = strdup_quoted_printable(data);
+      assert(data);
+    }
+  
+    unescape_string(data);
+    assert(data);
+ 
+    field->val.blob.dwCount = strlen(data);
+    field->val.blob.lpb = malloc(field->val.blob.dwCount);
+    assert(field->val.blob.lpb);
+    memcpy(field->val.blob.lpb, data, field->val.blob.dwCount);
+  
+    if (converted)
+      free(converted);
+  }
+}/*}}}*/
+
 static bool parser_handle_field(/*{{{*/
 		Parser* parser,
 		char* name, 
@@ -1423,6 +1448,10 @@ static bool parser_handle_field(/*{{{*/
   {
     add_string(parser, INDEX_ASSISTANT, type, value);
   }
+  else if (STR_EQUAL(name, "NOTE"))
+  {
+    add_blob(parser, INDEX_NOTE, type, value);
+  }
 /* FOOBAR */
   else if (rra_frontend_get()==ID_FRONTEND_KDEPIM && STR_EQUAL(name, "X-KADDRESSBOOK-X-IMAddress"))
   {
@@ -1618,6 +1647,10 @@ static bool rra_contact_from_vcard2(/*{{
       field->propid = (field_id[count] << 16) |
           CEVT_FLAG_EMPTY | CEVT_FILETIME;
       break;
+    case INDEX_NOTE:
+      field->propid = (field_id[count] << 16) |
+          CEVT_FLAG_EMPTY | CEVT_BLOB;
+      break;
     default:
       field->propid = (field_id[count] << 16) |
           CEVT_FLAG_EMPTY | CEVT_LPWSTR;
--- ./lib/contact.c.Orig	2006-03-13 11:24:18.000000000 +0100
+++ ./lib/contact.c	2006-03-13 11:26:50.000000000 +0100
@@ -514,6 +514,13 @@ static bool rra_contact_to_vcard2(/*{{{*
 				strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags);
 				strbuf_append_crlf(vcard);
 				break;
+
+      case ID_CHILDREN:
+        strbuf_append(vcard, "X-SYNCE-CHILDREN:");
+        strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags);
+        strbuf_append_crlf(vcard);
+        break;
+
 /* FOOBAR */
 			case ID_IMADDRESS:
 				switch(rra_frontend_get())
@@ -889,9 +896,7 @@ typedef enum _field_index
   INDEX_CATEGORY,
   INDEX_ASSISTANT,
   INDEX_ASSISTANT_TEL,
-/*
   INDEX_CHILDREN,
-*/
   INDEX_WORK2_TEL,
   INDEX_WEB_PAGE,
   INDEX_PAGER,
@@ -977,9 +982,7 @@ static const uint32_t field_id[ID_COUNT]
   ID_CATEGORY,
   ID_ASSISTANT,
   ID_ASSISTANT_TEL,
-/*
   ID_CHILDREN,
-*/
   ID_WORK2_TEL,
   ID_WEB_PAGE,
   ID_PAGER,
@@ -1452,6 +1455,10 @@ static bool parser_handle_field(/*{{{*/
   {
     add_blob(parser, INDEX_NOTE, type, value);
   }
+  else if (STR_EQUAL(name, "X-SYNCE-CHILDREN"))
+  {
+    add_string(parser, INDEX_CHILDREN, type, value);
+  }
 /* FOOBAR */
   else if (rra_frontend_get()==ID_FRONTEND_KDEPIM && STR_EQUAL(name, "X-KADDRESSBOOK-X-IMAddress"))
   {
--- ./lib/contact.c.Orig	2006-03-13 11:51:23.000000000 +0100
+++ ./lib/contact.c	2006-03-13 12:09:13.000000000 +0100
@@ -744,7 +744,15 @@ static bool rra_contact_to_vcard2(/*{{{*
         extended++[-1] = '\0';
     }
 
-		strbuf_append_type(vcard, "ADR", "POSTAL", flags);
+    switch(rra_frontend_get())
+    {
+      case ID_FRONTEND_EVOLUTION:
+        strbuf_append_type(vcard, "ADR", "OTHER", flags);
+        break;
+      default:
+        strbuf_append_type(vcard, "ADR", "POSTAL", flags);
+        break;
+    }
 		strbuf_append_escaped_wstr (vcard, NULL, flags); /* post office box */
 		strbuf_append_c            (vcard, ';');
     strbuf_append_escaped      (vcard, extended, flags); /* extended address */
@@ -1269,7 +1277,7 @@ static bool parser_handle_field(/*{{{*/
 		char** address = strsplit(value, ';');
 		int where;
 
-		if (STR_IN_STR(type, "POSTAL"))
+    if (STR_IN_STR(type, "POSTAL") || STR_IN_STR(type, "OTHER"))
 		        where = OTHER;
 		else if (STR_IN_STR(type, "WORK"))
 			where = WORK;
--- ./lib/contact.c.Orig	2006-03-13 12:16:14.000000000 +0100
+++ ./lib/contact.c	2006-03-13 12:36:22.000000000 +0100
@@ -335,8 +335,8 @@ static bool rra_contact_to_vcard2(/*{{{*
 				company = pFields[i].val.lpwstr;
 				break;
 
-			case ID_JOB_TITLE:
-				strbuf_append(vcard, "TITLE:");
+      case ID_JOB_ROLE:
+        strbuf_append(vcard, "ROLE:");
 				strbuf_append_escaped_wstr(vcard, pFields[i].val.lpwstr, flags);
 				strbuf_append_crlf(vcard);
 				break;
@@ -890,7 +890,7 @@ typedef enum _field_index
   INDEX_HOME_TEL,
   INDEX_LAST_NAME,
   INDEX_COMPANY,
-  INDEX_JOB_TITLE,
+  INDEX_JOB_ROLE,
   INDEX_DEPARTMENT,
   INDEX_OFFICE_LOC,
   INDEX_MOBILE_TEL,
@@ -976,7 +976,7 @@ static const uint32_t field_id[ID_COUNT]
   ID_HOME_TEL,
   ID_LAST_NAME,
   ID_COMPANY,
-  ID_JOB_TITLE,
+  ID_JOB_ROLE,
   ID_DEPARTMENT,
   ID_OFFICE_LOC,
   ID_MOBILE_TEL,
@@ -1421,9 +1421,9 @@ static bool parser_handle_field(/*{{{*/
       add_string(parser, INDEX_COMPANY, type, value);
 		}
 	}/*}}}*/
-	else if (STR_EQUAL(name, "TITLE"))/*{{{*/
+  else if (STR_EQUAL(name, "ROLE"))/*{{{*/
 	{
-    add_string(parser, INDEX_JOB_TITLE, type, value);
+    add_string(parser, INDEX_JOB_ROLE, type, value);
 	}/*}}}*/
 	else if (STR_EQUAL(name, "X-EVOLUTION-FILE-AS"))/*{{{*/
 	{
--- ./lib/contact_ids.h.Orig	2006-03-13 12:16:14.000000000 +0100
+++ ./lib/contact_ids.h	2006-03-13 12:35:39.000000000 +0100
@@ -9,7 +9,7 @@
 #define ID_HOME_TEL     0x3a09
 #define ID_LAST_NAME    0x3a11
 #define ID_COMPANY      0x3a16
-#define ID_JOB_TITLE    0x3a17
+#define ID_JOB_ROLE     0x3a17
 #define ID_DEPARTMENT   0x3a18
 #define ID_OFFICE_LOC   0x3a19
 #define ID_MOBILE_TEL   0x3a1c

Reply via email to