aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NetworkManager-r4241-use-modem-manager.patch5569
1 files changed, 0 insertions, 5569 deletions
diff --git a/NetworkManager-r4241-use-modem-manager.patch b/NetworkManager-r4241-use-modem-manager.patch
deleted file mode 100644
index b1258e1f..00000000
--- a/NetworkManager-r4241-use-modem-manager.patch
+++ /dev/null
@@ -1,5569 +0,0 @@
-diff --git a/configure.in b/configure.in
-index e63b313..0c2cdfd 100644
---- a/configure.in
-+++ b/configure.in
-@@ -477,6 +477,7 @@ src/dhcp-manager/Makefile
- src/supplicant-manager/Makefile
- src/ppp-manager/Makefile
- src/dnsmasq-manager/Makefile
-+src/modem-manager/Makefile
- src/backends/Makefile
- libnm-util/libnm-util.pc
- libnm-util/Makefile
-diff --git a/introspection/nm-device-cdma.xml b/introspection/nm-device-cdma.xml
-index 2b43f8f..22a612b 100644
---- a/introspection/nm-device-cdma.xml
-+++ b/introspection/nm-device-cdma.xml
-@@ -2,14 +2,5 @@
-
- <node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
- <interface name="org.freedesktop.NetworkManager.Device.Cdma">
--
-- <signal name="PropertiesChanged">
-- <arg name="properties" type="a{sv}" tp:type="String_Variant_Map">
-- <tp:docstring>
-- A dictionary mapping property names to variant boxed values
-- </tp:docstring>
-- </arg>
-- </signal>
--
- </interface>
- </node>
-diff --git a/introspection/nm-device-gsm.xml b/introspection/nm-device-gsm.xml
-index 650d656..0bf7b08 100644
---- a/introspection/nm-device-gsm.xml
-+++ b/introspection/nm-device-gsm.xml
-@@ -2,14 +2,5 @@
-
- <node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
- <interface name="org.freedesktop.NetworkManager.Device.Gsm">
--
-- <signal name="PropertiesChanged">
-- <arg name="properties" type="a{sv}" tp:type="String_Variant_Map">
-- <tp:docstring>
-- A dictionary mapping property names to variant boxed values
-- </tp:docstring>
-- </arg>
-- </signal>
--
- </interface>
- </node>
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 3c4ce75..3f24eb5 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -5,7 +5,8 @@ SUBDIRS= \
- supplicant-manager \
- ppp-manager \
- backends \
-- dnsmasq-manager
-+ dnsmasq-manager \
-+ modem-manager
-
- INCLUDES = -I${top_srcdir} \
- -I${top_srcdir}/include \
-@@ -15,6 +16,7 @@ INCLUDES = -I${top_srcdir} \
- -I${top_srcdir}/src/dhcp-manager \
- -I${top_srcdir}/src/supplicant-manager \
- -I${top_srcdir}/src/dnsmasq-manager \
-+ -I${top_srcdir}/src/modem-manager \
- -I${top_srcdir}/libnm-util \
- -I${top_srcdir}/callouts
-
-@@ -59,14 +61,6 @@ NetworkManager_SOURCES = \
- nm-activation-request.h \
- nm-properties-changed-signal.c \
- nm-properties-changed-signal.h \
-- nm-serial-device.c \
-- nm-serial-device.h \
-- nm-gsm-device.c \
-- nm-gsm-device.h \
-- nm-cdma-device.c \
-- nm-cdma-device.h \
-- nm-hso-gsm-device.c \
-- nm-hso-gsm-device.h \
- wpa.c \
- wpa.h \
- nm-netlink.c \
-@@ -89,15 +83,6 @@ nm-device-ethernet-glue.h: $(top_srcdir)/introspection/nm-device-ethernet.xml
- nm-device-wifi-glue.h: $(top_srcdir)/introspection/nm-device-wifi.xml
- dbus-binding-tool --prefix=nm_device_wifi --mode=glib-server --output=$@ $<
-
--nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml
-- dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $<
--
--nm-cdma-device-glue.h: $(top_srcdir)/introspection/nm-device-cdma.xml
-- dbus-binding-tool --prefix=nm_cdma_device --mode=glib-server --output=$@ $<
--
--nm-gsm-device-glue.h: $(top_srcdir)/introspection/nm-device-gsm.xml
-- dbus-binding-tool --prefix=nm_gsm_device --mode=glib-server --output=$@ $<
--
- nm-ip4-config-glue.h: $(top_srcdir)/introspection/nm-ip4-config.xml
- dbus-binding-tool --prefix=nm_ip4_config --mode=glib-server --output=$@ $<
-
-@@ -113,9 +98,6 @@ BUILT_SOURCES = \
- nm-device-interface-glue.h \
- nm-device-ethernet-glue.h \
- nm-device-wifi-glue.h \
-- nm-serial-device-glue.h \
-- nm-cdma-device-glue.h \
-- nm-gsm-device-glue.h \
- nm-ip4-config-glue.h \
- nm-active-connection-glue.h \
- nm-dhcp4-config-glue.h
-@@ -150,6 +132,7 @@ NetworkManager_LDADD = \
- ./supplicant-manager/libsupplicant-manager.la \
- ./dnsmasq-manager/libdnsmasq-manager.la \
- ./ppp-manager/libppp-manager.la \
-+ ./modem-manager/libmodem-manager.la \
- ./backends/libnmbackend.la \
- $(top_builddir)/libnm-util/libnm-util.la
-
-diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c
-index 8116e86..127d034 100644
---- a/src/NetworkManagerPolicy.c
-+++ b/src/NetworkManagerPolicy.c
-@@ -35,9 +35,6 @@
- #include "nm-device.h"
- #include "nm-device-wifi.h"
- #include "nm-device-ethernet.h"
--#include "nm-hso-gsm-device.h"
--#include "nm-gsm-device.h"
--#include "nm-cdma-device.h"
- #include "nm-dbus-manager.h"
- #include "nm-setting-ip4-config.h"
- #include "nm-setting-connection.h"
-@@ -236,7 +233,9 @@ get_best_device (NMManager *manager, NMActRequest **out_req)
- }
-
- /* 'hso' devices never get a gateway from the remote end */
-- if (!can_default && !NM_IS_HSO_GSM_DEVICE (dev))
-+ /* FIXME */
-+ /* if (!can_default && !NM_IS_HSO_GSM_DEVICE (dev)) */
-+ if (!can_default)
- continue;
-
- prio = nm_device_get_priority (dev);
-diff --git a/src/modem-manager/Makefile.am b/src/modem-manager/Makefile.am
-new file mode 100644
-index 0000000..5331f65
---- /dev/null
-+++ b/src/modem-manager/Makefile.am
-@@ -0,0 +1,45 @@
-+INCLUDES = \
-+ -I${top_srcdir}/src \
-+ -I${top_srcdir}/include \
-+ -I${top_srcdir}/libnm-util \
-+ -I${top_builddir}/marshallers
-+
-+noinst_LTLIBRARIES = libmodem-manager.la
-+
-+libmodem_manager_la_SOURCES = \
-+ nm-cdma-modem.c \
-+ nm-cdma-modem.h \
-+ nm-gsm-modem.c \
-+ nm-gsm-modem.h \
-+ nm-gsm-modem-hso.c \
-+ nm-gsm-modem-hso.h \
-+ nm-gsm-modem-mbm.c \
-+ nm-gsm-modem-mbm.h \
-+ nm-modem-device.c \
-+ nm-modem-device.h \
-+ nm-modem-manager.h \
-+ nm-modem-manager.c \
-+ nm-modem-types.h
-+
-+libmodem_manager_la_CPPFLAGS = \
-+ $(DBUS_CFLAGS)
-+
-+libmodem_manager_la_LIBADD = \
-+ $(DBUS_LIBS) \
-+ $(top_builddir)/marshallers/libmarshallers.la
-+
-+nm-cdma-device-glue.h: $(top_srcdir)/introspection/nm-device-cdma.xml
-+ dbus-binding-tool --prefix=nm_cdma_device --mode=glib-server --output=$@ $<
-+
-+nm-gsm-device-glue.h: $(top_srcdir)/introspection/nm-device-gsm.xml
-+ dbus-binding-tool --prefix=nm_gsm_device --mode=glib-server --output=$@ $<
-+
-+nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml
-+ dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $<
-+
-+BUILT_SOURCES = \
-+ nm-cdma-device-glue.h \
-+ nm-gsm-device-glue.h \
-+ nm-serial-device-glue.h
-+
-+CLEANFILES = $(BUILT_SOURCES)
-diff --git a/src/modem-manager/nm-cdma-modem.c b/src/modem-manager/nm-cdma-modem.c
-new file mode 100644
-index 0000000..85532c0
---- /dev/null
-+++ b/src/modem-manager/nm-cdma-modem.c
-@@ -0,0 +1,264 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#include <string.h>
-+
-+#include "nm-cdma-modem.h"
-+#include "nm-modem-types.h"
-+#include "nm-device-interface.h"
-+#include "nm-device-private.h"
-+#include "nm-dbus-manager.h"
-+#include "nm-setting-connection.h"
-+#include "nm-setting-cdma.h"
-+#include "nm-utils.h"
-+
-+#include "nm-cdma-device-glue.h"
-+
-+G_DEFINE_TYPE (NMCdmaModem, nm_cdma_modem, NM_TYPE_MODEM_DEVICE)
-+
-+#define NM_CDMA_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CDMA_MODEM, NMCdmaModemPrivate))
-+
-+enum {
-+ MODEM_STATE_BEGIN,
-+ MODEM_STATE_ENABLE,
-+ MODEM_STATE_CONNECT
-+};
-+
-+typedef struct {
-+ int modem_state;
-+} NMCdmaModemPrivate;
-+
-+enum {
-+ SIGNAL_QUALITY,
-+
-+ LAST_SIGNAL
-+};
-+
-+static guint signals[LAST_SIGNAL] = { 0 };
-+
-+NMDevice *
-+nm_cdma_modem_new (const char *path,
-+ const char *data_device,
-+ const char *driver)
-+{
-+ g_return_val_if_fail (path != NULL, NULL);
-+ g_return_val_if_fail (data_device != NULL, NULL);
-+ g_return_val_if_fail (driver != NULL, NULL);
-+
-+ return (NMDevice *) g_object_new (NM_TYPE_CDMA_MODEM,
-+ NM_DEVICE_INTERFACE_UDI, path,
-+ NM_DEVICE_INTERFACE_IFACE, data_device,
-+ NM_DEVICE_INTERFACE_DRIVER, driver,
-+ NM_DEVICE_INTERFACE_MANAGED, TRUE,
-+ NM_MODEM_DEVICE_PATH, path,
-+ NULL);
-+}
-+
-+static NMSetting *
-+get_setting (NMCdmaModem *device, GType setting_type)
-+{
-+ NMActRequest *req;
-+ NMSetting *setting = NULL;
-+
-+ req = nm_device_get_act_request (NM_DEVICE (device));
-+ if (req) {
-+ NMConnection *connection;
-+
-+ connection = nm_act_request_get_connection (req);
-+ if (connection)
-+ setting = nm_connection_get_setting (connection, setting_type);
-+ }
-+
-+ return setting;
-+}
-+
-+static void
-+state_machine (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-+{
-+ NMCdmaModem *modem = NM_CDMA_MODEM (user_data);
-+ NMCdmaModemPrivate *priv = NM_CDMA_MODEM_GET_PRIVATE (modem);
-+ NMSettingCdma *setting;
-+ GError *error = NULL;
-+
-+ setting = NM_SETTING_CDMA (get_setting (modem, NM_TYPE_SETTING_CDMA));
-+
-+ if (call_id)
-+ dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID);
-+
-+ if (error) {
-+ nm_warning ("CDMA modem connection failed: %s", error->message);
-+ nm_device_state_changed (NM_DEVICE (modem), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_NONE);
-+ return;
-+ }
-+
-+ switch (priv->modem_state) {
-+ case MODEM_STATE_BEGIN:
-+ priv->modem_state = MODEM_STATE_ENABLE;
-+ dbus_g_proxy_begin_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (modem), NULL),
-+ "Enable", state_machine,
-+ modem, NULL,
-+ G_TYPE_BOOLEAN, TRUE,
-+ G_TYPE_INVALID);
-+ break;
-+ case MODEM_STATE_ENABLE:
-+ priv->modem_state = MODEM_STATE_CONNECT;
-+ dbus_g_proxy_begin_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (modem), NULL),
-+ "Connect", state_machine,
-+ modem, NULL,
-+ G_TYPE_STRING, nm_setting_cdma_get_number (setting),
-+ G_TYPE_INVALID);
-+ break;
-+ case MODEM_STATE_CONNECT:
-+ nm_device_activate_schedule_stage2_device_config (NM_DEVICE (modem));
-+ break;
-+ default:
-+ nm_warning ("Invalid modem state %d", priv->modem_state);
-+ nm_device_state_changed (NM_DEVICE (modem), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_NONE);
-+ break;
-+ }
-+}
-+
-+static NMActStageReturn
-+real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ NMCdmaModemPrivate *priv = NM_CDMA_MODEM_GET_PRIVATE (device);
-+
-+ priv->modem_state = MODEM_STATE_BEGIN;
-+ state_machine (NULL, NULL, device);
-+
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+}
-+
-+static NMConnection *
-+real_get_best_auto_connection (NMDevice *dev,
-+ GSList *connections,
-+ char **specific_object)
-+{
-+ GSList *iter;
-+
-+ for (iter = connections; iter; iter = g_slist_next (iter)) {
-+ NMConnection *connection = NM_CONNECTION (iter->data);
-+ NMSettingConnection *s_con;
-+
-+ s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
-+ g_assert (s_con);
-+
-+ if (!nm_setting_connection_get_autoconnect (s_con))
-+ continue;
-+
-+ if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME))
-+ continue;
-+
-+ return connection;
-+ }
-+ return NULL;
-+}
-+
-+static void
-+real_connection_secrets_updated (NMDevice *dev,
-+ NMConnection *connection,
-+ GSList *updated_settings,
-+ RequestSecretsCaller caller)
-+{
-+ NMActRequest *req;
-+ gboolean found = FALSE;
-+ GSList *iter;
-+
-+ if (caller == SECRETS_CALLER_PPP) {
-+ NMPPPManager *ppp_manager;
-+ NMSettingCdma *s_cdma = NULL;
-+
-+ ppp_manager = nm_modem_device_get_ppp_manager (NM_MODEM_DEVICE (dev));
-+ g_return_if_fail (ppp_manager != NULL);
-+
-+ s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
-+ if (!s_cdma) {
-+ /* Shouldn't ever happen */
-+ nm_ppp_manager_update_secrets (ppp_manager,
-+ nm_device_get_iface (dev),
-+ NULL,
-+ NULL,
-+ "missing CDMA setting; no secrets could be found.");
-+ } else {
-+ const char *username = nm_setting_cdma_get_username (s_cdma);
-+ const char *password = nm_setting_cdma_get_password (s_cdma);
-+
-+ nm_ppp_manager_update_secrets (ppp_manager,
-+ nm_device_get_iface (dev),
-+ username ? username : "",
-+ password ? password : "",
-+ NULL);
-+ }
-+ return;
-+ }
-+
-+ g_return_if_fail (caller == SECRETS_CALLER_CDMA);
-+ g_return_if_fail (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH);
-+
-+ for (iter = updated_settings; iter; iter = g_slist_next (iter)) {
-+ const char *setting_name = (const char *) iter->data;
-+
-+ if (!strcmp (setting_name, NM_SETTING_CDMA_SETTING_NAME))
-+ found = TRUE;
-+ else
-+ nm_warning ("Ignoring updated secrets for setting '%s'.", setting_name);
-+ }
-+
-+ if (!found)
-+ return;
-+
-+ req = nm_device_get_act_request (dev);
-+ g_assert (req);
-+
-+ g_return_if_fail (nm_act_request_get_connection (req) == connection);
-+
-+ nm_device_activate_schedule_stage1_device_prepare (dev);
-+}
-+
-+static const char *
-+real_get_ppp_name (NMModemDevice *device, NMConnection *connection)
-+{
-+ NMSettingCdma *s_cdma;
-+
-+ s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
-+ g_assert (s_cdma);
-+
-+ return nm_setting_cdma_get_username (s_cdma);
-+}
-+
-+/*****************************************************************************/
-+
-+static void
-+nm_cdma_modem_init (NMCdmaModem *self)
-+{
-+ nm_device_set_device_type (NM_DEVICE (self), NM_DEVICE_TYPE_CDMA);
-+}
-+
-+static void
-+nm_cdma_modem_class_init (NMCdmaModemClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-+ NMModemDeviceClass *modem_class = NM_MODEM_DEVICE_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMCdmaModemPrivate));
-+
-+ /* Virtual methods */
-+ device_class->get_best_auto_connection = real_get_best_auto_connection;
-+ device_class->connection_secrets_updated = real_connection_secrets_updated;
-+ device_class->act_stage1_prepare = real_act_stage1_prepare;
-+ modem_class->get_ppp_name = real_get_ppp_name;
-+
-+ /* Signals */
-+ signals[SIGNAL_QUALITY] =
-+ g_signal_new ("signal-quality",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (NMCdmaModemClass, signal_quality),
-+ NULL, NULL,
-+ g_cclosure_marshal_VOID__UINT,
-+ G_TYPE_NONE, 1,
-+ G_TYPE_UINT);
-+
-+ dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-+ &dbus_glib_nm_cdma_device_object_info);
-+}
-diff --git a/src/modem-manager/nm-cdma-modem.h b/src/modem-manager/nm-cdma-modem.h
-new file mode 100644
-index 0000000..5dc3c14
---- /dev/null
-+++ b/src/modem-manager/nm-cdma-modem.h
-@@ -0,0 +1,36 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_CDMA_MODEM_H
-+#define NM_CDMA_MODEM_H
-+
-+#include <nm-modem-device.h>
-+
-+G_BEGIN_DECLS
-+
-+#define NM_TYPE_CDMA_MODEM (nm_cdma_modem_get_type ())
-+#define NM_CDMA_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CDMA_MODEM, NMCdmaModem))
-+#define NM_CDMA_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CDMA_MODEM, NMCdmaModemClass))
-+#define NM_IS_CDMA_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CDMA_MODEM))
-+#define NM_IS_CDMA_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CDMA_MODEM))
-+#define NM_CDMA_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CDMA_MODEM, NMCdmaModemClass))
-+
-+typedef struct {
-+ NMModemDevice parent;
-+} NMCdmaModem;
-+
-+typedef struct {
-+ NMModemDeviceClass parent;
-+
-+ /* Signals */
-+ void (*signal_quality) (NMCdmaModem *modem, guint32 quality);
-+} NMCdmaModemClass;
-+
-+GType nm_cdma_modem_get_type (void);
-+
-+NMDevice *nm_cdma_modem_new (const char *path,
-+ const char *data_device,
-+ const char *driver);
-+
-+G_END_DECLS
-+
-+#endif /* NM_CDMA_MODEM_H */
-diff --git a/src/modem-manager/nm-gsm-modem-hso.c b/src/modem-manager/nm-gsm-modem-hso.c
-new file mode 100644
-index 0000000..15b79b6
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem-hso.c
-@@ -0,0 +1,348 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#include "nm-gsm-modem-hso.h"
-+#include "nm-device-private.h"
-+#include "nm-device-interface.h"
-+#include "NetworkManagerSystem.h"
-+#include "nm-setting-connection.h"
-+#include "nm-setting-gsm.h"
-+#include "nm-modem-types.h"
-+#include "nm-utils.h"
-+
-+G_DEFINE_TYPE (NMGsmModemHso, nm_gsm_modem_hso, NM_TYPE_GSM_MODEM)
-+
-+#define NM_GSM_MODEM_HSO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_GSM_MODEM_HSO, NMGsmModemHsoPrivate))
-+
-+typedef struct {
-+ char *netdev_iface;
-+ NMIP4Config *pending_ip4_config;
-+} NMGsmModemHsoPrivate;
-+
-+#define HSO_SECRETS_TRIES "gsm-secrets-tries"
-+
-+static char *
-+get_network_device (NMDevice *device)
-+{
-+ char *result = NULL;
-+ GError *error = NULL;
-+ GValue value = { 0, };
-+
-+ if (!dbus_g_proxy_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (device), "org.freedesktop.DBus.Properties"),
-+ "Get", &error,
-+ G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM_GSM_HSO,
-+ G_TYPE_STRING, "NetworkDevice",
-+ G_TYPE_INVALID,
-+ G_TYPE_VALUE, &value,
-+ G_TYPE_INVALID)) {
-+ nm_warning ("Could not get HSO device's network interface: %s", error->message);
-+ g_error_free (error);
-+ } else {
-+ if (G_VALUE_HOLDS_STRING (&value))
-+ result = g_value_dup_string (&value);
-+ else
-+ nm_warning ("Could not get HSO device's network interface: wrong type '%s'",
-+ G_VALUE_TYPE_NAME (&value));
-+
-+ g_value_unset (&value);
-+ }
-+
-+ return result;
-+}
-+
-+NMDevice *
-+nm_gsm_modem_hso_new (const char *path,
-+ const char *data_device,
-+ const char *driver)
-+{
-+ NMDevice *device;
-+
-+ g_return_val_if_fail (path != NULL, NULL);
-+ g_return_val_if_fail (data_device != NULL, NULL);
-+ g_return_val_if_fail (driver != NULL, NULL);
-+
-+ device = (NMDevice *) g_object_new (NM_TYPE_GSM_MODEM_HSO,
-+ NM_DEVICE_INTERFACE_UDI, path,
-+ NM_DEVICE_INTERFACE_IFACE, data_device,
-+ NM_DEVICE_INTERFACE_DRIVER, driver,
-+ NM_DEVICE_INTERFACE_MANAGED, TRUE,
-+ NM_MODEM_DEVICE_PATH, path,
-+ NULL);
-+
-+ if (device) {
-+ NMGsmModemHsoPrivate *priv;
-+
-+ priv = NM_GSM_MODEM_HSO_GET_PRIVATE (device);
-+ priv->netdev_iface = get_network_device (device);
-+ if (!priv->netdev_iface) {
-+ g_object_unref (device);
-+ device = NULL;
-+ }
-+ }
-+
-+ return device;
-+}
-+
-+/*****************************************************************************/
-+
-+static NMSetting *
-+get_setting (NMGsmModemHso *modem, GType setting_type)
-+{
-+ NMActRequest *req;
-+ NMSetting *setting = NULL;
-+
-+ req = nm_device_get_act_request (NM_DEVICE (modem));
-+ if (req) {
-+ NMConnection *connection;
-+
-+ connection = nm_act_request_get_connection (req);
-+ if (connection)
-+ setting = nm_connection_get_setting (connection, setting_type);
-+ }
-+
-+ return setting;
-+}
-+
-+static void
-+hso_auth_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-+{
-+ NMDevice *device = NM_DEVICE (user_data);
-+ GError *error = NULL;
-+
-+ if (dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID))
-+ nm_device_activate_schedule_stage3_ip_config_start (device);
-+ else {
-+ nm_warning ("Authentication failed: %s", error->message);
-+ g_error_free (error);
-+ nm_device_state_changed (device,
-+ NM_DEVICE_STATE_FAILED,
-+ NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED);
-+ }
-+}
-+
-+static void
-+do_hso_auth (NMGsmModemHso *device)
-+{
-+ NMSettingGsm *s_gsm;
-+ const char *username;
-+ const char *password;
-+
-+ s_gsm = NM_SETTING_GSM (get_setting (device, NM_TYPE_SETTING_GSM));
-+ username = nm_setting_gsm_get_username (s_gsm);
-+ password = nm_setting_gsm_get_password (s_gsm);
-+
-+ dbus_g_proxy_begin_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (device), MM_DBUS_INTERFACE_MODEM_GSM_HSO),
-+ "Authenticate", hso_auth_done,
-+ device, NULL,
-+ G_TYPE_STRING, username ? username : "",
-+ G_TYPE_STRING, password ? password : "",
-+ G_TYPE_INVALID);
-+}
-+
-+static NMActStageReturn
-+real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ NMActRequest *req;
-+ NMConnection *connection;
-+ const char *setting_name;
-+ GPtrArray *hints = NULL;
-+ const char *hint1 = NULL, *hint2 = NULL;
-+ guint32 tries;
-+
-+ req = nm_device_get_act_request (device);
-+ g_assert (req);
-+ connection = nm_act_request_get_connection (req);
-+ g_assert (connection);
-+
-+ setting_name = nm_connection_need_secrets (connection, &hints);
-+ if (!setting_name) {
-+ do_hso_auth (NM_GSM_MODEM_HSO (device));
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+ }
-+
-+ if (hints) {
-+ if (hints->len > 0)
-+ hint1 = g_ptr_array_index (hints, 0);
-+ if (hints->len > 1)
-+ hint2 = g_ptr_array_index (hints, 1);
-+ }
-+
-+ nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
-+
-+ tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), HSO_SECRETS_TRIES));
-+ nm_act_request_request_connection_secrets (req,
-+ setting_name,
-+ tries ? TRUE : FALSE,
-+ SECRETS_CALLER_HSO_GSM,
-+ hint1,
-+ hint2);
-+ g_object_set_data (G_OBJECT (connection), HSO_SECRETS_TRIES, GUINT_TO_POINTER (++tries));
-+
-+ if (hints)
-+ g_ptr_array_free (hints, TRUE);
-+
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+}
-+
-+static void
-+get_ip4_config_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-+{
-+ NMDevice *device = NM_DEVICE (user_data);
-+ guint32 ip4_address;
-+ GArray *dns_array;
-+ GError *error = NULL;
-+
-+ if (dbus_g_proxy_end_call (proxy, call_id, &error,
-+ G_TYPE_UINT, &ip4_address,
-+ DBUS_TYPE_G_UINT_ARRAY, &dns_array,
-+ G_TYPE_INVALID)) {
-+
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (device);
-+ NMIP4Address *addr;
-+ int i;
-+
-+ addr = nm_ip4_address_new ();
-+ nm_ip4_address_set_address (addr, ip4_address);
-+ nm_ip4_address_set_prefix (addr, 32);
-+
-+ priv->pending_ip4_config = nm_ip4_config_new ();
-+ nm_ip4_config_take_address (priv->pending_ip4_config, addr);
-+
-+ for (i = 0; i < dns_array->len; i++)
-+ nm_ip4_config_add_nameserver (priv->pending_ip4_config,
-+ g_array_index (dns_array, guint32, i));
-+
-+ nm_device_activate_schedule_stage4_ip_config_get (device);
-+ } else {
-+ nm_warning ("Retrieving IP4 configuration failed: %s", error->message);
-+ g_error_free (error);
-+ nm_device_state_changed (device,
-+ NM_DEVICE_STATE_FAILED,
-+ NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-+ }
-+}
-+
-+static NMActStageReturn
-+real_act_stage3_ip_config_start (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ dbus_g_proxy_begin_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (device), MM_DBUS_INTERFACE_MODEM_GSM_HSO),
-+ "GetIP4Config", get_ip4_config_done,
-+ device, NULL,
-+ G_TYPE_INVALID);
-+
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+}
-+
-+static NMActStageReturn
-+real_act_stage4_get_ip4_config (NMDevice *device,
-+ NMIP4Config **config,
-+ NMDeviceStateReason *reason)
-+{
-+ NMGsmModemHso *self = NM_GSM_MODEM_HSO (device);
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (self);
-+ gboolean no_firmware = FALSE;
-+
-+ nm_device_set_ip_iface (device, priv->netdev_iface);
-+ if (!nm_device_hw_bring_up (device, TRUE, &no_firmware)) {
-+ if (no_firmware)
-+ *reason = NM_DEVICE_STATE_REASON_FIRMWARE_MISSING;
-+ else
-+ *reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
-+ return NM_ACT_STAGE_RETURN_FAILURE;
-+ }
-+
-+ *config = priv->pending_ip4_config;
-+ priv->pending_ip4_config = NULL;
-+
-+ return NM_ACT_STAGE_RETURN_SUCCESS;
-+}
-+
-+static void
-+real_deactivate (NMDevice *device)
-+{
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (device);
-+
-+ if (priv->pending_ip4_config) {
-+ g_object_unref (priv->pending_ip4_config);
-+ priv->pending_ip4_config = NULL;
-+ }
-+
-+ if (priv->netdev_iface) {
-+ nm_system_device_flush_ip4_routes_with_iface (priv->netdev_iface);
-+ nm_system_device_flush_ip4_addresses_with_iface (priv->netdev_iface);
-+ nm_system_device_set_up_down_with_iface (priv->netdev_iface, FALSE, NULL);
-+ }
-+ nm_device_set_ip_iface (device, NULL);
-+
-+ if (NM_DEVICE_CLASS (nm_gsm_modem_hso_parent_class)->deactivate)
-+ NM_DEVICE_CLASS (nm_gsm_modem_hso_parent_class)->deactivate (device);
-+}
-+
-+static gboolean
-+real_hw_is_up (NMDevice *device)
-+{
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (device);
-+ NMDeviceState state;
-+
-+ state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
-+ if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED)
-+ return nm_system_device_is_up_with_iface (priv->netdev_iface);
-+
-+ return TRUE;
-+}
-+
-+static gboolean
-+real_hw_bring_up (NMDevice *device, gboolean *no_firmware)
-+{
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (device);
-+ NMDeviceState state;
-+
-+ state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
-+ if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED)
-+ return nm_system_device_set_up_down_with_iface (priv->netdev_iface, TRUE, no_firmware);
-+
-+ return TRUE;
-+}
-+
-+static void
-+real_connect (NMModemDevice *modem, const char *number)
-+{
-+ nm_device_activate_schedule_stage2_device_config (NM_DEVICE (modem));
-+}
-+
-+/*****************************************************************************/
-+
-+static void
-+nm_gsm_modem_hso_init (NMGsmModemHso *self)
-+{
-+}
-+
-+static void
-+finalize (GObject *object)
-+{
-+ NMGsmModemHsoPrivate *priv = NM_GSM_MODEM_HSO_GET_PRIVATE (object);
-+
-+ g_free (priv->netdev_iface);
-+
-+ G_OBJECT_CLASS (nm_gsm_modem_hso_parent_class)->finalize (object);
-+}
-+
-+static void
-+nm_gsm_modem_hso_class_init (NMGsmModemHsoClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-+ NMModemDeviceClass *modem_class = NM_MODEM_DEVICE_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMGsmModemHsoPrivate));
-+
-+ object_class->finalize = finalize;
-+
-+ device_class->act_stage2_config = real_act_stage2_config;
-+ device_class->act_stage3_ip_config_start = real_act_stage3_ip_config_start;
-+ device_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config;
-+ device_class->deactivate = real_deactivate;
-+ device_class->hw_is_up = real_hw_is_up;
-+ device_class->hw_bring_up = real_hw_bring_up;
-+
-+ modem_class->connect = real_connect;
-+}
-diff --git a/src/modem-manager/nm-gsm-modem-hso.h b/src/modem-manager/nm-gsm-modem-hso.h
-new file mode 100644
-index 0000000..9b16b0b
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem-hso.h
-@@ -0,0 +1,33 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_GSM_MODEM_HSO_H
-+#define NM_GSM_MODEM_HSO_H
-+
-+#include <nm-gsm-modem.h>
-+
-+G_BEGIN_DECLS
-+
-+#define NM_TYPE_GSM_MODEM_HSO (nm_gsm_modem_hso_get_type ())
-+#define NM_GSM_MODEM_HSO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_GSM_MODEM_HSO, NMGsmModemHso))
-+#define NM_GSM_MODEM_HSO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_GSM_MODEM_HSO, NMGsmModemHsoClass))
-+#define NM_IS_GSM_MODEM_HSO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_GSM_MODEM_HSO))
-+#define NM_IS_GSM_MODEM_HSO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_GSM_MODEM_HSO))
-+#define NM_GSM_MODEM_HSO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_GSM_MODEM_HSO, NMGsmModemHsoClass))
-+
-+typedef struct {
-+ NMGsmModem parent;
-+} NMGsmModemHso;
-+
-+typedef struct {
-+ NMGsmModemClass parent;
-+} NMGsmModemHsoClass;
-+
-+GType nm_gsm_modem_hso_get_type (void);
-+
-+NMDevice *nm_gsm_modem_hso_new (const char *path,
-+ const char *data_device,
-+ const char *driver);
-+
-+G_END_DECLS
-+
-+#endif /* NM_GSM_MODEM_HSO_H */
-diff --git a/src/modem-manager/nm-gsm-modem-mbm.c b/src/modem-manager/nm-gsm-modem-mbm.c
-new file mode 100644
-index 0000000..37ca844
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem-mbm.c
-@@ -0,0 +1,261 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+/*
-+ Additions to NetworkManager, network-manager-applet and modemmanager
-+ for supporting Ericsson modules like F3507g.
-+
-+ Author: Per Hallsmark <per@hallsmark.se>
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+
-+*/
-+
-+#include "nm-gsm-modem-mbm.h"
-+#include "nm-device-private.h"
-+#include "nm-device-interface.h"
-+#include "NetworkManagerSystem.h"
-+#include "nm-setting-connection.h"
-+#include "nm-setting-gsm.h"
-+#include "nm-modem-types.h"
-+#include "nm-utils.h"
-+
-+G_DEFINE_TYPE (NMGsmModemMbm, nm_gsm_modem_mbm, NM_TYPE_GSM_MODEM)
-+
-+#define NM_GSM_MODEM_MBM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_GSM_MODEM_MBM, NMGsmModemMbmPrivate))
-+
-+typedef struct {
-+ char *netdev_iface;
-+ NMIP4Config *pending_ip4_config;
-+} NMGsmModemMbmPrivate;
-+
-+#define MBM_SECRETS_TRIES "gsm-secrets-tries"
-+
-+static char *
-+get_network_device (NMDevice *device)
-+{
-+ char *result = NULL;
-+ GError *error = NULL;
-+ GValue value = { 0, };
-+
-+ if (!dbus_g_proxy_call (nm_modem_device_get_proxy (NM_MODEM_DEVICE (device), "org.freedesktop.DBus.Properties"),
-+ "Get", &error,
-+ G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM_GSM_MBM,
-+ G_TYPE_STRING, "NetworkDevice",
-+ G_TYPE_INVALID,
-+ G_TYPE_VALUE, &value,
-+ G_TYPE_INVALID)) {
-+ nm_warning ("Could not get MBM device's network interface: %s", error->message);
-+ g_error_free (error);
-+ } else {
-+ if (G_VALUE_HOLDS_STRING (&value))
-+ result = g_value_dup_string (&value);
-+ else
-+ nm_warning ("Could not get MBM device's network interface: wrong type '%s'",
-+ G_VALUE_TYPE_NAME (&value));
-+
-+ g_value_unset (&value);
-+ }
-+
-+ return result;
-+}
-+
-+NMDevice *
-+nm_gsm_modem_mbm_new (const char *path,
-+ const char *data_device,
-+ const char *driver)
-+{
-+ NMDevice *device;
-+
-+ g_return_val_if_fail (path != NULL, NULL);
-+ g_return_val_if_fail (data_device != NULL, NULL);
-+ g_return_val_if_fail (driver != NULL, NULL);
-+
-+ device = (NMDevice *) g_object_new (NM_TYPE_GSM_MODEM_MBM,
-+ NM_DEVICE_INTERFACE_UDI, path,
-+ NM_DEVICE_INTERFACE_IFACE, data_device,
-+ NM_DEVICE_INTERFACE_DRIVER, driver,
-+ NM_DEVICE_INTERFACE_MANAGED, TRUE,
-+ NM_MODEM_DEVICE_PATH, path,
-+ NULL);
-+
-+ if (device) {
-+ NMGsmModemMbmPrivate *priv;
-+
-+ priv = NM_GSM_MODEM_MBM_GET_PRIVATE (device);
-+ priv->netdev_iface = get_network_device (device);
-+ if (!priv->netdev_iface) {
-+ g_object_unref (device);
-+ device = NULL;
-+ }
-+ }
-+
-+ return device;
-+}
-+
-+/*****************************************************************************/
-+
-+#if 0
-+static NMSetting *
-+get_setting (NMGsmModemMbm *modem, GType setting_type)
-+{
-+ NMActRequest *req;
-+ NMSetting *setting = NULL;
-+
-+ req = nm_device_get_act_request (NM_DEVICE (modem));
-+ if (req) {
-+ NMConnection *connection;
-+
-+ connection = nm_act_request_get_connection (req);
-+ if (connection)
-+ setting = nm_connection_get_setting (connection, setting_type);
-+ }
-+
-+ return setting;
-+}
-+#endif
-+
-+#if 0
-+static NMActStageReturn
-+real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ NMActRequest *req;
-+ NMConnection *connection;
-+ const char *setting_name;
-+ GPtrArray *hints = NULL;
-+ const char *hint1 = NULL, *hint2 = NULL;
-+ guint32 tries;
-+
-+ req = nm_device_get_act_request (device);
-+ g_assert (req);
-+ connection = nm_act_request_get_connection (req);
-+ g_assert (connection);
-+
-+ setting_name = nm_connection_need_secrets (connection, &hints);
-+ if (!setting_name) {
-+ // do_mbm_auth (NM_GSM_MODEM_MBM (device));
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+ }
-+
-+ if (hints) {
-+ if (hints->len > 0)
-+ hint1 = g_ptr_array_index (hints, 0);
-+ if (hints->len > 1)
-+ hint2 = g_ptr_array_index (hints, 1);
-+ }
-+
-+ nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
-+
-+ tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), MBM_SECRETS_TRIES));
-+ nm_act_request_request_connection_secrets (req,
-+ setting_name,
-+ tries ? TRUE : FALSE,
-+ SECRETS_CALLER_MBM_GSM,
-+ hint1,
-+ hint2);
-+ g_object_set_data (G_OBJECT (connection), MBM_SECRETS_TRIES, GUINT_TO_POINTER (++tries));
-+
-+ if (hints)
-+ g_ptr_array_free (hints, TRUE);
-+
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+}
-+#endif
-+
-+static void
-+real_deactivate (NMDevice *device)
-+{
-+ NMGsmModemMbmPrivate *priv = NM_GSM_MODEM_MBM_GET_PRIVATE (device);
-+
-+ if (priv->pending_ip4_config) {
-+ g_object_unref (priv->pending_ip4_config);
-+ priv->pending_ip4_config = NULL;
-+ }
-+
-+ if (priv->netdev_iface) {
-+ nm_system_device_flush_ip4_routes_with_iface (priv->netdev_iface);
-+ nm_system_device_flush_ip4_addresses_with_iface (priv->netdev_iface);
-+ nm_system_device_set_up_down_with_iface (priv->netdev_iface, FALSE, NULL);
-+ }
-+ nm_device_set_ip_iface (device, NULL);
-+
-+ if (NM_DEVICE_CLASS (nm_gsm_modem_mbm_parent_class)->deactivate)
-+ NM_DEVICE_CLASS (nm_gsm_modem_mbm_parent_class)->deactivate (device);
-+}
-+
-+static gboolean
-+real_hw_is_up (NMDevice *device)
-+{
-+ NMGsmModemMbmPrivate *priv = NM_GSM_MODEM_MBM_GET_PRIVATE (device);
-+
-+ if (priv->netdev_iface)
-+ return nm_system_device_is_up_with_iface (priv->netdev_iface);
-+
-+ return TRUE;
-+}
-+
-+static gboolean
-+real_hw_bring_up (NMDevice *device, gboolean *no_firmware)
-+{
-+ NMGsmModemMbmPrivate *priv = NM_GSM_MODEM_MBM_GET_PRIVATE (device);
-+
-+ if (priv->netdev_iface)
-+ return nm_system_device_set_up_down_with_iface (priv->netdev_iface, TRUE, no_firmware);
-+
-+ return TRUE;
-+}
-+
-+static void
-+real_connect (NMModemDevice *modem, const char *number)
-+{
-+ nm_device_activate_schedule_stage2_device_config (NM_DEVICE (modem));
-+}
-+
-+/*****************************************************************************/
-+
-+static void
-+nm_gsm_modem_mbm_init (NMGsmModemMbm *self)
-+{
-+}
-+
-+static void
-+finalize (GObject *object)
-+{
-+ NMGsmModemMbmPrivate *priv = NM_GSM_MODEM_MBM_GET_PRIVATE (object);
-+
-+ g_free (priv->netdev_iface);
-+
-+ G_OBJECT_CLASS (nm_gsm_modem_mbm_parent_class)->finalize (object);
-+}
-+
-+static void
-+nm_gsm_modem_mbm_class_init (NMGsmModemMbmClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-+ NMModemDeviceClass *modem_class = NM_MODEM_DEVICE_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMGsmModemMbmPrivate));
-+
-+ object_class->finalize = finalize;
-+
-+#if 0
-+ device_class->act_stage2_config = real_act_stage2_config;
-+#endif
-+ device_class->deactivate = real_deactivate;
-+ device_class->hw_is_up = real_hw_is_up;
-+ device_class->hw_bring_up = real_hw_bring_up;
-+
-+ modem_class->connect = real_connect;
-+}
-diff --git a/src/modem-manager/nm-gsm-modem-mbm.h b/src/modem-manager/nm-gsm-modem-mbm.h
-new file mode 100644
-index 0000000..1f49fda
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem-mbm.h
-@@ -0,0 +1,54 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+/*
-+ Additions to NetworkManager, network-manager-applet and modemmanager
-+ for supporting Ericsson modules like F3507g.
-+
-+ Author: Per Hallsmark <per@hallsmark.se>
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+
-+*/
-+
-+#ifndef NM_GSM_MODEM_MBM_H
-+#define NM_GSM_MODEM_MBM_H
-+
-+#include <nm-gsm-modem.h>
-+
-+G_BEGIN_DECLS
-+
-+#define NM_TYPE_GSM_MODEM_MBM (nm_gsm_modem_mbm_get_type ())
-+#define NM_GSM_MODEM_MBM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_GSM_MODEM_MBM, NMGsmModemMbm))
-+#define NM_GSM_MODEM_MBM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_GSM_MODEM_MBM, NMGsmModemMbmClass))
-+#define NM_IS_GSM_MODEM_MBM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_GSM_MODEM_MBM))
-+#define NM_IS_GSM_MODEM_MBM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_GSM_MODEM_MBM))
-+#define NM_GSM_MODEM_MBM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_GSM_MODEM_MBM, NMGsmModemMbmClass))
-+
-+typedef struct {
-+ NMGsmModem parent;
-+} NMGsmModemMbm;
-+
-+typedef struct {
-+ NMGsmModemClass parent;
-+} NMGsmModemMbmClass;
-+
-+GType nm_gsm_modem_mbm_get_type (void);
-+
-+NMDevice *nm_gsm_modem_mbm_new (const char *path, const char *data_device,
-+ const char *driver);
-+
-+G_END_DECLS
-+
-+#endif /* NM_GSM_MODEM_MBM_H */
-diff --git a/src/modem-manager/nm-gsm-modem.c b/src/modem-manager/nm-gsm-modem.c
-new file mode 100644
-index 0000000..047e76c
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem.c
-@@ -0,0 +1,354 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#include <string.h>
-+#include "nm-gsm-modem.h"
-+#include "nm-device-private.h"
-+#include "nm-device-interface.h"
-+#include "nm-setting-connection.h"
-+#include "nm-setting-gsm.h"
-+#include "nm-modem-types.h"
-+#include "nm-utils.h"
-+
-+#include "nm-gsm-device-glue.h"
-+
-+G_DEFINE_TYPE (NMGsmModem, nm_gsm_modem, NM_TYPE_MODEM_DEVICE)
-+
-+#define NM_GSM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_GSM_MODEM, NMGsmModemPrivate))
-+
-+enum {
-+ MODEM_STATE_BEGIN,
-+ MODEM_STATE_ENABLE,
-+ MODEM_STATE_SET_PIN,
-+ MODEM_STATE_SET_APN,
-+ MODEM_STATE_SET_BAND,
-+ MODEM_STATE_SET_NETWORK_MODE,
-+ MODEM_STATE_REGISTER,
-+ MODEM_STATE_FAILED,
-+};
-+
-+typedef struct {
-+ int modem_state;
-+} NMGsmModemPrivate;
-+
-+NMDevice *
-+nm_gsm_modem_new (const char *path,
-+ const char *data_device,
-+ const char *driver)
-+{
-+ g_return_val_if_fail (path != NULL, NULL);
-+ g_return_val_if_fail (data_device != NULL, NULL);
-+ g_return_val_if_fail (driver != NULL, NULL);
-+
-+ return (NMDevice *) g_object_new (NM_TYPE_GSM_MODEM,
-+ NM_DEVICE_INTERFACE_UDI, path,
-+ NM_DEVICE_INTERFACE_IFACE, data_device,
-+ NM_DEVICE_INTERFACE_DRIVER, driver,
-+ NM_DEVICE_INTERFACE_MANAGED, TRUE,
-+ NM_MODEM_DEVICE_PATH, path,
-+ NULL);
-+}
-+
-+static NMSetting *
-+get_setting (NMGsmModem *modem, GType setting_type)
-+{
-+ NMActRequest *req;
-+ NMSetting *setting = NULL;
-+
-+ req = nm_device_get_act_request (NM_DEVICE (modem));
-+ if (req) {
-+ NMConnection *connection;
-+
-+ connection = nm_act_request_get_connection (req);
-+ if (connection)
-+ setting = nm_connection_get_setting (connection, setting_type);
-+ }
-+
-+ return setting;
-+}
-+
-+#define get_proxy(dev,iface) (nm_modem_device_get_proxy(NM_MODEM_DEVICE (dev), iface))
-+
-+static void
-+state_machine (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-+{
-+ NMGsmModem *modem = NM_GSM_MODEM (user_data);
-+ NMGsmModemPrivate *priv = NM_GSM_MODEM_GET_PRIVATE (modem);
-+ NMSettingGsm *setting;
-+ const char *secret = NULL;
-+ const char *secret_name = NULL;
-+ const char *str;
-+ GError *error = NULL;
-+ int i;
-+ gboolean retry_secret = FALSE;
-+
-+ setting = NM_SETTING_GSM (get_setting (modem, NM_TYPE_SETTING_GSM));
-+
-+ if (call_id)
-+ dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID);
-+
-+ if (error) {
-+ g_debug ("%s", dbus_g_error_get_name (error));
-+
-+ if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PIN)) {
-+ secret = nm_setting_gsm_get_pin (setting);
-+ secret_name = NM_SETTING_GSM_PIN;
-+ priv->modem_state = MODEM_STATE_SET_PIN;
-+ } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PUK)) {
-+ secret = nm_setting_gsm_get_puk (setting);
-+ secret_name = NM_SETTING_GSM_PUK;
-+ priv->modem_state = MODEM_STATE_SET_PIN;
-+ } else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_WRONG)) {
-+ g_object_set (setting, NM_SETTING_GSM_PIN, NULL, NULL);
-+ secret_name = NM_SETTING_GSM_PIN;
-+ retry_secret = TRUE;
-+ priv->modem_state = MODEM_STATE_SET_PIN;
-+ }
-+
-+ /* FIXME: Hacks to ignore failures of setting band and network mode for now
-+ since only Huawei module supports it. Remove when ModemManager rules.
-+ */
-+ else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED) &&
-+ (priv->modem_state == MODEM_STATE_SET_BAND ||
-+ priv->modem_state == MODEM_STATE_SET_NETWORK_MODE)) {
-+
-+ nm_warning ("Modem does not support setting %s, ignoring",
-+ priv->modem_state == MODEM_STATE_SET_BAND ? "band" : "network mode");
-+ } else {
-+ priv->modem_state = MODEM_STATE_FAILED;
-+ nm_warning ("GSM modem connection failed: %s", error->message);
-+ }
-+
-+ g_error_free (error);
-+ }
-+
-+ again:
-+
-+ switch (priv->modem_state) {
-+ case MODEM_STATE_BEGIN:
-+ priv->modem_state = MODEM_STATE_ENABLE;
-+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM),
-+ "Enable", state_machine,
-+ modem, NULL,
-+ G_TYPE_BOOLEAN, TRUE,
-+ G_TYPE_INVALID);
-+ break;
-+
-+ case MODEM_STATE_SET_PIN:
-+ if (secret) {
-+ priv->modem_state = MODEM_STATE_ENABLE;
-+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_CARD),
-+ "SendPin", state_machine,
-+ modem, NULL,
-+ G_TYPE_STRING, secret,
-+ G_TYPE_INVALID);
-+ } else {
-+ nm_device_state_changed (NM_DEVICE (modem), NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
-+ nm_act_request_request_connection_secrets (nm_device_get_act_request (NM_DEVICE (modem)),
-+ NM_SETTING_GSM_SETTING_NAME,
-+ retry_secret,
-+ SECRETS_CALLER_GSM,
-+ secret_name,
-+ NULL);
-+
-+ }
-+ break;
-+
-+ case MODEM_STATE_ENABLE:
-+ priv->modem_state = MODEM_STATE_SET_APN;
-+ str = nm_setting_gsm_get_apn (setting);
-+
-+ if (str)
-+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK),
-+ "SetApn", state_machine,
-+ modem, NULL,
-+ G_TYPE_STRING, str,
-+ G_TYPE_INVALID);
-+ else
-+ goto again;
-+
-+ break;
-+ case MODEM_STATE_SET_APN:
-+ priv->modem_state = MODEM_STATE_SET_BAND;
-+ i = nm_setting_gsm_get_band (setting);
-+
-+ if (i)
-+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK),
-+ "SetBand", state_machine,
-+ modem, NULL,
-+ G_TYPE_UINT, (guint32) i,
-+ G_TYPE_INVALID);
-+ else
-+ goto again;
-+
-+ break;
-+
-+ case MODEM_STATE_SET_BAND:
-+ priv->modem_state = MODEM_STATE_SET_NETWORK_MODE;
-+ i = nm_setting_gsm_get_network_type (setting);
-+
-+ if (i)
-+ dbus_g_proxy_begin_call (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK),
-+ "SetNetworkMode", state_machine,
-+ modem, NULL,
-+ G_TYPE_UINT, (guint32) i,
-+ G_TYPE_INVALID);
-+ else
-+ goto again;
-+
-+ break;
-+
-+ case MODEM_STATE_SET_NETWORK_MODE:
-+ priv->modem_state = MODEM_STATE_REGISTER;
-+
-+ str = nm_setting_gsm_get_network_id (setting);
-+ dbus_g_proxy_begin_call_with_timeout (get_proxy (modem, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK),
-+ "Register", state_machine,
-+ modem, NULL, 120000,
-+ G_TYPE_STRING, str ? str : "",
-+ G_TYPE_INVALID);
-+ break;
-+
-+ case MODEM_STATE_REGISTER:
-+ nm_modem_device_connect (NM_MODEM_DEVICE (modem), nm_setting_gsm_get_number (setting));
-+ break;
-+ case MODEM_STATE_FAILED:
-+ default:
-+ nm_device_state_changed (NM_DEVICE (modem), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_NONE);
-+ break;
-+ }
-+}
-+
-+static NMActStageReturn
-+real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ NMGsmModemPrivate *priv = NM_GSM_MODEM_GET_PRIVATE (device);
-+
-+ priv->modem_state = MODEM_STATE_BEGIN;
-+ state_machine (NULL, NULL, device);
-+
-+ return NM_ACT_STAGE_RETURN_POSTPONE;
-+}
-+
-+static NMConnection *
-+real_get_best_auto_connection (NMDevice *dev,
-+ GSList *connections,
-+ char **specific_object)
-+{
-+ GSList *iter;
-+
-+ for (iter = connections; iter; iter = g_slist_next (iter)) {
-+ NMConnection *connection = NM_CONNECTION (iter->data);
-+ NMSettingConnection *s_con;
-+
-+ s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
-+ g_assert (s_con);
-+
-+ if (!nm_setting_connection_get_autoconnect (s_con))
-+ continue;
-+
-+ if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_GSM_SETTING_NAME))
-+ continue;
-+
-+ return connection;
-+ }
-+ return NULL;
-+}
-+
-+static void
-+real_connection_secrets_updated (NMDevice *dev,
-+ NMConnection *connection,
-+ GSList *updated_settings,
-+ RequestSecretsCaller caller)
-+{
-+ NMActRequest *req;
-+ gboolean found = FALSE;
-+ GSList *iter;
-+
-+ if (caller == SECRETS_CALLER_PPP) {
-+ NMPPPManager *ppp_manager;
-+ NMSettingGsm *s_gsm = NULL;
-+
-+ ppp_manager = nm_modem_device_get_ppp_manager (NM_MODEM_DEVICE (dev));
-+ g_return_if_fail (ppp_manager != NULL);
-+
-+ s_gsm = (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM);
-+ if (!s_gsm) {
-+ /* Shouldn't ever happen */
-+ nm_ppp_manager_update_secrets (ppp_manager,
-+ nm_device_get_iface (dev),
-+ NULL,
-+ NULL,
-+ "missing GSM setting; no secrets could be found.");
-+ } else {
-+ const char *username = nm_setting_gsm_get_username (s_gsm);
-+ const char *password = nm_setting_gsm_get_password (s_gsm);
-+
-+ nm_ppp_manager_update_secrets (ppp_manager,
-+ nm_device_get_iface (dev),
-+ username ? username : "",
-+ password ? password : "",
-+ NULL);
-+ }
-+ return;
-+ }
-+
-+ g_return_if_fail (caller == SECRETS_CALLER_GSM);
-+ g_return_if_fail (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH);
-+
-+ for (iter = updated_settings; iter; iter = g_slist_next (iter)) {
-+ const char *setting_name = (const char *) iter->data;
-+
-+ if (!strcmp (setting_name, NM_SETTING_GSM_SETTING_NAME))
-+ found = TRUE;
-+ else
-+ nm_warning ("Ignoring updated secrets for setting '%s'.", setting_name);
-+ }
-+
-+ if (!found)
-+ return;
-+
-+ req = nm_device_get_act_request (dev);
-+ g_assert (req);
-+
-+ g_return_if_fail (nm_act_request_get_connection (req) == connection);
-+
-+ nm_device_activate_schedule_stage1_device_prepare (dev);
-+}
-+
-+static const char *
-+real_get_ppp_name (NMModemDevice *device, NMConnection *connection)
-+{
-+ NMSettingGsm *s_gsm;
-+
-+ s_gsm = (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM);
-+ g_assert (s_gsm);
-+
-+ return nm_setting_gsm_get_username (s_gsm);
-+}
-+
-+/*****************************************************************************/
-+
-+static void
-+nm_gsm_modem_init (NMGsmModem *self)
-+{
-+ nm_device_set_device_type (NM_DEVICE (self), NM_DEVICE_TYPE_GSM);
-+}
-+
-+static void
-+nm_gsm_modem_class_init (NMGsmModemClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-+ NMModemDeviceClass *modem_class = NM_MODEM_DEVICE_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMGsmModemPrivate));
-+
-+ /* Virtual methods */
-+ device_class->get_best_auto_connection = real_get_best_auto_connection;
-+ device_class->connection_secrets_updated = real_connection_secrets_updated;
-+ device_class->act_stage1_prepare = real_act_stage1_prepare;
-+ modem_class->get_ppp_name = real_get_ppp_name;
-+
-+ dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-+ &dbus_glib_nm_gsm_device_object_info);
-+}
-diff --git a/src/modem-manager/nm-gsm-modem.h b/src/modem-manager/nm-gsm-modem.h
-new file mode 100644
-index 0000000..8df8265
---- /dev/null
-+++ b/src/modem-manager/nm-gsm-modem.h
-@@ -0,0 +1,36 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_GSM_MODEM_H
-+#define NM_GSM_MODEM_H
-+
-+#include <nm-modem-device.h>
-+
-+G_BEGIN_DECLS
-+
-+#define NM_TYPE_GSM_MODEM (nm_gsm_modem_get_type ())
-+#define NM_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_GSM_MODEM, NMGsmModem))
-+#define NM_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_GSM_MODEM, NMGsmModemClass))
-+#define NM_IS_GSM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_GSM_MODEM))
-+#define NM_IS_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_GSM_MODEM))
-+#define NM_GSM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_GSM_MODEM, NMGsmModemClass))
-+
-+typedef struct {
-+ NMModemDevice parent;
-+} NMGsmModem;
-+
-+typedef struct {
-+ NMModemDeviceClass parent;
-+
-+ /* Signals */
-+ void (*signal_quality) (NMGsmModem *modem, guint32 quality);
-+} NMGsmModemClass;
-+
-+GType nm_gsm_modem_get_type (void);
-+
-+NMDevice *nm_gsm_modem_new (const char *path,
-+ const char *data_device,
-+ const char *driver);
-+
-+G_END_DECLS
-+
-+#endif /* NM_GSM_MODEM_H */
-diff --git a/src/modem-manager/nm-modem-device.c b/src/modem-manager/nm-modem-device.c
-new file mode 100644
-index 0000000..1f49acc
---- /dev/null
-+++ b/src/modem-manager/nm-modem-device.c
-@@ -0,0 +1,457 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#include <string.h>
-+#include "nm-modem-device.h"
-+#include "nm-device-private.h"
-+#include "nm-device-interface.h"
-+#include "nm-dbus-manager.h"
-+#include "nm-setting-connection.h"
-+#include "nm-setting-gsm.h"
-+#include "nm-setting-cdma.h"
-+#include "nm-marshal.h"
-+#include "nm-properties-changed-signal.h"
-+#include "nm-modem-types.h"
-+#include "nm-utils.h"
-+#include "nm-serial-device-glue.h"
-+
-+G_DEFINE_TYPE (NMModemDevice, nm_modem_device, NM_TYPE_DEVICE)
-+
-+#define NM_MODEM_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM_DEVICE, NMModemDevicePrivate))
-+
-+enum {
-+ PROP_0,
-+ PROP_PATH,
-+
-+ LAST_PROP
-+};
-+
-+typedef struct {
-+ NMDBusManager *dbus_mgr;
-+ char *path;
-+ DBusGProxy *proxy;
-+ NMPPPManager *ppp_manager;
-+ NMIP4Config *pending_ip4_config;
-+
-+ guint state_to_disconnected_id;
-+
-+ /* PPP stats */
-+ guint32 in_bytes;
-+ guint32 out_bytes;
-+} NMModemDevicePrivate;
-+
-+enum {
-+ PPP_STATS,
-+ PROPERTIES_CHANGED,
-+
-+ LAST_SIGNAL
-+};
-+
-+static guint signals[LAST_SIGNAL] = { 0 };
-+
-+NMPPPManager *
-+nm_modem_device_get_ppp_manager (NMModemDevice *device)
-+{
-+ g_return_val_if_fail (NM_IS_MODEM_DEVICE (device), NULL);
-+
-+ return NM_MODEM_DEVICE_GET_PRIVATE (device)->ppp_manager;
-+}
-+
-+DBusGProxy *
-+nm_modem_device_get_proxy (NMModemDevice *device,
-+ const char *interface)
-+{
-+
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (device);
-+ const char *current_iface;
-+
-+ g_return_val_if_fail (NM_IS_MODEM_DEVICE (device), NULL);
-+
-+ /* Default to the default interface. */
-+ if (interface == NULL)
-+ interface = MM_DBUS_INTERFACE_MODEM;
-+
-+ current_iface = dbus_g_proxy_get_interface (priv->proxy);
-+ if (!current_iface || strcmp (current_iface, interface))
-+ dbus_g_proxy_set_interface (priv->proxy, interface);
-+
-+ return priv->proxy;
-+}
-+
-+void
-+nm_modem_device_connect (NMModemDevice *device,
-+ const char *number)
-+{
-+ g_return_if_fail (NM_IS_MODEM_DEVICE (device));
-+
-+ NM_MODEM_DEVICE_GET_CLASS (device)->connect (device, number);
-+}
-+
-+const char *
-+nm_modem_device_get_ppp_name (NMModemDevice *device,
-+ NMConnection *connection)
-+{
-+ g_return_val_if_fail (NM_IS_MODEM_DEVICE (device), NULL);
-+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
-+
-+ if (NM_MODEM_DEVICE_GET_CLASS (device)->get_ppp_name)
-+ return NM_MODEM_DEVICE_GET_CLASS (device)->get_ppp_name (device, connection);
-+
-+ return NULL;
-+}
-+
-+static void
-+ppp_state_changed (NMPPPManager *ppp_manager, NMPPPStatus status, gpointer user_data)
-+{
-+ NMDevice *device = NM_DEVICE (user_data);
-+
-+ switch (status) {
-+ case NM_PPP_STATUS_NETWORK:
-+ nm_device_state_changed (device, NM_DEVICE_STATE_IP_CONFIG, NM_DEVICE_STATE_REASON_NONE);
-+ break;
-+ case NM_PPP_STATUS_DISCONNECT:
-+ nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_DISCONNECT);
-+ break;
-+ case NM_PPP_STATUS_DEAD:
-+ nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_FAILED);
-+ break;
-+ case NM_PPP_STATUS_AUTHENTICATE:
-+ nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
-+ break;
-+ default:
-+ break;
-+ }
-+}
-+
-+static void
-+ppp_ip4_config (NMPPPManager *ppp_manager,
-+ const char *iface,
-+ NMIP4Config *config,
-+ gpointer user_data)
-+{
-+ NMDevice *device = NM_DEVICE (user_data);
-+
-+ nm_device_set_ip_iface (device, iface);
-+ NM_MODEM_DEVICE_GET_PRIVATE (device)->pending_ip4_config = g_object_ref (config);
-+ nm_device_activate_schedule_stage4_ip_config_get (device);
-+}
-+
-+static void
-+ppp_stats (NMPPPManager *ppp_manager,
-+ guint32 in_bytes,
-+ guint32 out_bytes,
-+ gpointer user_data)
-+{
-+ NMModemDevice *device = NM_MODEM_DEVICE (user_data);
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (device);
-+
-+ if (priv->in_bytes != in_bytes || priv->out_bytes != out_bytes) {
-+ priv->in_bytes = in_bytes;
-+ priv->out_bytes = out_bytes;
-+
-+ g_signal_emit (device, signals[PPP_STATS], 0, in_bytes, out_bytes);
-+ }
-+}
-+
-+static NMActStageReturn
-+real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (device);
-+ NMActRequest *req;
-+ const char *ppp_name = NULL;
-+ GError *err = NULL;
-+ NMActStageReturn ret;
-+
-+ req = nm_device_get_act_request (device);
-+ g_assert (req);
-+
-+ ppp_name = nm_modem_device_get_ppp_name (NM_MODEM_DEVICE (device),
-+ nm_act_request_get_connection (req));
-+
-+ priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (device));
-+ if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, &err)) {
-+ g_signal_connect (priv->ppp_manager, "state-changed",
-+ G_CALLBACK (ppp_state_changed),
-+ device);
-+ g_signal_connect (priv->ppp_manager, "ip4-config",
-+ G_CALLBACK (ppp_ip4_config),
-+ device);
-+ g_signal_connect (priv->ppp_manager, "stats",
-+ G_CALLBACK (ppp_stats),
-+ device);
-+
-+ ret = NM_ACT_STAGE_RETURN_POSTPONE;
-+ } else {
-+ nm_warning ("%s", err->message);
-+ g_error_free (err);
-+
-+ g_object_unref (priv->ppp_manager);
-+ priv->ppp_manager = NULL;
-+
-+ *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
-+ ret = NM_ACT_STAGE_RETURN_FAILURE;
-+ }
-+
-+ return ret;
-+}
-+
-+static NMActStageReturn
-+real_act_stage4_get_ip4_config (NMDevice *device,
-+ NMIP4Config **config,
-+ NMDeviceStateReason *reason)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (device);
-+
-+ *config = priv->pending_ip4_config;
-+ priv->pending_ip4_config = NULL;
-+
-+ return NM_ACT_STAGE_RETURN_SUCCESS;
-+}
-+
-+static void
-+real_deactivate_quickly (NMDevice *device)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (device);
-+
-+ nm_device_set_ip_iface (device, NULL);
-+
-+ if (priv->pending_ip4_config) {
-+ g_object_unref (priv->pending_ip4_config);
-+ priv->pending_ip4_config = NULL;
-+ }
-+
-+ priv->in_bytes = priv->out_bytes = 0;
-+
-+ if (priv->ppp_manager) {
-+ g_object_unref (priv->ppp_manager);
-+ priv->ppp_manager = NULL;
-+ }
-+
-+ dbus_g_proxy_call_no_reply (nm_modem_device_get_proxy (NM_MODEM_DEVICE (device), NULL),
-+ "Enable", G_TYPE_BOOLEAN, FALSE, G_TYPE_INVALID);
-+}
-+
-+static guint32
-+real_get_generic_capabilities (NMDevice *dev)
-+{
-+ return NM_DEVICE_CAP_NM_SUPPORTED;
-+}
-+
-+
-+static void
-+connect_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-+{
-+ NMDevice *device = NM_DEVICE (user_data);
-+ GError *error = NULL;
-+
-+ if (dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID))
-+ nm_device_activate_schedule_stage2_device_config (device);
-+ else {
-+ nm_warning ("Connect failed: %s", error->message);
-+ g_error_free (error);
-+ nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED);
-+ }
-+}
-+
-+static void
-+real_connect (NMModemDevice *modem, const char *number)
-+{
-+ dbus_g_proxy_begin_call_with_timeout (nm_modem_device_get_proxy (modem, MM_DBUS_INTERFACE_MODEM),
-+ "Connect", connect_done,
-+ modem, NULL, 60000,
-+ G_TYPE_STRING, number ? number : "",
-+ G_TYPE_INVALID);
-+}
-+
-+static gboolean
-+unavailable_to_disconnected (gpointer user_data)
-+{
-+ nm_device_state_changed (NM_DEVICE (user_data),
-+ NM_DEVICE_STATE_DISCONNECTED,
-+ NM_DEVICE_STATE_REASON_NONE);
-+ return FALSE;
-+}
-+
-+static void
-+device_state_changed (NMDeviceInterface *device,
-+ NMDeviceState new_state,
-+ NMDeviceState old_state,
-+ NMDeviceStateReason reason,
-+ gpointer user_data)
-+{
-+ NMModemDevice *self = NM_MODEM_DEVICE (user_data);
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (self);
-+
-+ /* Remove any previous delayed transition to disconnected */
-+ if (priv->state_to_disconnected_id) {
-+ g_source_remove (priv->state_to_disconnected_id);
-+ priv->state_to_disconnected_id = 0;
-+ }
-+
-+ /* If transitioning to UNAVAILBLE and we have a carrier, transition to
-+ * DISCONNECTED because the device is ready to use. Otherwise the carrier-on
-+ * handler will handle the transition to DISCONNECTED when the carrier is detected.
-+ */
-+ if (new_state == NM_DEVICE_STATE_UNAVAILABLE)
-+ priv->state_to_disconnected_id = g_idle_add (unavailable_to_disconnected, user_data);
-+
-+ /* Make sure we don't leave the serial device open */
-+ switch (new_state) {
-+ case NM_DEVICE_STATE_NEED_AUTH:
-+ if (priv->ppp_manager)
-+ break;
-+ /* else fall through */
-+ case NM_DEVICE_STATE_UNMANAGED:
-+ case NM_DEVICE_STATE_UNAVAILABLE:
-+ case NM_DEVICE_STATE_FAILED:
-+ case NM_DEVICE_STATE_DISCONNECTED:
-+ dbus_g_proxy_call_no_reply (nm_modem_device_get_proxy (self, NULL),
-+ "Disconnect", G_TYPE_INVALID);
-+ break;
-+ default:
-+ break;
-+ }
-+}
-+
-+/*****************************************************************************/
-+
-+static void
-+nm_modem_device_init (NMModemDevice *self)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (self);
-+
-+ priv->dbus_mgr = nm_dbus_manager_get ();
-+}
-+
-+static GObject*
-+constructor (GType type,
-+ guint n_construct_params,
-+ GObjectConstructParam *construct_params)
-+{
-+ GObject *object;
-+ NMModemDevicePrivate *priv;
-+
-+ object = G_OBJECT_CLASS (nm_modem_device_parent_class)->constructor (type,
-+ n_construct_params,
-+ construct_params);
-+ if (!object)
-+ return NULL;
-+
-+ priv = NM_MODEM_DEVICE_GET_PRIVATE (object);
-+
-+ if (!priv->path) {
-+ g_warning ("DBus path not provided");
-+ goto err;
-+ }
-+
-+ priv->proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
-+ MM_DBUS_SERVICE, priv->path, MM_DBUS_INTERFACE_MODEM);
-+
-+ g_signal_connect (object, "state-changed", G_CALLBACK (device_state_changed), object);
-+
-+ return object;
-+
-+ err:
-+ g_object_unref (object);
-+ return NULL;
-+}
-+
-+static void
-+get_property (GObject *object, guint prop_id,
-+ GValue *value, GParamSpec *pspec)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (object);
-+
-+ switch (prop_id) {
-+ case PROP_PATH:
-+ g_value_set_string (value, priv->path);
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+
-+}
-+
-+static void
-+set_property (GObject *object, guint prop_id,
-+ const GValue *value, GParamSpec *pspec)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (object);
-+
-+ switch (prop_id) {
-+ case PROP_PATH:
-+ /* Construct only */
-+ priv->path = g_value_dup_string (value);
-+ break;
-+ default:
-+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+ break;
-+ }
-+}
-+
-+static void
-+finalize (GObject *object)
-+{
-+ NMModemDevicePrivate *priv = NM_MODEM_DEVICE_GET_PRIVATE (object);
-+
-+ if (priv->state_to_disconnected_id) {
-+ g_source_remove (priv->state_to_disconnected_id);
-+ priv->state_to_disconnected_id = 0;
-+ }
-+
-+ if (priv->proxy)
-+ g_object_unref (priv->proxy);
-+
-+ g_object_unref (priv->dbus_mgr);
-+
-+ G_OBJECT_CLASS (nm_modem_device_parent_class)->finalize (object);
-+}
-+
-+static void
-+nm_modem_device_class_init (NMModemDeviceClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMModemDevicePrivate));
-+
-+ /* Virtual methods */
-+ object_class->constructor = constructor;
-+ object_class->set_property = set_property;
-+ object_class->get_property = get_property;
-+ object_class->finalize = finalize;
-+
-+ device_class->get_generic_capabilities = real_get_generic_capabilities;
-+ device_class->act_stage2_config = real_act_stage2_config;
-+ device_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config;
-+ device_class->deactivate_quickly = real_deactivate_quickly;
-+
-+ klass->connect = real_connect;
-+
-+ /* Properties */
-+ g_object_class_install_property
-+ (object_class, PROP_PATH,
-+ g_param_spec_string (NM_MODEM_DEVICE_PATH,
-+ "DBus path",
-+ "DBus path",
-+ NULL,
-+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+
-+ /* Signals */
-+ signals[PPP_STATS] =
-+ g_signal_new ("ppp-stats",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (NMModemDeviceClass, ppp_stats),
-+ NULL, NULL,
-+ _nm_marshal_VOID__UINT_UINT,
-+ G_TYPE_NONE, 2,
-+ G_TYPE_UINT, G_TYPE_UINT);
-+
-+ signals[PROPERTIES_CHANGED] =
-+ nm_properties_changed_signal_new (object_class,
-+ G_STRUCT_OFFSET (NMModemDeviceClass, properties_changed));
-+
-+ dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-+ &dbus_glib_nm_serial_device_object_info);
-+}
-diff --git a/src/modem-manager/nm-modem-device.h b/src/modem-manager/nm-modem-device.h
-new file mode 100644
-index 0000000..fae6d74
---- /dev/null
-+++ b/src/modem-manager/nm-modem-device.h
-@@ -0,0 +1,55 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_MODEM_DEVICE_H
-+#define NM_MODEM_DEVICE_H
-+
-+#include <dbus/dbus-glib.h>
-+#include <nm-device.h>
-+#include "ppp-manager/nm-ppp-manager.h"
-+
-+G_BEGIN_DECLS
-+
-+#define NM_TYPE_MODEM_DEVICE (nm_modem_device_get_type ())
-+#define NM_MODEM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM_DEVICE, NMModemDevice))
-+#define NM_MODEM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM_DEVICE, NMModemDeviceClass))
-+#define NM_IS_MODEM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM_DEVICE))
-+#define NM_IS_MODEM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM_DEVICE))
-+#define NM_MODEM_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM_DEVICE, NMModemDeviceClass))
-+
-+#define NM_MODEM_DEVICE_PATH "path"
-+
-+typedef struct {
-+ NMDevice parent;
-+} NMModemDevice;
-+
-+typedef struct {
-+ NMDeviceClass parent;
-+
-+ void (*connect) (NMModemDevice *device,
-+ const char *number);
-+
-+ const char *(*get_ppp_name) (NMModemDevice *device,
-+ NMConnection *connection);
-+
-+ /* Signals */
-+ void (*ppp_stats) (NMModemDevice *device, guint32 in_bytes, guint32 out_bytes);
-+ void (*properties_changed) (NMModemDevice *device, GHashTable *properties);
-+} NMModemDeviceClass;
-+
-+GType nm_modem_device_get_type (void);
-+
-+/* Protected */
-+
-+NMPPPManager *nm_modem_device_get_ppp_manager (NMModemDevice *device);
-+DBusGProxy *nm_modem_device_get_proxy (NMModemDevice *device,
-+ const char *interface);
-+
-+void nm_modem_device_connect (NMModemDevice *device,
-+ const char *number);
-+
-+const char *nm_modem_device_get_ppp_name (NMModemDevice *device,
-+ NMConnection *connection);
-+
-+G_END_DECLS
-+
-+#endif /* NM_MODEM_DEVICE_H */
-diff --git a/src/modem-manager/nm-modem-manager.c b/src/modem-manager/nm-modem-manager.c
-new file mode 100644
-index 0000000..318798d
---- /dev/null
-+++ b/src/modem-manager/nm-modem-manager.c
-@@ -0,0 +1,395 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#include <string.h>
-+#include "nm-modem-manager.h"
-+#include "nm-modem-device.h"
-+#include "nm-gsm-modem.h"
-+#include "nm-gsm-modem-hso.h"
-+#include "nm-gsm-modem-mbm.h"
-+#include "nm-cdma-modem.h"
-+#include "nm-dbus-manager.h"
-+#include "nm-utils.h"
-+#include "nm-modem-types.h"
-+
-+#define MODEM_POKE_INTERVAL 120000
-+
-+G_DEFINE_TYPE (NMModemManager, nm_modem_manager, G_TYPE_OBJECT)
-+
-+#define NM_MODEM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM_MANAGER, NMModemManagerPrivate))
-+
-+typedef struct {
-+ NMDBusManager *dbus_mgr;
-+ DBusGProxy *proxy;
-+ GHashTable *modems;
-+ gboolean disposed;
-+ guint poke_id;
-+} NMModemManagerPrivate;
-+
-+enum {
-+ DEVICE_ADDED,
-+ DEVICE_REMOVED,
-+
-+ LAST_SIGNAL
-+};
-+
-+static guint signals[LAST_SIGNAL] = { 0 };
-+
-+
-+NMModemManager *
-+nm_modem_manager_get (void)
-+{
-+ static NMModemManager *singleton = NULL;
-+
-+ if (!singleton)
-+ singleton = NM_MODEM_MANAGER (g_object_new (NM_TYPE_MODEM_MANAGER, NULL));
-+ else
-+ g_object_ref (singleton);
-+
-+ g_assert (singleton);
-+ return singleton;
-+}
-+
-+static gboolean
-+get_modem_properties (DBusGConnection *connection,
-+ const char *path,
-+ char **data_device,
-+ char **driver,
-+ guint32 *type)
-+{
-+ DBusGProxy *proxy;
-+ GValue value = { 0 };
-+ GError *err = NULL;
-+
-+ proxy = dbus_g_proxy_new_for_name (connection,
-+ MM_DBUS_SERVICE,
-+ path,
-+ "org.freedesktop.DBus.Properties");
-+
-+ if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err,
-+ G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM,
-+ G_TYPE_STRING, "Type",
-+ G_TYPE_INVALID,
-+ G_TYPE_VALUE, &value,
-+ G_TYPE_INVALID)) {
-+ *type = g_value_get_uint (&value);
-+ g_value_unset (&value);
-+ } else {
-+ g_warning ("Could not get modem data device: %s", err->message);
-+ goto out;
-+ }
-+
-+ if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err,
-+ G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM,
-+ G_TYPE_STRING, "DataDevice",
-+ G_TYPE_INVALID,
-+ G_TYPE_VALUE, &value,
-+ G_TYPE_INVALID)) {
-+ *data_device = g_value_dup_string (&value);
-+ g_value_unset (&value);
-+ } else {
-+ g_warning ("Could not get modem data device: %s", err->message);
-+ goto out;
-+ }
-+
-+ if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err,
-+ G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM,
-+ G_TYPE_STRING, "Driver",
-+ G_TYPE_INVALID,
-+ G_TYPE_VALUE, &value,
-+ G_TYPE_INVALID)) {
-+ *driver = g_value_dup_string (&value);
-+ g_value_unset (&value);
-+ } else {
-+ g_warning ("Could not get modem driver: %s", err->message);
-+ goto out;
-+ }
-+
-+ out:
-+ if (err)
-+ g_error_free (err);
-+
-+ g_object_unref (proxy);
-+
-+ return *data_device && *driver;
-+}
-+
-+static void
-+create_modem (NMModemManager *manager, const char *path)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (manager);
-+ NMDevice *device;
-+ char *data_device = NULL;
-+ char *driver = NULL;
-+ uint modem_type = MM_MODEM_TYPE_UNKNOWN;
-+
-+ if (g_hash_table_lookup (priv->modems, path)) {
-+ nm_warning ("Modem with path %s already exists, ignoring", path);
-+ return;
-+ }
-+
-+ if (!get_modem_properties (nm_dbus_manager_get_connection (priv->dbus_mgr), path,
-+ &data_device, &driver, &modem_type))
-+ return;
-+
-+ if (modem_type == MM_MODEM_TYPE_UNKNOWN) {
-+ nm_warning ("Modem with path %s has unknown type, ignoring", path);
-+ return;
-+ }
-+
-+ if (!driver || !strlen (driver)) {
-+ nm_warning ("Modem with path %s has unknown driver, ignoring", path);
-+ return;
-+ }
-+
-+ if (!data_device || !strlen (data_device)) {
-+ nm_warning ("Modem with path %s has unknown data device, ignoring", path);
-+ return;
-+ }
-+
-+ if (modem_type == MM_MODEM_TYPE_GSM) {
-+ if (!strcmp (driver, "hso"))
-+ device = nm_gsm_modem_hso_new (path, data_device, driver);
-+ else if (!strcmp (driver, "mbm"))
-+ device = nm_gsm_modem_mbm_new (path, data_device, driver);
-+ else
-+ device = nm_gsm_modem_new (path, data_device, driver);
-+ } else if (modem_type == MM_MODEM_TYPE_CDMA)
-+ device = nm_cdma_modem_new (path, data_device, driver);
-+ else
-+ g_error ("Invalid modem type");
-+
-+ g_free (data_device);
-+ g_free (driver);
-+
-+ if (device) {
-+ g_hash_table_insert (priv->modems, g_strdup (path), device);
-+ g_signal_emit (manager, signals[DEVICE_ADDED], 0, device);
-+ }
-+}
-+
-+static void
-+modem_added (DBusGProxy *proxy, const char *path, gpointer user_data)
-+{
-+ create_modem (NM_MODEM_MANAGER (user_data), path);
-+}
-+
-+static void
-+modem_removed (DBusGProxy *proxy, const char *path, gpointer user_data)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (user_data);
-+ NMModemDevice *modem;
-+
-+ modem = (NMModemDevice *) g_hash_table_lookup (priv->modems, path);
-+ if (modem) {
-+ g_signal_emit (user_data, signals[DEVICE_REMOVED], 0, modem);
-+ g_hash_table_remove (priv->modems, path);
-+ }
-+}
-+
-+static gboolean
-+poke_modem_cb (gpointer user_data)
-+{
-+ NMModemManager *self = NM_MODEM_MANAGER (user_data);
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self);
-+ DBusGConnection *g_connection;
-+ DBusGProxy *proxy;
-+
-+ g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr);
-+ proxy = dbus_g_proxy_new_for_name (g_connection,
-+ MM_DBUS_SERVICE,
-+ MM_DBUS_PATH,
-+ MM_DBUS_INTERFACE);
-+
-+ nm_info ("Trying to start the modem-manager...");
-+ dbus_g_proxy_call_no_reply (proxy, "EnumerateDevices", G_TYPE_INVALID);
-+ g_object_unref (proxy);
-+
-+ return TRUE;
-+}
-+
-+static void
-+enumerate_devices_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer data)
-+{
-+ NMModemManager *manager = NM_MODEM_MANAGER (data);
-+ GPtrArray *modems;
-+ GError *error = NULL;
-+
-+ if (!dbus_g_proxy_end_call (proxy, call_id, &error,
-+ dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &modems,
-+ G_TYPE_INVALID)) {
-+ nm_warning ("Could not get modem list: %s", error->message);
-+ g_error_free (error);
-+ } else {
-+ int i;
-+
-+ for (i = 0; i < modems->len; i++) {
-+ char *path = (char *) g_ptr_array_index (modems, i);
-+
-+ create_modem (manager, path);
-+ g_free (path);
-+ }
-+
-+ g_ptr_array_free (modems, TRUE);
-+ }
-+}
-+
-+static void
-+modem_manager_appeared (NMModemManager *self, gboolean enumerate_devices)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self);
-+
-+ if (priv->poke_id) {
-+ g_source_remove (priv->poke_id);
-+ priv->poke_id = 0;
-+ }
-+
-+ priv->proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
-+ MM_DBUS_SERVICE, MM_DBUS_PATH, MM_DBUS_INTERFACE);
-+
-+ dbus_g_proxy_add_signal (priv->proxy, "DeviceAdded", G_TYPE_STRING, G_TYPE_INVALID);
-+ dbus_g_proxy_connect_signal (priv->proxy, "DeviceAdded",
-+ G_CALLBACK (modem_added), self,
-+ NULL);
-+
-+ dbus_g_proxy_add_signal (priv->proxy, "DeviceRemoved", G_TYPE_STRING, G_TYPE_INVALID);
-+ dbus_g_proxy_connect_signal (priv->proxy, "DeviceRemoved",
-+ G_CALLBACK (modem_removed), self,
-+ NULL);
-+
-+ if (enumerate_devices)
-+ dbus_g_proxy_begin_call (priv->proxy, "EnumerateDevices", enumerate_devices_done, self, NULL, G_TYPE_INVALID);
-+}
-+
-+static gboolean
-+remove_one_modem (gpointer key, gpointer value, gpointer user_data)
-+{
-+ g_signal_emit (user_data, signals[DEVICE_REMOVED], 0, value);
-+
-+ return TRUE;
-+}
-+
-+static void
-+modem_manager_disappeared (NMModemManager *self)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self);
-+
-+ g_hash_table_foreach_remove (priv->modems, remove_one_modem, self);
-+
-+ if (priv->proxy) {
-+ g_object_unref (priv->proxy);
-+ priv->proxy = NULL;
-+ }
-+
-+ /* Try to activate the modem-manager */
-+ poke_modem_cb (self);
-+ priv->poke_id = g_timeout_add (MODEM_POKE_INTERVAL, poke_modem_cb, self);
-+}
-+
-+static void
-+nm_modem_manager_name_owner_changed (NMDBusManager *dbus_mgr,
-+ const char *name,
-+ const char *old_owner,
-+ const char *new_owner,
-+ gpointer user_data)
-+{
-+ gboolean old_owner_good;
-+ gboolean new_owner_good;
-+
-+ /* Can't handle the signal if its not from the modem service */
-+ if (strcmp (MM_DBUS_SERVICE, name) != 0)
-+ return;
-+
-+ old_owner_good = (old_owner && strlen (old_owner));
-+ new_owner_good = (new_owner && strlen (new_owner));
-+
-+ if (!old_owner_good && new_owner_good) {
-+ nm_info ("modem manager appeared");
-+ modem_manager_appeared (NM_MODEM_MANAGER (user_data), FALSE);
-+ } else if (old_owner_good && !new_owner_good) {
-+ nm_info ("modem manager disappeared");
-+ modem_manager_disappeared (NM_MODEM_MANAGER (user_data));
-+ }
-+}
-+
-+/*******************************************************/
-+
-+static void
-+nm_modem_manager_init (NMModemManager *self)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self);
-+
-+ priv->modems = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
-+ priv->dbus_mgr = nm_dbus_manager_get ();
-+
-+ g_signal_connect (priv->dbus_mgr, "name-owner-changed",
-+ G_CALLBACK (nm_modem_manager_name_owner_changed),
-+ self);
-+
-+ if (nm_dbus_manager_name_has_owner (priv->dbus_mgr, MM_DBUS_SERVICE))
-+ modem_manager_appeared (self, TRUE);
-+ else
-+ modem_manager_disappeared (self);
-+}
-+
-+static void
-+dispose (GObject *object)
-+{
-+ NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (object);
-+
-+ if (priv->disposed)
-+ return;
-+
-+ priv->disposed = TRUE;
-+
-+ if (priv->poke_id) {
-+ g_source_remove (priv->poke_id);
-+ priv->poke_id = 0;
-+ }
-+
-+ g_hash_table_foreach_remove (priv->modems, remove_one_modem, object);
-+ g_hash_table_destroy (priv->modems);
-+
-+ if (priv->proxy) {
-+ g_object_unref (priv->proxy);
-+ priv->proxy = NULL;
-+ }
-+
-+ if (priv->dbus_mgr) {
-+ g_object_unref (priv->dbus_mgr);
-+ priv->dbus_mgr = NULL;
-+ }
-+
-+ /* Chain up to the parent class */
-+ G_OBJECT_CLASS (nm_modem_manager_parent_class)->dispose (object);
-+}
-+
-+static void
-+nm_modem_manager_class_init (NMModemManagerClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+
-+ g_type_class_add_private (object_class, sizeof (NMModemManagerPrivate));
-+
-+ object_class->dispose = dispose;
-+
-+ /* signals */
-+ signals[DEVICE_ADDED] =
-+ g_signal_new ("device-added",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (NMModemManagerClass, device_added),
-+ NULL, NULL,
-+ g_cclosure_marshal_VOID__OBJECT,
-+ G_TYPE_NONE, 1,
-+ G_TYPE_OBJECT);
-+
-+ signals[DEVICE_REMOVED] =
-+ g_signal_new ("device-removed",
-+ G_OBJECT_CLASS_TYPE (object_class),
-+ G_SIGNAL_RUN_FIRST,
-+ G_STRUCT_OFFSET (NMModemManagerClass, device_removed),
-+ NULL, NULL,
-+ g_cclosure_marshal_VOID__OBJECT,
-+ G_TYPE_NONE, 1,
-+ G_TYPE_OBJECT);
-+}
-diff --git a/src/modem-manager/nm-modem-manager.h b/src/modem-manager/nm-modem-manager.h
-new file mode 100644
-index 0000000..ec62f84
---- /dev/null
-+++ b/src/modem-manager/nm-modem-manager.h
-@@ -0,0 +1,35 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_MODEM_MANAGER_H
-+#define NM_MODEM_MANAGER_H
-+
-+#include <glib-object.h>
-+#include "nm-device.h"
-+
-+#define NM_TYPE_MODEM_MANAGER (nm_modem_manager_get_type ())
-+#define NM_MODEM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM_MANAGER, NMModemManager))
-+#define NM_MODEM_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM_MANAGER, NMModemManagerClass))
-+#define NM_IS_MODEM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM_MANAGER))
-+#define NM_IS_MODEM_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM_MANAGER))
-+#define NM_MODEM_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM_MANAGER, NMModemManagerClass))
-+
-+typedef struct {
-+ GObject parent;
-+} NMModemManager;
-+
-+typedef struct {
-+ GObjectClass parent;
-+
-+ /* Signals */
-+ void (*device_added) (NMModemManager *manager,
-+ NMDevice *device);
-+
-+ void (*device_removed) (NMModemManager *manager,
-+ NMDevice *device);
-+} NMModemManagerClass;
-+
-+GType nm_modem_manager_get_type (void);
-+
-+NMModemManager *nm_modem_manager_get (void);
-+
-+#endif /* NM_MODEM_MANAGER_H */
-diff --git a/src/modem-manager/nm-modem-types.h b/src/modem-manager/nm-modem-types.h
-new file mode 100644
-index 0000000..de1d2de
---- /dev/null
-+++ b/src/modem-manager/nm-modem-types.h
-@@ -0,0 +1,90 @@
-+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-+
-+#ifndef NM_MODEM_TYPES_H
-+#define NM_MODEM_TYPES_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_CDMA "org.freedesktop.ModemManager.Modem.Cdma"
-+
-+#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_DBUS_INTERFACE_MODEM_GSM_HSO "org.freedesktop.ModemManager.Modem.Gsm.Hso"
-+#define MM_DBUS_INTERFACE_MODEM_GSM_MBM "org.freedesktop.ModemManager.Modem.Gsm.Mbm"
-+
-+#define MM_MODEM_TYPE_UNKNOWN 0
-+#define MM_MODEM_TYPE_GSM 1
-+#define MM_MODEM_TYPE_CDMA 2
-+
-+/* Errors */
-+
-+#define MM_SERIAL_OPEN_FAILED MM_DBUS_INTERFACE_MODEM ".SerialOpenFailed"
-+#define MM_SERIAL_SEND_FAILED MM_DBUS_INTERFACE_MODEM ".SerialSendFailed"
-+#define MM_SERIAL_RESPONSE_TIMEOUT MM_DBUS_INTERFACE_MODEM ".SerialResponseTimeout"
-+
-+#define MM_MODEM_ERROR_GENERAL MM_DBUS_INTERFACE_MODEM ".General"
-+#define MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED MM_DBUS_INTERFACE_MODEM ".OperationNotSupported"
-+
-+#define MM_MODEM_CONNECT_ERROR_NO_CARRIER MM_DBUS_INTERFACE_MODEM ".NoCarrier"
-+#define MM_MODEM_CONNECT_ERROR_NO_DIALTONE MM_DBUS_INTERFACE_MODEM ".NoDialtone"
-+#define MM_MODEM_CONNECT_ERROR_BUSY MM_DBUS_INTERFACE_MODEM ".Busy"
-+#define MM_MODEM_CONNECT_ERROR_NO_ANSWER MM_DBUS_INTERFACE_MODEM ".NoAnswer"
-+
-+#define MM_MODEM_ERROR "org.freedesktop.ModemManager.Modem.Gsm"
-+
-+#define MM_MODEM_ERROR_PHONE_FAILURE MM_MODEM_ERROR ".PhoneFailure"
-+#define MM_MODEM_ERROR_NO_CONNECTION MM_MODEM_ERROR ".NoConnection"
-+#define MM_MODEM_ERROR_LINK_RESERVED MM_MODEM_ERROR ".LinkReserved"
-+#define MM_MODEM_ERROR_NOT_ALLOWED MM_MODEM_ERROR ".OperationNotAllowed"
-+#define MM_MODEM_ERROR_NOT_SUPPORTED MM_MODEM_ERROR ".OperationNotSupported"
-+#define MM_MODEM_ERROR_PH_SIM_PIN MM_MODEM_ERROR ".PhSimPinRequired"
-+#define MM_MODEM_ERROR_PH_FSIM_PIN MM_MODEM_ERROR ".PhFSimPinRequired"
-+#define MM_MODEM_ERROR_PH_FSIM_PUK MM_MODEM_ERROR ".PhFPukRequired"
-+#define MM_MODEM_ERROR_SIM_NOT_INSERTED MM_MODEM_ERROR ".SimNotInserted"
-+#define MM_MODEM_ERROR_SIM_PIN MM_MODEM_ERROR ".SimPinRequired"
-+#define MM_MODEM_ERROR_SIM_PUK MM_MODEM_ERROR ".SimPukRequired"
-+#define MM_MODEM_ERROR_SIM_FAILURE MM_MODEM_ERROR ".SimFailure"
-+#define MM_MODEM_ERROR_SIM_BUSY MM_MODEM_ERROR ".SimBusy"
-+#define MM_MODEM_ERROR_SIM_WRONG MM_MODEM_ERROR ".SimWrong"
-+#define MM_MODEM_ERROR_WRONG_PASSWORD MM_MODEM_ERROR ".IncorrectPassword"
-+#define MM_MODEM_ERROR_SIM_PIN2 MM_MODEM_ERROR ".SimPin2Required"
-+#define MM_MODEM_ERROR_SIM_PUK2 MM_MODEM_ERROR ".SimPuk2Required"
-+#define MM_MODEM_ERROR_MEMORY_FULL MM_MODEM_ERROR ".MemoryFull"
-+#define MM_MODEM_ERROR_INVALID_INDEX MM_MODEM_ERROR ".InvalidIndex"
-+#define MM_MODEM_ERROR_NOT_FOUND MM_MODEM_ERROR ".NotFound"
-+#define MM_MODEM_ERROR_MEMORY_FAILURE MM_MODEM_ERROR ".MemoryFailure"
-+#define MM_MODEM_ERROR_TEXT_TOO_LONG MM_MODEM_ERROR ".TextTooLong"
-+#define MM_MODEM_ERROR_INVALID_CHARS MM_MODEM_ERROR ".InvalidChars"
-+#define MM_MODEM_ERROR_DIAL_STRING_TOO_LONG MM_MODEM_ERROR ".DialStringTooLong"
-+#define MM_MODEM_ERROR_DIAL_STRING_INVALID MM_MODEM_ERROR ".InvalidDialString"
-+#define MM_MODEM_ERROR_NO_NETWORK MM_MODEM_ERROR ".NoNetwork"
-+#define MM_MODEM_ERROR_NETWORK_TIMEOUT MM_MODEM_ERROR ".NetworkTimeout"
-+#define MM_MODEM_ERROR_NETWORK_NOT_ALLOWED MM_MODEM_ERROR ".NetworkNotAllowed"
-+#define MM_MODEM_ERROR_NETWORK_PIN MM_MODEM_ERROR ".NetworkPinRequired"
-+#define MM_MODEM_ERROR_NETWORK_PUK MM_MODEM_ERROR ".NetworkPukRequired"
-+#define MM_MODEM_ERROR_NETWORK_SUBSET_PIN MM_MODEM_ERROR ".NetworkSubsetPinRequired"
-+#define MM_MODEM_ERROR_NETWORK_SUBSET_PUK MM_MODEM_ERROR ".NetworkSubsetPukRequired"
-+#define MM_MODEM_ERROR_SERVICE_PIN MM_MODEM_ERROR ".ServicePinRequired"
-+#define MM_MODEM_ERROR_SERVICE_PUK MM_MODEM_ERROR ".ServicePukRequired"
-+#define MM_MODEM_ERROR_CORP_PIN MM_MODEM_ERROR ".CorporatePinRequired"
-+#define MM_MODEM_ERROR_CORP_PUK MM_MODEM_ERROR ".CorporatePukRequired"
-+#define MM_MODEM_ERROR_HIDDEN_KEY MM_MODEM_ERROR ".HiddenKeyRequired"
-+#define MM_MODEM_ERROR_EAP_NOT_SUPPORTED MM_MODEM_ERROR ".EapMethodNotSupported"
-+#define MM_MODEM_ERROR_INCORRECT_PARAMS MM_MODEM_ERROR ".IncorrectParams"
-+#define MM_MODEM_ERROR_UNKNOWN MM_MODEM_ERROR ".Unknown"
-+#define MM_MODEM_ERROR_GPRS_ILLEGAL_MS MM_MODEM_ERROR ".GprsIllegalMs"
-+#define MM_MODEM_ERROR_GPRS_ILLEGAL_ME MM_MODEM_ERROR ".GprsIllegalMe"
-+#define MM_MODEM_ERROR_GPRS_SERVICE_NOT_ALLOWED MM_MODEM_ERROR ".GprsServiceNotAllowed"
-+#define MM_MODEM_ERROR_GPRS_PLMN_NOT_ALLOWED MM_MODEM_ERROR ".GprsPlmnNotAllowed"
-+#define MM_MODEM_ERROR_GPRS_LOCATION_NOT_ALLOWED MM_MODEM_ERROR ".GprsLocationNotAllowed"
-+#define MM_MODEM_ERROR_GPRS_ROAMING_NOT_ALLOWED MM_MODEM_ERROR ".GprsRoamingNotAllowed"
-+#define MM_MODEM_ERROR_GPRS_OPTION_NOT_SUPPORTED MM_MODEM_ERROR ".GprsOptionNotSupported"
-+#define MM_MODEM_ERROR_GPRS_NOT_SUBSCRIBED MM_MODEM_ERROR ".GprsNotSubscribed"
-+#define MM_MODEM_ERROR_GPRS_OUT_OF_ORDER MM_MODEM_ERROR ".GprsOutOfOrder"
-+#define MM_MODEM_ERROR_GPRS_PDP_AUTH_FAILURE MM_MODEM_ERROR ".GprsPdpAuthFailure"
-+#define MM_MODEM_ERROR_GPRS_UNKNOWN MM_MODEM_ERROR ".GprsUnspecified"
-+#define MM_MODEM_ERROR_GPRS_INVALID_CLASS MM_MODEM_ERROR ".GprsInvalidClass"
-+
-+#endif /* NM_MODEM_TYPES_H */
-diff --git a/src/nm-cdma-device.c b/src/nm-cdma-device.c
-deleted file mode 100644
-index 628a9b7..0000000
---- a/src/nm-cdma-device.c
-+++ /dev/null
-@@ -1,574 +0,0 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
--
--#include <stdio.h>
--#include <string.h>
--#include "nm-cdma-device.h"
--#include "nm-device-interface.h"
--#include "nm-device-private.h"
--#include "nm-setting-cdma.h"
--#include "nm-utils.h"
--#include "nm-properties-changed-signal.h"
--#include "nm-cdma-device-glue.h"
--#include "nm-setting-connection.h"
--
--G_DEFINE_TYPE (NMCdmaDevice, nm_cdma_device, NM_TYPE_SERIAL_DEVICE)
--
--#define NM_CDMA_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CDMA_DEVICE, NMCdmaDevicePrivate))
--
--typedef struct {
-- char *monitor_iface;
-- NMSerialDevice *monitor_device;
--
-- guint state_to_disconnected_id;
--} NMCdmaDevicePrivate;
--
--enum {
-- PROP_0,
-- PROP_MONITOR_IFACE,
--
-- LAST_PROP
--};
--
--enum {
-- PROPERTIES_CHANGED,
--
-- LAST_SIGNAL
--};
--
--static guint signals[LAST_SIGNAL] = { 0 };
--
--
--NMCdmaDevice *
--nm_cdma_device_new (const char *udi,
-- const char *data_iface,
-- const char *monitor_iface,
-- const char *driver,
-- gboolean managed)
--{
-- g_return_val_if_fail (udi != NULL, NULL);
-- g_return_val_if_fail (data_iface != NULL, NULL);
-- g_return_val_if_fail (driver != NULL, NULL);
--
-- return (NMCdmaDevice *) g_object_new (NM_TYPE_CDMA_DEVICE,
-- NM_DEVICE_INTERFACE_UDI, udi,
-- NM_DEVICE_INTERFACE_IFACE, data_iface,
-- NM_DEVICE_INTERFACE_DRIVER, driver,
-- NM_CDMA_DEVICE_MONITOR_IFACE, monitor_iface,
-- NM_DEVICE_INTERFACE_MANAGED, managed,
-- NULL);
--}
--
--static NMSetting *
--cdma_device_get_setting (NMCdmaDevice *device, GType setting_type)
--{
-- NMActRequest *req;
-- NMSetting *setting = NULL;
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- if (req) {
-- NMConnection *connection;
--
-- connection = nm_act_request_get_connection (req);
-- if (connection)
-- setting = nm_connection_get_setting (connection, setting_type);
-- }
--
-- return setting;
--}
--
--static void
--dial_done (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- NMDeviceStateReason reason = NM_DEVICE_STATE_REASON_UNKNOWN;
-- gboolean success = FALSE;
--
-- switch (reply_index) {
-- case 0:
-- nm_info ("Connected, Woo!");
-- success = TRUE;
-- break;
-- case 1:
-- nm_info ("Busy");
-- reason = NM_DEVICE_STATE_REASON_MODEM_BUSY;
-- break;
-- case 2:
-- nm_warning ("No dial tone");
-- reason = NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE;
-- break;
-- case 3:
-- nm_warning ("No carrier");
-- reason = NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER;
-- break;
-- case -1:
-- nm_warning ("Dialing timed out");
-- reason = NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT;
-- break;
-- default:
-- nm_warning ("Dialing failed");
-- break;
-- }
--
-- if (success)
-- nm_device_activate_schedule_stage2_device_config (NM_DEVICE (device));
-- else
-- nm_device_state_changed (NM_DEVICE (device), NM_DEVICE_STATE_FAILED, reason);
--}
--
--static void
--do_dial (NMSerialDevice *device)
--{
-- NMSettingCdma *setting;
-- char *command;
-- guint id = 0;
-- const char *responses[] = { "CONNECT", "BUSY", "NO DIAL TONE", "NO CARRIER", NULL };
--
-- setting = NM_SETTING_CDMA (cdma_device_get_setting (NM_CDMA_DEVICE (device), NM_TYPE_SETTING_CDMA));
--
-- command = g_strconcat ("ATDT", nm_setting_cdma_get_number (setting), NULL);
-- if (nm_serial_device_send_command_string (device, command))
-- id = nm_serial_device_wait_for_reply (device, 60, responses, responses, dial_done, NULL);
-- g_free (command);
--
-- if (id == 0)
-- nm_device_state_changed (NM_DEVICE (device),
-- NM_DEVICE_STATE_FAILED,
-- NM_DEVICE_STATE_REASON_UNKNOWN);
--}
--
--static void
--power_up_response (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- /* Ignore errors */
-- do_dial (device);
--}
--
--static void
--power_up (NMSerialDevice *device)
--{
-- const char *responses[] = { "OK", "ERROR", "ERR", NULL };
-- guint id = 0;
--
-- /* Only works on Sierra cards */
-- nm_info ("(%s): powering up...", nm_device_get_iface (NM_DEVICE (device)));
-- if (nm_serial_device_send_command_string (device, "at!pcstate=1"))
-- id = nm_serial_device_wait_for_reply (device, 10, responses, responses, power_up_response, NULL);
--
-- /* Ignore errors */
-- if (id == 0)
-- do_dial (device);
--}
--
--static void
--init_done (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- switch (reply_index) {
-- case 0:
-- power_up (device);
-- break;
-- case -1:
-- nm_warning ("Modem initialization timed out");
-- nm_device_state_changed (NM_DEVICE (device),
-- NM_DEVICE_STATE_FAILED,
-- NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED);
-- break;
-- default:
-- nm_warning ("Modem initialization failed");
-- nm_device_state_changed (NM_DEVICE (device),
-- NM_DEVICE_STATE_FAILED,
-- NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED);
-- return;
-- }
--}
--
--static void
--init_modem (NMSerialDevice *device, gpointer user_data)
--{
-- guint id = 0;
-- const char *responses[] = { "OK", "ERROR", "ERR", NULL };
--
-- if (nm_serial_device_send_command_string (device, "ATZ E0"))
-- id = nm_serial_device_wait_for_reply (device, 10, responses, responses, init_done, NULL);
--
-- if (id == 0)
-- nm_device_state_changed (NM_DEVICE (device), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_UNKNOWN);
--}
--
--static NMActStageReturn
--real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
--{
-- NMSerialDevice *serial_device = NM_SERIAL_DEVICE (device);
-- NMSettingSerial *setting;
-- guint id;
--
-- setting = NM_SETTING_SERIAL (cdma_device_get_setting (NM_CDMA_DEVICE (device), NM_TYPE_SETTING_SERIAL));
--
-- if (!nm_serial_device_open (serial_device, setting)) {
-- *reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
-- return NM_ACT_STAGE_RETURN_FAILURE;
-- }
--
-- id = nm_serial_device_flash (serial_device, 100, init_modem, NULL);
-- if (!id)
-- *reason = NM_DEVICE_STATE_REASON_UNKNOWN;
--
-- return id ? NM_ACT_STAGE_RETURN_POSTPONE : NM_ACT_STAGE_RETURN_FAILURE;
--}
--
--static NMConnection *
--real_get_best_auto_connection (NMDevice *dev,
-- GSList *connections,
-- char **specific_object)
--{
-- GSList *iter;
--
-- for (iter = connections; iter; iter = g_slist_next (iter)) {
-- NMConnection *connection = NM_CONNECTION (iter->data);
-- NMSettingConnection *s_con;
--
-- s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
-- g_assert (s_con);
--
-- if (!nm_setting_connection_get_autoconnect (s_con))
-- continue;
--
-- if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME))
-- continue;
--
-- return connection;
-- }
-- return NULL;
--}
--
--static guint32
--real_get_generic_capabilities (NMDevice *dev)
--{
-- return NM_DEVICE_CAP_NM_SUPPORTED;
--}
--
--static void
--real_connection_secrets_updated (NMDevice *dev,
-- NMConnection *connection,
-- GSList *updated_settings,
-- RequestSecretsCaller caller)
--{
-- NMActRequest *req;
-- gboolean found = FALSE;
-- GSList *iter;
--
-- if (caller == SECRETS_CALLER_PPP) {
-- NMPPPManager *ppp_manager;
-- NMSettingCdma *s_cdma = NULL;
--
-- ppp_manager = nm_serial_device_get_ppp_manager (NM_SERIAL_DEVICE (dev));
-- g_return_if_fail (ppp_manager != NULL);
--
-- s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
-- if (!s_cdma) {
-- /* Shouldn't ever happen */
-- nm_ppp_manager_update_secrets (ppp_manager,
-- nm_device_get_iface (dev),
-- NULL,
-- NULL,
-- "missing CDMA setting; no secrets could be found.");
-- } else {
-- const char *cdma_username = nm_setting_cdma_get_username (s_cdma);
-- const char *cdma_password = nm_setting_cdma_get_password (s_cdma);
--
-- nm_ppp_manager_update_secrets (ppp_manager,
-- nm_device_get_iface (dev),
-- cdma_username ? cdma_username : "",
-- cdma_password ? cdma_password : "",
-- NULL);
-- }
-- return;
-- }
--
-- g_return_if_fail (caller == SECRETS_CALLER_CDMA);
-- g_return_if_fail (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH);
--
-- for (iter = updated_settings; iter; iter = g_slist_next (iter)) {
-- const char *setting_name = (const char *) iter->data;
--
-- if (!strcmp (setting_name, NM_SETTING_CDMA_SETTING_NAME))
-- found = TRUE;
-- else
-- nm_warning ("Ignoring updated secrets for setting '%s'.", setting_name);
-- }
--
-- if (!found)
-- return;
--
-- req = nm_device_get_act_request (dev);
-- g_assert (req);
--
-- g_return_if_fail (nm_act_request_get_connection (req) == connection);
--
-- nm_device_activate_schedule_stage1_device_prepare (dev);
--}
--
--static const char *
--real_get_ppp_name (NMSerialDevice *device, NMActRequest *req)
--{
-- NMConnection *connection;
-- NMSettingCdma *s_cdma;
--
-- connection = nm_act_request_get_connection (req);
-- g_assert (connection);
--
-- s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
-- g_assert (s_cdma);
--
-- return nm_setting_cdma_get_username (s_cdma);
--}
--
--/*****************************************************************************/
--/* Monitor device handling */
--
--static gboolean
--monitor_device_got_data (GIOChannel *source,
-- GIOCondition condition,
-- gpointer data)
--{
-- gsize bytes_read;
-- char buf[4096];
-- GIOStatus status;
--
-- if (condition & G_IO_IN) {
-- do {
-- status = g_io_channel_read_chars (source, buf, 4096, &bytes_read, NULL);
--
-- if (bytes_read) {
-- buf[bytes_read] = '\0';
-- /* Do nothing with the data for now */
-- nm_debug ("Monitor got unhandled data: '%s'", buf);
-- }
-- } while (bytes_read == 4096 || status == G_IO_STATUS_AGAIN);
-- }
--
-- if (condition & G_IO_HUP || condition & G_IO_ERR) {
-- return FALSE;
-- }
--
-- return TRUE;
--}
--
--static gboolean
--setup_monitor_device (NMCdmaDevice *device)
--{
-- NMCdmaDevicePrivate *priv = NM_CDMA_DEVICE_GET_PRIVATE (device);
-- GIOChannel *channel;
-- NMSettingSerial *setting;
--
-- if (!priv->monitor_iface) {
-- nm_debug ("No monitoring udi provided");
-- return FALSE;
-- }
--
-- priv->monitor_device = g_object_new (NM_TYPE_SERIAL_DEVICE,
-- NM_DEVICE_INTERFACE_UDI, nm_device_get_udi (NM_DEVICE (device)),
-- NM_DEVICE_INTERFACE_IFACE, priv->monitor_iface,
-- NULL);
--
-- if (!priv->monitor_device) {
-- nm_warning ("Creation of the monitoring device failed");
-- return FALSE;
-- }
--
-- setting = NM_SETTING_SERIAL (nm_setting_serial_new ());
-- if (!nm_serial_device_open (priv->monitor_device, setting)) {
-- nm_warning ("Monitoring device open failed");
-- g_object_unref (setting);
-- g_object_unref (priv->monitor_device);
-- return FALSE;
-- }
--
-- g_object_unref (setting);
--
-- channel = nm_serial_device_get_io_channel (priv->monitor_device);
-- g_io_add_watch (channel, G_IO_IN | G_IO_ERR | G_IO_HUP,
-- monitor_device_got_data, device);
--
-- g_io_channel_unref (channel);
--
-- return TRUE;
--}
--
--/*****************************************************************************/
--
--static void
--nm_cdma_device_init (NMCdmaDevice *self)
--{
-- nm_device_set_device_type (NM_DEVICE (self), NM_DEVICE_TYPE_CDMA);
--}
--
--static gboolean
--unavailable_to_disconnected (gpointer user_data)
--{
-- nm_device_state_changed (NM_DEVICE (user_data),
-- NM_DEVICE_STATE_DISCONNECTED,
-- NM_DEVICE_STATE_REASON_NONE);
-- return FALSE;
--}
--
--static void
--device_state_changed (NMDeviceInterface *device,
-- NMDeviceState new_state,
-- NMDeviceState old_state,
-- NMDeviceStateReason reason,
-- gpointer user_data)
--{
-- NMCdmaDevice *self = NM_CDMA_DEVICE (user_data);
-- NMCdmaDevicePrivate *priv = NM_CDMA_DEVICE_GET_PRIVATE (self);
--
-- /* Remove any previous delayed transition to disconnected */
-- if (priv->state_to_disconnected_id) {
-- g_source_remove (priv->state_to_disconnected_id);
-- priv->state_to_disconnected_id = 0;
-- }
--
-- /* If transitioning to UNAVAILBLE and we have a carrier, transition to
-- * DISCONNECTED because the device is ready to use. Otherwise the carrier-on
-- * handler will handle the transition to DISCONNECTED when the carrier is detected.
-- */
-- if (new_state == NM_DEVICE_STATE_UNAVAILABLE)
-- priv->state_to_disconnected_id = g_idle_add (unavailable_to_disconnected, self);
--
-- /* Make sure we don't leave the serial device open */
-- switch (new_state) {
-- case NM_DEVICE_STATE_UNMANAGED:
-- case NM_DEVICE_STATE_UNAVAILABLE:
-- case NM_DEVICE_STATE_FAILED:
-- case NM_DEVICE_STATE_DISCONNECTED:
-- nm_serial_device_close (NM_SERIAL_DEVICE (self));
-- break;
-- default:
-- break;
-- }
--}
--
--static GObject*
--constructor (GType type,
-- guint n_construct_params,
-- GObjectConstructParam *construct_params)
--{
-- GObject *object;
--
-- object = G_OBJECT_CLASS (nm_cdma_device_parent_class)->constructor (type,
-- n_construct_params,
-- construct_params);
-- if (!object)
-- return NULL;
--
-- /* FIXME: Make the monitor device not required for now */
-- setup_monitor_device (NM_CDMA_DEVICE (object));
--#if 0
-- if (!setup_monitor_device (NM_CDMA_DEVICE (object))) {
-- g_object_unref (object);
-- object = NULL;
-- }
--#endif
--
-- g_signal_connect (NM_DEVICE (object), "state-changed",
-- G_CALLBACK (device_state_changed), NM_CDMA_DEVICE (object));
--
-- return object;
--}
--
--static void
--set_property (GObject *object, guint prop_id,
-- const GValue *value, GParamSpec *pspec)
--{
-- NMCdmaDevicePrivate *priv = NM_CDMA_DEVICE_GET_PRIVATE (object);
--
-- switch (prop_id) {
-- case PROP_MONITOR_IFACE:
-- /* Construct only */
-- priv->monitor_iface = g_value_dup_string (value);
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--get_property (GObject *object, guint prop_id,
-- GValue *value, GParamSpec *pspec)
--{
-- NMCdmaDevicePrivate *priv = NM_CDMA_DEVICE_GET_PRIVATE (object);
--
-- switch (prop_id) {
-- case PROP_MONITOR_IFACE:
-- g_value_set_string (value, priv->monitor_iface);
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--finalize (GObject *object)
--{
-- NMCdmaDevicePrivate *priv = NM_CDMA_DEVICE_GET_PRIVATE (object);
--
-- if (priv->monitor_device)
-- g_object_unref (priv->monitor_device);
--
-- g_free (priv->monitor_iface);
--
-- if (priv->state_to_disconnected_id) {
-- g_source_remove (priv->state_to_disconnected_id);
-- priv->state_to_disconnected_id = 0;
-- }
--
-- G_OBJECT_CLASS (nm_cdma_device_parent_class)->finalize (object);
--}
--
--static void
--nm_cdma_device_class_init (NMCdmaDeviceClass *klass)
--{
-- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-- NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-- NMSerialDeviceClass *serial_class = NM_SERIAL_DEVICE_CLASS (klass);
--
-- g_type_class_add_private (object_class, sizeof (NMCdmaDevicePrivate));
--
-- object_class->constructor = constructor;
-- object_class->get_property = get_property;
-- object_class->set_property = set_property;
-- object_class->finalize = finalize;
--
-- device_class->get_best_auto_connection = real_get_best_auto_connection;
-- device_class->get_generic_capabilities = real_get_generic_capabilities;
-- device_class->act_stage1_prepare = real_act_stage1_prepare;
-- device_class->connection_secrets_updated = real_connection_secrets_updated;
--
-- serial_class->get_ppp_name = real_get_ppp_name;
--
-- /* Properties */
-- g_object_class_install_property
-- (object_class, PROP_MONITOR_IFACE,
-- g_param_spec_string (NM_CDMA_DEVICE_MONITOR_IFACE,
-- "Monitoring interface",
-- "Monitoring interface",
-- NULL,
-- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | NM_PROPERTY_PARAM_NO_EXPORT));
--
-- /* Signals */
-- signals[PROPERTIES_CHANGED] =
-- nm_properties_changed_signal_new (object_class,
-- G_STRUCT_OFFSET (NMCdmaDeviceClass, properties_changed));
--
-- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-- &dbus_glib_nm_cdma_device_object_info);
--}
-diff --git a/src/nm-cdma-device.h b/src/nm-cdma-device.h
-deleted file mode 100644
-index eef2aba..0000000
---- a/src/nm-cdma-device.h
-+++ /dev/null
-@@ -1,40 +0,0 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
--
--#ifndef NM_CDMA_DEVICE_H
--#define NM_CDMA_DEVICE_H
--
--#include <nm-serial-device.h>
--
--G_BEGIN_DECLS
--
--#define NM_TYPE_CDMA_DEVICE (nm_cdma_device_get_type ())
--#define NM_CDMA_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CDMA_DEVICE, NMCdmaDevice))
--#define NM_CDMA_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CDMA_DEVICE, NMCdmaDeviceClass))
--#define NM_IS_CDMA_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CDMA_DEVICE))
--#define NM_IS_CDMA_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CDMA_DEVICE))
--#define NM_CDMA_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CDMA_DEVICE, NMCdmaDeviceClass))
--
--#define NM_CDMA_DEVICE_MONITOR_IFACE "monitor-iface"
--
--typedef struct {
-- NMSerialDevice parent;
--} NMCdmaDevice;
--
--typedef struct {
-- NMSerialDeviceClass parent;
--
-- /* Signals */
-- void (*properties_changed) (NMCdmaDevice *device, GHashTable *properties);
--} NMCdmaDeviceClass;
--
--GType nm_cdma_device_get_type (void);
--
--NMCdmaDevice *nm_cdma_device_new (const char *udi,
-- const char *data_iface,
-- const char *monitor_iface,
-- const char *driver,
-- gboolean managed);
--
--G_END_DECLS
--
--#endif /* NM_CDMA_DEVICE_H */
-diff --git a/src/nm-hal-manager.c b/src/nm-hal-manager.c
-index 32cb705..8cf41e1 100644
---- a/src/nm-hal-manager.c
-+++ b/src/nm-hal-manager.c
-@@ -13,9 +13,6 @@
- #include "nm-utils.h"
- #include "nm-device-wifi.h"
- #include "nm-device-ethernet.h"
--#include "nm-gsm-device.h"
--#include "nm-hso-gsm-device.h"
--#include "nm-cdma-device.h"
-
- /* Killswitch poll frequency in seconds */
- #define RFKILL_POLL_FREQUENCY 6
-@@ -200,145 +197,6 @@ wireless_device_creator (NMHalManager *self, const char *udi, gboolean managed)
- return device;
- }
-
--/* Modem device creator */
--
--static gboolean
--is_modem_device (NMHalManager *self, const char *udi)
--{
-- NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self);
-- gboolean is_modem = FALSE;
--
-- if (libhal_device_property_exists (priv->hal_ctx, udi, "info.category", NULL)) {
-- char *category;
--
-- category = libhal_device_get_property_string (priv->hal_ctx, udi, "info.category", NULL);
-- if (category) {
-- is_modem = strcmp (category, "serial") == 0;
-- libhal_free_string (category);
-- }
-- }
--
-- return is_modem;
--}
--
--static char *
--get_hso_netdev (LibHalContext *ctx, const char *udi)
--{
-- char *serial_parent, *netdev = NULL;
-- char **netdevs;
-- int num, i;
--
-- /* Get the serial interface's originating device UDI, used to find the
-- * originating device's netdev.
-- */
-- serial_parent = libhal_device_get_property_string (ctx, udi, "serial.originating_device", NULL);
-- if (!serial_parent)
-- serial_parent = libhal_device_get_property_string (ctx, udi, "info.parent", NULL);
-- if (!serial_parent)
-- return NULL;
--
-- /* Look for the originating device's netdev */
-- netdevs = libhal_find_device_by_capability (ctx, "net", &num, NULL);
-- for (i = 0; netdevs && !netdev && (i < num); i++) {
-- char *netdev_parent, *tmp;
--
-- netdev_parent = libhal_device_get_property_string (ctx, netdevs[i], "net.originating_device", NULL);
-- if (!netdev_parent)
-- netdev_parent = libhal_device_get_property_string (ctx, netdevs[i], "net.physical_device", NULL);
-- if (!netdev_parent)
-- continue;
--
-- if (!strcmp (netdev_parent, serial_parent)) {
-- /* We found it */
-- tmp = libhal_device_get_property_string (ctx, netdevs[i], "net.interface", NULL);
-- if (tmp) {
-- netdev = g_strdup (tmp);
-- libhal_free_string (tmp);
-- }
-- }
--
-- libhal_free_string (netdev_parent);
-- }
-- libhal_free_string_array (netdevs);
-- libhal_free_string (serial_parent);
--
-- return netdev;
--}
--
--static GObject *
--modem_device_creator (NMHalManager *self, const char *udi, gboolean managed)
--{
-- NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self);
-- char *serial_device;
-- char *parent_udi;
-- char *driver_name = NULL;
-- GObject *device = NULL;
-- char **capabilities, **iter;
-- gboolean type_gsm = FALSE;
-- gboolean type_cdma = FALSE;
-- char *netdev = NULL;
--
-- serial_device = libhal_device_get_property_string (priv->hal_ctx, udi, "serial.device", NULL);
--
-- /* Get the driver */
-- parent_udi = libhal_device_get_property_string (priv->hal_ctx, udi, "info.parent", NULL);
-- if (parent_udi) {
-- driver_name = libhal_device_get_property_string (priv->hal_ctx, parent_udi, "info.linux.driver", NULL);
-- libhal_free_string (parent_udi);
-- }
--
-- if (!serial_device || !driver_name)
-- goto out;
--
-- capabilities = libhal_device_get_property_strlist (priv->hal_ctx, udi, "modem.command_sets", NULL);
-- /* 'capabilites' may be NULL */
-- for (iter = capabilities; iter && *iter; iter++) {
-- if (!strcmp (*iter, "GSM-07.07")) {
-- type_gsm = TRUE;
-- break;
-- }
-- if (!strcmp (*iter, "IS-707-A")) {
-- type_cdma = TRUE;
-- break;
-- }
-- }
-- g_strfreev (capabilities);
--
-- /* Compatiblity with the pre-specification bits */
-- if (!type_gsm && !type_cdma) {
-- capabilities = libhal_device_get_property_strlist (priv->hal_ctx, udi, "info.capabilities", NULL);
-- for (iter = capabilities; *iter; iter++) {
-- if (!strcmp (*iter, "gsm")) {
-- type_gsm = TRUE;
-- break;
-- }
-- if (!strcmp (*iter, "cdma")) {
-- type_cdma = TRUE;
-- break;
-- }
-- }
-- g_strfreev (capabilities);
-- }
--
-- /* Special handling of 'hso' cards (until punted out to a modem manager) */
-- if (type_gsm && !strcmp (driver_name, "hso"))
-- netdev = get_hso_netdev (priv->hal_ctx, udi);
--
-- if (type_gsm) {
-- if (netdev)
-- device = (GObject *) nm_hso_gsm_device_new (udi, serial_device + strlen ("/dev/"), NULL, netdev, driver_name, managed);
-- else
-- device = (GObject *) nm_gsm_device_new (udi, serial_device + strlen ("/dev/"), NULL, driver_name, managed);
-- } else if (type_cdma)
-- device = (GObject *) nm_cdma_device_new (udi, serial_device + strlen ("/dev/"), NULL, driver_name, managed);
--
--out:
-- libhal_free_string (serial_device);
-- libhal_free_string (driver_name);
--
-- return device;
--}
--
- static void
- register_built_in_creators (NMHalManager *self)
- {
-@@ -360,14 +218,6 @@ register_built_in_creators (NMHalManager *self)
- creator->is_device_fn = is_wireless_device;
- creator->creator_fn = wireless_device_creator;
- priv->device_creators = g_slist_append (priv->device_creators, creator);
--
-- /* Modem */
-- creator = g_slice_new0 (DeviceCreator);
-- creator->device_type_name = g_strdup ("Modem");
-- creator->capability_str = g_strdup ("modem");
-- creator->is_device_fn = is_modem_device;
-- creator->creator_fn = modem_device_creator;
-- priv->device_creators = g_slist_append (priv->device_creators, creator);
- }
-
- static void
-diff --git a/src/nm-hso-gsm-device.c b/src/nm-hso-gsm-device.c
-deleted file mode 100644
-index 7fedbd6..0000000
---- a/src/nm-hso-gsm-device.c
-+++ /dev/null
-@@ -1,570 +0,0 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
--
--#include <stdio.h>
--#include <string.h>
--#include <errno.h>
--#include <stdlib.h>
--#include <arpa/inet.h>
--#include <dbus/dbus-glib.h>
--
--#include "nm-device.h"
--#include "nm-hso-gsm-device.h"
--#include "nm-gsm-device.h"
--#include "nm-device-interface.h"
--#include "nm-device-private.h"
--#include "nm-setting-gsm.h"
--#include "nm-utils.h"
--#include "nm-properties-changed-signal.h"
--#include "nm-setting-connection.h"
--#include "NetworkManagerSystem.h"
--
--G_DEFINE_TYPE (NMHsoGsmDevice, nm_hso_gsm_device, NM_TYPE_GSM_DEVICE)
--
--#define NM_HSO_GSM_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDevicePrivate))
--
--extern const DBusGObjectInfo dbus_glib_nm_gsm_device_object_info;
--
--#define GSM_CID "gsm-cid"
--#define HSO_SECRETS_TRIES "gsm-secrets-tries"
--
--typedef struct {
-- char *netdev_iface;
-- NMIP4Config *pending_ip4_config;
--} NMHsoGsmDevicePrivate;
--
--enum {
-- PROP_0,
-- PROP_NETDEV_IFACE,
--
-- LAST_PROP
--};
--
--NMHsoGsmDevice *
--nm_hso_gsm_device_new (const char *udi,
-- const char *data_iface,
-- const char *monitor_iface,
-- const char *netdev_iface,
-- const char *driver,
-- gboolean managed)
--{
-- g_return_val_if_fail (udi != NULL, NULL);
-- g_return_val_if_fail (data_iface != NULL, NULL);
-- g_return_val_if_fail (driver != NULL, NULL);
-- g_return_val_if_fail (netdev_iface != NULL, NULL);
--
-- return (NMHsoGsmDevice *) g_object_new (NM_TYPE_HSO_GSM_DEVICE,
-- NM_DEVICE_INTERFACE_UDI, udi,
-- NM_DEVICE_INTERFACE_IFACE, data_iface,
-- NM_DEVICE_INTERFACE_DRIVER, driver,
-- NM_GSM_DEVICE_MONITOR_IFACE, monitor_iface,
-- NM_HSO_GSM_DEVICE_NETDEV_IFACE, netdev_iface,
-- NM_DEVICE_INTERFACE_MANAGED, managed,
-- NULL);
--}
--
--static void
--modem_wait_for_reply (NMGsmDevice *self,
-- const char *command,
-- guint timeout,
-- const char **responses,
-- const char **terminators,
-- NMSerialWaitForReplyFn callback,
-- gpointer user_data)
--{
-- NMSerialDevice *serial = NM_SERIAL_DEVICE (self);
-- guint id = 0;
--
-- if (nm_serial_device_send_command_string (serial, command))
-- id = nm_serial_device_wait_for_reply (serial, timeout, responses, terminators, callback, user_data);
--
-- if (id == 0)
-- nm_device_state_changed (NM_DEVICE (self), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_UNKNOWN);
--}
--
--static NMSetting *
--gsm_device_get_setting (NMGsmDevice *device, GType setting_type)
--{
-- NMActRequest *req;
-- NMSetting *setting = NULL;
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- if (req) {
-- NMConnection *connection;
--
-- connection = nm_act_request_get_connection (req);
-- if (connection)
-- setting = nm_connection_get_setting (connection, setting_type);
-- }
--
-- return setting;
--}
--
--static void
--hso_call_done (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- gboolean success = FALSE;
--
-- switch (reply_index) {
-- case 0:
-- nm_info ("Connected, Woo!");
-- success = TRUE;
-- break;
-- default:
-- nm_warning ("Connect request failed");
-- break;
-- }
--
-- if (success)
-- nm_device_activate_schedule_stage3_ip_config_start (NM_DEVICE (device));
-- else
-- nm_device_state_changed (NM_DEVICE (device), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED);
--}
--
--static void
--hso_clear_done (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- const char *responses[] = { "_OWANCALL: ", "ERROR", NULL };
-- guint cid = GPOINTER_TO_UINT (user_data);
-- char *command;
--
-- /* Try to connect */
-- command = g_strdup_printf ("AT_OWANCALL=%d,1,1", cid);
-- modem_wait_for_reply (NM_GSM_DEVICE (device), command, 10, responses, responses, hso_call_done, NULL);
-- g_free (command);
--}
--
--static void
--hso_auth_done (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data)
--{
-- gboolean success = FALSE;
-- const char *responses[] = { "_OWANCALL: ", "ERROR", "NO CARRIER", NULL };
-- guint cid = GPOINTER_TO_UINT (user_data);
-- char *command;
--
-- switch (reply_index) {
-- case 0:
-- nm_info ("Authentication successful!");
-- success = TRUE;
-- break;
-- default:
-- nm_warning ("Authentication failed");
-- break;
-- }
--
-- if (!success) {
-- nm_device_state_changed (NM_DEVICE (device), NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED);
-- return;
-- }
--
-- /* Kill any existing connection */
-- command = g_strdup_printf ("AT_OWANCALL=%d,0,1", cid);
-- modem_wait_for_reply (NM_GSM_DEVICE (device), command, 5, responses, responses, hso_clear_done, GUINT_TO_POINTER (cid));
-- g_free (command);
--}
--
--static void
--do_hso_auth (NMHsoGsmDevice *device)
--{
-- NMSettingGsm *s_gsm;
-- NMActRequest *req;
-- const char *responses[] = { "OK", "ERROR", "ERR", NULL };
-- char *command;
-- const char *gsm_username;
-- const char *gsm_password;
-- guint cid;
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- g_assert (req);
--
-- cid = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (req), GSM_CID));
--
-- s_gsm = NM_SETTING_GSM (gsm_device_get_setting (NM_GSM_DEVICE (device), NM_TYPE_SETTING_GSM));
--
-- gsm_username = nm_setting_gsm_get_username (s_gsm);
-- gsm_password = nm_setting_gsm_get_password (s_gsm);
--
-- command = g_strdup_printf ("AT$QCPDPP=%d,1,\"%s\",\"%s\"",
-- cid,
-- gsm_password ? gsm_password : "",
-- gsm_username ? gsm_username : "");
-- modem_wait_for_reply (NM_GSM_DEVICE (device), command, 5, responses, responses, hso_auth_done, GUINT_TO_POINTER (cid));
-- g_free (command);
--}
--
--static NMActStageReturn
--real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
--{
-- NMActRequest *req;
-- NMConnection *connection;
-- const char *setting_name;
-- GPtrArray *hints = NULL;
-- const char *hint1 = NULL, *hint2 = NULL;
-- guint32 tries;
--
-- req = nm_device_get_act_request (device);
-- g_assert (req);
-- connection = nm_act_request_get_connection (req);
-- g_assert (connection);
--
-- setting_name = nm_connection_need_secrets (connection, &hints);
-- if (!setting_name) {
-- do_hso_auth (NM_HSO_GSM_DEVICE (device));
-- return NM_ACT_STAGE_RETURN_POSTPONE;
-- }
--
-- if (hints) {
-- if (hints->len > 0)
-- hint1 = g_ptr_array_index (hints, 0);
-- if (hints->len > 1)
-- hint2 = g_ptr_array_index (hints, 1);
-- }
--
-- nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
--
-- tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), HSO_SECRETS_TRIES));
-- nm_act_request_request_connection_secrets (req,
-- setting_name,
-- tries ? TRUE : FALSE,
-- SECRETS_CALLER_HSO_GSM,
-- hint1,
-- hint2);
-- g_object_set_data (G_OBJECT (connection), HSO_SECRETS_TRIES, GUINT_TO_POINTER (++tries));
--
-- if (hints)
-- g_ptr_array_free (hints, TRUE);
--
-- return NM_ACT_STAGE_RETURN_POSTPONE;
--}
--
--static void
--real_do_dial (NMGsmDevice *device, guint cid)
--{
-- NMActRequest *req;
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- g_assert (req);
-- g_object_set_data (G_OBJECT (req), GSM_CID, GUINT_TO_POINTER (cid));
--
-- nm_device_activate_schedule_stage2_device_config (NM_DEVICE (device));
--}
--
--#define OWANDATA_TAG "_OWANDATA: "
--
--static void
--hso_ip4_config_response (NMSerialDevice *device,
-- int reply_index,
-- const char *response,
-- gpointer user_data)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device);
-- NMActRequest *req;
-- char **items, **iter;
-- guint cid, i;
-- guint32 dns1 = 0, dns2 = 0, ip4_address = 0;
--
-- if ( (reply_index < 0)
-- || !response
-- || strncmp (response, OWANDATA_TAG, strlen (OWANDATA_TAG))) {
-- nm_device_activate_schedule_stage4_ip_config_timeout (NM_DEVICE (device));
-- return;
-- }
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- g_assert (req);
-- cid = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (req), GSM_CID));
--
-- items = g_strsplit (response + strlen (OWANDATA_TAG), ", ", 0);
-- for (iter = items, i = 0; *iter; iter++, i++) {
-- if (i == 0) { /* CID */
-- long int tmp;
--
-- errno = 0;
-- tmp = strtol (*iter, NULL, 10);
-- if (errno != 0 || tmp < 0 || (guint) tmp != cid) {
-- nm_warning ("%s: unknown CID in OWANDATA response (got %d, expected %d)",
-- nm_device_get_iface (NM_DEVICE (device)),
-- (guint) tmp, cid);
-- goto out;
-- }
-- } else if (i == 1) { /* IP address */
-- if (inet_pton (AF_INET, *iter, &ip4_address) <= 0)
-- ip4_address = 0;
-- } else if (i == 3) { /* DNS 1 */
-- if (inet_pton (AF_INET, *iter, &dns1) <= 0)
-- dns1 = 0;
-- } else if (i == 4) { /* DNS 2 */
-- if (inet_pton (AF_INET, *iter, &dns2) <= 0)
-- dns2 = 0;
-- }
-- }
--
--out:
-- g_strfreev (items);
--
-- if (ip4_address) {
-- NMIP4Address *addr;
--
-- priv->pending_ip4_config = nm_ip4_config_new ();
--
-- addr = nm_ip4_address_new ();
-- nm_ip4_address_set_address (addr, ip4_address);
-- nm_ip4_address_set_prefix (addr, 32);
--
-- nm_ip4_config_take_address (priv->pending_ip4_config, addr);
--
-- if (dns1)
-- nm_ip4_config_add_nameserver (priv->pending_ip4_config, dns1);
-- if (dns2)
-- nm_ip4_config_add_nameserver (priv->pending_ip4_config, dns2);
--
-- nm_device_activate_schedule_stage4_ip_config_get (NM_DEVICE (device));
-- } else {
-- nm_device_state_changed (NM_DEVICE (device),
-- NM_DEVICE_STATE_FAILED,
-- NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-- }
--}
--
--static NMActStageReturn
--real_act_stage3_ip_config_start (NMDevice *device, NMDeviceStateReason *reason)
--{
-- NMActRequest *req;
-- char *command;
-- gint cid;
-- const char *responses[] = { "_OWANDATA: ", NULL };
-- const char *terminators[] = { "OK", "ERROR", "ERR", NULL };
--
-- req = nm_device_get_act_request (device);
-- g_assert (req);
--
-- cid = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (req), GSM_CID));
-- command = g_strdup_printf ("AT_OWANDATA=%d", cid);
-- modem_wait_for_reply (NM_GSM_DEVICE (device), command, 5, responses, terminators, hso_ip4_config_response, NULL);
-- g_free (command);
--
-- return NM_ACT_STAGE_RETURN_POSTPONE;
--}
--
--static NMActStageReturn
--real_act_stage4_get_ip4_config (NMDevice *device,
-- NMIP4Config **config,
-- NMDeviceStateReason *reason)
--{
-- NMHsoGsmDevice *self = NM_HSO_GSM_DEVICE (device);
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (self);
-- gboolean no_firmware = FALSE;
--
-- g_return_val_if_fail (config != NULL, NM_ACT_STAGE_RETURN_FAILURE);
-- g_return_val_if_fail (*config == NULL, NM_ACT_STAGE_RETURN_FAILURE);
--
-- nm_device_set_ip_iface (device, priv->netdev_iface);
-- if (!nm_device_hw_bring_up (device, TRUE, &no_firmware)) {
-- if (no_firmware)
-- *reason = NM_DEVICE_STATE_REASON_FIRMWARE_MISSING;
-- else
-- *reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
-- return NM_ACT_STAGE_RETURN_FAILURE;
-- }
--
-- *config = priv->pending_ip4_config;
-- priv->pending_ip4_config = NULL;
-- return NM_ACT_STAGE_RETURN_SUCCESS;
--}
--
--static void
--real_connection_secrets_updated (NMDevice *device,
-- NMConnection *connection,
-- GSList *updated_settings,
-- RequestSecretsCaller caller)
--{
-- g_return_if_fail (caller == SECRETS_CALLER_HSO_GSM);
-- g_return_if_fail (nm_device_get_state (device) == NM_DEVICE_STATE_NEED_AUTH);
--
-- nm_device_activate_schedule_stage2_device_config (device);
--}
--
--static void
--real_deactivate_quickly (NMDevice *device)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device);
-- NMActRequest *req;
-- guint cid;
-- char *command;
--
-- if (priv->pending_ip4_config) {
-- g_object_unref (priv->pending_ip4_config);
-- priv->pending_ip4_config = NULL;
-- }
--
-- /* Don't leave the modem connected */
-- req = nm_device_get_act_request (device);
-- if (req) {
-- cid = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (req), GSM_CID));
-- if (cid) {
-- const char *responses[] = { "OK", "ERROR", "ERR", NULL };
-- int reply;
--
-- /* Disconnect and disable asynchonous notification to keep serial
-- * buffer empty after the OK.
-- */
-- command = g_strdup_printf ("AT_OWANCALL=%d,0,0", cid);
-- nm_serial_device_send_command_string (NM_SERIAL_DEVICE (device), command);
-- reply = nm_serial_device_wait_reply_blocking (NM_SERIAL_DEVICE (device), 5, responses, responses);
-- g_free (command);
-- }
-- }
--
-- if (NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate_quickly)
-- NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate_quickly (device);
--}
--
--static void
--real_deactivate (NMDevice *device)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device);
--
-- if (priv->netdev_iface) {
-- nm_system_device_flush_ip4_routes_with_iface (priv->netdev_iface);
-- nm_system_device_flush_ip4_addresses_with_iface (priv->netdev_iface);
-- nm_system_device_set_up_down_with_iface (priv->netdev_iface, FALSE, NULL);
-- }
-- nm_device_set_ip_iface (device, NULL);
--
-- if (NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate)
-- NM_DEVICE_CLASS (nm_hso_gsm_device_parent_class)->deactivate (device);
--}
--
--static gboolean
--real_hw_is_up (NMDevice *device)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device);
-- NMDeviceState state;
--
-- state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
--
-- if ( priv->pending_ip4_config
-- || (state == NM_DEVICE_STATE_IP_CONFIG)
-- || (state == NM_DEVICE_STATE_ACTIVATED))
-- return nm_system_device_is_up_with_iface (priv->netdev_iface);
--
-- return TRUE;
--}
--
--static gboolean
--real_hw_bring_up (NMDevice *device, gboolean *no_firmware)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (device);
-- NMDeviceState state;
--
-- state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device));
--
-- if ( priv->pending_ip4_config
-- || (state == NM_DEVICE_STATE_IP_CONFIG)
-- || (state == NM_DEVICE_STATE_ACTIVATED))
-- return nm_system_device_set_up_down_with_iface (priv->netdev_iface, TRUE, no_firmware);
--
-- return TRUE;
--}
--
--static void
--nm_hso_gsm_device_init (NMHsoGsmDevice *self)
--{
--}
--
--static GObject*
--constructor (GType type,
-- guint n_params,
-- GObjectConstructParam *params)
--{
-- return G_OBJECT_CLASS (nm_hso_gsm_device_parent_class)->constructor (type, n_params, params);
--}
--
--static void
--set_property (GObject *object, guint prop_id,
-- const GValue *value, GParamSpec *pspec)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (object);
--
-- switch (prop_id) {
-- case PROP_NETDEV_IFACE:
-- /* Construct only */
-- priv->netdev_iface = g_value_dup_string (value);
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--get_property (GObject *object, guint prop_id,
-- GValue *value, GParamSpec *pspec)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (object);
--
-- switch (prop_id) {
-- case PROP_NETDEV_IFACE:
-- g_value_set_string (value, priv->netdev_iface);
-- break;
-- default:
-- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-- break;
-- }
--}
--
--static void
--finalize (GObject *object)
--{
-- NMHsoGsmDevicePrivate *priv = NM_HSO_GSM_DEVICE_GET_PRIVATE (object);
--
-- g_free (priv->netdev_iface);
--
-- G_OBJECT_CLASS (nm_hso_gsm_device_parent_class)->finalize (object);
--}
--
--static void
--nm_hso_gsm_device_class_init (NMHsoGsmDeviceClass *klass)
--{
-- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-- NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
-- NMGsmDeviceClass *gsm_class = NM_GSM_DEVICE_CLASS (klass);
--
-- g_type_class_add_private (object_class, sizeof (NMHsoGsmDevicePrivate));
--
-- object_class->constructor = constructor;
-- object_class->get_property = get_property;
-- object_class->set_property = set_property;
-- object_class->finalize = finalize;
--
-- device_class->act_stage2_config = real_act_stage2_config;
-- device_class->act_stage3_ip_config_start = real_act_stage3_ip_config_start;
-- device_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config;
-- device_class->connection_secrets_updated = real_connection_secrets_updated;
-- device_class->deactivate_quickly = real_deactivate_quickly;
-- device_class->deactivate = real_deactivate;
-- device_class->hw_is_up = real_hw_is_up;
-- device_class->hw_bring_up = real_hw_bring_up;
--
-- gsm_class->do_dial = real_do_dial;
--
-- /* Properties */
-- g_object_class_install_property
-- (object_class, PROP_NETDEV_IFACE,
-- g_param_spec_string (NM_HSO_GSM_DEVICE_NETDEV_IFACE,
-- "Network interface",
-- "Network interface",
-- NULL,
-- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | NM_PROPERTY_PARAM_NO_EXPORT));
--
-- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-- &dbus_glib_nm_gsm_device_object_info);
--}
-diff --git a/src/nm-hso-gsm-device.h b/src/nm-hso-gsm-device.h
-deleted file mode 100644
-index a7498c8..0000000
---- a/src/nm-hso-gsm-device.h
-+++ /dev/null
-@@ -1,38 +0,0 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
--
--#ifndef NM_HSO_GSM_DEVICE_H
--#define NM_HSO_GSM_DEVICE_H
--
--#include <nm-gsm-device.h>
--
--G_BEGIN_DECLS
--
--#define NM_TYPE_HSO_GSM_DEVICE (nm_hso_gsm_device_get_type ())
--#define NM_HSO_GSM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDevice))
--#define NM_HSO_GSM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDeviceClass))
--#define NM_IS_HSO_GSM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_HSO_GSM_DEVICE))
--#define NM_IS_HSO_GSM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_HSO_GSM_DEVICE))
--#define NM_HSO_GSM_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDeviceClass))
--
--#define NM_HSO_GSM_DEVICE_NETDEV_IFACE "netdev-iface"
--
--typedef struct {
-- NMGsmDevice parent;
--} NMHsoGsmDevice;
--
--typedef struct {
-- NMGsmDeviceClass parent;
--} NMHsoGsmDeviceClass;
--
--GType nm_hso_gsm_device_get_type (void);
--
--NMHsoGsmDevice *nm_hso_gsm_device_new (const char *udi,
-- const char *data_iface,
-- const char *monitor_iface,
-- const char *netdev_iface,
-- const char *driver,
-- gboolean managed);
--
--G_END_DECLS
--
--#endif /* NM_HSO_GSM_DEVICE_H */
-diff --git a/src/nm-manager.c b/src/nm-manager.c
-index def60e1..797c7b4 100644
---- a/src/nm-manager.c
-+++ b/src/nm-manager.c
-@@ -7,6 +7,7 @@
- #include "nm-utils.h"
- #include "nm-dbus-manager.h"
- #include "nm-vpn-manager.h"
-+#include "nm-modem-manager.h"
- #include "nm-device-interface.h"
- #include "nm-device-private.h"
- #include "nm-device-wifi.h"
-@@ -74,6 +75,10 @@ static void system_settings_properties_changed_cb (DBusGProxy *proxy,
- GHashTable *properties,
- gpointer user_data);
-
-+static void add_device (NMManager *self, NMDevice *device, const char *type_name);
-+static void remove_one_device (NMManager *manager, NMDevice *device);
-+
-+
- #define SSD_POKE_INTERVAL 120000
-
- typedef struct {
-@@ -112,6 +117,10 @@ typedef struct {
- NMVPNManager *vpn_manager;
- guint vpn_manager_id;
-
-+ NMModemManager *modem_manager;
-+ guint modem_added_id;
-+ guint modem_removed_id;
-+
- DBusGProxy *aipd_proxy;
-
- gboolean disposed;
-@@ -220,6 +229,36 @@ vpn_manager_connection_deactivated_cb (NMVPNManager *manager,
- }
-
- static void
-+modem_added (NMModemManager *modem_manager,
-+ NMDevice *modem,
-+ gpointer user_data)
-+{
-+ NMDeviceType type;
-+ const char *type_name;
-+
-+ type = nm_device_get_device_type (NM_DEVICE (modem));
-+ if (type == NM_DEVICE_TYPE_GSM)
-+ type_name = "GSM modem";
-+ else if (type == NM_DEVICE_TYPE_CDMA)
-+ type_name = "CDMA modem";
-+ else
-+ type_name = "Unknown modem";
-+
-+ add_device (NM_MANAGER (user_data), NM_DEVICE (g_object_ref (modem)), type_name);
-+}
-+
-+static void
-+modem_removed (NMModemManager *modem_manager,
-+ NMDevice *modem,
-+ gpointer user_data)
-+{
-+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (user_data);
-+
-+ remove_one_device (NM_MANAGER (user_data), modem);
-+ priv->devices = g_slist_remove (priv->devices, modem);
-+}
-+
-+static void
- aipd_handle_event (DBusGProxy *proxy,
- const char *event,
- const char *iface,
-@@ -282,6 +321,12 @@ nm_manager_init (NMManager *manager)
- g_free,
- g_object_unref);
-
-+ priv->modem_manager = nm_modem_manager_get ();
-+ priv->modem_added_id = g_signal_connect (priv->modem_manager, "device-added",
-+ G_CALLBACK (modem_added), manager);
-+ priv->modem_removed_id = g_signal_connect (priv->modem_manager, "device-removed",
-+ G_CALLBACK (modem_removed), manager);
-+
- priv->vpn_manager = nm_vpn_manager_get ();
- id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-deactivated",
- G_CALLBACK (vpn_manager_connection_deactivated_cb), manager);
-@@ -481,6 +526,16 @@ dispose (GObject *object)
- }
- g_object_unref (priv->vpn_manager);
-
-+ if (priv->modem_added_id) {
-+ g_source_remove (priv->modem_added_id);
-+ priv->modem_added_id = 0;
-+ }
-+ if (priv->modem_removed_id) {
-+ g_source_remove (priv->modem_removed_id);
-+ priv->modem_removed_id = 0;
-+ }
-+ g_object_unref (priv->modem_manager);
-+
- g_object_unref (priv->dbus_mgr);
- g_object_unref (priv->hal_mgr);
-
-@@ -1623,58 +1678,66 @@ next:
- }
-
- static void
--hal_manager_udi_added_cb (NMHalManager *hal_mgr,
-- const char *udi,
-- const char *type_name,
-- NMDeviceCreatorFn creator_fn,
-- gpointer user_data)
-+add_device (NMManager *self, NMDevice *device, const char *type_name)
- {
-- NMManager *self = NM_MANAGER (user_data);
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
-- GObject *device;
- const char *iface;
-
-- if (priv->sleeping)
-- return;
--
-- /* Make sure the device is not already in the device list */
-- if (nm_manager_get_device_by_udi (self, udi))
-- return;
--
-- device = creator_fn (hal_mgr, udi, nm_manager_udi_is_managed (self, udi));
-- if (!device)
-- return;
--
- priv->devices = g_slist_append (priv->devices, device);
-
- g_signal_connect (device, "state-changed",
-- G_CALLBACK (manager_device_state_changed),
-- self);
-+ G_CALLBACK (manager_device_state_changed),
-+ self);
-
- /* Attach to the access-point-added signal so that the manager can fill
- * non-SSID-broadcasting APs with an SSID.
- */
- if (NM_IS_DEVICE_WIFI (device)) {
- g_signal_connect (device, "hidden-ap-found",
-- G_CALLBACK (manager_hidden_ap_found),
-- self);
-+ G_CALLBACK (manager_hidden_ap_found),
-+ self);
-
- /* Set initial rfkill state */
- nm_device_wifi_set_enabled (NM_DEVICE_WIFI (device), priv->wireless_enabled);
- }
-
-- iface = nm_device_get_iface (NM_DEVICE (device));
-+ iface = nm_device_get_iface (device);
- nm_info ("Found new %s device '%s'.", type_name, iface);
-
- dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (priv->dbus_mgr),
- nm_device_get_udi (NM_DEVICE (device)),
-- device);
-- nm_info ("(%s): exported as %s", iface, udi);
-+ G_OBJECT (device));
-+ nm_info ("(%s): exported as %s", iface, nm_device_get_udi (device));
-
- g_signal_emit (self, signals[DEVICE_ADDED], 0, device);
- }
-
- static void
-+hal_manager_udi_added_cb (NMHalManager *hal_mgr,
-+ const char *udi,
-+ const char *type_name,
-+ NMDeviceCreatorFn creator_fn,
-+ gpointer user_data)
-+{
-+ NMManager *self = NM_MANAGER (user_data);
-+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
-+ GObject *device;
-+
-+ if (priv->sleeping)
-+ return;
-+
-+ /* Make sure the device is not already in the device list */
-+ if (nm_manager_get_device_by_udi (self, udi))
-+ return;
-+
-+ device = creator_fn (hal_mgr, udi, nm_manager_udi_is_managed (self, udi));
-+ if (!device)
-+ return;
-+
-+ add_device (self, NM_DEVICE (device), type_name);
-+}
-+
-+static void
- hal_manager_udi_removed_cb (NMHalManager *manager,
- const char *udi,
- gpointer user_data)
-diff --git a/src/nm-serial-device.c b/src/nm-serial-device.c
-deleted file mode 100644
-index eeea3b7..0000000
---- a/src/nm-serial-device.c
-+++ /dev/null
-@@ -1,1159 +0,0 @@
--/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
--
--#define _GNU_SOURCE /* for strcasestr() */
--
--#include <termio.h>
--#include <unistd.h>
--#include <sys/types.h>
--#include <sys/stat.h>
--#include <fcntl.h>
--#include <errno.h>
--#include <sys/ioctl.h>
--#include <string.h>
--#include <stdlib.h>
--#include <glib.h>
--
--#include "nm-serial-device.h"
--#include "nm-device-interface.h"
--#include "nm-device-private.h"
--#include "ppp-manager/nm-ppp-manager.h"
--#include "nm-setting-ppp.h"
--#include "nm-marshal.h"
--#include "nm-utils.h"
--#include "nm-serial-device-glue.h"
--#include "NetworkManagerUtils.h"
--
--static gboolean serial_debug = FALSE;
--
--#define SERIAL_BUF_SIZE 2048
--
--G_DEFINE_TYPE (NMSerialDevice, nm_serial_device, NM_TYPE_DEVICE)
--
--#define NM_SERIAL_DEVICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SERIAL_DEVICE, NMSerialDevicePrivate))
--
--typedef struct {
-- int fd;
-- GIOChannel *channel;
-- NMPPPManager *ppp_manager;
-- NMIP4Config *pending_ip4_config;
-- struct termios old_t;
--
-- guint pending_id;
-- guint timeout_id;
--
-- /* PPP stats */
-- guint32 in_bytes;
-- guint32 out_bytes;
--} NMSerialDevicePrivate;
--
--enum {
-- PPP_STATS,
--
-- LAST_SIGNAL
--};
--
--static guint signals[LAST_SIGNAL] = { 0 };
--
--static int
--parse_baudrate (guint i)
--{
-- int speed;
--
-- switch (i) {
-- case 0:
-- speed = B0;
-- break;
-- case 50:
-- speed = B50;
-- break;
-- case 75:
-- speed = B75;
-- break;
-- case 110:
-- speed = B110;
-- break;
-- case 150:
-- speed = B150;
-- break;
-- case 300:
-- speed = B300;
-- break;
-- case 600:
-- speed = B600;
-- break;
-- case 1200:
-- speed = B1200;
-- break;
-- case 2400:
-- speed = B2400;
-- break;
-- case 4800:
-- speed = B4800;
-- break;
-- case 9600:
-- speed = B9600;
-- break;
-- case 19200:
-- speed = B19200;
-- break;
-- case 38400:
-- speed = B38400;
-- break;
-- case 57600:
-- speed = B57600;
-- break;
-- case 115200:
-- speed = B115200;
-- break;
-- case 460800:
-- speed = B460800;
-- break;
-- default:
-- g_warning ("Invalid baudrate '%d'", i);
-- speed = B9600;
-- }
--
-- return speed;
--}
--
--static int
--parse_bits (guint i)
--{
-- int bits;
--
-- switch (i) {
-- case 5:
-- bits = CS5;
-- break;
-- case 6:
-- bits = CS6;
-- break;
-- case 7:
-- bits = CS7;
-- break;
-- case 8:
-- bits = CS8;
-- break;
-- default:
-- g_warning ("Invalid bits (%d). Valid values are 5, 6, 7, 8.", i);
-- bits = CS8;
-- }
--
-- return bits;
--}
--
--static int
--parse_parity (char c)
--{
-- int parity;
--
-- switch (c) {
-- case 'n':
-- case 'N':
-- parity = 0;
-- break;
-- case 'e':
-- case 'E':
-- parity = PARENB;
-- break;
-- case 'o':
-- case 'O':
-- parity = PARENB | PARODD;
-- break;
-- default:
-- g_warning ("Invalid parity (%c). Valid values are n, e, o", c);
-- parity = 0;
-- }
--
-- return parity;
--}
--
--static int
--parse_stopbits (guint i)
--{
-- int stopbits;
--
-- switch (i) {
-- case 1:
-- stopbits = 0;
-- break;
-- case 2:
-- stopbits = CSTOPB;
-- break;
-- default:
-- g_warning ("Invalid stop bits (%d). Valid values are 1 and 2)", i);
-- stopbits = 0;
-- }
--
-- return stopbits;
--}
--
--static inline void
--nm_serial_debug (const char *prefix, const char *data, int len)
--{
-- GString *str;
-- int i;
--
-- if (!serial_debug)
-- return;
--
-- str = g_string_sized_new (len);
-- for (i = 0; i < len; i++) {
-- if (data[i] == '\0')
-- g_string_append_c (str, ' ');
-- else if (data[i] == '\r')
-- g_string_append_c (str, '\n');
-- else
-- g_string_append_c (str, data[i]);
-- }
--
-- nm_debug ("%s '%s'", prefix, str->str);
-- g_string_free (str, TRUE);
--}
--
--static NMSetting *
--serial_device_get_setting (NMSerialDevice *device, GType setting_type)
--{
-- NMActRequest *req;
-- NMSetting *setting = NULL;
--
-- req = nm_device_get_act_request (NM_DEVICE (device));
-- if (req) {
-- NMConnection *connection;
--
-- connection = nm_act_request_get_connection (req);
-- if (connection)
-- setting = nm_connection_get_setting (connection, setting_type);
-- }
--
-- return setting;
--}
--
--/* Timeout handling */
--
--static void
--nm_serial_device_timeout_removed (gpointer data)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (data);
--
-- priv->timeout_id = 0;
--}
--
--static gboolean
--nm_serial_device_timed_out (gpointer data)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (data);
--
-- /* Cancel data reading */
-- if (priv->pending_id)
-- g_source_remove (priv->pending_id);
-- else
-- nm_warning ("Timeout reached, but there's nothing to time out");
--
-- return FALSE;
--}
--
--static void
--nm_serial_device_add_timeout (NMSerialDevice *self, guint timeout)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (self);
--
-- if (priv->pending_id == 0)
-- nm_warning ("Adding a time out while not waiting for any data");
--
-- if (priv->timeout_id) {
-- nm_warning ("Trying to add a new time out while the old one still exists");
-- g_source_remove (priv->timeout_id);
-- }
--
-- priv->timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT,
-- timeout * 1000,
-- nm_serial_device_timed_out,
-- self,
-- nm_serial_device_timeout_removed);
-- if (G_UNLIKELY (priv->timeout_id == 0))
-- nm_warning ("Registering serial device time out failed.");
--}
--
--static void
--nm_serial_device_remove_timeout (NMSerialDevice *self)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (self);
--
-- if (priv->timeout_id)
-- g_source_remove (priv->timeout_id);
--}
--
--/* Pending data reading */
--
--static guint
--nm_serial_device_set_pending (NMSerialDevice *device,
-- guint timeout,
-- GIOFunc callback,
-- gpointer user_data,
-- GDestroyNotify notify)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
--
-- if (G_UNLIKELY (priv->pending_id)) {
-- /* FIXME: Probably should queue up pending calls instead? */
-- /* Multiple pending calls on the same GIOChannel doesn't work, so let's cancel the previous one. */
-- nm_warning ("Adding new pending call while previous one isn't finished.");
-- nm_warning ("Cancelling the previous pending call.");
-- g_source_remove (priv->pending_id);
-- }
--
-- priv->pending_id = g_io_add_watch_full (priv->channel,
-- G_PRIORITY_DEFAULT,
-- G_IO_IN | G_IO_ERR | G_IO_HUP,
-- callback, user_data, notify);
--
-- nm_serial_device_add_timeout (device, timeout);
--
-- return priv->pending_id;
--}
--
--static void
--nm_serial_device_pending_done (NMSerialDevice *self)
--{
-- NM_SERIAL_DEVICE_GET_PRIVATE (self)->pending_id = 0;
-- nm_serial_device_remove_timeout (self);
--}
--
--/****/
--
--static gboolean
--config_fd (NMSerialDevice *device, NMSettingSerial *setting)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
-- struct termio stbuf;
-- int speed;
-- int bits;
-- int parity;
-- int stopbits;
--
-- speed = parse_baudrate (nm_setting_serial_get_baud (setting));
-- bits = parse_bits (nm_setting_serial_get_bits (setting));
-- parity = parse_parity (nm_setting_serial_get_parity (setting));
-- stopbits = parse_stopbits (nm_setting_serial_get_stopbits (setting));
--
-- ioctl (priv->fd, TCGETA, &stbuf);
--
-- stbuf.c_iflag &= ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | IGNPAR );
-- stbuf.c_oflag &= ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
-- stbuf.c_lflag &= ~(ICANON | XCASE | ECHO | ECHOE | ECHONL);
-- stbuf.c_lflag &= ~(ECHO | ECHOE);
-- stbuf.c_cc[VMIN] = 1;
-- stbuf.c_cc[VTIME] = 0;
-- stbuf.c_cc[VEOF] = 1;
--
-- stbuf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB);
-- stbuf.c_cflag |= (speed | bits | CREAD | 0 | parity | stopbits);
--
-- if (ioctl (priv->fd, TCSETA, &stbuf) < 0) {
-- nm_warning ("(%s) cannot control device (errno %d)",
-- nm_device_get_iface (NM_DEVICE (device)), errno);
-- return FALSE;
-- }
--
-- return TRUE;
--}
--
--gboolean
--nm_serial_device_open (NMSerialDevice *device,
-- NMSettingSerial *setting)
--{
-- NMSerialDevicePrivate *priv;
-- const char *iface;
-- char *path;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), FALSE);
-- g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), FALSE);
--
-- priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
-- iface = nm_device_get_iface (NM_DEVICE (device));
--
-- nm_debug ("(%s) opening device...", iface);
--
-- path = g_build_filename ("/dev", iface, NULL);
-- priv->fd = open (path, O_RDWR | O_EXCL | O_NONBLOCK | O_NOCTTY);
-- g_free (path);
--
-- if (priv->fd < 0) {
-- nm_warning ("(%s) cannot open device (errno %d)", iface, errno);
-- return FALSE;
-- }
--
-- if (ioctl (priv->fd, TCGETA, &priv->old_t) < 0) {
-- nm_warning ("(%s) cannot control device (errno %d)", iface, errno);
-- close (priv->fd);
-- return FALSE;
-- }
--
-- if (!config_fd (device, setting)) {
-- close (priv->fd);
-- return FALSE;
-- }
--
-- priv->channel = g_io_channel_unix_new (priv->fd);
--
-- return TRUE;
--}
--
--void
--nm_serial_device_close (NMSerialDevice *device)
--{
-- NMSerialDevicePrivate *priv;
--
-- g_return_if_fail (NM_IS_SERIAL_DEVICE (device));
--
-- priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
--
-- if (priv->pending_id)
-- g_source_remove (priv->pending_id);
--
-- if (priv->ppp_manager) {
-- nm_ppp_manager_stop (priv->ppp_manager);
-- g_object_unref (priv->ppp_manager);
-- priv->ppp_manager = NULL;
-- }
--
-- if (priv->fd) {
-- nm_debug ("Closing device '%s'", nm_device_get_iface (NM_DEVICE (device)));
--
-- if (priv->channel) {
-- g_io_channel_unref (priv->channel);
-- priv->channel = NULL;
-- }
--
-- ioctl (priv->fd, TCSETA, &priv->old_t);
-- close (priv->fd);
-- priv->fd = 0;
-- }
--}
--
--gboolean
--nm_serial_device_send_command (NMSerialDevice *device, GByteArray *command)
--{
-- int fd;
-- NMSettingSerial *setting;
-- int i, eagain_count = 1000;
-- ssize_t written;
-- guint32 send_delay = 0;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), FALSE);
-- g_return_val_if_fail (command != NULL, FALSE);
--
-- fd = NM_SERIAL_DEVICE_GET_PRIVATE (device)->fd;
-- setting = NM_SETTING_SERIAL (serial_device_get_setting (device, NM_TYPE_SETTING_SERIAL));
-- if (setting)
-- send_delay = nm_setting_serial_get_send_delay (setting);
-- if (send_delay == 0)
-- send_delay = G_USEC_PER_SEC / 1000;
--
-- nm_serial_debug ("Sending:", (char *) command->data, command->len);
--
-- for (i = 0; i < command->len && eagain_count > 0;) {
-- written = write (fd, command->data + i, 1);
--
-- if (written > 0)
-- i += written;
-- else {
-- /* Treat written == 0 as EAGAIN to ensure we break out of the
-- * for() loop eventually.
-- */
-- if ((written < 0) && (errno != EAGAIN)) {
-- g_warning ("Error in writing (errno %d)", errno);
-- return FALSE;
-- }
-- eagain_count--;
-- }
-- g_usleep (send_delay);
-- }
--
-- if (eagain_count <= 0)
-- nm_serial_debug ("Error: too many retries sending:", (char *) command->data, command->len);
--
-- return TRUE;
--}
--
--gboolean
--nm_serial_device_send_command_string (NMSerialDevice *device, const char *str)
--{
-- GByteArray *command;
-- gboolean ret;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), FALSE);
-- g_return_val_if_fail (str != NULL, FALSE);
--
-- command = g_byte_array_new ();
-- g_byte_array_append (command, (guint8 *) str, strlen (str));
-- g_byte_array_append (command, (guint8 *) "\r", 1);
--
-- ret = nm_serial_device_send_command (device, command);
-- g_byte_array_free (command, TRUE);
--
-- return ret;
--}
--
--static gboolean
--find_terminator (const char *line, const char **terminators)
--{
-- int i;
--
-- for (i = 0; terminators[i]; i++) {
-- if (!strncasecmp (line, terminators[i], strlen (terminators[i])))
-- return TRUE;
-- }
-- return FALSE;
--}
--
--static const char *
--find_response (const char *line, const char **responses, gint *idx)
--{
-- int i;
--
-- /* Don't look for a result again if we got one previously */
-- for (i = 0; responses[i]; i++) {
-- if (strcasestr (line, responses[i])) {
-- *idx = i;
-- return line;
-- }
-- }
-- return NULL;
--}
--
--#define RESPONSE_LINE_MAX 128
--
--int
--nm_serial_device_wait_reply_blocking (NMSerialDevice *device,
-- guint32 timeout_secs,
-- const char **needles,
-- const char **terminators)
--{
-- char buf[SERIAL_BUF_SIZE + 1];
-- int fd, reply_index = -1, bytes_read;
-- GString *result = NULL;
-- time_t end;
-- const char *response = NULL;
-- gboolean done = FALSE;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), -1);
-- g_return_val_if_fail (timeout_secs <= 60, -1);
-- g_return_val_if_fail (needles != NULL, -1);
--
-- fd = NM_SERIAL_DEVICE_GET_PRIVATE (device)->fd;
-- if (fd < 0)
-- return -1;
--
-- end = time (NULL) + timeout_secs;
-- result = g_string_sized_new (20);
-- do {
-- bytes_read = read (fd, buf, SERIAL_BUF_SIZE);
-- if (bytes_read < 0 && errno != EAGAIN) {
-- nm_warning ("%s: read error: %d (%s)",
-- nm_device_get_iface (NM_DEVICE (device)),
-- errno,
-- strerror (errno));
-- return -1;
-- }
--
-- if (bytes_read == 0)
-- break; /* EOF */
-- else if (bytes_read > 0) {
-- buf[bytes_read] = 0;
-- g_string_append (result, buf);
--
-- nm_serial_debug ("Got:", result->str, result->len);
-- }
--
-- /* Look for needles and terminators */
-- if ((bytes_read > 0) && result->str) {
-- char *p = result->str;
--
-- /* Break the response up into lines and process each one */
-- while ((p < result->str + strlen (result->str)) && !done) {
-- char line[RESPONSE_LINE_MAX] = { '\0', };
-- char *tmp;
-- int i;
-- gboolean got_something = FALSE;
--
-- for (i = 0; *p && (i < RESPONSE_LINE_MAX - 1); p++) {
-- /* Ignore front CR/LF */
-- if ((*p == '\n') || (*p == '\r')) {
-- if (got_something)
-- break;
-- } else {
-- line[i++] = *p;
-- got_something = TRUE;
-- }
-- }
-- line[i] = '\0';
--
-- tmp = g_strstrip (line);
-- if (tmp && strlen (tmp)) {
-- done = find_terminator (tmp, terminators);
-- if (reply_index == -1)
-- response = find_response (tmp, needles, &reply_index);
-- }
-- }
-- }
--
-- /* Limit the size of the buffer */
-- if (result->len > SERIAL_BUF_SIZE) {
-- g_warning ("%s (%s): response buffer filled before repsonse received",
-- __func__, nm_device_get_iface (NM_DEVICE (device)));
-- break;
-- }
--
-- if (!done)
-- g_usleep (100);
-- } while (!done && (time (NULL) < end));
--
-- return reply_index;
--}
--
--typedef struct {
-- NMSerialDevice *device;
-- char **str_needles;
-- char **terminators;
-- GString *result;
-- NMSerialWaitForReplyFn callback;
-- gpointer user_data;
-- int reply_index;
-- char *reply_line;
-- time_t end;
--} WaitForReplyInfo;
--
--static void
--wait_for_reply_done (gpointer data)
--{
-- WaitForReplyInfo *info = (WaitForReplyInfo *) data;
--
-- nm_serial_device_pending_done (info->device);
--
-- /* Call the callback */
-- info->callback (info->device, info->reply_index, info->reply_line, info->user_data);
--
-- /* Free info */
-- if (info->result)
-- g_string_free (info->result, TRUE);
--
-- g_free (info->reply_line);
--
-- g_strfreev (info->str_needles);
-- g_strfreev (info->terminators);
-- g_slice_free (WaitForReplyInfo, info);
--}
--
--static gboolean
--wait_for_reply_got_data (GIOChannel *source,
-- GIOCondition condition,
-- gpointer data)
--{
-- WaitForReplyInfo *info = (WaitForReplyInfo *) data;
-- gchar buf[SERIAL_BUF_SIZE + 1];
-- gsize bytes_read;
-- GIOStatus status;
-- gboolean done = FALSE;
--
-- if (condition & G_IO_HUP || condition & G_IO_ERR)
-- return FALSE;
--
-- do {
-- GError *err = NULL;
--
-- status = g_io_channel_read_chars (source, buf, SERIAL_BUF_SIZE, &bytes_read, &err);
-- if (status == G_IO_STATUS_ERROR) {
-- g_warning ("%s", err->message);
-- g_error_free (err);
-- err = NULL;
-- }
--
-- if (bytes_read > 0) {
-- buf[bytes_read] = 0;
-- g_string_append (info->result, buf);
--
-- nm_serial_debug ("Got:", info->result->str, info->result->len);
-- }
--
-- /* Look for needles and terminators */
-- if ((bytes_read > 0) && info->result->str) {
-- char *p = info->result->str;
--
-- /* Break the response up into lines and process each one */
-- while ((p < info->result->str + strlen (info->result->str)) && !done) {
-- char line[RESPONSE_LINE_MAX] = { '\0', };
-- char *tmp;
-- int i;
-- gboolean got_something = FALSE;
--
-- for (i = 0; *p && (i < RESPONSE_LINE_MAX - 1); p++) {
-- /* Ignore front CR/LF */
-- if ((*p == '\n') || (*p == '\r')) {
-- if (got_something)
-- break;
-- } else {
-- line[i++] = *p;
-- got_something = TRUE;
-- }
-- }
-- line[i] = '\0';
--
-- tmp = g_strstrip (line);
-- if (tmp && strlen (tmp)) {
-- done = find_terminator (tmp, (const char **) info->terminators);
-- if (info->reply_index == -1) {
-- if (find_response (tmp, (const char **) info->str_needles, &(info->reply_index)))
-- info->reply_line = g_strdup (tmp);
-- }
-- }
-- }
-- }
--
-- /* Limit the size of the buffer */
-- if (info->result->len > SERIAL_BUF_SIZE) {
-- nm_warning ("(%s): response buffer filled before repsonse received",
-- nm_device_get_iface (NM_DEVICE (info->device)));
-- done = TRUE;
-- break;
-- }
--
-- /* Make sure we don't go over the timeout, in addition to the timeout
-- * handler that's been scheduled. If for some reason this loop doesn't
-- * terminate (terminator not found, whatever) then this should make
-- * sure that NM doesn't spin the CPU forever.
-- */
-- if (time (NULL) > info->end) {
-- done = TRUE;
-- break;
-- } else if (!done)
-- g_usleep (50);
-- } while (!done || bytes_read == SERIAL_BUF_SIZE || status == G_IO_STATUS_AGAIN);
--
-- return !done;
--}
--
--guint
--nm_serial_device_wait_for_reply (NMSerialDevice *device,
-- guint timeout,
-- const char **responses,
-- const char **terminators,
-- NMSerialWaitForReplyFn callback,
-- gpointer user_data)
--{
-- WaitForReplyInfo *info;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), 0);
-- g_return_val_if_fail (responses != NULL, 0);
-- g_return_val_if_fail (callback != NULL, 0);
--
-- info = g_slice_new0 (WaitForReplyInfo);
-- info->device = device;
-- info->str_needles = g_strdupv ((char **) responses);
-- info->terminators = g_strdupv ((char **) terminators);
-- info->result = g_string_new (NULL);
-- info->callback = callback;
-- info->user_data = user_data;
-- info->reply_index = -1;
-- info->end = time (NULL) + timeout;
--
-- return nm_serial_device_set_pending (device, timeout, wait_for_reply_got_data, info, wait_for_reply_done);
--}
--
--#if 0
--typedef struct {
-- NMSerialDevice *device;
-- gboolean timed_out;
-- NMSerialWaitQuietFn callback;
-- gpointer user_data;
--} WaitQuietInfo;
--
--static void
--wait_quiet_done (gpointer data)
--{
-- WaitQuietInfo *info = (WaitQuietInfo *) data;
--
-- nm_serial_device_pending_done (info->device);
--
-- /* Call the callback */
-- info->callback (info->device, info->timed_out, info->user_data);
--
-- /* Free info */
-- g_slice_free (WaitQuietInfo, info);
--}
--
--static gboolean
--wait_quiet_quiettime (gpointer data)
--{
-- WaitQuietInfo *info = (WaitQuietInfo *) data;
--
-- info->timed_out = FALSE;
-- g_source_remove (NM_SERIAL_DEVICE_GET_PRIVATE (info->device)->pending);
--
-- return FALSE;
--}
--
--static gboolean
--wait_quiet_got_data (GIOChannel *source,
-- GIOCondition condition,
-- gpointer data)
--{
-- WaitQuietInfo *info = (WaitQuietInfo *) data;
-- gsize bytes_read;
-- char buf[4096];
-- GIOStatus status;
--
-- if (condition & G_IO_HUP || condition & G_IO_ERR)
-- return FALSE;
--
-- if (condition & G_IO_IN) {
-- do {
-- status = g_io_channel_read_chars (source, buf, 4096, &bytes_read, NULL);
--
-- if (bytes_read) {
-- /* Reset the quiet time timeout */
-- g_source_remove (info->quiet_id);
-- info->quiet_id = g_timeout_add (info->quiet_time, wait_quiet_quiettime, info);
-- }
-- } while (bytes_read == 4096 || status == G_IO_STATUS_AGAIN);
-- }
--
-- return TRUE;
--}
--
--void
--nm_serial_device_wait_quiet (NMSerialDevice *device,
-- guint timeout,
-- guint quiet_time,
-- NMSerialWaitQuietFn callback,
-- gpointer user_data)
--{
-- WaitQuietInfo *info;
--
-- g_return_if_fail (NM_IS_SERIAL_DEVICE (device));
-- g_return_if_fail (callback != NULL);
--
-- info = g_slice_new0 (WaitQuietInfo);
-- info->device = device;
-- info->timed_out = TRUE;
-- info->callback = callback;
-- info->user_data = user_data;
-- info->quiet_id = g_timeout_add (quiet_time,
-- wait_quiet_timeout,
-- info);
--
-- return nm_serial_device_set_pending (device, timeout, wait_quiet_got_data, info, wait_quiet_done);
--}
--
--#endif
--
--typedef struct {
-- NMSerialDevice *device;
-- speed_t current_speed;
-- NMSerialFlashFn callback;
-- gpointer user_data;
--} FlashInfo;
--
--static speed_t
--get_speed (NMSerialDevice *device)
--{
-- struct termios options;
--
-- tcgetattr (NM_SERIAL_DEVICE_GET_PRIVATE (device)->fd, &options);
--
-- return cfgetospeed (&options);
--}
--
--static void
--set_speed (NMSerialDevice *device, speed_t speed)
--{
-- struct termios options;
-- int fd;
--
-- fd = NM_SERIAL_DEVICE_GET_PRIVATE (device)->fd;
-- tcgetattr (fd, &options);
--
-- cfsetispeed (&options, speed);
-- cfsetospeed (&options, speed);
--
-- options.c_cflag |= (CLOCAL | CREAD);
-- tcsetattr (fd, TCSANOW, &options);
--}
--
--static void
--flash_done (gpointer data)
--{
-- FlashInfo *info = (FlashInfo *) data;
--
-- NM_SERIAL_DEVICE_GET_PRIVATE (info->device)->pending_id = 0;
--
-- info->callback (info->device, info->user_data);
--
-- g_slice_free (FlashInfo, info);
--}
--
--static gboolean
--flash_do (gpointer data)
--{
-- FlashInfo *info = (FlashInfo *) data;
--
-- set_speed (info->device, info->current_speed);
--
-- return FALSE;
--}
--
--guint
--nm_serial_device_flash (NMSerialDevice *device,
-- guint32 flash_time,
-- NMSerialFlashFn callback,
-- gpointer user_data)
--{
-- FlashInfo *info;
-- guint id;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), 0);
-- g_return_val_if_fail (callback != NULL, 0);
--
-- info = g_slice_new0 (FlashInfo);
-- info->device = device;
-- info->current_speed = get_speed (device);
-- info->callback = callback;
-- info->user_data = user_data;
--
-- set_speed (device, B0);
--
-- id = g_timeout_add_full (G_PRIORITY_DEFAULT,
-- flash_time,
-- flash_do,
-- info,
-- flash_done);
--
-- NM_SERIAL_DEVICE_GET_PRIVATE (device)->pending_id = id;
--
-- return id;
--}
--
--GIOChannel *
--nm_serial_device_get_io_channel (NMSerialDevice *device)
--{
-- NMSerialDevicePrivate *priv;
--
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), 0);
--
-- priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
-- if (priv->channel)
-- return g_io_channel_ref (priv->channel);
--
-- return NULL;
--}
--
--NMPPPManager *
--nm_serial_device_get_ppp_manager (NMSerialDevice *device)
--{
-- g_return_val_if_fail (NM_IS_SERIAL_DEVICE (device), NULL);
--
-- return NM_SERIAL_DEVICE_GET_PRIVATE (device)->ppp_manager;
--}
--
--static void
--ppp_state_changed (NMPPPManager *ppp_manager, NMPPPStatus status, gpointer user_data)
--{
-- NMDevice *device = NM_DEVICE (user_data);
--
-- switch (status) {
-- case NM_PPP_STATUS_NETWORK:
-- nm_device_state_changed (device, NM_DEVICE_STATE_IP_CONFIG, NM_DEVICE_STATE_REASON_NONE);
-- break;
-- case NM_PPP_STATUS_DISCONNECT:
-- nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_DISCONNECT);
-- break;
-- case NM_PPP_STATUS_DEAD:
-- nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_FAILED);
-- break;
-- case NM_PPP_STATUS_AUTHENTICATE:
-- nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE);
-- break;
-- default:
-- break;
-- }
--}
--
--static void
--ppp_ip4_config (NMPPPManager *ppp_manager,
-- const char *iface,
-- NMIP4Config *config,
-- gpointer user_data)
--{
-- NMDevice *device = NM_DEVICE (user_data);
--
-- nm_device_set_ip_iface (device, iface);
-- NM_SERIAL_DEVICE_GET_PRIVATE (device)->pending_ip4_config = g_object_ref (config);
-- nm_device_activate_schedule_stage4_ip_config_get (device);
--}
--
--static void
--ppp_stats (NMPPPManager *ppp_manager,
-- guint32 in_bytes,
-- guint32 out_bytes,
-- gpointer user_data)
--{
-- NMSerialDevice *device = NM_SERIAL_DEVICE (user_data);
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
--
-- if (priv->in_bytes != in_bytes || priv->out_bytes != out_bytes) {
-- priv->in_bytes = in_bytes;
-- priv->out_bytes = out_bytes;
--
-- g_signal_emit (device, signals[PPP_STATS], 0, in_bytes, out_bytes);
-- }
--}
--
--static NMActStageReturn
--real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
-- NMSerialDeviceClass *serial_class = NM_SERIAL_DEVICE_GET_CLASS (device);
-- NMActRequest *req;
-- GError *err = NULL;
-- NMActStageReturn ret;
-- const char *ppp_name = NULL;
--
-- req = nm_device_get_act_request (device);
-- g_assert (req);
--
-- if (serial_class->get_ppp_name)
-- ppp_name = serial_class->get_ppp_name (NM_SERIAL_DEVICE (device), req);
--
-- priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (device));
-- if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, &err)) {
-- g_signal_connect (priv->ppp_manager, "state-changed",
-- G_CALLBACK (ppp_state_changed),
-- device);
-- g_signal_connect (priv->ppp_manager, "ip4-config",
-- G_CALLBACK (ppp_ip4_config),
-- device);
-- g_signal_connect (priv->ppp_manager, "stats",
-- G_CALLBACK (ppp_stats),
-- device);
--
-- ret = NM_ACT_STAGE_RETURN_POSTPONE;
-- } else {
-- nm_warning ("%s", err->message);
-- g_error_free (err);
--
-- g_object_unref (priv->ppp_manager);
-- priv->ppp_manager = NULL;
--
-- *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
-- ret = NM_ACT_STAGE_RETURN_FAILURE;
-- }
--
-- return ret;
--}
--
--static NMActStageReturn
--real_act_stage4_get_ip4_config (NMDevice *device,
-- NMIP4Config **config,
-- NMDeviceStateReason *reason)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
-- NMConnection *connection;
-- NMSettingIP4Config *s_ip4;
--
-- g_return_val_if_fail (config != NULL, NM_ACT_STAGE_RETURN_FAILURE);
-- g_return_val_if_fail (*config == NULL, NM_ACT_STAGE_RETURN_FAILURE);
-- g_return_val_if_fail (reason != NULL, NM_ACT_STAGE_RETURN_FAILURE);
--
-- connection = nm_act_request_get_connection (nm_device_get_act_request (device));
-- g_assert (connection);
--
-- s_ip4 = (NMSettingIP4Config *) nm_connection_get_setting (connection, NM_TYPE_SETTING_IP4_CONFIG);
--
-- *config = priv->pending_ip4_config;
-- priv->pending_ip4_config = NULL;
-- nm_utils_merge_ip4_config (*config, s_ip4);
--
-- return NM_ACT_STAGE_RETURN_SUCCESS;
--}
--
--static void
--cleanup_device (NMSerialDevice *device)
--{
-- NMSerialDevicePrivate *priv = NM_SERIAL_DEVICE_GET_PRIVATE (device);
--
-- nm_device_set_ip_iface (NM_DEVICE (device), NULL);
--
-- if (priv->pending_ip4_config) {
-- g_object_unref (priv->pending_ip4_config);
-- priv->pending_ip4_config = NULL;
-- }
--
-- priv->in_bytes = priv->out_bytes = 0;
--}
--
--static void
--real_deactivate_quickly (NMDevice *device)
--{
-- NMSerialDevice *self = NM_SERIAL_DEVICE (device);
--
-- cleanup_device (self);
-- nm_serial_device_close (self);
--}
--
--static guint32
--real_get_generic_capabilities (NMDevice *dev)
--{
-- return NM_DEVICE_CAP_NM_SUPPORTED;
--}
--
--/*****************************************************************************/
--
--static void
--nm_serial_device_init (NMSerialDevice *self)
--{
-- if (getenv ("NM_SERIAL_DEBUG"))
-- serial_debug = TRUE;
--}
--
--static void
--finalize (GObject *object)
--{
-- NMSerialDevice *self = NM_SERIAL_DEVICE (object);
--
-- cleanup_device (self);
-- nm_serial_device_close (self);
--
-- G_OBJECT_CLASS (nm_serial_device_parent_class)->finalize (object);
--}
--
--static void
--nm_serial_device_class_init (NMSerialDeviceClass *klass)
--{
-- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-- NMDeviceClass *parent_class = NM_DEVICE_CLASS (klass);
--
-- g_type_class_add_private (object_class, sizeof (NMSerialDevicePrivate));
--
-- /* Virtual methods */
-- object_class->finalize = finalize;
--
-- parent_class->get_generic_capabilities = real_get_generic_capabilities;
-- parent_class->act_stage2_config = real_act_stage2_config;
-- parent_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config;
-- parent_class->deactivate_quickly = real_deactivate_quickly;
--
-- /* Signals */
-- signals[PPP_STATS] =
-- g_signal_new ("ppp-stats",
-- G_OBJECT_CLASS_TYPE (object_class),
-- G_SIGNAL_RUN_FIRST,
-- G_STRUCT_OFFSET (NMSerialDeviceClass, ppp_stats),
-- NULL, NULL,
-- _nm_marshal_VOID__UINT_UINT,
-- G_TYPE_NONE, 2,
-- G_TYPE_UINT, G_TYPE_UINT);
--
-- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-- &dbus_glib_nm_serial_device_object_info);
--}
-diff --git a/src/nm-serial-device.h b/src/nm-serial-device.h
-deleted file mode 100644
-index 024b2e8..0000000
---- a/src/nm-serial-device.h
-+++ /dev/null
-@@ -1,91 +0,0 @@
--/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
--
--#ifndef NM_SERIAL_DEVICE_H
--#define NM_SERIAL_DEVICE_H
--
--#include <nm-device.h>
--#include <nm-setting-serial.h>
--#include "ppp-manager/nm-ppp-manager.h"
--
--G_BEGIN_DECLS
--
--#define NM_TYPE_SERIAL_DEVICE (nm_serial_device_get_type ())
--#define NM_SERIAL_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SERIAL_DEVICE, NMSerialDevice))
--#define NM_SERIAL_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SERIAL_DEVICE, NMSerialDeviceClass))
--#define NM_IS_SERIAL_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SERIAL_DEVICE))
--#define NM_IS_SERIAL_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SERIAL_DEVICE))
--#define NM_SERIAL_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SERIAL_DEVICE, NMSerialDeviceClass))
--
--typedef struct {
-- NMDevice parent;
--} NMSerialDevice;
--
--typedef struct {
-- NMDeviceClass parent;
--
-- const char * (*get_ppp_name) (NMSerialDevice *device, NMActRequest *req);
--
-- /* Signals */
-- void (*ppp_stats) (NMSerialDevice *device, guint32 in_bytes, guint32 out_bytes);
--} NMSerialDeviceClass;
--
--GType nm_serial_device_get_type (void);
--
--typedef void (*NMSerialGetReplyFn) (NMSerialDevice *device,
-- const char *reply,
-- gpointer user_data);
--
--typedef void (*NMSerialWaitForReplyFn) (NMSerialDevice *device,
-- int reply_index,
-- const char *reply,
-- gpointer user_data);
--
--typedef void (*NMSerialWaitQuietFn) (NMSerialDevice *device,
-- gboolean timed_out,
-- gpointer user_data);
--
--typedef void (*NMSerialFlashFn) (NMSerialDevice *device,
-- gpointer user_data);
--
--
--
--gboolean nm_serial_device_open (NMSerialDevice *device,
-- NMSettingSerial *setting);
--
--void nm_serial_device_close (NMSerialDevice *device);
--gboolean nm_serial_device_send_command (NMSerialDevice *device,
-- GByteArray *command);
--
--gboolean nm_serial_device_send_command_string (NMSerialDevice *device,
-- const char *str);
--
--int nm_serial_device_wait_reply_blocking (NMSerialDevice *device,
-- guint32 timeout_secs,
-- const char **needles,
-- const char **terminators);
--
--guint nm_serial_device_wait_for_reply (NMSerialDevice *device,
-- guint timeout,
-- const char **responses,
-- const char **terminators,
-- NMSerialWaitForReplyFn callback,
-- gpointer user_data);
--
--void nm_serial_device_wait_quiet (NMSerialDevice *device,
-- guint timeout,
-- guint quiet_time,
-- NMSerialWaitQuietFn callback,
-- gpointer user_data);
--
--guint nm_serial_device_flash (NMSerialDevice *device,
-- guint32 flash_time,
-- NMSerialFlashFn callback,
-- gpointer user_data);
--
--GIOChannel *nm_serial_device_get_io_channel (NMSerialDevice *device);
--
--NMPPPManager *nm_serial_device_get_ppp_manager (NMSerialDevice *device);
--
--G_END_DECLS
--
--#endif /* NM_SERIAL_DEVICE_H */