X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=filter.c;h=7f8bcd5ce3da16f61d61fa0b670b8ae44dbbc1e6;hb=a2d4ea58437d93297c7f7e2e8efd4d48297ca46a;hp=613a827dd2ec0eb0847942c341c349992560a9a6;hpb=e3aa1d4b6065ed803b9d3aaa6c3528119a4f80a6;p=pkg%2Fabook.git diff --git a/filter.c b/filter.c index 613a827..7f8bcd5 100644 --- a/filter.c +++ b/filter.c @@ -35,6 +35,8 @@ extern abook_field_list *fields_list; extern int fields_count; +// see also enum field_types @database.h +extern abook_field standard_fields[]; /* * function declarations @@ -1285,6 +1287,11 @@ pine_export_database(FILE *out, struct db_enumerator e) * csv import filter */ +/* This is used by both allcsv_export_database() and csv_export_common() + to distinguish between standard and defined fields. + To avoid confusions this should stay > ITEM_FIELDS */ +#define CUSTOM_FIELD_START_INDEX (ITEM_FIELDS + 10) + /* FIXME * these files should be parsed according to a certain * lay out, or the default if layout is not given, at @@ -1645,10 +1652,7 @@ vcard_parse_email(list_item item, char *line) static void vcard_parse_address(list_item item, char *line) { - int i; - int k; char *value; - char *address_field; value = vcard_get_line_element(line, VCARD_VALUE); if(!value) @@ -1656,20 +1660,33 @@ vcard_parse_address(list_item item, char *line) // vCard(post office box) - not used strsep(&value, ";"); + if(!value) return; + // vCard(the extended address) item_fput(item, ADDRESS2, xstrdup(strsep(&value, ";"))); + if(!value) return; + // vCard(the street address) item_fput(item, ADDRESS, xstrdup(strsep(&value, ";"))); + if(!value) return; + // vCard(the locality) item_fput(item, CITY, xstrdup(strsep(&value, ";"))); + if(!value) return; + // vCard(the region) item_fput(item, STATE, xstrdup(strsep(&value, ";"))); + if(!value) return; + // vCard(the postal code) item_fput(item, ZIP, xstrdup(strsep(&value, ";"))); + if(!value) return; + // vCard(the country name) item_fput(item, COUNTRY, xstrdup(strsep(&value, ";"))); - if(*value) xfree(value); + // support of optional trailing ";" to the ADR field + if(value && *value) xfree(value); } static void @@ -1816,7 +1833,12 @@ csv_export_common(FILE *out, struct db_enumerator e, else if(CSV_IS_SPECIAL(fields[i])) { if(special_func) (*special_func)(out, e.item, fields[i]); - } else + } + else if(fields[i] >= CUSTOM_FIELD_START_INDEX) { + fprintf(out, "\"%s\"", + safe_str(db_fget_byid(e.item, fields[i] - CUSTOM_FIELD_START_INDEX))); + } + else /*fprintf(out,( strchr(safe_str(database[e.item][field_idx(fields[i])]), ',') || strchr(safe_str(database[e.item][field_idx(fields[i])]), '\"')) ? @@ -1859,7 +1881,7 @@ allcsv_export_database(FILE *out, struct db_enumerator e) * TODO: Should get these atomatically from abook_fileds * - JH */ - int allcsv_export_fields[] = { + int allcsv_export_fields[ITEM_FIELDS + 6] = { // only the 5 custom fields are allowed so far NAME, EMAIL, ADDRESS, @@ -1871,7 +1893,7 @@ allcsv_export_database(FILE *out, struct db_enumerator e) PHONE, WORKPHONE, FAX, - MOBILEPHONE, + MOBILEPHONE, // spelt "mobile" in standard_fields NICK, URL, NOTES, @@ -1881,23 +1903,47 @@ allcsv_export_database(FILE *out, struct db_enumerator e) }; fprintf(out, "#"); - fprintf(out, "\"NAME\","); - fprintf(out, "\"EMAIL\","); - fprintf(out, "\"ADDRESS\","); - fprintf(out, "\"ADDRESS2\","); - fprintf(out, "\"CITY\","); - fprintf(out, "\"STATE\","); - fprintf(out, "\"ZIP\","); - fprintf(out, "\"COUNTRY\","); - fprintf(out, "\"PHONE\","); - fprintf(out, "\"WORKPHONE\","); - fprintf(out, "\"FAX\","); - fprintf(out, "\"MOBILEPHONE\","); - fprintf(out, "\"NICK\","); - fprintf(out, "\"URL\","); - fprintf(out, "\"NOTES\","); - fprintf(out, "\"ANNIVERSARY\","); - fprintf(out, "\"GROUPS\"\n"); + int i = 0; + while(allcsv_export_fields[i+1] != CSV_LAST) { + fprintf(out, "\"%s\",", standard_fields[i++].key); + } + fprintf(out, "\"%s\"", standard_fields[i].key); + + /* + Custom fields handling: + This loop appends custom fields' id at the end of allcsv_export_fields and shift + the CSV_LAST sentinel value each time one is found. + CUSTOM_FIELD_START_INDEX is added to these index values so csv_export_common() + can later recognize them and call db_fget_byid() instead of the traditional db_fget() + + It only search for defined the [legacy?] "custom" fields. + */ + + // pointer to the end of the field list + int append_field = ITEM_FIELDS; + // custom field's trailing number (between 1 and 5) + int j; + // full custom field name, eg "custom4" + char custom_field_key[8]; + // index used by custom_field_key + int field_no; + // name of the defined field as chosen by the user + char *custom_field_name; + + for (j = 1; j <= 5; j++) { + snprintf(custom_field_key, 8, "custom%d", j++); + if(find_declared_field(custom_field_key)) { + find_field_number(custom_field_key, &field_no); + get_field_info(field_no, NULL, &custom_field_name, NULL); + // append the field to the list + allcsv_export_fields[append_field] = field_no + CUSTOM_FIELD_START_INDEX; + allcsv_export_fields[++append_field] = CSV_LAST; + // print column name + fprintf(out, ",\"%s\"", custom_field_name); + } + } + free(custom_field_name); + fprintf(out, "\n"); csv_export_common(out, e, allcsv_export_fields, NULL); @@ -2000,7 +2046,7 @@ vcard_export_database(FILE *out, struct db_enumerator e) void vcard_export_item(FILE *out, int item) { - int j; + int j, email_no; char *name, *tmp; abook_list *emails, *em; fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n", @@ -2048,9 +2094,10 @@ vcard_export_item(FILE *out, int item) tmp = db_email_get(item); if(*tmp) { emails = csv_to_abook_list(tmp); - - for(em = emails; em; em = em->next) - fprintf(out, "EMAIL;INTERNET:%s\r\n", em->data); + fprintf(out, "EMAIL;PREF;INTERNET:%s\r\n", emails->data); + email_no = 1; + for(em = emails->next; em; em = em->next, email_no++ ) + fprintf(out, "EMAIL;%d;INTERNET:%s\r\n", email_no, em->data); abook_list_free(&emails); } @@ -2480,8 +2527,6 @@ bsdcal_export_database(FILE *out, struct db_enumerator e) return 0; } -// see also enum field_types @database.h -extern abook_field standard_fields[]; static int find_field_enum(char *s) { int i = -1;