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