5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
16 #include <sys/types.h>
17 #include "abook_curses.h"
30 extern abook_field_list *fields_list;
31 extern int fields_count;
34 * function declarations
38 * import filter prototypes
41 static int ldif_parse_file(FILE *handle);
42 static int mutt_parse_file(FILE *in);
43 static int pine_parse_file(FILE *in);
44 static int csv_parse_file(FILE *in);
45 static int allcsv_parse_file(FILE *in);
46 static int palmcsv_parse_file(FILE *in);
49 * export filter prototypes
52 static int ldif_export_database(FILE *out, struct db_enumerator e);
53 static int html_export_database(FILE *out, struct db_enumerator e);
54 static int pine_export_database(FILE *out, struct db_enumerator e);
55 static int csv_export_database(FILE *out, struct db_enumerator e);
56 static int allcsv_export_database(FILE *out, struct db_enumerator e);
57 static int palm_export_database(FILE *out, struct db_enumerator e);
58 static int gcrd_export_database(FILE *out, struct db_enumerator e);
59 static int mutt_alias_export(FILE *out, struct db_enumerator e);
60 static int elm_alias_export(FILE *out, struct db_enumerator e);
61 static int text_export_database(FILE *out, struct db_enumerator e);
62 static int spruce_export_database(FILE *out, struct db_enumerator e);
63 static int wl_export_database(FILE *out, struct db_enumerator e);
66 * end of function declarations
69 struct abook_input_filter i_filters[] = {
70 { "abook", N_("abook native format"), parse_database },
71 { "ldif", N_("ldif / Netscape addressbook"), ldif_parse_file },
72 { "mutt", N_("mutt alias"), mutt_parse_file },
73 { "pine", N_("pine addressbook"), pine_parse_file },
74 { "csv", N_("comma separated values"), csv_parse_file },
75 { "allcsv", N_("comma separated values (all fields)"), allcsv_parse_file },
76 { "palmcsv", N_("Palm comma separated values"), palmcsv_parse_file },
80 struct abook_output_filter e_filters[] = {
81 { "abook", N_("abook native format"), write_database },
82 { "ldif", N_("ldif / Netscape addressbook (.4ld)"), ldif_export_database },
83 { "mutt", N_("mutt alias"), mutt_alias_export },
84 { "html", N_("html document"), html_export_database },
85 { "pine", N_("pine addressbook"), pine_export_database },
86 { "gcrd", N_("GnomeCard (VCard) addressbook"), gcrd_export_database },
87 { "csv", N_("comma separated values"), csv_export_database },
88 { "allcsv", N_("comma separated values (all fields)"), allcsv_export_database },
89 { "palmcsv", N_("Palm comma separated values"), palm_export_database},
90 { "elm", N_("elm alias"), elm_alias_export },
91 { "text", N_("plain text"), text_export_database },
92 { "wl", N_("Wanderlust address book"), wl_export_database },
93 { "spruce", N_("Spruce address book"), spruce_export_database },
107 for(i=0; *i_filters[i].filtname ; i++)
108 printf("\t%s\t%s\n", i_filters[i].filtname,
109 gettext(i_filters[i].desc));
114 for(i=0; *e_filters[i].filtname ; i++)
115 printf("\t%s\t%s\n", e_filters[i].filtname,
116 gettext(e_filters[i].desc));
122 number_of_output_filters()
126 for(i=0; *e_filters[i].filtname ; i++)
133 number_of_input_filters()
137 for(i=0; *i_filters[i].filtname ; i++)
146 char *username = getenv("USER");
147 struct passwd *pwent;
151 pwent = getpwnam(username);
153 if((tmp = xstrdup(pwent->pw_gecos)) == NULL)
154 return xstrdup(username);
156 rtn = sscanf(pwent->pw_gecos, "%[^,]", tmp);
157 if (rtn == EOF || rtn == 0) {
159 return xstrdup(username);
168 static int i_read_file(char *filename, int (*func) (FILE *in));
177 refresh_statusline();
178 headerline(_("import database"));
180 mvaddstr(3, 1, _("please select a filter"));
183 for(i=0; *i_filters[i].filtname ; i++)
184 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
185 i_filters[i].filtname,
186 gettext(i_filters[i].desc));
188 mvprintw(6 + i, 6, _("x -\tcancel"));
196 int tmp = db_n_items();
200 filter = getch() - 'a';
201 if(filter == 'x' - 'a' ||
202 filter >= number_of_input_filters() || filter < 0) {
207 mvaddstr(5+filter, 2, "->");
209 filename = ask_filename(_("Filename: "));
215 if(i_read_file(filename, i_filters[filter].func ))
216 statusline_msg(_("Error occured while opening the file"));
217 else if(tmp == db_n_items())
218 statusline_msg(_("File does not seem to be a valid addressbook"));
229 i_read_file(char *filename, int (*func) (FILE *in))
234 if( (in = abook_fopen( filename, "r" )) == NULL )
245 import_file(char filtname[FILTNAME_LEN], char *filename)
248 int tmp = db_n_items();
252 if(! strncasecmp(i_filters[i].filtname, filtname,
255 if(! *i_filters[i].filtname) {
264 if(!strcmp(filename, "-")) {
266 if((fstat(fileno(stdin), &s)) == -1 || S_ISDIR(s.st_mode))
269 ret = (*i_filters[i].func) (stdin);
271 ret = i_read_file(filename, i_filters[i].func);
273 if(tmp == db_n_items())
283 static int e_write_file(char *filename,
284 int (*func) (FILE *in, struct db_enumerator e), int mode);
294 refresh_statusline();
295 headerline(_("export database"));
297 mvaddstr(3, 1, _("please select a filter"));
300 for(i = 0; *e_filters[i].filtname ; i++)
301 mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i,
302 e_filters[i].filtname,
303 gettext(e_filters[i].desc));
305 mvprintw(6 + i, 6, _("x -\tcancel"));
312 int enum_mode = ENUM_ALL;
317 filter = getch() - 'a';
318 if(filter == 'x' - 'a' ||
319 filter >= number_of_output_filters() || filter < 0) {
324 mvaddstr(5 + filter, 2, "->");
326 if(selected_items()) {
327 switch(statusline_askchoice(
328 _("Export <a>ll, export <s>elected, or <c>ancel?"),
329 S_("keybindings:all/selected/cancel|asc"), 3)) {
333 enum_mode = ENUM_SELECTED;
343 filename = ask_filename(_("Filename: "));
349 if( e_write_file(filename, e_filters[filter].func, enum_mode))
350 statusline_msg(_("Error occured while exporting"));
359 e_write_file(char *filename, int (*func) (FILE *in, struct db_enumerator e),
364 struct db_enumerator enumerator = init_db_enumerator(mode);
366 if((out = fopen(filename, "a")) == NULL)
372 ret = (*func) (out, enumerator);
380 fexport(char filtname[FILTNAME_LEN], FILE *handle, int enum_mode)
383 struct db_enumerator e = init_db_enumerator(enum_mode);
386 if(!strncasecmp(e_filters[i].filtname, filtname,
389 if(!*e_filters[i].filtname) {
395 return (e_filters[i].func) (handle, e);
401 export_file(char filtname[FILTNAME_LEN], char *filename)
403 const int mode = ENUM_ALL;
406 struct db_enumerator e = init_db_enumerator(mode);
409 if(!strncasecmp(e_filters[i].filtname, filtname,
412 if(!*e_filters[i].filtname) {
421 if(!strcmp(filename, "-"))
422 ret = (e_filters[i].func) (stdout, e);
424 ret = e_write_file(filename, e_filters[i].func, mode);
430 * end of common functions
439 static void ldif_fix_string(char *str);
441 #define LDIF_ITEM_FIELDS 16
443 typedef char *ldif_item[LDIF_ITEM_FIELDS];
445 static ldif_item ldif_field_names = {
457 "facsimiletelephonenumber",
461 "objectclass", /* this must be the last entry */
464 static int ldif_conv_table[LDIF_ITEM_FIELDS] = {
467 ADDRESS, /* "streetaddress" */
468 ADDRESS2, /* "streetaddress2" */
469 CITY, /* "locality" */
471 ZIP, /* "postalcode" */
472 COUNTRY, /* "countryname" */
473 PHONE, /* "homephone" */
474 NOTES, /* "description" */
476 FAX, /* "facsimiletelephonenumber" */
477 MOBILEPHONE, /* "cellphone" */
478 WORKPHONE, /* "xmozillaanyphone" */
479 NICK, /* "xmozillanickname" */
480 -1, /* "objectclass" */ /* this must be the last entry */
485 ldif_read_line(FILE *in)
498 if(feof(in) || !line)
507 fseek(in, pos, SEEK_SET); /* fixme ! */
517 buf = strconcat(buf, ptr, NULL);
522 if(buf && *buf == '#' ) {
531 ldif_add_item(ldif_item li)
536 item = item_create();
538 if(!li[LDIF_ITEM_FIELDS -1])
542 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
543 if(ldif_conv_table[i] >= 0 && li[i] && *li[i])
544 item_fput(item,ldif_conv_table[i],xstrdup(li[i]));
547 add_item2database(item);
550 for(i=0; i < LDIF_ITEM_FIELDS; i++)
557 ldif_convert(ldif_item item, char *type, char *value)
561 if(!strcmp(type, "dn")) {
566 for(i=0; i < LDIF_ITEM_FIELDS; i++) {
567 if(!safe_strcmp(ldif_field_names[i], type) && *value) {
568 if(i == LDIF_ITEM_FIELDS - 1) /* this is a dirty hack */
569 if(safe_strcmp("person", value))
572 if(item_fget(item, i))
573 free(item_fget(item, i));
575 item_fput(item, i, xstrdup(value));
581 ldif_parse_file(FILE *handle)
588 memset(item, 0, sizeof(item));
591 if( !(line = ldif_read_line(handle)) )
594 if(-1 == (str_parse_line(line, &type, &value, &vlen))) {
596 continue; /* just skip the errors */
599 ldif_fix_string(value);
601 ldif_convert(item, type, value);
604 } while ( !feof(handle) );
606 ldif_convert(item, "dn", "");
612 ldif_fix_string(char *str)
616 for(i = 0, j = 0; j < (int)strlen(str); i++, j++)
617 str[i] = ( str[j] == (char)0xc3 ?
618 (char) str[++j] + (char) 0x40 :
629 * mutt alias import filter
635 mutt_read_line(FILE *in, char **alias, char **rest)
637 char *line, *ptr, *tmp;
640 if( !(line = ptr = getaline(in)) )
641 return 1; /* error / EOF */
645 if(strncmp("alias", ptr, 5)) {
656 while( ! ISSPACE(*ptr) )
659 alias_len = (size_t)(ptr - tmp);
662 *alias = xmalloc_inc(alias_len, 1);
664 strncpy(*alias, tmp, alias_len);
665 *(*alias + alias_len) = 0;
669 *rest = xstrdup(ptr);
676 mutt_fix_quoting(char *p)
696 mutt_parse_email(list_item item)
698 char *line = item_fget(item, NAME);
706 mutt_fix_quoting(line);
707 tmp = strconcat("From: ", line, NULL);
708 getname(tmp, &name, &email);
712 item_fput(item, NAME, name);
717 item_fput(item, EMAIL, email);
722 * this is completely broken
725 while( (start = strchr(start, ',')) && i++ < MAX_EMAILS - 1) {
726 tmp = strconcat("From: ", ++start, NULL);
727 getname(tmp, &name, &email);
732 tmp = strconcat(item[EMAIL], ",", email, NULL);
744 mutt_parse_file(FILE *in)
746 list_item item = item_create();
749 memset(item, 0, fields_count * sizeof(char *));
751 if(!mutt_read_line(in,
752 (field_id(NICK) != -1) ?
753 &item[field_id(NICK)] : NULL,
754 &item[field_id(NAME)]))
755 mutt_parse_email(item);
762 add_item2database(item);
770 * end of mutt alias import filter
779 ldif_fput_type_and_value(FILE *out,char *type, char *value )
783 tmp = ldif_type_and_value(type, value, strlen(value));
791 ldif_export_database(FILE *out, struct db_enumerator e)
793 char email[MAX_EMAILSTR_LEN];
795 fprintf(out, "version: 1\n");
797 db_enumerate_items(e) {
800 get_first_email(email, e.item);
802 tmp = strdup_printf("cn=%s,mail=%s",db_name_get(e.item),email);
804 ldif_fput_type_and_value(out, "dn", tmp);
807 for(j = 0; j < LDIF_ITEM_FIELDS; j++) {
808 if(ldif_conv_table[j] >= 0) {
809 if(ldif_conv_table[j] == EMAIL)
810 ldif_fput_type_and_value(out,
811 ldif_field_names[j], email);
812 else if(db_fget(e.item,ldif_conv_table[j]))
813 ldif_fput_type_and_value(out,
816 ldif_conv_table[j]));
820 fprintf(out, "objectclass: top\n"
821 "objectclass: person\n\n");
828 * end of ldif export filter
835 static void html_export_write_head(FILE *out);
836 static void html_export_write_tail(FILE *out);
838 extern struct index_elem *index_elements;
841 html_print_emails(FILE *out, struct list_field *f)
843 abook_list *l = csv_to_abook_list(f->data);
845 for(; l; l = l->next) {
846 fprintf(out, "<a href=\"mailto:%s\">%s</a>", l->data, l->data);
855 html_export_database(FILE *out, struct db_enumerator e)
858 struct index_elem *cur;
865 html_export_write_head(out);
867 db_enumerate_items(e) {
868 fprintf(out, "<tr>");
869 for(cur = index_elements; cur; cur = cur->next) {
870 if(cur->type != INDEX_FIELD)
873 get_list_field(e.item, cur, &f);
875 if(f.type == FIELD_EMAILS) {
876 fprintf(out, "<td>");
877 html_print_emails(out, &f);
878 fprintf(out, "</td>");
881 fprintf(out, "<td>%s</td>", safe_str(f.data));
884 fprintf(out, "</tr>\n");
887 html_export_write_tail(out);
893 html_export_write_head(FILE *out)
895 char *realname = get_real_name(), *str;
896 struct index_elem *cur;
898 fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
899 fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>",
901 fprintf(out, "\n</head>\n<body>\n");
902 fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
903 fprintf(out, "<br><br>\n\n");
905 fprintf(out, "<table border=\"1\" align=\"center\">\n<tr>");
906 for(cur = index_elements; cur; cur = cur->next) {
907 if(cur->type != INDEX_FIELD)
910 get_field_info(cur->d.field.id, NULL, &str, NULL);
911 fprintf(out, "<th>%s</th>", str);
913 fprintf(out, "</tr>\n\n");
919 html_export_write_tail(FILE *out)
921 fprintf(out, "\n</table>\n");
922 fprintf(out, "\n</body>\n</html>\n");
926 * end of html export filter
931 * pine addressbook import filter
934 #define PINE_BUF_SIZE 2048
937 pine_fixbuf(char *buf)
941 for(i = 0,j = 0; j < (int)strlen(buf); i++, j++)
942 buf[i] = buf[j] == '\n' ? buf[++j] : buf[j];
946 pine_convert_emails(char *s)
951 if(s == NULL || *s != '(')
954 for(i = 0; s[i]; i++)
957 if( ( tmp = strchr(s,')')) )
960 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
961 if(i > MAX_LIST_ITEMS - 1) {
969 pine_parse_buf(char *buf)
974 char tmp[PINE_BUF_SIZE];
976 int pine_conv_table[]= {NICK, NAME, EMAIL, -1, NOTES};
978 item = item_create();
980 for(i=0, last=0; !last ; i++) {
981 if( !(end = strchr(start, '\t')) )
984 len = last ? strlen(start) : (int) (end-start);
985 len = min(len, PINE_BUF_SIZE - 1);
987 if(i < (int)(sizeof(pine_conv_table) / sizeof(*pine_conv_table))
988 && pine_conv_table[i] >= 0) {
989 strncpy(tmp, start, len);
992 item_fput(item, pine_conv_table[i],
998 pine_convert_emails(item_fget(item, EMAIL));
999 add_item2database(item);
1004 #define LINESIZE 1024
1007 pine_parse_file(FILE *in)
1009 char line[LINESIZE];
1014 fgets(line, LINESIZE, in);
1018 buf = xrealloc(buf, i*LINESIZE);
1021 fgets(line, LINESIZE, in);
1023 if(*ptr != ' ' || feof(in))
1037 pine_parse_buf(buf);
1046 * end of pine addressbook import filter
1051 * pine addressbook export filter
1053 * filter doesn't wrap the lines as it should but Pine seems to handle
1054 * created files without problems - JH
1058 pine_export_database(FILE *out, struct db_enumerator e)
1062 db_enumerate_items(e) {
1063 emails = db_email_get(e.item);
1064 fprintf(out, strchr(emails, ',') /* multiple addresses? */ ?
1065 "%s\t%s\t(%s)\t\t%s\n" : "%s\t%s\t%s\t\t%s\n",
1066 safe_str(db_fget(e.item, NICK)),
1067 safe_str(db_name_get(e.item)),
1069 safe_str(db_fget(e.item, NOTES))
1078 * end of pine addressbook export filter
1087 * these files should be parsed according to a certain
1088 * lay out, or the default if layout is not given, at
1089 * the moment only default is done...
1092 #define CSV_COMMENT_CHAR '#'
1093 #define CSV_DUPLICATE_SEPARATOR " "
1094 #define CSV_TABLE_SIZE(t) (sizeof (t) / sizeof *(t))
1096 static int csv_conv_table[] = {
1104 static int allcsv_conv_table[] = {
1123 static int palmcsv_conv_table[] = {
1124 NAME, /* Last name */
1125 NAME, /* First name */
1142 csv_convert_emails(char *s)
1150 for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1)
1151 if(i > MAX_LIST_ITEMS - 1) {
1159 csv_remove_quotes(char *s)
1161 char *copy, *trimmed;
1164 copy = trimmed = xstrdup(s);
1167 len = strlen(trimmed);
1168 if(trimmed[len - 1] == '\"' && *trimmed == '\"') {
1173 trimmed[len - 1] = 0;
1175 trimmed = xstrdup(trimmed);
1185 csv_field_to_item(int *table_base, size_t table_size, int field)
1187 if(field < table_size)
1188 return field_id(table_base[field]);
1194 csv_store_item(list_item item, int i, char *s)
1196 char *newstr = NULL;
1201 if( !(newstr = csv_remove_quotes(s)) )
1205 if (item[i] != NULL) {
1206 char *oldstr = item[i];
1208 item[i] = strconcat(newstr, CSV_DUPLICATE_SEPARATOR,
1221 csv_is_valid_quote_end(char *p)
1229 else if(!ISSPACE(*p))
1237 csv_is_valid_quote_start(char *p)
1242 else if(!ISSPACE(*p))
1250 csv_parse_line(char *line, int *table_base, size_t table_size)
1254 bool in_quote = FALSE;
1257 item = item_create();
1259 for(p = start = line, field = 0; *p; p++) {
1261 if(csv_is_valid_quote_end(p))
1264 if ( (((p - start) / sizeof (char)) < 2 ) &&
1265 csv_is_valid_quote_start(p) )
1269 if(*p == ',' && !in_quote) {
1271 csv_store_item(item,
1272 csv_field_to_item(table_base,table_size,field),
1281 csv_store_item(item, csv_field_to_item(table_base, table_size, field),
1284 csv_convert_emails(item_fget(item, EMAIL));
1285 add_item2database(item);
1290 csv_parse_file_common(FILE *in, int *conv_table, size_t table_size)
1295 line = getaline(in);
1297 if(line && *line && *line != CSV_COMMENT_CHAR)
1298 csv_parse_line(line, conv_table, table_size);
1307 csv_parse_file(FILE *in)
1309 return csv_parse_file_common(in, csv_conv_table,
1310 CSV_TABLE_SIZE(csv_conv_table));
1314 allcsv_parse_file(FILE *in)
1316 return csv_parse_file_common(in, allcsv_conv_table,
1317 CSV_TABLE_SIZE(allcsv_conv_table));
1321 palmcsv_parse_file(FILE *in)
1323 return csv_parse_file_common(in, palmcsv_conv_table,
1324 CSV_TABLE_SIZE(palmcsv_conv_table));
1328 * end of csv import filter
1332 * csv addressbook export filters
1335 #define CSV_LAST (-1)
1336 #define CSV_UNDEFINED (-2)
1337 #define CSV_SPECIAL(X) (-3 - (X))
1338 #define CSV_IS_SPECIAL(X) ((X) <= -3)
1341 csv_export_common(FILE *out, struct db_enumerator e,
1342 int fields[], void (*special_func)(FILE *, int, int))
1346 db_enumerate_items(e) {
1347 for(i = 0; fields[i] != CSV_LAST; i++) {
1348 if(fields[i] == CSV_UNDEFINED)
1349 fprintf(out, "\"\"");
1350 else if(CSV_IS_SPECIAL(fields[i])) {
1352 (*special_func)(out, e.item, fields[i]);
1355 strchr(safe_str(database[e.item][field_idx(fields[i])]), ',') ||
1356 strchr(safe_str(database[e.item][field_idx(fields[i])]), '\"')) ?
1358 safe_str(database[e.item][field_idx(fields[i])])
1360 fprintf(out, "\"%s\"",
1361 safe_str(db_fget(e.item,fields[i])));
1363 if(fields[i + 1] != CSV_LAST)
1373 csv_export_database(FILE *out, struct db_enumerator e)
1375 int csv_export_fields[] = {
1384 csv_export_common(out, e, csv_export_fields, NULL);
1390 allcsv_export_database(FILE *out, struct db_enumerator e)
1393 * TODO: Should get these atomatically from abook_fileds
1396 int allcsv_export_fields[] = {
1417 fprintf(out, "\"NAME\",");
1418 fprintf(out, "\"EMAIL\",");
1419 fprintf(out, "\"ADDRESS\",");
1420 fprintf(out, "\"ADDRESS2\",");
1421 fprintf(out, "\"CITY\",");
1422 fprintf(out, "\"STATE\",");
1423 fprintf(out, "\"ZIP\",");
1424 fprintf(out, "\"COUNTRY\",");
1425 fprintf(out, "\"PHONE\",");
1426 fprintf(out, "\"WORKPHONE\",");
1427 fprintf(out, "\"FAX\",");
1428 fprintf(out, "\"MOBILEPHONE\",");
1429 fprintf(out, "\"NICK\",");
1430 fprintf(out, "\"URL\",");
1431 fprintf(out, "\"NOTES\",");
1432 fprintf(out, "\"ANNIVERSARY\"\n");
1434 csv_export_common(out, e, allcsv_export_fields, NULL);
1443 #define PALM_CSV_NAME CSV_SPECIAL(0)
1444 #define PALM_CSV_END CSV_SPECIAL(1)
1445 #define PALM_CSV_CAT CSV_SPECIAL(2)
1448 palm_split_and_write_name(FILE *out, char *name)
1454 if ( (p = strchr(name, ' ')) ) {
1458 fprintf(out, "\"%s\",\"" , p + 1);
1459 fwrite((void *)name, p - name, sizeof(char), out);
1462 fprintf(out, "\"%s\"", safe_str(name));
1467 palm_csv_handle_specials(FILE *out, int item, int field)
1471 palm_split_and_write_name(out, db_name_get(item));
1474 fprintf(out, "\"abook\"");
1477 fprintf(out, "\"0\"");
1485 palm_export_database(FILE *out, struct db_enumerator e)
1487 int palm_export_fields[] = {
1488 PALM_CSV_NAME, /* LASTNAME, FIRSTNAME */
1489 CSV_UNDEFINED, /* TITLE */
1490 CSV_UNDEFINED, /* COMPANY */
1491 WORKPHONE, /* WORK PHONE */
1492 PHONE, /* HOME PHONE */
1494 MOBILEPHONE, /* OTHER */
1496 ADDRESS, /* ADDRESS */
1500 COUNTRY, /* COUNTRY */
1501 NICK, /* DEFINED 1 */
1502 URL, /* DEFINED 2 */
1503 CSV_UNDEFINED, /* DEFINED 3 */
1504 CSV_UNDEFINED, /* DEFINED 4 */
1506 PALM_CSV_END, /* "0" */
1507 PALM_CSV_CAT, /* CATEGORY */
1511 csv_export_common(out, e, palm_export_fields, palm_csv_handle_specials);
1517 * end of csv export filters
1521 * GnomeCard (VCard) addressbook export filter
1525 gcrd_export_database(FILE *out, struct db_enumerator e)
1529 abook_list *emails, *em;
1531 db_enumerate_items(e) {
1532 fprintf(out, "BEGIN:VCARD\r\nFN:%s\r\n",
1533 safe_str(db_name_get(e.item)));
1535 name = get_surname(db_name_get(e.item));
1536 for( j = strlen(db_name_get(e.item)) - 1; j >= 0; j-- ) {
1537 if((db_name_get(e.item))[j] == ' ')
1540 fprintf(out, "N:%s;%.*s\r\n",
1543 safe_str(db_name_get(e.item))
1548 if(db_fget(e.item, ADDRESS))
1549 fprintf(out, "ADR:;;%s;%s;%s;%s;%s;%s\r\n",
1550 safe_str(db_fget(e.item, ADDRESS)),
1551 safe_str(db_fget(e.item, ADDRESS2)),
1552 safe_str(db_fget(e.item, CITY)),
1553 safe_str(db_fget(e.item, STATE)),
1554 safe_str(db_fget(e.item, ZIP)),
1555 safe_str(db_fget(e.item, COUNTRY))
1558 if(db_fget(e.item, PHONE))
1559 fprintf(out, "TEL;HOME:%s\r\n",
1560 db_fget(e.item, PHONE));
1561 if(db_fget(e.item, WORKPHONE))
1562 fprintf(out, "TEL;WORK:%s\r\n",
1563 db_fget(e.item, WORKPHONE));
1564 if(db_fget(e.item, FAX))
1565 fprintf(out, "TEL;FAX:%s\r\n",
1566 db_fget(e.item, FAX));
1567 if(db_fget(e.item, MOBILEPHONE))
1568 fprintf(out, "TEL;CELL:%s\r\n",
1569 db_fget(e.item, MOBILEPHONE));
1571 tmp = db_email_get(e.item);
1573 emails = csv_to_abook_list(tmp);
1575 for(em = emails; em; em = em->next)
1576 fprintf(out, "EMAIL;INTERNET:%s\r\n", em->data);
1578 abook_list_free(&emails);
1582 if(db_fget(e.item, NOTES))
1583 fprintf(out, "NOTE:%s\r\n",
1584 db_fget(e.item, NOTES));
1585 if(db_fget(e.item, URL))
1586 fprintf(out, "URL:%s\r\n",
1587 db_fget(e.item, URL));
1589 fprintf(out, "END:VCARD\r\n\r\n");
1597 * end of GnomeCard export filter
1602 * mutt alias export filter
1606 mutt_alias_genalias(int i)
1610 if(db_fget(i, NICK))
1611 return xstrdup(db_fget(i, NICK));
1613 tmp = xstrdup(db_name_get(i));
1615 if( ( pos = strchr(tmp, ' ') ) )
1624 mutt_alias_export(FILE *out, struct db_enumerator e)
1626 char email[MAX_EMAIL_LEN];
1629 db_enumerate_items(e) {
1630 alias = mutt_alias_genalias(e.item);
1631 get_first_email(email, e.item);
1632 fprintf(out, *email ? "alias %s %s <%s>\n": "alias %s %s%s\n",
1634 db_name_get(e.item),
1643 * end of mutt alias export filter
1648 * printable export filter
1653 text_write_address_us(FILE *out, int i) {
1654 fprintf(out, "\n%s", db_fget(i, ADDRESS));
1656 if(db_fget(i, ADDRESS2))
1657 fprintf(out, "\n%s", db_fget(i, ADDRESS2));
1659 if(db_fget(i, CITY))
1660 fprintf(out, "\n%s", db_fget(i, CITY));
1662 if(db_fget(i, STATE) || db_fget(i, ZIP)) {
1665 if(db_fget(i, STATE)) {
1666 fprintf(out, "%s", db_fget(i, STATE));
1672 fprintf(out, "%s", db_fget(i, ZIP));
1675 if(db_fget(i, COUNTRY))
1676 fprintf(out, "\n%s", db_fget(i, COUNTRY));
1681 text_write_address_uk(FILE *out, int i) {
1684 for(j = ADDRESS; j <= COUNTRY; j++)
1686 fprintf(out, "\n%s", db_fget(i, j));
1690 text_write_address_eu(FILE *out, int i) {
1691 fprintf(out, "\n%s", db_fget(i, ADDRESS));
1693 if(db_fget(i, ADDRESS2))
1694 fprintf(out, "\n%s", db_fget(i, ADDRESS2));
1696 if(db_fget(i, ZIP) || db_fget(i, CITY)) {
1699 if(db_fget(i, ZIP)) {
1700 fprintf(out, "%s", db_fget(i, ZIP));
1701 if(db_fget(i, CITY))
1705 fprintf(out, "%s", safe_str(db_fget(i, CITY)));
1708 if(db_fget(i, STATE))
1709 fprintf(out, "\n%s", db_fget(i, STATE));
1711 if(db_fget(i, COUNTRY))
1712 fprintf(out, "\n%s", db_fget(i, COUNTRY));
1716 text_export_database(FILE * out, struct db_enumerator e)
1718 abook_list *emails, *em;
1720 char *realname = get_real_name(), *str = NULL, *tmp;
1721 char *style = opt_get_str(STR_ADDRESS_STYLE);
1724 "-----------------------------------------\n%s's address book\n"
1725 "-----------------------------------------\n\n\n",
1729 db_enumerate_items(e) {
1731 "-----------------------------------------\n\n");
1732 fprintf(out, "%s", db_name_get(e.item));
1733 if(db_fget(e.item, NICK) && *db_fget(e.item, NICK))
1734 fprintf(out, "\n(%s)", db_fget(e.item, NICK));
1737 tmp = db_email_get(e.item);
1739 emails = csv_to_abook_list(tmp);
1742 for(em = emails; em; em = em->next)
1743 fprintf(out, "%s\n", em->data);
1745 abook_list_free(&emails);
1749 if(db_fget(e.item, ADDRESS)) {
1750 if(!safe_strcmp(style, "us")) /* US like */
1751 text_write_address_us(out, e.item);
1752 else if(!safe_strcmp(style, "uk")) /* UK like */
1753 text_write_address_uk(out, e.item);
1755 text_write_address_eu(out, e.item);
1760 if((db_fget(e.item, PHONE)) ||
1761 (db_fget(e.item, WORKPHONE)) ||
1762 (db_fget(e.item, FAX)) ||
1763 (db_fget(e.item, MOBILEPHONE))) {
1765 for(j = PHONE; j <= MOBILEPHONE; j++)
1766 if(db_fget(e.item, j)) {
1767 get_field_info(field_id(j),
1769 fprintf(out, "%s: %s\n", str,
1770 db_fget(e.item, j));
1774 if(db_fget(e.item, URL))
1775 fprintf(out, "\n%s\n", db_fget(e.item, URL));
1776 if(db_fget(e.item, NOTES))
1777 fprintf(out, "\n%s\n", db_fget(e.item, NOTES));
1782 fprintf(out, "-----------------------------------------\n");
1788 * end of printable export filter
1792 * elm alias export filter
1796 elm_alias_export(FILE *out, struct db_enumerator e)
1798 char email[MAX_EMAIL_LEN];
1801 db_enumerate_items(e) {
1802 alias = mutt_alias_genalias(e.item);
1803 get_first_email(email, e.item);
1804 fprintf(out, "%s = %s = %s\n",alias,db_name_get(e.item),email);
1812 * end of elm alias export filter
1817 * Spruce export filter
1821 spruce_export_database (FILE *out, struct db_enumerator e)
1823 char email[MAX_EMAIL_LEN];
1825 fprintf(out, "# This is a generated file made by abook for the Spruce e-mail client.\n\n");
1827 db_enumerate_items(e) {
1828 get_first_email(email, e.item);
1829 if(strcmp(email, "")) {
1830 fprintf(out, "# Address %d\nName: %s\nEmail: %s\nMemo: %s\n\n",
1832 db_name_get(e.item),
1834 safe_str(db_fget(e.item, NOTES))
1839 fprintf (out, "# End of address book file.\n");
1845 * end of Spruce export filter
1849 * wanderlust addressbook export filter
1853 wl_export_database(FILE *out, struct db_enumerator e)
1855 char email[MAX_EMAIL_LEN];
1857 fprintf(out, "# Wanderlust address book written by %s\n\n", PACKAGE);
1858 db_enumerate_items(e) {
1859 get_first_email(email, e.item);
1862 "%s\t\"%s\"\t\"%s\"\n",
1864 safe_str(db_fget(e.item, NICK)),
1865 safe_str(db_name_get(e.item))
1870 fprintf (out, "\n# End of address book file.\n");
1876 * end of wanderlust addressbook export filter