Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.2
NetworkManager-gnome
0003-Use-ModemManager.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0003-Use-ModemManager.patch of Package NetworkManager-gnome
From c0f970a540f25c781c6a284a2b7fa0611a05540f Mon Sep 17 00:00:00 2001 From: Tambet Ingo <tambet@gmail.com> Date: Tue, 13 Jan 2009 13:36:29 +0200 Subject: [PATCH] Use ModemManager. diff --git a/configure.ac b/configure.ac index bc92172..d3b3b55 100644 --- a/configure.ac +++ b/configure.ac @@ -227,6 +227,7 @@ src/gconf-helpers/Makefile src/wireless-security/Makefile src/polkit-helpers/Makefile src/connection-editor/Makefile +src/modems/Makefile icons/Makefile icons/16/Makefile icons/22/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 3486186..33d2c49 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = marshallers utils gconf-helpers wireless-security polkit-helpers connection-editor +SUBDIRS = marshallers utils gconf-helpers wireless-security polkit-helpers connection-editor modems NULL= @@ -49,6 +49,9 @@ nm_applet_SOURCES = \ applet-device-gsm.c \ applet-device-cdma.h \ applet-device-cdma.c \ + mm-types.h \ + nma-gsm-modem.c \ + nma-gsm-modem.h \ $(NULL) nm_applet_LDADD = \ diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c index a01d57c..e34dc47 100644 --- a/src/applet-device-gsm.c +++ b/src/applet-device-gsm.c @@ -25,6 +25,9 @@ #include <config.h> #endif +#include <sys/types.h> +#include <unistd.h> + #include <glib/gi18n.h> #include <gtk/gtk.h> @@ -38,6 +41,8 @@ #include "applet.h" #include "applet-device-gsm.h" +#include "nma-gsm-modem.h" +#include "mm-types.h" #include "utils.h" typedef struct { @@ -173,6 +178,50 @@ add_default_connection_item (NMDevice *device, } static void +child_setup (gpointer user_data G_GNUC_UNUSED) +{ + /* We are in the child process at this point */ + pid_t pid = getpid (); + setpgid (pid, pid); +} + +static void +gsm_properties_cb (GtkMenuItem *mi, gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + char *argv[3]; + GError *error = NULL; + gboolean success; + + argv[0] = BINDIR "/nm-modem-properties"; + argv[1] = (char *) nm_device_get_udi (device); + argv[2] = NULL; + + success = g_spawn_async ("/", argv, NULL, 0, &child_setup, NULL, NULL, &error); + if (!success) { + g_warning ("Error launching modem properties dialog: %s", error->message); + g_error_free (error); + } +} + +static void +add_properties_item (NMDevice *device, + GtkWidget *menu) +{ + GtkWidget *item; + + if (nm_device_get_state (device) != NM_DEVICE_STATE_DISCONNECTED) + return; + + item = gtk_menu_item_new_with_label (_("Properties")); + g_signal_connect (item, "activate", + G_CALLBACK (gsm_properties_cb), + device); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +} + +static void gsm_menu_item_deactivate (GtkMenuItem *item, gpointer user_data) { GSMMenuItemInfo *info = (GSMMenuItemInfo *) user_data; @@ -271,41 +320,67 @@ gsm_add_menu_item (NMDevice *device, add_connection_items (device, connections, active, menu, applet); else add_default_connection_item (device, menu, applet); + add_disconnect_item (device, menu, applet); + add_properties_item (device, menu); out: g_slist_free (connections); } static void +signal_quality_changed (NMAGsmModem *modem, guint32 quality, gpointer user_data) +{ + applet_schedule_update_icon (NM_APPLET (user_data)); +} + +static void gsm_device_state_changed (NMDevice *device, NMDeviceState new_state, NMDeviceState old_state, NMDeviceStateReason reason, NMApplet *applet) { - if (new_state == NM_DEVICE_STATE_ACTIVATED) { - NMConnection *connection; - NMSettingConnection *s_con = NULL; - char *str = NULL; - - connection = applet_find_active_connection_for_device (device, applet, NULL); - if (connection) { - const char *id; - - s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); - id = s_con ? nm_setting_connection_get_id (s_con) : NULL; - if (id) - str = g_strdup_printf (_("You are now connected to '%s'."), id); - } + NMAGsmModem *modem; + char *oper_code; + char *oper_name; + char *msg; + guint32 reg_status; + + if (new_state != NM_DEVICE_STATE_ACTIVATED) + return; - applet_do_notify_with_pref (applet, - _("Connection Established"), - str ? str : _("You are now connected to the GSM network."), - "nm-device-wwan", - PREF_DISABLE_CONNECTED_NOTIFICATIONS); - g_free (str); + modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem"); + if (!modem) { + DBusGConnection *bus; + + bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); + if (!bus) + return; + + modem = nma_gsm_modem_new (bus, nm_device_get_udi (device)); + dbus_g_connection_unref (bus); + + g_object_set_data_full (G_OBJECT (device), "gsm-modem", modem, g_object_unref); + + g_signal_connect (modem, "signal-quality", + G_CALLBACK (signal_quality_changed), + applet); } + + oper_code = NULL; + oper_name = NULL; + reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name); + msg = g_strdup_printf (_("You are now connected to the %s GSM network '%s'."), + reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("roaming") : _("home"), + oper_name); + + applet_do_notify_with_pref (applet, _("Connection Established"), msg, + "nm-device-wwan", PREF_DISABLE_CONNECTED_NOTIFICATIONS); + + g_free (oper_code); + g_free (oper_name); + g_free (msg); } static GdkPixbuf * @@ -316,6 +391,7 @@ gsm_get_icon (NMDevice *device, NMApplet *applet) { NMSettingConnection *s_con; + NMAGsmModem *modem; GdkPixbuf *pixbuf = NULL; const char *id; @@ -339,8 +415,40 @@ gsm_get_icon (NMDevice *device, *tip = g_strdup_printf (_("Requesting a network address for '%s'..."), id); break; case NM_DEVICE_STATE_ACTIVATED: - pixbuf = applet->wwan_icon; - *tip = g_strdup_printf (_("Mobile broadband connection '%s' active"), id); + modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem"); + if (modem) { + char *oper_code; + char *oper_name; + guint32 reg_status; + guint32 quality; + + quality = nma_gsm_modem_get_signal_quality (modem); + quality = CLAMP (quality, 0, 100); + + if (quality > 80) + pixbuf = applet->wireless_100_icon; + else if (quality > 55) + pixbuf = applet->wireless_75_icon; + else if (quality > 30) + pixbuf = applet->wireless_50_icon; + else if (quality > 5) + pixbuf = applet->wireless_25_icon; + else + pixbuf = applet->wireless_00_icon; + + reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name); + *tip = g_strdup_printf (_("%s GSM connection '%s' (%d%%)"), + reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("Roaming") : _("Home"), + oper_name, quality); + + g_free (oper_name); + g_free (oper_code); + + } else { + pixbuf = applet->wireless_00_icon; + *tip = g_strdup_printf (_("GSM connection")); + } + break; default: break; @@ -512,6 +620,7 @@ ask_for_pin_puk (NMDevice *device, w = gtk_entry_new (); *out_secret_entry = GTK_ENTRY (w); + gtk_entry_set_visibility (GTK_ENTRY (w), FALSE); gtk_entry_set_max_length (GTK_ENTRY (w), 4); gtk_entry_set_width_chars (GTK_ENTRY (w), 4); gtk_entry_set_activates_default (GTK_ENTRY (w), TRUE); diff --git a/src/connection-editor/page-mobile.c b/src/connection-editor/page-mobile.c index 9c599c7..70a3447 100644 --- a/src/connection-editor/page-mobile.c +++ b/src/connection-editor/page-mobile.c @@ -107,7 +107,6 @@ populate_gsm_ui (CEPageMobile *self, NMConnection *connection) int type_idx; GHashTable *secrets; GValue *value; - GtkWidget *widget; const char *s; s = nm_setting_gsm_get_number (setting); @@ -146,17 +145,6 @@ populate_gsm_ui (CEPageMobile *self, NMConnection *connection) } gtk_combo_box_set_active (priv->network_type, type_idx); - /* Hide network type widgets; not supported yet */ - gtk_widget_hide (GTK_WIDGET (priv->network_type)); - widget = glade_xml_get_widget (CE_PAGE (self)->xml, "type_label"); - gtk_widget_hide (widget); - - /* Hide Band widgets; not supported yet */ - widget = glade_xml_get_widget (CE_PAGE (self)->xml, "mobile_band"); - gtk_widget_hide (widget); - widget = glade_xml_get_widget (CE_PAGE (self)->xml, "band_label"); - gtk_widget_hide (widget); - secrets = get_secrets (connection, nm_setting_get_name (priv->setting)); s = nm_setting_gsm_get_password (setting); diff --git a/src/mm-types.h b/src/mm-types.h new file mode 100644 index 0000000..a1f9979 --- /dev/null +++ b/src/mm-types.h @@ -0,0 +1,18 @@ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ + +#ifndef MM_TYPES_H +#define MM_TYPES_H + +#define MM_DBUS_SERVICE "org.freedesktop.ModemManager" +#define MM_DBUS_INTERFACE_MODEM_GSM "org.freedesktop.ModemManager.Modem.Gsm.Network" + +enum { + MM_GSM_MODEM_REG_STATUS_IDLE = 0, + MM_GSM_MODEM_REG_STATUS_HOME = 1, + MM_GSM_MODEM_REG_STATUS_SEARCHING = 2, + MM_GSM_MODEM_REG_STATUS_DENIED = 3, + MM_GSM_MODEM_REG_STATUS_UNKNOWN = 4, + MM_GSM_MODEM_REG_STATUS_ROAMING = 5 +}; + +#endif /* MM_TYPES_H */ diff --git a/src/modems/Makefile.am b/src/modems/Makefile.am new file mode 100644 index 0000000..206ee52 --- /dev/null +++ b/src/modems/Makefile.am @@ -0,0 +1,25 @@ +bin_PROGRAMS = nm-modem-properties + +nm_modem_properties_CPPFLAGS = \ + $(NMA_CFLAGS) \ + -DICONDIR=\""$(datadir)/icons"\" \ + -DGLADEDIR=\""$(gladedir)"\" \ + -DBINDIR=\""$(bindir)"\" \ + -DSYSCONFDIR=\""$(sysconfdir)"\" \ + -DLIBDIR=\""$(libdir)"\" \ + -DNMALOCALEDIR=\"$(datadir)/locale\" \ + $(DBUS_CFLAGS) \ + -I${top_srcdir}/src/gconf-helpers + +nm_modem_properties_SOURCES = \ + main.c + +nm_modem_properties_LDADD = \ + $(top_builddir)/src/gconf-helpers/libgconf-helpers.la \ + $(NMA_LIBS) + +gladedir = $(datadir)/nm-applet +glade_DATA = nm-modem-properties.glade + +CLEANFILES = *.bak *.gladep +EXTRA_DIST = $(glade_DATA) diff --git a/src/modems/main.c b/src/modems/main.c new file mode 100644 index 0000000..672d1cd --- /dev/null +++ b/src/modems/main.c @@ -0,0 +1,559 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#include <string.h> +#include <gtk/gtk.h> +#include <glade/glade.h> +#include <dbus/dbus-glib.h> +#include <gconf/gconf-client.h> +#include <nm-connection.h> +#include <nm-setting-connection.h> +#include <nm-setting-gsm.h> +#include <nm-setting-serial.h> +#include <nm-setting-ppp.h> +#include <nm-utils.h> +#include "gconf-helpers.h" + +#define MM_DBUS_SERVICE "org.freedesktop.ModemManager" +#define MM_DBUS_PATH "/org/freedesktop/ModemManager" +#define MM_DBUS_INTERFACE "org.freedesktop.ModemManager" +#define MM_DBUS_INTERFACE_MODEM "org.freedesktop.ModemManager.Modem" + +#define MM_DBUS_INTERFACE_MODEM_GSM_CARD "org.freedesktop.ModemManager.Modem.Gsm.Card" +#define MM_DBUS_INTERFACE_MODEM_GSM_NETWORK "org.freedesktop.ModemManager.Modem.Gsm.Network" + +#define MM_MODEM_TYPE_UNKNOWN 0 +#define MM_MODEM_TYPE_GSM 1 +#define MM_MODEM_TYPE_CDMA 2 + +#define SCAN_COL_NAME 0 +#define SCAN_COL_STATUS 1 +#define SCAN_COL_OPER_ID 2 + +typedef struct { + /* UI */ + GladeXML *glade_xml; + GtkDialog *main_dialog; + GtkTreeView *network_list; + GtkListStore *network_store; + GtkWidget *scan_button; + GtkWidget *create_net_button; + + GtkWidget *scan_dialog; + GtkProgressBar *scan_progress_bar; + + GtkDialog *create_network_dialog; + GtkEntry *create_network_name; + + /* DBus */ + DBusGConnection *bus; + DBusGProxy *proxy; + DBusGProxy *gsm_net_proxy; + + GMainLoop *main_loop; +} AppData; + +static void +get_str_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + char *result = NULL; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_STRING, &result, G_TYPE_INVALID)) { + g_warning ("%s", error->message); + g_error_free (error); + } else { + gtk_label_set_text (GTK_LABEL (user_data), result); + g_free (result); + } +} + +static void +get_card_info_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + GladeXML *glade_xml = GLADE_XML (user_data); + char *manufacturer = NULL; + char *model = NULL; + char *version = NULL; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, + G_TYPE_STRING, &manufacturer, + G_TYPE_STRING, &model, + G_TYPE_STRING, &version, + G_TYPE_INVALID)) { + g_warning ("Couldn't get modem information: %s", error->message); + g_error_free (error); + } else { + gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "vendor_label")), manufacturer); + gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "model_label")), model); + gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "version_label")), version); + + g_free (manufacturer); + g_free (model); + g_free (version); + } +} + +static void +get_property_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + GValue value = { 0, }; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning ("%s", error->message); + g_error_free (error); + } else { + gtk_label_set_text (GTK_LABEL (user_data), g_value_get_string (&value)); + g_value_unset (&value); + } +} + +static gboolean +get_info (gpointer data) +{ + AppData *app_data = (AppData *) data; + + dbus_g_proxy_set_interface (app_data->proxy, MM_DBUS_INTERFACE_MODEM_GSM_CARD); + dbus_g_proxy_begin_call (app_data->proxy, "GetImsi", get_str_done, + glade_xml_get_widget (app_data->glade_xml, "imsi_label"), NULL, + G_TYPE_INVALID); + + dbus_g_proxy_begin_call (app_data->proxy, "GetImei", get_str_done, + glade_xml_get_widget (app_data->glade_xml, "imei_label"), NULL, + G_TYPE_INVALID); + + dbus_g_proxy_begin_call (app_data->proxy, "GetInfo", get_card_info_done, + app_data->glade_xml, NULL, + G_TYPE_INVALID); + + dbus_g_proxy_set_interface (app_data->proxy, "org.freedesktop.DBus.Properties"); + + dbus_g_proxy_begin_call (app_data->proxy, "Get", get_property_done, + glade_xml_get_widget (app_data->glade_xml, "driver_label"), NULL, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "Driver", + G_TYPE_INVALID); + + dbus_g_proxy_begin_call (app_data->proxy, "Get", get_property_done, + glade_xml_get_widget (app_data->glade_xml, "device_label"), NULL, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "Device", + G_TYPE_INVALID); + + return FALSE; +} + +static void +got_signal_quality (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + guint32 quality = 0; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_UINT, &quality, G_TYPE_INVALID)) { + g_warning ("%s", error->message); + g_error_free (error); + } else { + char *tmp; + + tmp = g_strdup_printf ("%d%%", quality); + gtk_label_set_text (GTK_LABEL (user_data), tmp); + g_free (tmp); + } +} + +static void +signal_quality_changed (DBusGProxy *proxy, + guint32 signal_quality, + gpointer user_data) +{ + char *tmp; + + tmp = g_strdup_printf ("%d%%", signal_quality); + gtk_label_set_text (GTK_LABEL (user_data), tmp); + g_free (tmp); +} + +static gboolean +monitor_signal_quality (gpointer data) +{ + AppData *app_data = (AppData *) data; + GtkWidget *label; + + label = glade_xml_get_widget (app_data->glade_xml, "signal_quality_label"); + + dbus_g_proxy_add_signal (app_data->gsm_net_proxy, "SignalQuality", G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (app_data->gsm_net_proxy, "SignalQuality", + G_CALLBACK (signal_quality_changed), + label, NULL); + + dbus_g_proxy_begin_call (app_data->gsm_net_proxy, "GetSignalQuality", + got_signal_quality, label, NULL, G_TYPE_INVALID); + + return FALSE; +} + +static void +got_scan_results (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + GPtrArray *array = NULL; + GError *error = NULL; + GType type; + + type = dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_STRING_STRING_HASHTABLE); + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, type, &array, G_TYPE_INVALID)) { + g_warning ("Couldn't scan: %s", error->message); + g_error_free (error); + } else { + GtkTreeIter iter; + int i; + + for (i = 0; i < array->len; i++) { + GHashTable *hash = (GHashTable *) g_ptr_array_index (array, i); + char *status; + const char *status_str; + + status = g_hash_table_lookup (hash, "status"); + if (!strcmp (status, "1")) + status_str = "Available"; + else if (!strcmp (status, "2")) + status_str = "Current"; + else if (!strcmp (status, "3")) + status_str = "Forbidden"; + else + status_str = "Unknown"; + + gtk_list_store_append (app_data->network_store, &iter); + gtk_list_store_set (app_data->network_store, &iter, + SCAN_COL_NAME, g_hash_table_lookup (hash, "operator-long"), + SCAN_COL_STATUS, status_str, + SCAN_COL_OPER_ID, g_hash_table_lookup (hash, "operator-num"), + -1); + + g_hash_table_destroy (hash); + } + + g_ptr_array_free (array, TRUE); + } + + gtk_widget_hide (app_data->scan_dialog); + gtk_widget_set_sensitive (app_data->scan_button, TRUE); +} + +static gboolean +scan_pulse (gpointer data) +{ + GtkProgressBar *bar = GTK_PROGRESS_BAR (data); + + gtk_progress_bar_pulse (bar); + return gdk_window_is_visible (gtk_widget_get_parent_window (GTK_WIDGET (bar))); +} + +static void +scan (GtkButton *button, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + + dbus_g_proxy_begin_call_with_timeout (app_data->gsm_net_proxy, "Scan", got_scan_results, + app_data, NULL, 120000, G_TYPE_INVALID); + + gtk_widget_set_sensitive (app_data->scan_button, FALSE); + gtk_list_store_clear (app_data->network_store); + + g_timeout_add (200, scan_pulse, app_data->scan_progress_bar); + gtk_widget_show (app_data->scan_dialog); +} + +static void +modem_enabled (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)) { + g_warning ("Couldn't enable modem: %s", error->message); + g_error_free (error); + g_main_loop_quit (app_data->main_loop); + return; + } + + g_idle_add (get_info, app_data); + g_idle_add (monitor_signal_quality, app_data); +} + +static void +modem_enable (AppData *app_data) +{ + dbus_g_proxy_begin_call (app_data->proxy, "Enable", modem_enabled, + app_data, NULL, + G_TYPE_BOOLEAN, TRUE, G_TYPE_INVALID); +} + +static void +create_network (const char *name, const char *oper_code) +{ + NMConnection *connection; + NMSettingGsm *s_gsm; + NMSettingSerial *s_serial; + NMSettingPPP *s_ppp; + NMSettingConnection *s_con; + GConfClient *gconf_client; + char *uuid; + + connection = nm_connection_new (); + + s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ()); + g_object_set (s_gsm, + NM_SETTING_GSM_NUMBER, "*99#", + NM_SETTING_GSM_NETWORK_ID, oper_code, + NULL); + + nm_connection_add_setting (connection, NM_SETTING (s_gsm)); + + /* Serial setting */ + s_serial = (NMSettingSerial *) nm_setting_serial_new (); + g_object_set (s_serial, + NM_SETTING_SERIAL_BAUD, 115200, + NM_SETTING_SERIAL_BITS, 8, + NM_SETTING_SERIAL_PARITY, 'n', + NM_SETTING_SERIAL_STOPBITS, 1, + NULL); + + nm_connection_add_setting (connection, NM_SETTING (s_serial)); + + s_ppp = (NMSettingPPP *) nm_setting_ppp_new (); + nm_connection_add_setting (connection, NM_SETTING (s_ppp)); + + s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ()); + uuid = nm_utils_uuid_generate (); + g_object_set (s_con, + NM_SETTING_CONNECTION_ID, name, + NM_SETTING_CONNECTION_TYPE, nm_setting_get_name (NM_SETTING (s_gsm)), + NM_SETTING_CONNECTION_AUTOCONNECT, FALSE, + NM_SETTING_CONNECTION_UUID, uuid, + NULL); + + g_free (uuid); + nm_connection_add_setting (connection, NM_SETTING (s_con)); + + gconf_client = gconf_client_get_default (); + if (gconf_client) { + char *dir = NULL; + int i; + + /* Find free GConf directory */ + for (i = 0; i < G_MAXUINT32; i++) { + char buf[255]; + + snprintf (&buf[0], 255, GCONF_PATH_CONNECTIONS"/%d", i); + if (!gconf_client_dir_exists (gconf_client, buf, NULL)) { + dir = g_strdup (buf); + break; + } + } + + nm_gconf_write_connection (connection, gconf_client, dir); + gconf_client_notify (gconf_client, dir); + gconf_client_suggest_sync (gconf_client, NULL); + g_free (dir); + g_object_unref (gconf_client); + } else + g_warning ("Writing conneciton failed"); + + g_object_unref (connection); +} + +static void +create_network_clicked (GtkButton *button, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + GtkTreeSelection *selection; + GList *selected_rows; + GtkTreeModel *model = NULL; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection (app_data->network_list); + selected_rows = gtk_tree_selection_get_selected_rows (selection, &model); + if (!selected_rows) + return; + + if (gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) selected_rows->data)) { + char *oper_name = NULL; + char *oper_id = NULL; + gint result; + + gtk_tree_model_get (model, &iter, SCAN_COL_NAME, &oper_name, -1); + gtk_tree_model_get (model, &iter, SCAN_COL_OPER_ID, &oper_id, -1); + + gtk_entry_set_text (app_data->create_network_name, oper_name); + gtk_editable_select_region (GTK_EDITABLE (app_data->create_network_name), 0, -1); + gtk_widget_grab_focus (GTK_WIDGET (app_data->create_network_name)); + + result = gtk_dialog_run (app_data->create_network_dialog); + gtk_widget_hide (GTK_WIDGET (app_data->create_network_dialog)); + + if (result == GTK_RESPONSE_OK) + create_network (gtk_entry_get_text (app_data->create_network_name), oper_id); + + g_free (oper_name); + g_free (oper_id); + } + + /* free memory */ + g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL); + g_list_free (selected_rows); +} + +static void +network_list_selection_changed (GtkTreeSelection *selection, gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) + gtk_widget_set_sensitive (app_data->create_net_button, TRUE); + else + gtk_widget_set_sensitive (app_data->create_net_button, FALSE); +} + + +static void +app_data_destroy (AppData *app_data) +{ + if (app_data->bus) + dbus_g_connection_unref (app_data->bus); + + if (app_data->proxy) + g_object_unref (app_data->proxy); + + if (app_data->gsm_net_proxy) + g_object_unref (app_data->gsm_net_proxy); + + if (app_data->glade_xml) + g_object_unref (app_data->glade_xml); + + if (app_data->main_loop) + g_main_loop_unref (app_data->main_loop); + + g_slice_free (AppData, app_data); +} + +static void +close_cb (GtkDialog *dialog, + gint response_id, + gpointer user_data) +{ + AppData *app_data = (AppData *) user_data; + + dbus_g_proxy_set_interface (app_data->proxy, MM_DBUS_INTERFACE_MODEM); + dbus_g_proxy_call_no_reply (app_data->proxy, "Enable", G_TYPE_BOOLEAN, FALSE, G_TYPE_INVALID); + + g_main_loop_quit (app_data->main_loop); + app_data_destroy (app_data); +} + + +static GtkListStore * +prepare_network_list (GtkTreeView *treeview) +{ + GtkListStore *store; + + store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store)); + g_object_unref (store); + + gtk_tree_view_insert_column_with_attributes (treeview, + -1, "Name", gtk_cell_renderer_text_new (), + "text", SCAN_COL_NAME, + NULL); + + gtk_tree_view_insert_column_with_attributes (treeview, + -1, "Status", gtk_cell_renderer_text_new (), + "text", SCAN_COL_STATUS, + NULL); + + return store; +} + +static AppData * +app_data_create (const char *udi) +{ + AppData *app_data; + GtkTreeSelection *selection; + GError *error = NULL; + + app_data = g_slice_new0 (AppData); + + /* DBus */ + app_data->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + if (!app_data->bus) { + g_error ("Couldn't connect to DBus: %s", error->message); + g_error_free (error); + g_slice_free (AppData, app_data); + + return NULL; + } + + app_data->proxy = dbus_g_proxy_new_for_name (app_data->bus, MM_DBUS_SERVICE, udi, MM_DBUS_INTERFACE_MODEM); + app_data->gsm_net_proxy = dbus_g_proxy_new_from_proxy (app_data->proxy, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK, NULL); + + /* UI */ + app_data->glade_xml = glade_xml_new (GLADEDIR "/nm-modem-properties.glade", NULL, NULL); + if (!app_data->glade_xml) { + g_error ("Could not load Glade file"); + g_slice_free (AppData, app_data); + + return NULL; + } + + app_data->main_dialog = GTK_DIALOG (glade_xml_get_widget (app_data->glade_xml, "main_dialog")); + g_signal_connect (app_data->main_dialog, "response", G_CALLBACK (close_cb), app_data); + + app_data->network_list = GTK_TREE_VIEW (glade_xml_get_widget (app_data->glade_xml, "network_list")); + app_data->network_store = prepare_network_list (app_data->network_list); + app_data->scan_button = glade_xml_get_widget (app_data->glade_xml, "scan_button"); + g_signal_connect (app_data->scan_button, "clicked", G_CALLBACK (scan), app_data); + + app_data->scan_dialog = glade_xml_get_widget (app_data->glade_xml, "scan_dialog"); + gtk_window_set_transient_for (GTK_WINDOW (app_data->scan_dialog), GTK_WINDOW (app_data->main_dialog)); + + app_data->scan_progress_bar = GTK_PROGRESS_BAR (glade_xml_get_widget (app_data->glade_xml, "scan_progress_bar")); + + app_data->create_net_button = glade_xml_get_widget (app_data->glade_xml, "create_connection_button"); + gtk_widget_set_sensitive (app_data->create_net_button, FALSE); + g_signal_connect (app_data->create_net_button, "clicked", G_CALLBACK (create_network_clicked), app_data); + selection = gtk_tree_view_get_selection (app_data->network_list); + g_signal_connect (selection, "changed", G_CALLBACK (network_list_selection_changed), app_data); + + app_data->create_network_dialog = GTK_DIALOG (glade_xml_get_widget (app_data->glade_xml, "create_network_dialog")); + app_data->create_network_name = GTK_ENTRY (glade_xml_get_widget (app_data->glade_xml, "create_network_name")); + + app_data->main_loop = g_main_loop_new (NULL, FALSE); + + return app_data; +} + +int +main (int argc, char *argv[]) +{ + //const char *udi = "/org/freedesktop/Hal/devices/usb_device_12d1_1003_noserial_if0_serial_usb_0"; + AppData *app_data; + + if (argc != 2) { + g_print ("Usage: %s <udi>\n", argv[0]); + return 1; + } + + gtk_init (&argc, &argv); + + app_data = app_data_create (argv[1]); + if (app_data) { + modem_enable (app_data); + g_main_loop_run (app_data->main_loop); + } + + return 0; +} diff --git a/src/modems/nm-modem-properties.glade b/src/modems/nm-modem-properties.glade new file mode 100644 index 0000000..5c1285c --- /dev/null +++ b/src/modems/nm-modem-properties.glade @@ -0,0 +1,1083 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> + +<glade-interface> + +<widget class="GtkDialog" id="main_dialog"> + <property name="visible">True</property> + <property name="title" translatable="yes">GSM modem properties</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <property name="has_separator">True</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="closebutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="label_yalign">0.5</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + + <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="info_table"> + <property name="visible">True</property> + <property name="n_rows">8</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">0</property> + <property name="column_spacing">6</property> + + <child> + <widget class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="label" translatable="yes">Vendor</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="label" translatable="yes">Model</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="label" translatable="yes">Version</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="label" translatable="yes">Driver</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="label" translatable="yes">Data device</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="label" translatable="yes">IMSI</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="label" translatable="yes">IMEI</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="label" translatable="yes">Signal quality</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="vendor_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="model_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="version_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="driver_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="device_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="imsi_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="imei_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="signal_quality_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Information</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkFrame" id="frame3"> + <property name="label_xalign">0</property> + <property name="label_yalign">0.5</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + + <child> + <widget class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <placeholder/> + </child> + </widget> + </child> + + <child> + <widget class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>PIN operations</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="label_yalign">0.5</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + + <child> + <widget class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="network_list"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + <property name="rules_hint">False</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + <property name="fixed_height_mode">False</property> + <property name="hover_selection">False</property> + <property name="hover_expand">False</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVButtonBox" id="vbuttonbox1"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_START</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="scan_button"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Scan</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="create_connection_button"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Create connection</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Networks</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="create_network_dialog"> + <property name="title" translatable="yes">Create new connection</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <property name="has_separator">True</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox2"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area2"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">Please choose a name for the connection</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="create_network_name"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">●</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkWindow" id="scan_dialog"> + <property name="title" translatable="yes"></property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> + <property name="modal">True</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">False</property> + <property name="skip_taskbar_hint">True</property> + <property name="skip_pager_hint">True</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_CENTER</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + + <child> + <widget class="GtkVBox" id="vbox3"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="label" translatable="yes">Scanning... Please wait.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkProgressBar" id="scan_progress_bar"> + <property name="visible">True</property> + <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property> + <property name="fraction">0</property> + <property name="pulse_step">0.10000000149</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="pin_dialog"> + <property name="visible">False</property> + <property name="title" translatable="yes">PIN code required</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <property name="has_separator">True</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox3"> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area3"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox4"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="pin_dialog_label"> + <property name="visible">True</property> + <property name="label" translatable="yes">Please enter SIM PIN code</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="pin_dialog_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">●</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +</glade-interface> diff --git a/src/nma-gsm-modem.c b/src/nma-gsm-modem.c new file mode 100644 index 0000000..0dba9cd --- /dev/null +++ b/src/nma-gsm-modem.c @@ -0,0 +1,198 @@ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ + +#include "nma-gsm-modem.h" +#include "mm-types.h" + +G_DEFINE_TYPE (NMAGsmModem, nma_gsm_modem, G_TYPE_OBJECT) + +#define NMA_GSM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMA_TYPE_GSM_MODEM, NMAGsmModemPrivate)) + +typedef struct { + DBusGProxy *proxy; + int signal_quality; + + gboolean disposed; +} NMAGsmModemPrivate; + +enum { + SIGNAL_QUALITY, + NETWORK_MODE, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +signal_quality_proxy (DBusGProxy *proxy, + guint32 signal_quality, + gpointer user_data) +{ + NMAGsmModem *modem = NMA_GSM_MODEM (user_data); + + NMA_GSM_MODEM_GET_PRIVATE (modem)->signal_quality = signal_quality; + + g_signal_emit (modem, signals[SIGNAL_QUALITY], 0, signal_quality); +} + +static void +network_mode_proxy (DBusGProxy *proxy, + guint32 network_mode, + gpointer user_data) +{ + NMAGsmModem *modem = NMA_GSM_MODEM (user_data); + + g_signal_emit (modem, signals[NETWORK_MODE], 0, network_mode); +} + +NMAGsmModem * +nma_gsm_modem_new (DBusGConnection *bus, const char *object_path) +{ + NMAGsmModem *modem; + NMAGsmModemPrivate *priv; + + g_return_val_if_fail (bus != NULL, NULL); + g_return_val_if_fail (object_path != NULL, NULL); + + modem = (NMAGsmModem *) g_object_new (NMA_TYPE_GSM_MODEM, NULL); + if (!modem) + return NULL; + + priv = NMA_GSM_MODEM_GET_PRIVATE (modem); + priv->proxy = dbus_g_proxy_new_for_name (bus, MM_DBUS_SERVICE, object_path, MM_DBUS_INTERFACE_MODEM_GSM); + + dbus_g_proxy_add_signal (priv->proxy, "SignalQuality", G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (priv->proxy, "SignalQuality", + G_CALLBACK (signal_quality_proxy), + modem, + NULL); + + dbus_g_proxy_add_signal (priv->proxy, "NetworkMode", G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (priv->proxy, "NetworkMode", + G_CALLBACK (network_mode_proxy), + modem, + NULL); + + return modem; +} + +guint32 +nma_gsm_modem_get_signal_quality (NMAGsmModem *modem) +{ + NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); + GError *err = NULL; + + g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); + + if (priv->signal_quality == -1) { + if (!dbus_g_proxy_call (priv->proxy, "GetSignalQuality", &err, + G_TYPE_INVALID, + G_TYPE_UINT, &priv->signal_quality, + G_TYPE_INVALID)) { + g_warning ("Error in getting signal quality: %s", err->message); + g_error_free (err); + } + } + + return priv->signal_quality; +} + +guint32 +nma_gsm_modem_get_registration_info (NMAGsmModem *modem, + char **operator_code, + char **operator_name) +{ + NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); + GError *err = NULL; + guint32 status = MM_GSM_MODEM_REG_STATUS_UNKNOWN; + + g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); + + if (!dbus_g_proxy_call (priv->proxy, "GetRegistrationInfo", &err, + G_TYPE_INVALID, + G_TYPE_UINT, &status, + G_TYPE_STRING, operator_code, + G_TYPE_STRING, operator_name, + G_TYPE_INVALID)) { + g_warning ("Error in getting network mode: %s", err->message); + g_error_free (err); + } + + return status; +} + +guint32 +nma_gsm_modem_get_network_mode (NMAGsmModem *modem) +{ + NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); + GError *err = NULL; + guint32 network_mode = 0; + + g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0); + + if (!dbus_g_proxy_call (priv->proxy, "GetNetworkMode", &err, + G_TYPE_INVALID, + G_TYPE_UINT, &network_mode, + G_TYPE_INVALID)) { + g_warning ("Error in getting network mode: %s", err->message); + g_error_free (err); + } + + return network_mode; +} + +static void +nma_gsm_modem_init (NMAGsmModem *modem) +{ + NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem); + + priv->signal_quality = -1; +} + +static void +dispose (GObject *object) +{ + NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (object); + + if (priv->disposed) + return; + + priv->disposed = TRUE; + + if (priv->proxy) + g_object_unref (priv->proxy); + + G_OBJECT_CLASS (nma_gsm_modem_parent_class)->dispose (object); +} + +static void +nma_gsm_modem_class_init (NMAGsmModemClass *modem_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (modem_class); + + g_type_class_add_private (modem_class, sizeof (NMAGsmModemPrivate)); + + /* virtual methods */ + object_class->dispose = dispose; + + /* Signals */ + signals[SIGNAL_QUALITY] = + g_signal_new ("signal-quality", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMAGsmModemClass, signal_quality), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, + G_TYPE_UINT); + + signals[NETWORK_MODE] = + g_signal_new ("network-mode", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMAGsmModemClass, network_mode), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, + G_TYPE_UINT); +} diff --git a/src/nma-gsm-modem.h b/src/nma-gsm-modem.h new file mode 100644 index 0000000..90e7ae0 --- /dev/null +++ b/src/nma-gsm-modem.h @@ -0,0 +1,45 @@ +/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */ + +#ifndef NMA_GSM_MODEM_H +#define NMA_GSM_MODEM_H + +#include <glib/gtypes.h> +#include <glib-object.h> +#include <dbus/dbus-glib.h> + +G_BEGIN_DECLS + +#define NMA_TYPE_GSM_MODEM (nma_gsm_modem_get_type ()) +#define NMA_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModem)) +#define NMA_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NMA_TYPE_GSM_MODEM, NMAGsmModemClass)) +#define NMA_IS_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMA_TYPE_GSM_MODEM)) +#define NMA_IS_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NMA_TYPE_GSM_MODEM)) +#define NMA_GSM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModemClass)) + +typedef struct { + GObject parent; +} NMAGsmModem; + +typedef struct { + GObjectClass parent; + + /* Signals */ + void (*signal_quality) (NMAGsmModem *modem, guint32 signal_quality); + void (*network_mode) (NMAGsmModem *modem, guint32 network_mode); +} NMAGsmModemClass; + +GType nma_gsm_modem_get_type (void); + +NMAGsmModem *nma_gsm_modem_new (DBusGConnection *bus, + const char *object_path); + +guint32 nma_gsm_modem_get_signal_quality (NMAGsmModem *modem); +guint32 nma_gsm_modem_get_registration_info (NMAGsmModem *modem, + char **operator_code, + char **operator_name); + +guint32 nma_gsm_modem_get_network_mode (NMAGsmModem *modem); + +G_END_DECLS + +#endif /* NMA_GSM_MODEM_H */ -- 1.6.0.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor