From: Raphaƫl Droz Date: Sun, 13 Jan 2013 12:31:20 +0000 (+0100) Subject: vcard import: fixing the "ADR" field X-Git-Tag: upstream/0.6.1~2^2~25 X-Git-Url: https://git.deb.at/w?a=commitdiff_plain;h=e3aa1d4b6065ed803b9d3aaa6c3528119a4f80a6;p=pkg%2Fabook.git vcard import: fixing the "ADR" field * cleaner code for vcard_parse_address() (the abook's built-in vcard parser) * vcard_parse_address() now parses "ADR" w.r.t. rfc6350 * fixed the libvformat-based "ADR" import in a similar way --- diff --git a/filter.c b/filter.c index 4d1abd8..613a827 100644 --- a/filter.c +++ b/filter.c @@ -1538,7 +1538,7 @@ static char *vcard_fields[] = { "FN", /* FORMATTED NAME */ "EMAIL", /* EMAIL */ "ADR", /* ADDRESS */ - "ADR", /* ADDRESS2 - not used */ + "ADR", /* ADDRESS2 */ "ADR", /* CITY */ "ADR", /* STATE */ "ADR", /* ZIP */ @@ -1554,20 +1554,6 @@ static char *vcard_fields[] = { NULL /* not implemented: ANNIVERSARY, ITEM_FIELDS */ }; -/* - * mappings between vCard ADR field and abook's ADDRESS - * see rfc2426 section 3.2.1 - */ -static int vcard_address_fields[] = { - -1, /* vCard(post office box) - not used */ - -1, /* vCard(the extended address) - not used */ - 2, /* vCard(the street address) - ADDRESS */ - 4, /* vCard(the locality) - CITY */ - 5, /* vCard(the region) - STATE */ - 6, /* vCard(the postal code) - ZIP */ - 7 /* vCard(the country name) - COUNTRY */ -}; - enum { VCARD_KEY = 0, VCARD_KEY_ATTRIBUTE, @@ -1651,6 +1637,11 @@ vcard_parse_email(list_item item, char *line) } } + +/* + * mappings between vCard ADR field and abook's ADDRESS + * see rfc2426 section 3.2.1 + */ static void vcard_parse_address(list_item item, char *line) { @@ -1663,21 +1654,22 @@ vcard_parse_address(list_item item, char *line) if(!value) return; - address_field = value; - for(i=k=0; value[i]; i++) { - if(value[i] == ';') { - value[i] = '\0'; - if(vcard_address_fields[k] >= 0) { - item[vcard_address_fields[k]] = xstrdup(address_field); - } - address_field = &value[i+1]; - k++; - if((k+1)==(sizeof(vcard_address_fields)/sizeof(*vcard_address_fields))) - break; - } - } - item[vcard_address_fields[k]] = xstrdup(address_field); - xfree(value); + // vCard(post office box) - not used + strsep(&value, ";"); + // vCard(the extended address) + item_fput(item, ADDRESS2, xstrdup(strsep(&value, ";"))); + // vCard(the street address) + item_fput(item, ADDRESS, xstrdup(strsep(&value, ";"))); + // vCard(the locality) + item_fput(item, CITY, xstrdup(strsep(&value, ";"))); + // vCard(the region) + item_fput(item, STATE, xstrdup(strsep(&value, ";"))); + // vCard(the postal code) + item_fput(item, ZIP, xstrdup(strsep(&value, ";"))); + // vCard(the country name) + item_fput(item, COUNTRY, xstrdup(strsep(&value, ";"))); + + if(*value) xfree(value); } static void diff --git a/vcard.c b/vcard.c index f86d610..0ff5642 100644 --- a/vcard.c +++ b/vcard.c @@ -78,32 +78,27 @@ int vcard_parse_file_libvformat(char *filename) { // PO Box, Extended Addr, Street, Locality, Region, Postal Code, Country if (vf_get_property(&prop, vfobj, VFGP_FIND, NULL, "ADR", NULL)) { props = 0; - // US address ? - propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, ADDRESS, xstrdup(propval)); - // address - propval = vf_get_prop_value_string(prop, props++); - // TODO: concat ? + // PO Box: abook ignores + vf_get_prop_value_string(prop, props++); - // street: TODO: address1 instead ? + // ext-address propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, ADDRESS2, xstrdup(propval)); - // city + if(propval) item_fput(item, ADDRESS2, xstrdup(propval)); + // address (street) propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, CITY, xstrdup(propval)); - // state + if(propval) item_fput(item, ADDRESS, xstrdup(propval)); + // locality (city) propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, STATE, xstrdup(propval)); + if(propval) item_fput(item, CITY, xstrdup(propval)); + // region (state) propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, ZIP, xstrdup(propval)); + if(propval) item_fput(item, STATE, xstrdup(propval)); + // postal-code (zip) propval = vf_get_prop_value_string(prop, props++); - if(propval) - item_fput(item, COUNTRY, xstrdup(propval)); + if(propval) item_fput(item, ZIP, xstrdup(propval)); + // country + propval = vf_get_prop_value_string(prop, props++); + if(propval) item_fput(item, COUNTRY, xstrdup(propval)); }