]> git.deb.at Git - pkg/abook.git/commitdiff
vcard import: fixing the "ADR" field
authorRaphaël Droz <raphael.droz+floss@gmail.com>
Sun, 13 Jan 2013 12:31:20 +0000 (13:31 +0100)
committerRaphaël Droz <raphael.droz+floss@gmail.com>
Sun, 13 Jan 2013 12:41:42 +0000 (13:41 +0100)
* 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

filter.c
vcard.c

index 4d1abd893f018cdacc9e6e2e8c41852eb76889a1..613a827dd2ec0eb0847942c341c349992560a9a6 100644 (file)
--- 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 f86d610e0e8df762b5ab65e26c31a3cb391dab0f..0ff564212eee2a3c7dd5ce44885f96957c3715e2 100644 (file)
--- 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));
     }