4 * by JH <jheinonen@users.sourceforge.net>
6 * Copyright (C) Jaakko Heinonen
18 #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
30 static void init_abook();
31 static void set_filenames();
32 static void free_filenames();
33 static void parse_command_line(int argc, char **argv);
34 static void show_usage();
35 static void mutt_query(char *str);
36 static void init_mutt_query();
37 static void quit_mutt_query();
38 static void convert(char *srcformat, char *srcfile,
39 char *dstformat, char *dstfile);
41 char *datafile = NULL;
50 signal(SIGKILL, quit_abook);
51 signal(SIGTERM, quit_abook);
59 * this is very ugly for now
61 /*if( options_get_int("datafile", "autosave") )*/
63 if( load_database(datafile) == 2 ) {
64 char *tmp = strconcat(getenv("HOME"),
67 if( safe_strcmp(tmp, datafile) ) {
69 statusline_msg("Sorry, the specified file does "
70 "not appear to be a valid abook addressbook");
71 statusline_msg("Will open default addressbook...");
74 load_database(datafile);
85 if( options_get_int("autosave") )
87 else if( statusline_ask_boolean("Save database", TRUE) )
99 main(int argc, char **argv)
101 #if defined(HAVE_SETLOCALE) && defined(HAVE_LOCALE_H)
102 setlocale(LC_ALL, "" );
105 parse_command_line(argc, argv);
121 if( (stat(getenv("HOME"), &s)) == -1 || ! S_ISDIR(s.st_mode) ) {
122 fprintf(stderr,"%s is not a valid HOME directory\n", getenv("HOME") );
127 datafile = strconcat(getenv("HOME"), "/" DATAFILE, NULL);
129 rcfile = strconcat(getenv("HOME"), "/" RCFILE, NULL);
131 atexit(free_filenames);
142 parse_command_line(int argc, char **argv)
146 for( i = 1; i < argc; i++ ) {
147 if( !strcmp(argv[i], "--help") ) {
151 if( !strcmp(argv[i], "--mutt-query") )
152 mutt_query(argv[i + 1]);
154 if( !strcmp(argv[i], "--datafile") ) {
156 if (argv[i+1][0] != '/') {
157 char *cwd = my_getcwd();
158 datafile = strconcat(cwd, "/", argv[i+1], NULL);
161 datafile = strdup(argv[i+1]);
169 if( !strcmp(argv[i], "--convert") ) {
170 if( argc < 5 || argc > 6 ) {
171 fprintf(stderr, "incorrect number of argumets to make conversion\n");
172 fprintf(stderr, "try %s --help\n", argv[0]);
176 convert(argv[i+1], argv[i+2],
177 argv[i+3], argv[i+4]);
179 convert(argv[i+1], argv[i+2], argv[i+3], "-");
181 printf("option %s not recognized\n", argv[i]);
182 printf("try %s --help\n", argv[0]);
192 puts (PACKAGE " v " VERSION "\n");
193 puts (" --help show usage");
194 puts (" --datafile <filename> use an alternative addressbook file");
195 puts (" --mutt-query <string> make a query for mutt");
196 puts (" --convert <inputformat> <inputfile> "
197 "<outputformat> <outputfile>");
199 puts ("available formats for --convert option:");
202 puts ("\nWarning: this version compiled with DEBUG flag ON");
206 extern list_item *database;
209 muttq_print_item(int item)
211 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
214 split_emailstr(item, emails);
216 for(i = 0; i < (options_get_int("mutt_return_all_emails") ?
217 MAX_EMAILS : 1) ; i++)
219 printf("%s\t%s\t%s\n", emails[i],
220 database[item][NAME],
221 database[item][NOTES] == NULL ? " " :
222 database[item][NOTES]
227 mutt_query(char *str)
231 if( str == NULL || !strcasecmp(str, "all") ) {
232 struct db_enumerator e = init_db_enumerator(ENUM_ALL);
233 printf("All items\n");
234 db_enumerate_items(e)
235 muttq_print_item(e.item);
237 int search_fields[] = {NAME, EMAIL, NICK, -1};
239 if( (i = find_item(str, 0, search_fields)) < 0 ) {
240 printf("Not found\n");
246 i = find_item(str, i+1, search_fields);
259 if( load_database(datafile) ) {
260 printf("Cannot open database\n");
267 quit_mutt_query(int status)
277 make_mailstr(int item)
279 char email[MAX_EMAIL_LEN];
281 char *name = mkstr("\"%s\"", database[item][NAME]);
283 get_first_email(email, item);
285 ret = *database[item][EMAIL] ?
286 mkstr("%s <%s>", name, email) :
295 launch_mutt(int item)
297 char *cmd = NULL, *mailstr = NULL;
298 char *mutt_command = options_get_str("mutt_command");
300 if(mutt_command == NULL || !*mutt_command)
303 if( is_valid_item(item) )
304 mailstr = make_mailstr(item);
306 struct db_enumerator e = init_db_enumerator(ENUM_SELECTED);
308 db_enumerate_items(e) {
311 strconcat(tmp, ",", make_mailstr(e.item), NULL):
312 strconcat(make_mailstr(e.item), NULL);
317 cmd = strconcat(mutt_command, " \'", mailstr,
321 fprintf(stderr, "cmd: %s\n", cmd);
327 * we need to make sure that curses settings are correct
333 launch_wwwbrowser(int item)
337 if( !is_valid_item(item) )
340 if( database[item][URL] )
341 cmd = mkstr("%s '%s'",
342 options_get_str("www_command"),
343 safe_str(database[item][URL]));
353 * we need to make sure that curses settings are correct
359 abook_malloc(size_t size)
363 if ( (ptr = malloc(size)) == NULL ) {
364 if( is_ui_initialized() )
366 perror("malloc() failed");
374 abook_realloc(void *ptr, size_t size)
376 ptr = realloc(ptr, size);
382 if( is_ui_initialized() )
384 perror("realloc() failed");
392 abook_fopen (const char *path, const char *mode)
396 if( ! strchr(mode, 'r') )
397 return fopen(path, mode);
399 if ( (stat(path, &s)) == -1 )
402 return S_ISREG(s.st_mode) ? fopen(path, mode) : NULL;
408 convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile)
412 if( !srcformat || !srcfile || !dstformat || !dstfile ) {
413 fprintf(stderr, "too few argumets to make conversion\n");
414 fprintf(stderr, "try --help\n");
421 if( !strcmp(srcformat, dstformat) ) {
422 printf( "input and output formats are the same\n"
431 switch( import(srcformat, srcfile) ) {
433 printf("input format %s not supported\n", srcformat);
436 printf("cannot read file %s\n", srcfile);
441 switch( export(dstformat, dstfile) ) {
443 printf("output format %s not supported\n",
448 printf("cannot write file %s\n", dstfile);