X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=config-ui%2Fbrowser-switchboard-config.c;h=685a0b048111a06263939bda9ec2a0b3eeeaeee0;hp=c14b80fdd9b5a05e6327b94f07338716100a08b8;hb=e3ec5ec543a7a76d230d3102666a6a33ae20c496;hpb=6ac42ed781a7735221de8aaa28a6647b32608049 diff --git a/config-ui/browser-switchboard-config.c b/config-ui/browser-switchboard-config.c index c14b80f..685a0b0 100644 --- a/config-ui/browser-switchboard-config.c +++ b/config-ui/browser-switchboard-config.c @@ -1,9 +1,9 @@ /* - * browser-switchboard-config.c -- command-line configuration utility for + * browser-switchboard-config.c -- command-line configuration utility for * Browser Switchboard - * + * * Copyright (C) 2009-2010 Steven Luo - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) @@ -24,16 +24,19 @@ #include #include #include +#include #include #include "config.h" +#include "save-config.h" +#include "browsers.h" extern struct swb_config_option swb_config_options[]; static int get_config_value(char *name) { struct swb_config cfg; - int i; - struct swb_config_option optinfo; + struct swb_config_option *optinfo; + void *entry; int retval = 1; swb_config_init(&cfg); @@ -41,17 +44,18 @@ static int get_config_value(char *name) { if (!swb_config_load(&cfg)) return 1; - for (i = 0; swb_config_options[i].name; ++i) { - optinfo = swb_config_options[i]; - if (strcmp(name, optinfo.name)) + for (optinfo = swb_config_options; optinfo->name; ++optinfo) { + if (strcmp(name, optinfo->name)) continue; - switch (optinfo.type) { + entry = (char *)&cfg + optinfo->offset; + switch (optinfo->type) { case SWB_CONFIG_OPT_STRING: - printf("%s\n", *(char **)cfg.entries[i]); + if (*(char **)entry) + printf("%s\n", *(char **)entry); break; case SWB_CONFIG_OPT_INT: - printf("%d\n", *(int *)cfg.entries[i]); + printf("%d\n", *(int *)entry); break; default: break; @@ -65,50 +69,81 @@ static int get_config_value(char *name) { return retval; } -static int set_config_value(char *name, char *value) { +static int get_default_browser(void) { struct swb_config cfg; int i; - struct swb_config_option optinfo; - int retval = 1; swb_config_init(&cfg); if (!swb_config_load(&cfg)) return 1; - for (i = 0; swb_config_options[i].name; ++i) { - optinfo = swb_config_options[i]; - if (strcmp(name, optinfo.name)) + /* Check to see if the configured default browser is installed + If not, report the default default browser */ + for (i = 0; browsers[i].config; ++i) { + if (strcmp(browsers[i].config, cfg.default_browser)) continue; - switch (optinfo.type) { - case SWB_CONFIG_OPT_STRING: - /* Free any existing string */ - if (cfg.flags & optinfo.set_mask) - free(*(char **)cfg.entries[i]); + if (browsers[i].binary && access(browsers[i].binary, X_OK)) + printf("%s\n", browsers[0].config); + else + printf("%s\n", browsers[i].config); + + break; + } + + if (!browsers[i].config) + /* Unknown browser configured as default, report the default + default browser */ + printf("%s\n", browsers[0].config); + + swb_config_free(&cfg); + + return 0; +} + +static int set_config_value(char *name, char *value) { + struct swb_config orig_cfg, cfg; + struct swb_config_option *optinfo; + void *entry; + int retval = 1; + + swb_config_init(&orig_cfg); + + if (!swb_config_load(&orig_cfg)) + return 1; + cfg = orig_cfg; + + for (optinfo = swb_config_options; optinfo->name; ++optinfo) { + if (strcmp(name, optinfo->name)) + continue; + + entry = (char *)&cfg + optinfo->offset; + switch (optinfo->type) { + case SWB_CONFIG_OPT_STRING: if (strlen(value) == 0) { /* If the new value is empty, clear the config setting */ - *(char **)cfg.entries[i] = NULL; - cfg.flags &= ~optinfo.set_mask; + *(char **)entry = NULL; + cfg.flags &= ~optinfo->set_mask; } else { /* Make a copy of the string -- it's not safe to free value, which comes from argv */ - if (!(*(char **)cfg.entries[i] = + if (!(*(char **)entry = strdup(value))) exit(1); - cfg.flags |= optinfo.set_mask; + cfg.flags |= optinfo->set_mask; } break; case SWB_CONFIG_OPT_INT: if (strlen(value) == 0) { /* If the new value is empty, clear the config setting */ - cfg.flags &= ~optinfo.set_mask; + cfg.flags &= ~optinfo->set_mask; } else { - *(int *)cfg.entries[i] = atoi(value); - cfg.flags |= optinfo.set_mask; + *(int *)entry = atoi(value); + cfg.flags |= optinfo->set_mask; } break; } @@ -120,12 +155,15 @@ static int set_config_value(char *name, char *value) { if (!swb_config_save(&cfg)) retval = 1; - swb_config_free(&cfg); + /* Reconfigure a running browser-switchboard, if present */ + swb_reconfig(&orig_cfg, &cfg); - /* Try to send SIGHUP to any running browser-switchboard process - This causes it to reread config files if in continuous_mode, or - die so that the config will be reloaded on next start otherwise */ - system("kill -HUP `pidof browser-switchboard` > /dev/null 2>&1"); + swb_config_free(&orig_cfg); + /* XXX can't free all of cfg, it contains pointers to memory we just + freed above + swb_config_free(&cfg); */ + if (optinfo->name && optinfo->type == SWB_CONFIG_OPT_STRING) + free(*(char **)entry); return retval; } @@ -146,7 +184,7 @@ int main(int argc, char **argv) { int opt, done = 0; int set = 0; char *selected_opt = NULL; - + while (!done && (opt = getopt(argc, argv, "hsbcmo:")) != -1) { switch (opt) { case 'h': @@ -192,6 +230,9 @@ int main(int argc, char **argv) { exit(1); } return set_config_value(selected_opt, argv[optind]); - } else + } else if (!strcmp(selected_opt, "default_browser")) + /* Default browser value needs special handling */ + return get_default_browser(); + else return get_config_value(selected_opt); }