Add a patch for the current nm-applet to make it use ModemManager.
This commit is contained in:
427
nm-applet-r861-use-modem-manager.patch
Normal file
427
nm-applet-r861-use-modem-manager.patch
Normal file
@@ -0,0 +1,427 @@
|
|||||||
|
diff --git a/src/Makefile.am b/src/Makefile.am
|
||||||
|
index de8ccb4..fe60b87 100644
|
||||||
|
--- a/src/Makefile.am
|
||||||
|
+++ b/src/Makefile.am
|
||||||
|
@@ -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 ad125e5..9ae87e1 100644
|
||||||
|
--- a/src/applet-device-gsm.c
|
||||||
|
+++ b/src/applet-device-gsm.c
|
||||||
|
@@ -38,6 +38,8 @@
|
||||||
|
|
||||||
|
#include "applet.h"
|
||||||
|
#include "applet-device-gsm.h"
|
||||||
|
+#include "nma-gsm-modem.h"
|
||||||
|
+#include "mm-types.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
@@ -275,16 +277,64 @@ out:
|
||||||
|
}
|
||||||
|
|
||||||
|
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 state,
|
||||||
|
NMApplet *applet)
|
||||||
|
{
|
||||||
|
- if (state == NM_DEVICE_STATE_ACTIVATED) {
|
||||||
|
- applet_do_notify (applet, NOTIFY_URGENCY_LOW,
|
||||||
|
- _("Connection Established"),
|
||||||
|
- _("You are now connected to the GSM network."),
|
||||||
|
- "nm-device-wwan", NULL, NULL, NULL, NULL);
|
||||||
|
+ NMAGsmModem *modem;
|
||||||
|
+ char *oper_code;
|
||||||
|
+ char *oper_name;
|
||||||
|
+ char *msg;
|
||||||
|
+ guint32 reg_status;
|
||||||
|
+
|
||||||
|
+ if (state != NM_DEVICE_STATE_ACTIVATED)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ 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);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ g_message ("Signal quality: %d", nma_gsm_modem_get_signal_quality (modem));
|
||||||
|
+ g_message ("Network mode: %d", nma_gsm_modem_get_network_mode (modem));
|
||||||
|
+
|
||||||
|
+ oper_code = NULL;
|
||||||
|
+ oper_name = NULL;
|
||||||
|
+
|
||||||
|
+ reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name);
|
||||||
|
+
|
||||||
|
+ g_message ("Reg status: %d code: %s name: %s", reg_status, 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 *
|
||||||
|
@@ -293,6 +343,7 @@ gsm_get_icon (NMDevice *device,
|
||||||
|
char **tip,
|
||||||
|
NMApplet *applet)
|
||||||
|
{
|
||||||
|
+ NMAGsmModem *modem;
|
||||||
|
GdkPixbuf *pixbuf = NULL;
|
||||||
|
const char *iface;
|
||||||
|
|
||||||
|
@@ -306,8 +357,40 @@ gsm_get_icon (NMDevice *device,
|
||||||
|
*tip = g_strdup_printf (_("Running PPP on device %s..."), iface);
|
||||||
|
break;
|
||||||
|
case NM_DEVICE_STATE_ACTIVATED:
|
||||||
|
- *tip = g_strdup (_("GSM 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/mm-types.h b/src/mm-types.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..4c6e514
|
||||||
|
--- /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"
|
||||||
|
+
|
||||||
|
+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/nma-gsm-modem.c b/src/nma-gsm-modem.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..584090b
|
||||||
|
--- /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 */
|
Reference in New Issue
Block a user