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