X-Git-Url: https://git.deb.at/w?p=pkg%2Fabook.git;a=blobdiff_plain;f=filter.c;h=520d4ceddd5b1f248505667274dec44503145c28;hp=4f20f0060465d29996833c413511b13f3c9849a6;hb=cd6241eed4fe11f496a88a665acbafba81d5ec51;hpb=fa167822d1f3426ce75bb36b4080e64537ae6362 diff --git a/filter.c b/filter.c index 4f20f00..520d4ce 100644 --- a/filter.c +++ b/filter.c @@ -29,6 +29,10 @@ #include "xmalloc.h" #include +#ifdef HAVE_VFORMAT +#include "vcard.h" +#endif + extern abook_field_list *fields_list; extern int fields_count; @@ -68,6 +72,14 @@ static int wl_export_database(FILE *out, struct db_enumerator e); static int bsdcal_export_database(FILE *out, struct db_enumerator e); static int custom_export_database(FILE *out, struct db_enumerator e); +/* + * export filter item prototypes + */ + +void vcard_export_item(FILE *out, int item); +void muttq_print_item(FILE *file, int item); +void custom_print_item(FILE *out, int item); + /* * end of function declarations */ @@ -105,6 +117,7 @@ struct abook_output_filter e_filters[] = { }; struct abook_output_item_filter u_filters[] = { + { "vcard", N_("vCard 2 file"), vcard_export_item }, { "muttq", N_("mutt alias"), muttq_print_item }, { "custom", N_("Custom format"), custom_print_item }, { "\0", NULL } @@ -119,21 +132,21 @@ print_filters() { int i; - puts(_("input:")); + puts(_("input formats:")); for(i=0; *i_filters[i].filtname ; i++) printf("\t%s\t%s\n", i_filters[i].filtname, gettext(i_filters[i].desc)); putchar('\n'); - puts(_("output:")); + puts(_("output formats:")); for(i=0; *e_filters[i].filtname ; i++) printf("\t%s\t%s\n", e_filters[i].filtname, gettext(e_filters[i].desc)); putchar('\n'); - puts(_("output (with query):")); + puts(_("query-compatible output formats:")); for(i=0; *u_filters[i].filtname ; i++) printf("\t%s\t%s\n", u_filters[i].filtname, gettext(u_filters[i].desc)); @@ -284,6 +297,18 @@ import_file(char filtname[FILTNAME_LEN], char *filename) if(i < 0) return -1; +#ifdef HAVE_VFORMAT + // this is a special case for + // libvformat whose API expects a filename + if(!strcmp(filtname, "vcard")) { + if(!strcmp(filename, "-")) + ret = vcard_parse_file_libvformat("/dev/stdin"); + else + ret = vcard_parse_file_libvformat(filename); + } + else +#endif + if(!strcmp(filename, "-")) { struct stat s; if((fstat(fileno(stdin), &s)) == -1 || S_ISDIR(s.st_mode)) @@ -605,16 +630,10 @@ ldif_convert(ldif_item item, char *type, char *value) return; } - for(i=0; i < LDIF_ITEM_FIELDS; i++) { - if(!safe_strcmp(ldif_field_names[i], type) && *value) { - if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */ - if(safe_strcmp("person", value)) - break; - - if(item_fget(item, i)) - free(item_fget(item, i)); - + for(i=0; i < LDIF_ITEM_FIELDS - 1; i++) { + if(!strcasecmp(ldif_field_names[i], type) && *value) { item_fput(item, i, xstrdup(value)); + break; } } } @@ -1852,74 +1871,77 @@ palm_export_database(FILE *out, struct db_enumerator e) static int vcard_export_database(FILE *out, struct db_enumerator e) +{ + db_enumerate_items(e) + vcard_export_item(out, e.item); + return 0; +} + +void +vcard_export_item(FILE *out, int item) { int j; char *name, *tmp; abook_list *emails, *em; + fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n", + safe_str(db_name_get(item))); - db_enumerate_items(e) { - fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n", - safe_str(db_name_get(e.item))); - - name = get_surname(db_name_get(e.item)); - for( j = strlen(db_name_get(e.item)) - 1; j >= 0; j-- ) { - if((db_name_get(e.item))[j] == ' ') - break; - } - fprintf(out, "N:%s;%.*s\r\n", - safe_str(name), - j, - safe_str(db_name_get(e.item)) - ); - - free(name); - - if(db_fget(e.item, ADDRESS)) - fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n", - safe_str(db_fget(e.item, ADDRESS)), - safe_str(db_fget(e.item, ADDRESS2)), - safe_str(db_fget(e.item, CITY)), - safe_str(db_fget(e.item, STATE)), - safe_str(db_fget(e.item, ZIP)), - safe_str(db_fget(e.item, COUNTRY)) - ); - - if(db_fget(e.item, PHONE)) - fprintf(out, "TEL;HOME:%s\r\n", - db_fget(e.item, PHONE)); - if(db_fget(e.item, WORKPHONE)) - fprintf(out, "TEL;WORK:%s\r\n", - db_fget(e.item, WORKPHONE)); - if(db_fget(e.item, FAX)) - fprintf(out, "TEL;FAX:%s\r\n", - db_fget(e.item, FAX)); - if(db_fget(e.item, MOBILEPHONE)) - fprintf(out, "TEL;CELL:%s\r\n", - db_fget(e.item, MOBILEPHONE)); - - tmp = db_email_get(e.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); - - abook_list_free(&emails); - } - free(tmp); - - if(db_fget(e.item, NOTES)) - fprintf(out, "NOTE:%s\r\n", - db_fget(e.item, NOTES)); - if(db_fget(e.item, URL)) - fprintf(out, "URL:%s\r\n", - db_fget(e.item, URL)); + name = get_surname(db_name_get(item)); + for( j = strlen(db_name_get(item)) - 1; j >= 0; j-- ) { + if((db_name_get(item))[j] == ' ') + break; + } + fprintf(out, "N:%s;%.*s\r\n", + safe_str(name), + j, + safe_str(db_name_get(item)) + ); + + free(name); + + if(db_fget(item, ADDRESS)) + fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n", + safe_str(db_fget(item, ADDRESS)), + safe_str(db_fget(item, ADDRESS2)), + safe_str(db_fget(item, CITY)), + safe_str(db_fget(item, STATE)), + safe_str(db_fget(item, ZIP)), + safe_str(db_fget(item, COUNTRY)) + ); + + if(db_fget(item, PHONE)) + fprintf(out, "TEL;HOME:%s\r\n", + db_fget(item, PHONE)); + if(db_fget(item, WORKPHONE)) + fprintf(out, "TEL;WORK:%s\r\n", + db_fget(item, WORKPHONE)); + if(db_fget(item, FAX)) + fprintf(out, "TEL;FAX:%s\r\n", + db_fget(item, FAX)); + if(db_fget(item, MOBILEPHONE)) + fprintf(out, "TEL;CELL:%s\r\n", + db_fget(item, MOBILEPHONE)); + + 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); + + abook_list_free(&emails); + } + free(tmp); - fprintf(out, "END:VCARD\r\n\r\n"); + if(db_fget(item, NOTES)) + fprintf(out, "NOTE:%s\r\n", + db_fget(item, NOTES)); + if(db_fget(item, URL)) + fprintf(out, "URL:%s\r\n", + db_fget(item, URL)); - } + fprintf(out, "END:VCARD\r\n\r\n"); - return 0; } /*