diff options
Diffstat (limited to 'libproxy/modules/pxgconf.cpp')
-rw-r--r-- | libproxy/modules/pxgconf.cpp | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/libproxy/modules/pxgconf.cpp b/libproxy/modules/pxgconf.cpp deleted file mode 100644 index ff7890f..0000000 --- a/libproxy/modules/pxgconf.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#include <cstdio> -#include <unistd.h> -#include <signal.h> -#include <stdexcept> - -#include <glib.h> -#include <gconf/gconf.h> -#include <gconf/gconf-client.h> - -using namespace std; - -static GMainLoop* loop = NULL; - -static int print_value(const GConfValue *value, const char *suffix) { - int count = 0; - GSList* cursor = NULL; - - if (!value) return 0; - - switch (value->type) { - case GCONF_VALUE_STRING: - return printf("%s%s", gconf_value_get_string(value), suffix); - case GCONF_VALUE_INT: - return printf("%d%s", gconf_value_get_int(value), suffix); - case GCONF_VALUE_FLOAT: - return printf("%f%s", gconf_value_get_float(value), suffix); - case GCONF_VALUE_BOOL: - if (gconf_value_get_bool(value)) - return printf("true%s", suffix); - return printf("false%s", suffix); - case GCONF_VALUE_LIST: - cursor = gconf_value_get_list(value); - if (g_slist_length (cursor) == 0) - count += printf("%s", suffix); - else for ( ; cursor ; cursor = g_slist_next(cursor)) - count += print_value((const GConfValue *) cursor->data, cursor->next ? "," : suffix); - return count; - case GCONF_VALUE_PAIR: - return print_value(gconf_value_get_car(value), ",") + - print_value(gconf_value_get_cdr(value), suffix); - default: - throw exception(); - } - - - return 0; -} - -static void on_value_change(GConfClient* /*client*/, guint /*cnxn_id*/, GConfEntry* entry, void* /*user_data*/) { - printf("%s\t", gconf_entry_get_key(entry)); - print_value(gconf_entry_get_value(entry), "\n"); -} - -static void on_sig(int /*signal*/) { - g_main_loop_quit(loop); -} - -static gboolean err(GIOChannel* /*source*/, GIOCondition /*condition*/, gpointer /*data*/) { - g_main_loop_quit(loop); - return false; -} - -static gboolean set_key(const char *key, const char *val) { - gboolean error = false; - GConfClient *client = gconf_client_get_default(); - GConfValue *value = gconf_client_get(client, key, NULL); - GConfValueType type = value ? value->type : GCONF_VALUE_STRING; - gconf_value_free(value); - - switch (type) { - case GCONF_VALUE_STRING: - error = !gconf_client_set_string(client, key, val, NULL); - break; - case GCONF_VALUE_INT: - int ival; - error = sscanf(val, "%d", &ival) != 1; - error = error || !gconf_client_set_int(client, key, ival, NULL); - break; - case GCONF_VALUE_FLOAT: - float fval; - error = sscanf(val, "%f", &fval) != 1; - error = error || !gconf_client_set_float(client, key, fval, NULL); - break; - case GCONF_VALUE_BOOL: - error = !gconf_client_set_float(client, key, !g_strcmp0(val, "true"), NULL); - break; - case GCONF_VALUE_LIST: - case GCONF_VALUE_PAIR: - default: - g_critical("Invalid value type!"); - error = true; - } - - g_object_unref(client); - return !error; -} - -static gboolean in(GIOChannel *source, GIOCondition condition, gpointer data) { - gchar *key, *val; - GIOStatus st = g_io_channel_read_line(source, &key, NULL, NULL, NULL); - - // Remove the trailing '\n' - for (int i=0 ; key && key[i] ; i++) - if (key[i] == '\n') - key[i] = '\0'; - - // If we were successful - if (key && st == G_IO_STATUS_NORMAL) { - if (!g_strrstr(key, "\t")) - goto exit; - - val = g_strrstr(key, "\t") + 1; - *(val-1) = '\0'; - - if (!set_key(key, val)) - goto exit; - - g_free(key); - return true; - } - else if (key && st == G_IO_STATUS_AGAIN) { - g_free(key); - return in(source, condition, data); - } - -exit: - g_free(key); - return err(source, condition, data); -} - -int main(int argc, char **argv) { - if (argc < 2) return 1; - - // Register sighup handler - if (signal(SIGHUP, on_sig) == SIG_ERR || signal(SIGPIPE, on_sig) == SIG_ERR || signal(SIGABRT, on_sig) == SIG_ERR) { - fprintf(stderr, "Unable to trap signals!"); - return 2; - } - - // Switch stdout to line buffering - if (setvbuf(stdout, NULL, _IOLBF, 0)) { - fprintf(stderr, "Unable to switch stdout to line buffering!"); - return 3; - } - - // Switch stdin to line buffering - if (setvbuf(stdin, NULL, _IOLBF, 0)) { - fprintf(stderr, "Unable to switch stdin to line buffering!"); - return 4; - } - - // Init - g_type_init(); - - // Get the main loop - loop = g_main_loop_new(NULL, false); - - // Setup our GIO Channels - GIOChannel* inchan = g_io_channel_unix_new(fileno(stdin)); - GIOChannel* outchan = g_io_channel_unix_new(fileno(stdout)); - g_io_add_watch(inchan, G_IO_IN, in, NULL); - g_io_add_watch(inchan, G_IO_PRI, in, NULL); - g_io_add_watch(inchan, G_IO_ERR, err, NULL); - g_io_add_watch(inchan, G_IO_HUP, err, NULL); - g_io_add_watch(outchan, G_IO_ERR, err, NULL); - g_io_add_watch(outchan, G_IO_HUP, err, NULL); - - // Get GConf client - GConfClient* client = gconf_client_get_default(); - - // Add server notifications for all keys - for (int i=1 ; i < argc ; i++) { - GConfValue *value; - gconf_client_add_dir(client, argv[i], GCONF_CLIENT_PRELOAD_NONE, NULL); - gconf_client_notify_add(client, argv[i], on_value_change, NULL, NULL, NULL); - value = gconf_client_get(client, argv[i], NULL); - if (value) { - gconf_value_free (value); - gconf_client_notify(client, argv[i]); - } else { - printf("%s\n", argv[i]); - } - } - - g_main_loop_run(loop); - - // Cleanup - g_object_unref(client); - g_io_channel_shutdown(inchan, FALSE, NULL); - g_io_channel_shutdown(outchan, FALSE, NULL); - g_io_channel_unref(inchan); - g_io_channel_unref(outchan); - g_main_loop_unref(loop); -} |