5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
16 #include <sys/types.h>
17 #include "abook_curses.h"
31 extern abook_field_list *fields_list;
32 extern int fields_count;
35 * function declarations
39 * import filter prototypes
42 static int ldif_parse_file(FILE *handle);
43 static int mutt_parse_file(FILE *in);
44 static int pine_parse_file(FILE *in);
45 static int csv_parse_file(FILE *in);
46 static int allcsv_parse_file(FILE *in);
47 static int palmcsv_parse_file(FILE *in);
50 * export filter prototypes
53 static int ldif_export_database(FILE *out, struct db_enumerator e);
54 static int html_export_database(FILE *out, struct db_enumerator e);
55 static int pine_export_database(FILE *out, struct db_enumerator e);
56 static int csv_export_database(FILE *out, struct db_enumerator e);
57 static int allcsv_export_database(FILE *out, struct db_enumerator e);
58 static int palm_export_database(FILE *out, struct db_enumerator e);
59 static int gcrd_export_database(FILE *out, struct db_enumerator e);
60 static int mutt_alias_export(FILE *out, struct db_enumerator e);
61 static int elm_alias_export(FILE *out, struct db_enumerator e);
62 static int text_export_database(FILE *out, struct db_enumerator e);
63 static int spruce_export_database(FILE *out, struct db_enumerator e);
64 static int wl_export_database(FILE *out, struct db_enumerator e);
67 * end of function declarations
70 struct abook_input_filter i_filters[] = {
71 { "abook", N_("abook native format"), parse_database },
72 { "ldif", N_("ldif / Netscape addressbook"), ldif_parse_file },
73 { "mutt", N_("mutt alias"), mutt_parse_file },
74 { "pine", N_("pine addressbook"), pine_parse_file },
75 { "csv", N_("comma separated values"), csv_parse_file },
76 { "allcsv", N_("comma separated values (all fields)"), allcsv_parse_file },
77 { "palmcsv", N_("Palm comma separated values"), palmcsv_parse_file },
81 struct abook_output_filter e_filters[] = {
82 { "abook", N_("abook native format"), write_database },
83 { "ldif", N_("ldif / Netscape addressbook (.4ld)"), ldif_export_database },
84 { "mutt", N_("mutt alias"), mutt_alias_export },
85 { "html", N_("html document"), html_export_database },
86 { "pine", N_("pine addressbook"), pine_export_database },
87 { "gcrd", N_("GnomeCard (VCard) addressbook"), gcrd_export_database },
88 { "csv", N_("comma separated values"), csv_export_database },
89 { "allcsv", N_("comma separated values (all fields)"), allcsv_export_database },
90 { "palmcsv", N_("Palm comma separated values"), palm_export_database},
91 { "elm", N_("elm alias"), elm_alias_export },
92 { "text", N_("plain text"), text_export_database },
93 { "wl", N_("Wanderlust address book"), wl_export_database },
94 { "spruce", N_("Spruce address book"), spruce_export_database },
108 for(i=0; *i_filters[i].filtname ; i++)
109 printf("\t%s\t%s\n", i_filters[i].filtname,
110 gettext(i_filters[i].desc));
115 for(i=0; *e_filters[i].filtname ; i++)
116 printf("\t%s\t%s\n", e_filters[i].filtname,
117 gettext(e_filters[i].desc));
123 number_of_output_filters()
127 for(i=0; *e_filters[i].filtname ; i++)
134 number_of_input_filters()
138 for(i=0; *i_filters[i].filtname ; i++)
147 char *username = getenv("USER");
148 struct passwd *pwent;
152 pwent = getpwnam(username);
154 if((tmp = xstrdup(pwent->pw_gecos)) == NULL)
155 return xstrdup(username);
157 rtn = sscanf(pwent->pw_gecos, "%[^,]", tmp);
158 if (rtn == EOF || rtn == 0) {
160 return xstrdup(username);
169 static int i_read_file(char *filename, int (*func) (FILE *in));
178 refresh_statusline();
179 headerline(_("import database"));
181 mvaddstr(3, 1, _("please select a filter"));
184 for(i=0; *i_filters[i].filtname ; i++)
185 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
186 i_filters[i].filtname,
187 gettext(i_filters[i].desc));
189 mvprintw(6 + i, 6, _("x -\tcancel"));
201 filter = getch() - 'a';
202 if(filter == 'x' - 'a' ||
203 filter >= number_of_input_filters() || filter < 0) {
208 mvaddstr(5+filter, 2, "->");
210 filename = ask_filename(_("Filename: "));
216 if(i_read_file(filename, i_filters[filter].func ))
217 statusline_msg(_("Error occured while opening the file"));
218 else if(tmp == items)
219 statusline_msg(_("File does not seem to be a valid addressbook"));
230 i_read_file(char *filename, int (*func) (FILE *in))
235 if( (in = abook_fopen( filename, "r" )) == NULL )
246 import_file(char filtname[FILTNAME_LEN], char *filename)
253 if(! strncasecmp(i_filters[i].filtname, filtname,
256 if(! *i_filters[i].filtname) {
265 if(!strcmp(filename, "-")) {
267 if((fstat(fileno(stdin), &s)) == -1 || S_ISDIR(s.st_mode))
270 ret = (*i_filters[i].func) (stdin);
272 ret = i_read_file(filename, i_filters[i].func);
284 static int e_write_file(char *filename,
285 int (*func) (FILE *in, struct db_enumerator e), int mode);
295 refresh_statusline();
296 headerline(_("export database"));
298 mvaddstr(3, 1, _("please select a filter"));
301 for(i = 0; *e_filters[i].filtname ; i++)
302 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
303 e_filters[i].filtname,
304 gettext(e_filters[i].desc));
306 mvprintw(6 + i, 6, _("x -\tcancel"));
313 int enum_mode = ENUM_ALL;
318 filter = getch() - 'a';
319 if(filter == 'x' - 'a' ||
320 filter >= number_of_output_filters() || filter < 0) {
325 mvaddstr(5 + filter, 2, "->");
327 if(selected_items()) {
328 switch(statusline_askchoice(
329 _("Export <a>ll, export <s>elected, or <c>ancel?"),
330 S_("keybindings:all/selected/cancel|asc"), 3)) {
334 enum_mode = ENUM_SELECTED;
344 filename = ask_filename(_("Filename: "));
350 if( e_write_file(filename, e_filters[filter].func, enum_mode))
351 statusline_msg(_("Error occured while exporting"));
360 e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
365 struct db_enumerator enumerator = init_db_enumerator(mode);
367 if((out = fopen(filename, "a")) == NULL)
373 ret = (*func) (out, enumerator);
381 fexport(char filtname[FILTNAME_LEN], FILE *handle, int enum_mode)
384 struct db_enumerator e = init_db_enumerator(enum_mode);
387 if(!strncasecmp(e_filters[i].filtname, filtname,
390 if(!*e_filters[i].filtname) {
396 return (e_filters[i].func) (handle, e);
402 export_file(char filtname[FILTNAME_LEN], char *filename)
404 const int mode = ENUM_ALL;
407 struct db_enumerator e = init_db_enumerator(mode);
410 if(!strncasecmp(e_filters[i].filtname, filtname,
413 if(!*e_filters[i].filtname) {
422 if(!strcmp(filename, "-"))
423 ret = (e_filters[i].func) (stdout, e);
425 ret = e_write_file(filename, e_filters[i].func, mode);
431 * end of common functions
440 static void ldif_fix_string(char *str);
442 #define LDIF_ITEM_FIELDS 16
444 typedef char *ldif_item[LDIF_ITEM_FIELDS];
446 static ldif_item ldif_field_names = {
458 "facsimiletelephonenumber",
462 "objectclass", /* this must be the last entry */
465 static int ldif_conv_table[LDIF_ITEM_FIELDS] = {
468 ADDRESS, /* "streetaddress" */
469 ADDRESS2, /* "streetaddress2" */
470 CITY, /* "locality" */
472 ZIP, /* "postalcode" */
473 COUNTRY, /* "countryname" */
474 PHONE, /* "homephone" */
475 NOTES, /* "description" */
477 FAX, /* "facsimiletelephonenumber" */
478 MOBILEPHONE, /* "cellphone" */
479 WORKPHONE, /* "xmozillaanyphone" */
480 NICK, /* "xmozillanickname" */
481 -1, /* "objectclass" */ /* this must be the last entry */
486 ldif_read_line(FILE *in)
499 if(feof(in) || !line)
508 fseek(in, pos, SEEK_SET); /* fixme ! */
518 buf = strconcat(buf, ptr, NULL);
523 if(buf && *buf == '#' ) {
532 ldif_add_item(ldif_item li)
537 item = item_create();
539 if(!li[LDIF_ITEM_FIELDS -1])
543 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
544 if(ldif_conv_table[i] >= 0 && li[i] && *li[i])
545 item_fput(item,ldif_conv_table[i],xstrdup(li[i]));
548 add_item2database(item);
551 for(i=0; i < LDIF_ITEM_FIELDS; i++)
558 ldif_convert(ldif_item item, char *type, char *value)
562 if(!strcmp(type, "dn")) {
567 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
568 if(!safe_strcmp(ldif_field_names[i], type) && *value) {
569 if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */
570 if(safe_strcmp("person", value))
573 if(item_fget(item, i))
574 free(item_fget(item, i));
576 item_fput(item, i, xstrdup(value));
582 ldif_parse_file(FILE *handle)
589 memset(item, 0, sizeof(item));
592 if( !(line = ldif_read_line(handle)) )
595 if(-1 == (str_parse_line(line, &type, &value, &vlen))) {
597 continue; /* just skip the errors */
600 ldif_fix_string(value);
602 ldif_convert(item, type, value);
605 } while ( !feof(handle) );
607 ldif_convert(item, "dn", "");
613 ldif_fix_string(char *str)
617 for(i = 0, j = 0; j < (int)strlen(str); i++, j++)
618 str[i] = ( str[j] == (char)0xc3 ?
619 (char) str[++j] + (char) 0x40 :
630 * mutt alias import filter
636 mutt_read_line(FILE *in, char **alias, char **rest)
638 char *line, *ptr, *tmp;
641 if( !(line = ptr = getaline(in)) )
642 return 1; /* error / EOF */
646 if(strncmp("alias", ptr, 5)) {
657 while( ! ISSPACE(*ptr) )
660 alias_len = (size_t)(ptr - tmp);
663 *alias = xmalloc_inc(alias_len, 1);
665 strncpy(*alias, tmp, alias_len);
666 *(*alias + alias_len) = 0;
670 *rest = xstrdup(ptr);
677 mutt_fix_quoting(char *p)
697 mutt_parse_email(list_item item)
699 char *line = item_fget(item, NAME);
707 mutt_fix_quoting(line);
708 tmp = strconcat("From: ", line, NULL);
709 getname(tmp, &name, &email);
713 item_fput(item, NAME, name);
718 item_fput(item, EMAIL, email);
723 * this is completely broken
726 while( (start = strchr(start, ',')) && i++ < MAX_EMAILS - 1) {
727 tmp = strconcat("From: ", ++start, NULL);
728 getname(tmp, &name, &email);
733 tmp = strconcat(item[EMAIL], ",", email, NULL);
745 mutt_parse_file(FILE *in)
747 list_item item = item_create();
750 memset(item, 0, fields_count * sizeof(char *));
752 if(!mutt_read_line(in,
753 (field_id(NICK) != -1) ?
754 &item[field_id(NICK)] : NULL,
755 &item[field_id(NAME)]))
756 mutt_parse_email(item);
763 add_item2database(item);
771 * end of mutt alias import filter
780 ldif_fput_type_and_value(FILE *out,char *type, char *value )
784 tmp = ldif_type_and_value(type, value, strlen(value));
792 ldif_export_database(FILE *out, struct db_enumerator e)
794 char email[MAX_EMAILSTR_LEN];
796 fprintf(out, "version: 1\n");
798 db_enumerate_items(e) {
801 get_first_email(email, e.item);
803 tmp = strdup_printf("cn=%s,mail=%s",db_name_get(e.item),email);
805 ldif_fput_type_and_value(out, "dn", tmp);
808 for(j = 0; j < LDIF_ITEM_FIELDS; j++) {
809 if(ldif_conv_table[j] >= 0) {
810 if(ldif_conv_table[j] == EMAIL)
811 ldif_fput_type_and_value(out,
812 ldif_field_names[j], email);
813 else if(db_fget(e.item,ldif_conv_table[j]))
814 ldif_fput_type_and_value(out,
817 ldif_conv_table[j]));
821 fprintf(out, "objectclass: top\n"
822 "objectclass: person\n\n");
829 * end of ldif export filter
836 static void html_export_write_head(FILE *out, int extra_column);
837 static void html_export_write_tail(FILE *out);
840 html_export_database(FILE *out, struct db_enumerator e)
842 char tmp[MAX_EMAILSTR_LEN];
848 extra_column = init_extra_field(STR_EXTRA_COLUMN);
849 html_export_write_head(out, extra_column);
851 db_enumerate_items(e) {
852 get_first_email(tmp, e.item);
854 fprintf(out, "<tr>\n<td>"
855 "<a href=\"mailto:%s\">%s</a>"
858 db_name_get(e.item));
860 fprintf(out, "<tr>\n<td>%s</td>\n", db_name_get(e.item));
862 fprintf(out, "<td>%s</td>\n", db_email_get(e.item));
863 if(extra_column >= 0)
864 fprintf(out, "<td>%s</td>\n",
865 safe_str(db_fget_byid(e.item, extra_column)));
866 fprintf(out, "</tr>\n\n");
869 html_export_write_tail(out);
875 html_export_write_head(FILE *out, int extra_column)
877 char *realname = get_real_name(), *extra_column_name = NULL;
879 fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
880 fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>",
882 fprintf(out, "\n</head>\n<body>\n");
883 fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
884 fprintf(out, "<br><br>\n\n");
886 fprintf(out, "<table border=\"1\" align=\"center\">\n");
887 fprintf(out, "\n<tr><th>Name</th><th>E-mail address(es)</th>");
888 if(extra_column >= 0) {
889 get_field_keyname(extra_column, NULL, &extra_column_name);
890 fprintf(out, "<th>%s</th>", safe_str(extra_column_name));
892 fprintf(out, "</tr>\n\n");
898 html_export_write_tail(FILE *out)
900 fprintf(out, "\n</table>\n");
901 fprintf(out, "\n</body>\n</html>\n");
905 * end of html export filter
910 * pine addressbook import filter
913 #define PINE_BUF_SIZE 2048
916 pine_fixbuf(char *buf)
920 for(i=0,j=0; j < (int)strlen(buf); i++, j++)
921 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
925 pine_convert_emails(char *s)
930 if(s == NULL || *s != '(')
936 if( ( tmp = strchr(s,')')) )
939 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
940 if(i > MAX_LIST_ITEMS - 1) {
948 pine_parse_buf(char *buf)
953 char tmp[PINE_BUF_SIZE];
955 int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES};
957 item = item_create();
959 for(i=0, last=0; !last ; i++) {
960 if( !(end = strchr(start, '\t')) )
963 len = last ? strlen(start) : (int) (end-start);
964 len = min(len, PINE_BUF_SIZE - 1);
966 if(i < (int)(sizeof(pine_conv_table) / sizeof(*pine_conv_table))
967 && pine_conv_table[i] >= 0) {
968 strncpy(tmp, start, len);
971 item_fput(item, pine_conv_table[i],
977 pine_convert_emails(item_fget(item, EMAIL));
978 add_item2database(item);
983 #define LINESIZE 1024
986 pine_parse_file(FILE *in)
993 fgets(line, LINESIZE, in);
997 buf = xrealloc(buf, i*LINESIZE);
1000 fgets(line, LINESIZE, in);
1002 if(*ptr != ' ' || feof(in))
1016 pine_parse_buf(buf);
1025 * end of pine addressbook import filter
1030 * pine addressbook export filter
1032 * filter doesn't wrap the lines as it should but Pine seems to handle
1033 * created files without problems - JH
1037 pine_export_database(FILE *out, struct db_enumerator e)
1039 db_enumerate_items(e) {
1040 fprintf(out, have_multiple_emails(e.item) ?
1041 "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
1042 safe_str(db_fget(e.item, NICK)),
1043 safe_str(db_name_get(e.item)),
1044 safe_str(db_email_get(e.item)),
1045 safe_str(db_fget(e.item, NOTES))
1053 * end of pine addressbook export filter
1062 * these files should be parsed according to a certain
1063 * lay out, or the default if layout is not given, at
1064 * the moment only default is done...
1067 #define CSV_COMMENT_CHAR '#'
1068 #define CSV_DUPLICATE_SEPARATOR " "
1069 #define CSV_TABLE_SIZE(t) (sizeof (t) / sizeof *(t))
1071 static int csv_conv_table[] = {
1079 static int allcsv_conv_table[] = {
1098 static int palmcsv_conv_table[] = {
1099 NAME, /* Last name */
1100 NAME, /* First name */
1117 csv_convert_emails(char *s)
1125 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
1126 if(i > MAX_LIST_ITEMS - 1) {
1134 csv_remove_quotes(char *s)
1136 char *copy, *trimmed;
1139 copy = trimmed = xstrdup(s);
1142 len = strlen(trimmed);
1143 if(trimmed[len - 1] == '\"' && *trimmed == '\"') {
1148 trimmed[len - 1] = 0;
1150 trimmed = xstrdup(trimmed);
1160 csv_field_to_item(int *table_base, size_t table_size, int field)
1162 if(field < table_size)
1163 return field_id(table_base[field]);
1169 csv_store_item(list_item item, int i, char *s)
1171 char *newstr = NULL;
1176 if( !(newstr = csv_remove_quotes(s)) )
1180 if (item[i] != NULL) {
1181 char *oldstr = item[i];
1183 item[i] = strconcat(newstr, CSV_DUPLICATE_SEPARATOR,
1196 csv_is_valid_quote_end(char *p)
1204 else if(!ISSPACE(*p))
1212 csv_is_valid_quote_start(char *p)
1217 else if(!ISSPACE(*p))
1225 csv_parse_line(char *line, int *table_base, size_t table_size)
1229 bool in_quote = FALSE;
1232 item = item_create();
1234 for(p = start = line, field = 0; *p; p++) {
1236 if(csv_is_valid_quote_end(p))
1239 if ( (((p - start) / sizeof (char)) < 2 ) &&
1240 csv_is_valid_quote_start(p) )
1244 if(*p == ',' && !in_quote) {
1246 csv_store_item(item,
1247 csv_field_to_item(table_base,table_size,field),
1256 csv_store_item(item, csv_field_to_item(table_base, table_size, field),
1259 csv_convert_emails(item_fget(item, EMAIL));
1260 add_item2database(item);
1265 csv_parse_file_common(FILE *in, int *conv_table, size_t table_size)
1270 line = getaline(in);
1272 if(line && *line && *line != CSV_COMMENT_CHAR)
1273 csv_parse_line(line, conv_table, table_size);
1282 csv_parse_file(FILE *in)
1284 return csv_parse_file_common(in, csv_conv_table,
1285 CSV_TABLE_SIZE(csv_conv_table));
1289 allcsv_parse_file(FILE *in)
1291 return csv_parse_file_common(in, allcsv_conv_table,
1292 CSV_TABLE_SIZE(allcsv_conv_table));
1296 palmcsv_parse_file(FILE *in)
1298 return csv_parse_file_common(in, palmcsv_conv_table,
1299 CSV_TABLE_SIZE(palmcsv_conv_table));
1303 * end of csv import filter
1307 * csv addressbook export filters
1310 #define CSV_LAST (-1)
1311 #define CSV_UNDEFINED (-2)
1312 #define CSV_SPECIAL(X) (-3 - (X))
1313 #define CSV_IS_SPECIAL(X) ((X) <= -3)
1316 csv_export_common(FILE *out, struct db_enumerator e,
1317 int fields[], void (*special_func)(FILE *, int, int))
1321 db_enumerate_items(e) {
1322 for(i = 0; fields[i] != CSV_LAST; i++) {
1323 if(fields[i] == CSV_UNDEFINED)
1324 fprintf(out, "\"\"");
1325 else if(CSV_IS_SPECIAL(fields[i])) {
1327 (*special_func)(out, e.item, fields[i]);
1330 strchr(safe_str(database[e.item][field_idx(fields[i])]), ',') ||
1331 strchr(safe_str(database[e.item][field_idx(fields[i])]), '\"')) ?
1333 safe_str(database[e.item][field_idx(fields[i])])
1335 fprintf(out, "\"%s\"",
1336 safe_str(db_fget(e.item,fields[i])));
1338 if(fields[i + 1] != CSV_LAST)
1348 csv_export_database(FILE *out, struct db_enumerator e)
1350 int csv_export_fields[] = {
1359 csv_export_common(out, e, csv_export_fields, NULL);
1365 allcsv_export_database(FILE *out, struct db_enumerator e)
1368 * TODO: Should get these atomatically from abook_fileds
1371 int allcsv_export_fields[] = {
1392 fprintf(out, "\"NAME\",");
1393 fprintf(out, "\"EMAIL\",");
1394 fprintf(out, "\"ADDRESS\",");
1395 fprintf(out, "\"ADDRESS2\",");
1396 fprintf(out, "\"CITY\",");
1397 fprintf(out, "\"STATE\",");
1398 fprintf(out, "\"ZIP\",");
1399 fprintf(out, "\"COUNTRY\",");
1400 fprintf(out, "\"PHONE\",");
1401 fprintf(out, "\"WORKPHONE\",");
1402 fprintf(out, "\"FAX\",");
1403 fprintf(out, "\"MOBILEPHONE\",");
1404 fprintf(out, "\"NICK\",");
1405 fprintf(out, "\"URL\",");
1406 fprintf(out, "\"NOTES\",");
1407 fprintf(out, "\"ANNIVERSARY\"\n");
1409 csv_export_common(out, e, allcsv_export_fields, NULL);
1418 #define PALM_CSV_NAME CSV_SPECIAL(0)
1419 #define PALM_CSV_END CSV_SPECIAL(1)
1420 #define PALM_CSV_CAT CSV_SPECIAL(2)
1423 palm_split_and_write_name(FILE *out, char *name)
1429 if ( (p = strchr(name, ' ')) ) {
1433 fprintf(out, "\"%s\",\"" , p + 1);
1434 fwrite((void *)name, p - name, sizeof(char), out);
1437 fprintf(out, "\"%s\"", safe_str(name));
1442 palm_csv_handle_specials(FILE *out, int item, int field)
1446 palm_split_and_write_name(out, db_name_get(item));
1449 fprintf(out, "\"abook\"");
1452 fprintf(out, "\"0\"");
1460 palm_export_database(FILE *out, struct db_enumerator e)
1462 int palm_export_fields[] = {
1463 PALM_CSV_NAME, /* LASTNAME, FIRSTNAME */
1464 CSV_UNDEFINED, /* TITLE */
1465 CSV_UNDEFINED, /* COMPANY */
1466 WORKPHONE, /* WORK PHONE */
1467 PHONE, /* HOME PHONE */
1469 MOBILEPHONE, /* OTHER */
1471 ADDRESS, /* ADDRESS */
1475 COUNTRY, /* COUNTRY */
1476 NICK, /* DEFINED 1 */
1477 URL, /* DEFINED 2 */
1478 CSV_UNDEFINED, /* DEFINED 3 */
1479 CSV_UNDEFINED, /* DEFINED 4 */
1481 PALM_CSV_END, /* "0" */
1482 PALM_CSV_CAT, /* CATEGORY */
1486 csv_export_common(out, e, palm_export_fields, palm_csv_handle_specials);
1492 * end of csv export filters
1496 * GnomeCard (VCard) addressbook export filter
1500 gcrd_export_database(FILE *out, struct db_enumerator e)
1504 abook_list *emails, *em;
1506 db_enumerate_items(e) {
1507 fprintf(out, "BEGIN:VCARD\nFN:%s\n",
1508 safe_str(db_name_get(e.item)));
1510 name = get_surname(db_name_get(e.item));
1511 for( j = strlen(db_name_get(e.item)) - 1; j >= 0; j-- ) {
1512 if((db_name_get(e.item))[j] == ' ')
1515 fprintf(out, "N:%s;%.*s\n",
1518 safe_str(db_name_get(e.item))
1523 if(db_fget(e.item, ADDRESS))
1524 fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\n",
1525 safe_str(db_fget(e.item, ADDRESS)),
1526 safe_str(db_fget(e.item, ADDRESS2)),
1527 safe_str(db_fget(e.item, CITY)),
1528 safe_str(db_fget(e.item, STATE)),
1529 safe_str(db_fget(e.item, ZIP)),
1530 safe_str(db_fget(e.item, COUNTRY))
1533 if(db_fget(e.item, PHONE))
1534 fprintf(out, "TEL;HOME:%s\n",
1535 db_fget(e.item, PHONE));
1536 if(db_fget(e.item, WORKPHONE))
1537 fprintf(out, "TEL;WORK:%s\n",
1538 db_fget(e.item, WORKPHONE));
1539 if(db_fget(e.item, FAX))
1540 fprintf(out, "TEL;FAX:%s\n",
1541 db_fget(e.item, FAX));
1542 if(db_fget(e.item, MOBILEPHONE))
1543 fprintf(out, "TEL;CELL:%s\n",
1544 db_fget(e.item, MOBILEPHONE));
1546 if(*db_email_get(e.item)) {
1547 emails = csv_to_abook_list(db_email_get(e.item));
1549 for(em = emails; em; em = em->next)
1550 fprintf(out, "EMAIL;INTERNET:%s\n", em->data);
1552 abook_list_free(&emails);
1555 if(db_fget(e.item, NOTES))
1556 fprintf(out, "NOTE:%s\n",
1557 db_fget(e.item, NOTES));
1558 if(db_fget(e.item, URL))
1559 fprintf(out, "URL:%s\n",
1560 db_fget(e.item, URL));
1562 fprintf(out, "END:VCARD\n\n");
1570 * end of GnomeCard export filter
1575 * mutt alias export filter
1579 mutt_alias_genalias(int i)
1583 if(db_fget(i, NICK))
1584 return xstrdup(db_fget(i, NICK));
1586 tmp = xstrdup(db_name_get(i));
1588 if( ( pos = strchr(tmp, ' ') ) )
1597 mutt_alias_export(FILE *out, struct db_enumerator e)
1599 char email[MAX_EMAIL_LEN];
1602 db_enumerate_items(e) {
1603 alias = mutt_alias_genalias(e.item);
1604 get_first_email(email, e.item);
1605 fprintf(out, *email ? "alias %s %s <%s>\n": "alias %s %s%s\n",
1607 db_name_get(e.item),
1616 * end of mutt alias export filter
1621 * printable export filter
1626 text_write_address_us(FILE *out, int i) {
1627 fprintf(out, "\n%s", db_fget(i, ADDRESS));
1629 if(db_fget(i, ADDRESS2))
1630 fprintf(out, "\n%s", db_fget(i, ADDRESS2));
1632 if(db_fget(i, CITY))
1633 fprintf(out, "\n%s", db_fget(i, CITY));
1635 if(db_fget(i, STATE) || db_fget(i, ZIP)) {
1638 if(db_fget(i, STATE)) {
1639 fprintf(out, "%s", db_fget(i, STATE));
1645 fprintf(out, "%s", db_fget(i, ZIP));
1648 if(db_fget(i, COUNTRY))
1649 fprintf(out, "\n%s", db_fget(i, COUNTRY));
1654 text_write_address_uk(FILE *out, int i) {
1657 for(j = ADDRESS; j <= COUNTRY; j++)
1659 fprintf(out, "\n%s", db_fget(i, j));
1663 text_write_address_eu(FILE *out, int i) {
1664 fprintf(out, "\n%s", db_fget(i, ADDRESS));
1666 if(db_fget(i, ADDRESS2))
1667 fprintf(out, "\n%s", db_fget(i, ADDRESS2));
1669 if(db_fget(i, ZIP) || db_fget(i, CITY)) {
1672 if(db_fget(i, ZIP)) {
1673 fprintf(out, "%s", db_fget(i, ZIP));
1674 if(db_fget(i, CITY))
1678 fprintf(out, "%s", safe_str(db_fget(i, CITY)));
1681 if(db_fget(i, STATE))
1682 fprintf(out, "\n%s", db_fget(i, STATE));
1684 if(db_fget(i, COUNTRY))
1685 fprintf(out, "\n%s", db_fget(i, COUNTRY));
1689 text_export_database(FILE * out, struct db_enumerator e)
1691 abook_list *emails, *em;
1693 char *realname = get_real_name(), *str = NULL;
1694 char *style = opt_get_str(STR_ADDRESS_STYLE);
1697 "-----------------------------------------\n%s's address book\n"
1698 "-----------------------------------------\n\n\n",
1702 db_enumerate_items(e) {
1704 "-----------------------------------------\n\n");
1705 fprintf(out, "%s", db_name_get(e.item));
1706 if(db_fget(e.item, NICK) && *db_fget(e.item, NICK))
1707 fprintf(out, "\n(%s)", db_fget(e.item, NICK));
1710 if(*db_email_get(e.item)) {
1711 emails = csv_to_abook_list(db_email_get(e.item));
1714 for(em = emails; em; em = em->next)
1715 fprintf(out, "%s\n", em->data);
1717 abook_list_free(&emails);
1720 if(db_fget(e.item, ADDRESS)) {
1721 if(!safe_strcmp(style, "us")) /* US like */
1722 text_write_address_us(out, e.item);
1723 else if(!safe_strcmp(style, "uk")) /* UK like */
1724 text_write_address_uk(out, e.item);
1726 text_write_address_eu(out, e.item);
1731 if((db_fget(e.item, PHONE)) ||
1732 (db_fget(e.item, WORKPHONE)) ||
1733 (db_fget(e.item, FAX)) ||
1734 (db_fget(e.item, MOBILEPHONE))) {
1736 for(j = PHONE; j <= MOBILEPHONE; j++)
1737 if(db_fget(e.item, j)) {
1738 get_field_keyname(field_id(j),
1740 fprintf(out, "%s: %s\n", str,
1741 db_fget(e.item, j));
1745 if(db_fget(e.item, URL))
1746 fprintf(out, "\n%s\n", db_fget(e.item, URL));
1747 if(db_fget(e.item, NOTES))
1748 fprintf(out, "\n%s\n", db_fget(e.item, NOTES));
1753 fprintf(out, "-----------------------------------------\n");
1759 * end of printable export filter
1763 * elm alias export filter
1767 elm_alias_export(FILE *out, struct db_enumerator e)
1769 char email[MAX_EMAIL_LEN];
1772 db_enumerate_items(e) {
1773 alias = mutt_alias_genalias(e.item);
1774 get_first_email(email, e.item);
1775 fprintf(out, "%s = %s = %s\n",alias,db_name_get(e.item),email);
1783 * end of elm alias export filter
1788 * Spruce export filter
1792 spruce_export_database (FILE *out, struct db_enumerator e)
1794 char email[MAX_EMAIL_LEN];
1796 fprintf(out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
1798 db_enumerate_items(e) {
1799 if(strcmp(safe_str(db_email_get(e.item)), "")) {
1800 get_first_email(email, e.item);
1801 fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
1803 db_name_get(e.item),
1805 safe_str(db_fget(e.item, NOTES))
1810 fprintf (out, "# End of address book file.\n");
1816 * end of Spruce export filter
1820 * wanderlust addressbook export filter
1824 wl_export_database(FILE *out, struct db_enumerator e)
1828 fprintf(out, "# Wanderlust address book written by %s\n\n", PACKAGE);
1829 db_enumerate_items(e) {
1830 if((emails = csv_to_abook_list(db_email_get(e.item))) != NULL) {
1832 "%s\t\"%s\"\t\"%s\"\n",
1834 safe_str(db_fget(e.item, NICK)),
1835 safe_str(db_name_get(e.item))
1838 abook_list_free(&emails);
1841 fprintf (out, "\n# End of address book file.\n");
1847 * end of wanderlust addressbook export filter