| /* |
| * |
| * Connection Manager |
| * |
| * Copyright (C) 2008 Intel Corporation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| * |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include <config.h> |
| #endif |
| |
| #include <dbus/dbus-glib.h> |
| #include <gtk/gtk.h> |
| |
| #include "marshal.h" |
| #include "marshal.c" |
| |
| static GtkWidget *label_state; |
| static GtkWidget *label_offlinemode; |
| static GtkWidget *label_available; |
| static GtkWidget *label_enabled; |
| static GtkWidget *label_connected; |
| static GtkWidget *label_default; |
| |
| static void property_changed(DBusGProxy *proxy, const char *property, |
| GValue *value, gpointer user_data) |
| { |
| if (property == NULL || value == NULL) |
| return; |
| |
| if (g_str_equal(property, "State") == TRUE) |
| gtk_label_set_text(GTK_LABEL(label_state), |
| g_value_get_string(value)); |
| |
| if (g_str_equal(property, "OfflineMode") == TRUE) |
| gtk_label_set_text(GTK_LABEL(label_offlinemode), |
| g_value_get_boolean(value) == TRUE ? "yes" : "no"); |
| |
| if (g_str_equal(property, "AvailableTechnologies") == TRUE) { |
| GString *text = g_string_sized_new(0); |
| gchar **list = g_value_get_boxed(value); |
| guint i; |
| |
| for (i = 0; i < g_strv_length(list); i++) |
| g_string_append_printf(text, " %s", *(list + i)); |
| |
| gtk_label_set_text(GTK_LABEL(label_available), |
| g_string_free(text, FALSE)); |
| } |
| |
| if (g_str_equal(property, "EnabledTechnologies") == TRUE) { |
| GString *text = g_string_sized_new(0); |
| gchar **list = g_value_get_boxed(value); |
| guint i; |
| |
| for (i = 0; i < g_strv_length(list); i++) |
| g_string_append_printf(text, " %s", *(list + i)); |
| |
| gtk_label_set_text(GTK_LABEL(label_enabled), |
| g_string_free(text, FALSE)); |
| } |
| |
| if (g_str_equal(property, "ConnectedTechnologies") == TRUE) { |
| GString *text = g_string_sized_new(0); |
| gchar **list = g_value_get_boxed(value); |
| guint i; |
| |
| for (i = 0; i < g_strv_length(list); i++) |
| g_string_append_printf(text, " %s", *(list + i)); |
| |
| gtk_label_set_text(GTK_LABEL(label_connected), |
| g_string_free(text, FALSE)); |
| } |
| |
| if (g_str_equal(property, "DefaultTechnology") == TRUE) |
| gtk_label_set_text(GTK_LABEL(label_default), |
| g_value_get_string(value)); |
| } |
| |
| static void properties_callback(DBusGProxy *proxy, |
| DBusGProxyCall *call, void *user_data) |
| { |
| GHashTable *hash; |
| GValue *value; |
| GError *error = NULL; |
| |
| dbus_g_proxy_end_call(proxy, call, &error, |
| dbus_g_type_get_map("GHashTable", |
| G_TYPE_STRING, G_TYPE_VALUE), |
| &hash, G_TYPE_INVALID); |
| |
| if (error != NULL) { |
| g_printerr("%s\n", error->message); |
| g_error_free(error); |
| return; |
| } |
| |
| value = g_hash_table_lookup(hash, "State"); |
| property_changed(proxy, "State", value, user_data); |
| |
| value = g_hash_table_lookup(hash, "OfflineMode"); |
| property_changed(proxy, "OfflineMode", value, user_data); |
| |
| value = g_hash_table_lookup(hash, "AvailableTechnologies"); |
| property_changed(proxy, "AvailableTechnologies", value, user_data); |
| |
| value = g_hash_table_lookup(hash, "EnabledTechnologies"); |
| property_changed(proxy, "EnabledTechnologies", value, user_data); |
| |
| value = g_hash_table_lookup(hash, "ConnectedTechnologies"); |
| property_changed(proxy, "ConnectedTechnologies", value, user_data); |
| |
| value = g_hash_table_lookup(hash, "DefaultTechnology"); |
| property_changed(proxy, "DefaultTechnology", value, user_data); |
| } |
| |
| static void get_properties(DBusGProxy *proxy) |
| { |
| if (dbus_g_proxy_begin_call_with_timeout(proxy, "GetProperties", |
| properties_callback, NULL, NULL, |
| 120 * 1000, G_TYPE_INVALID) == FALSE) { |
| g_printerr("Method call for retrieving properties failed\n"); |
| return; |
| } |
| } |
| |
| static DBusGProxy *manager; |
| |
| static void name_owner_changed(DBusGProxy *dbus, const char *name, |
| const char *prev, const char *new, gpointer user_data) |
| { |
| if (g_str_equal(name, "net.connman") == FALSE) |
| return; |
| |
| if (*new != '\0') { |
| get_properties(manager); |
| return; |
| } |
| |
| gtk_label_set_text(GTK_LABEL(label_state), NULL); |
| gtk_label_set_text(GTK_LABEL(label_offlinemode), NULL); |
| gtk_label_set_text(GTK_LABEL(label_available), NULL); |
| gtk_label_set_text(GTK_LABEL(label_enabled), NULL); |
| gtk_label_set_text(GTK_LABEL(label_connected), NULL); |
| gtk_label_set_text(GTK_LABEL(label_default), NULL); |
| } |
| |
| static gboolean delete_callback(GtkWidget *window, GdkEvent *event, |
| gpointer user_data) |
| { |
| gtk_widget_destroy(window); |
| |
| gtk_main_quit(); |
| |
| return FALSE; |
| } |
| |
| static void close_callback(GtkWidget *button, gpointer user_data) |
| { |
| GtkWidget *window = user_data; |
| |
| gtk_widget_destroy(window); |
| |
| gtk_main_quit(); |
| } |
| |
| static GtkWidget *create_window(void) |
| { |
| GtkWidget *window; |
| GtkWidget *mainbox; |
| GtkWidget *buttonbox; |
| GtkWidget *button; |
| GtkWidget *hbox; |
| GtkWidget *label; |
| |
| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| gtk_window_set_title(GTK_WINDOW(window), "Configuration Test"); |
| gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); |
| gtk_window_set_default_size(GTK_WINDOW(window), 420, 280); |
| g_signal_connect(G_OBJECT(window), "delete-event", |
| G_CALLBACK(delete_callback), NULL); |
| |
| mainbox = gtk_vbox_new(FALSE, 12); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 12); |
| gtk_container_add(GTK_CONTAINER(window), mainbox); |
| |
| buttonbox = gtk_hbutton_box_new(); |
| gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonbox), |
| GTK_BUTTONBOX_END); |
| gtk_box_pack_end(GTK_BOX(mainbox), buttonbox, FALSE, FALSE, 0); |
| |
| button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); |
| gtk_container_add(GTK_CONTAINER(buttonbox), button); |
| g_signal_connect(G_OBJECT(button), "clicked", |
| G_CALLBACK(close_callback), window); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("System state:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_state = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_state, FALSE, FALSE, 0); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("Offline mode:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_offlinemode = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_offlinemode, FALSE, FALSE, 0); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("Available technologies:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_available = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_available, FALSE, FALSE, 0); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("Enabled technologies:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_enabled = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_enabled, FALSE, FALSE, 0); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("Connected technologies:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_connected = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_connected, FALSE, FALSE, 0); |
| |
| hbox = gtk_hbox_new(FALSE, 6); |
| gtk_container_set_border_width(GTK_CONTAINER(mainbox), 24); |
| gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0); |
| label = gtk_label_new("Default technology:"); |
| gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| label_default = gtk_label_new(NULL); |
| gtk_box_pack_end(GTK_BOX(hbox), label_default, FALSE, FALSE, 0); |
| |
| gtk_widget_show_all(window); |
| |
| return window; |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| DBusGConnection *connection; |
| DBusGProxy *proxy; |
| GError *error = NULL; |
| |
| gtk_init(&argc, &argv); |
| |
| gtk_window_set_default_icon_name("network-wireless"); |
| |
| dbus_g_object_register_marshaller(marshal_VOID__STRING_BOXED, |
| G_TYPE_NONE, G_TYPE_STRING, |
| G_TYPE_VALUE, G_TYPE_INVALID); |
| |
| connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); |
| if (error != NULL) { |
| g_printerr("%s\n", error->message); |
| g_error_free(error); |
| } |
| |
| proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, |
| DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); |
| |
| manager = dbus_g_proxy_new_for_name(connection, "net.connman", |
| "/", "net.connman.Manager"); |
| |
| create_window(); |
| |
| dbus_g_proxy_add_signal(proxy, "NameOwnerChanged", |
| G_TYPE_STRING, G_TYPE_STRING, |
| G_TYPE_STRING, G_TYPE_INVALID); |
| dbus_g_proxy_connect_signal(proxy, "NameOwnerChanged", |
| G_CALLBACK(name_owner_changed), NULL, NULL); |
| |
| dbus_g_proxy_add_signal(manager, "PropertyChanged", |
| G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); |
| dbus_g_proxy_connect_signal(manager, "PropertyChanged", |
| G_CALLBACK(property_changed), NULL, NULL); |
| |
| get_properties(manager); |
| |
| gtk_main(); |
| |
| dbus_g_proxy_disconnect_signal(manager, "PropertyChanged", |
| G_CALLBACK(property_changed), NULL); |
| |
| dbus_g_proxy_disconnect_signal(proxy, "NameOwnerChanged", |
| G_CALLBACK(name_owner_changed), NULL); |
| |
| g_object_unref(manager); |
| |
| g_object_unref(proxy); |
| |
| dbus_g_connection_unref(connection); |
| |
| return 0; |
| } |