2247 lines
77 KiB
Diff
2247 lines
77 KiB
Diff
diff --git a/configure.ac b/configure.ac
|
|
index 9e64b77..77ad2ac 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -221,6 +221,7 @@ src/utils/Makefile
|
|
src/gconf-helpers/Makefile
|
|
src/wireless-security/Makefile
|
|
src/connection-editor/Makefile
|
|
+src/modems/Makefile
|
|
icons/Makefile
|
|
po/Makefile.in
|
|
])
|
|
diff --git a/src/Makefile.am b/src/Makefile.am
|
|
index de8ccb4..2be2217 100644
|
|
--- a/src/Makefile.am
|
|
+++ b/src/Makefile.am
|
|
@@ -1,4 +1,4 @@
|
|
-SUBDIRS = marshallers utils gconf-helpers wireless-security connection-editor
|
|
+SUBDIRS = marshallers utils gconf-helpers wireless-security 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 aff002f..760234a 100644
|
|
--- a/src/applet-device-gsm.c
|
|
+++ b/src/applet-device-gsm.c
|
|
@@ -24,6 +24,9 @@
|
|
#include <config.h>
|
|
#endif
|
|
|
|
+#include <sys/types.h>
|
|
+#include <unistd.h>
|
|
+
|
|
#include <glib/gi18n.h>
|
|
#include <gtk/gtkwidget.h>
|
|
#include <gtk/gtkmenuitem.h>
|
|
@@ -39,6 +42,8 @@
|
|
|
|
#include "applet.h"
|
|
#include "applet-device-gsm.h"
|
|
+#include "nma-gsm-modem.h"
|
|
+#include "mm-types.h"
|
|
#include "utils.h"
|
|
|
|
typedef struct {
|
|
@@ -174,6 +179,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;
|
|
@@ -273,40 +322,68 @@ 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 (applet, NOTIFY_URGENCY_LOW,
|
|
- _("Connection Established"),
|
|
- str ? str : _("You are now connected to the GSM network."),
|
|
- "nm-device-wwan", NULL, NULL, NULL, NULL);
|
|
- 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 (applet, NOTIFY_URGENCY_LOW,
|
|
+ _("Connection Established"), msg,
|
|
+ "nm-device-wwan", NULL, NULL, NULL, NULL);
|
|
+
|
|
+ g_free (oper_code);
|
|
+ g_free (oper_name);
|
|
+ g_free (msg);
|
|
}
|
|
|
|
static GdkPixbuf *
|
|
@@ -316,6 +393,7 @@ gsm_get_icon (NMDevice *device,
|
|
char **tip,
|
|
NMApplet *applet)
|
|
{
|
|
+ NMAGsmModem *modem;
|
|
GdkPixbuf *pixbuf = NULL;
|
|
const char *iface;
|
|
NMSettingConnection *s_con = NULL;
|
|
@@ -335,15 +413,40 @@ gsm_get_icon (NMDevice *device,
|
|
*tip = g_strdup_printf (_("Waiting for user authentication on device '%s'..."), iface);
|
|
break;
|
|
case NM_DEVICE_STATE_ACTIVATED:
|
|
- if (s_con) {
|
|
- const char *id;
|
|
-
|
|
- id = nm_setting_connection_get_id (s_con);
|
|
- if (id)
|
|
- *tip = g_strdup_printf (_("Mobile broadband connection '%s'"), id);
|
|
- } else
|
|
- *tip = g_strdup (_("Mobile broadband connection"));
|
|
- pixbuf = applet->wwan_icon;
|
|
+ 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;
|
|
diff --git a/src/connection-editor/page-mobile.c b/src/connection-editor/page-mobile.c
|
|
index 2522ff1..40f2d44 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..3243a6c
|
|
--- /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, "DataDevice",
|
|
+ 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..12ccf06
|
|
--- /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">True</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 */
|