[PATCH 2/2] nma-bt-device: handle modems from the new `ModemManager1' interface



Needed so that the wizard is launched for the correct modem type.
---
 src/gnome-bluetooth/Makefile.am     |   9 ++
 src/gnome-bluetooth/nma-bt-device.c | 172 +++++++++++++++++++++++++++++++-----
 2 files changed, 158 insertions(+), 23 deletions(-)

diff --git a/src/gnome-bluetooth/Makefile.am b/src/gnome-bluetooth/Makefile.am
index 6679589..dbf5373 100644
--- a/src/gnome-bluetooth/Makefile.am
+++ b/src/gnome-bluetooth/Makefile.am
@@ -22,6 +22,10 @@ plugin_LTLIBRARIES = libnma.la
 
 libnma_la_SOURCES = $(BT_WIDGET_SOURCES)
 
+if WITH_MODEM_MANAGER_1
+libnma_la_CPPFLAGS = $(MM_GLIB_CFLAGS)
+endif
+
 libnma_la_LDFLAGS = -module -avoid-version
 
 libnma_la_LIBADD = \
@@ -29,6 +33,11 @@ libnma_la_LIBADD = \
 	$(top_builddir)/src/utils/libutils.la \
 	$(top_builddir)/src/libnm-gtk/libnm-gtk.la \
 	$(GNOME_BLUETOOTH_LIBS)
+
+if WITH_MODEM_MANAGER_1
+libnma_la_LIBADD += $(MM_GLIB_LIBS)
+endif
+
 endif
 
 EXTRA_DIST = $(BT_WIDGET_SOURCES)
diff --git a/src/gnome-bluetooth/nma-bt-device.c b/src/gnome-bluetooth/nma-bt-device.c
index e1b9f38..968dc89 100644
--- a/src/gnome-bluetooth/nma-bt-device.c
+++ b/src/gnome-bluetooth/nma-bt-device.c
@@ -43,6 +43,10 @@
 #include "nm-utils.h"
 #include "utils.h"
 
+#if WITH_MODEM_MANAGER_1
+#include <libmm-glib.h>
+#endif
+
 #if !GLIB_CHECK_VERSION(2,28,0)
 #define g_clear_object(object_ptr) \
 	G_STMT_START { \
@@ -83,6 +87,11 @@ typedef struct {
 	char *rfcomm_iface;
 	guint dun_timeout_id;
 
+#if WITH_MODEM_MANAGER_1
+	GDBusConnection *dbus_connection;
+	MMManager *modem_manager_1;
+#endif
+
 	GtkWindow *parent_window;
 	NMAMobileWizard *wizard;
 	GtkWindowGroup *window_group;
@@ -122,6 +131,10 @@ static void _set_dun_enabled (NmaBtDevice *device, gboolean enabled);
 #define MM_INTERFACE       "org.freedesktop.ModemManager"
 #define MM_MODEM_INTERFACE "org.freedesktop.ModemManager.Modem"
 
+#if WITH_MODEM_MANAGER_1
+#include <libmm-glib.h>
+#endif
+
 /*********************************************************************/
 
 static gboolean
@@ -283,13 +296,18 @@ dun_cleanup (NmaBtDevice *self)
 	NmaBtDevicePrivate *priv = NMA_BT_DEVICE_GET_PRIVATE (self);
 	GSList *iter;
 
+	/* ModemManager */
 	for (iter = priv->modem_proxies; iter; iter = g_slist_next (iter))
 		g_object_unref (DBUS_G_PROXY (iter->data));
 	g_slist_free (priv->modem_proxies);
 	priv->modem_proxies = NULL;
-
 	g_clear_object (&priv->mm_proxy);
 
+#if WITH_MODEM_MANAGER_1
+	g_clear_object (&priv->dbus_connection);
+	g_clear_object (&priv->modem_manager_1);
+#endif
+
 	if (priv->dun_proxy && priv->rfcomm_iface) {
 		dbus_g_proxy_call_no_reply (priv->dun_proxy, "Disconnect",
 		                            G_TYPE_STRING, priv->rfcomm_iface,
@@ -485,6 +503,38 @@ wizard_done_cb (NMAMobileWizard *wizard,
 }
 
 static void
+start_wizard (NmaBtDevice *self,
+              const gchar *path,
+              NMDeviceType devtype)
+{
+	NmaBtDevicePrivate *priv = NMA_BT_DEVICE_GET_PRIVATE (self);
+
+	if (devtype == NM_DEVICE_TYPE_UNKNOWN) {
+		dun_error (self, __func__, NULL, _("unknown modem type."));
+		return;
+	}
+
+	if (priv->wizard) {
+		g_message ("%s: (%s) oops! not starting Wizard as one is already in progress", __func__, path);
+		return;
+	}
+
+	g_message ("%s: (%s) starting the mobile wizard", __func__, path);
+
+	g_source_remove (priv->dun_timeout_id);
+	priv->dun_timeout_id = 0;
+
+	/* Start the mobile wizard */
+	priv->wizard = nma_mobile_wizard_new (priv->parent_window,
+	                                      priv->window_group,
+	                                      devtype,
+	                                      FALSE,
+	                                      wizard_done_cb,
+	                                      self);
+	nma_mobile_wizard_present (priv->wizard);
+}
+
+static void
 modem_get_all_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
 {
 	NmaBtDevice *self = NMA_BT_DEVICE (user_data);
@@ -544,28 +594,8 @@ modem_get_all_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data)
 
 	g_hash_table_unref (properties);
 
-	if (devtype != NM_DEVICE_TYPE_UNKNOWN) {
-		if (priv->wizard) {
-			g_message ("%s: (%s) oops! not starting Wizard as one is already in progress", __func__, path);
-			goto out;
-		}
-
-		g_message ("%s: (%s) starting the mobile wizard", __func__, path);
-
-		g_source_remove (priv->dun_timeout_id);
-		priv->dun_timeout_id = 0;
-
-		/* Start the mobile wizard */
-		priv->wizard = nma_mobile_wizard_new (priv->parent_window,
-											  priv->window_group,
-											  devtype,
-											  FALSE,
-											  wizard_done_cb,
-											  self);
-		nma_mobile_wizard_present (priv->wizard);
-	} else {
-		dun_error (self, __func__, NULL, _("unknown modem type."));
-	}
+	/* Launch wizard! */
+	start_wizard (self, path, devtype);
 
 out:
 	g_message ("%s: finished", __func__);
@@ -621,6 +651,70 @@ modem_removed (DBusGProxy *proxy, const char *path, gpointer user_data)
 	}
 }
 
+#if WITH_MODEM_MANAGER_1
+
+static void
+modem_object_added (MMManager *modem_manager,
+                    MMObject  *modem_object,
+                    NmaBtDevice *self)
+{
+	NmaBtDevicePrivate *priv = NMA_BT_DEVICE_GET_PRIVATE (self);
+	NMDeviceType devtype = NM_DEVICE_TYPE_UNKNOWN;
+	MMModem *modem_iface;
+	const gchar *path;
+	const gchar *primary_port;
+	const gchar *iface_basename;
+	MMModemCapability caps;
+
+	path = mm_object_get_path (modem_object);
+	g_message ("%s: (%s) modem found", __func__, path);
+
+	/* Ensure we have the 'Modem' interface at least */
+	modem_iface = mm_object_peek_modem (modem_object);
+	g_return_if_fail (modem_iface != NULL);
+
+	/* Get modem's primary port */
+	primary_port = mm_modem_get_primary_port (modem_iface);
+	g_return_if_fail (primary_port != NULL);
+
+	/* Get rfcomm iface name */
+	iface_basename = g_path_get_basename (priv->rfcomm_iface);
+
+	/* If not matched, just return */
+	if (!g_str_equal (primary_port, iface_basename)) {
+		g_message ("%s: (%s) (%s) not the modem we're looking for (%s)",
+		           __func__, path, primary_port, iface_basename);
+		return;
+	}
+
+	/* This is the modem we were waiting for, so keep on */
+	caps = mm_modem_get_current_capabilities (modem_iface);
+	/* CDMA-only? */
+	if (caps == MM_MODEM_CAPABILITY_CDMA_EVDO)
+		devtype = NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO;
+	/* GSM/UMTS-only? */
+	else if (caps == MM_MODEM_CAPABILITY_GSM_UMTS)
+		devtype = NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS;
+	/* LTE? */
+	else if (caps & MM_MODEM_CAPABILITY_LTE)
+		devtype = NM_DEVICE_MODEM_CAPABILITY_LTE;
+	else
+		g_message ("%s: (%s) unknown modem type", __func__, path);
+
+	/* Launch wizard! */
+	start_wizard (self, path, devtype);
+}
+
+static void
+modem_object_removed (MMManager *manager,
+                      MMObject  *modem_object,
+                      NmaBtDevice *self)
+{
+	g_message ("%s: (%s) modem removed", __func__, mm_object_get_path (modem_object));
+}
+
+#endif /* WITH_MODEM_MANAGER_1 */
+
 static void
 dun_connect_cb (DBusGProxy *proxy,
                 DBusGProxyCall *call,
@@ -719,6 +813,38 @@ dun_start (NmaBtDevice *self)
 								 G_CALLBACK (modem_removed), self,
 								 NULL);
 
+#if WITH_MODEM_MANAGER_1
+	/* ModemManager1 stuff */
+	{
+		GError *error = NULL;
+
+		priv->dbus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+		if (!priv->dbus_connection) {
+			dun_error (self, __func__, error, _("error getting bus connection"));
+			g_error_free (error);
+		} else {
+			priv->modem_manager_1 = mm_manager_new_sync (priv->dbus_connection,
+			                                             G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+			                                             NULL,
+			                                             &error);
+			if (!priv->modem_manager_1) {
+				dun_error (self, __func__, error, "error creating modem manager");
+				g_error_free (error);
+			} else {
+				g_signal_connect (priv->modem_manager_1,
+				                  "object-added",
+				                  G_CALLBACK (modem_object_added),
+				                  self);
+				g_signal_connect (priv->modem_manager_1,
+				                  "object-removed",
+				                  G_CALLBACK (modem_object_removed),
+				                  self);
+			}
+		}
+	}
+#endif
+
+	/* Bluez */
 	priv->dun_proxy = dbus_g_proxy_new_for_name (priv->bus,
 	                                             BLUEZ_SERVICE,
 	                                             priv->object_path,
-- 
1.8.0



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]