summary refs log tree commit diff
path: root/src/modem-manager
diff options
context:
space:
mode:
Diffstat (limited to 'src/modem-manager')
-rw-r--r--src/modem-manager/Makefile.am7
-rw-r--r--src/modem-manager/Makefile.in77
-rw-r--r--src/modem-manager/nm-modem-cdma.c40
-rw-r--r--src/modem-manager/nm-modem-gsm.c55
-rw-r--r--src/modem-manager/nm-modem-manager.c2
-rw-r--r--src/modem-manager/nm-modem.c217
-rw-r--r--src/modem-manager/nm-modem.h40
7 files changed, 276 insertions, 162 deletions
diff --git a/src/modem-manager/Makefile.am b/src/modem-manager/Makefile.am
index 22ed809f..db680aea 100644
--- a/src/modem-manager/Makefile.am
+++ b/src/modem-manager/Makefile.am
@@ -26,10 +26,3 @@ libmodem_manager_la_LIBADD = \
 	$(top_builddir)/src/logging/libnm-logging.la \
 	$(DBUS_LIBS)
 
-nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml
-	$(AM_V_GEN) dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $<
-
-BUILT_SOURCES = \
-	nm-serial-device-glue.h
-
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/src/modem-manager/Makefile.in b/src/modem-manager/Makefile.in
index 5d33ee26..66f7c1bc 100644
--- a/src/modem-manager/Makefile.in
+++ b/src/modem-manager/Makefile.in
@@ -38,11 +38,16 @@ subdir = src/modem-manager
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \
-	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -64,7 +69,7 @@ AM_V_lt = $(am__v_lt_$(V))
 am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
 am__v_lt_0 = --silent
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -95,7 +100,6 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -104,13 +108,15 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DATADIRNAME = @DATADIRNAME@
 DBUS_CFLAGS = @DBUS_CFLAGS@
@@ -122,6 +128,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@
 DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
 DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -130,6 +137,7 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
@@ -138,8 +146,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
-GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
 GNUTLS_LIBS = @GNUTLS_LIBS@
 GREP = @GREP@
@@ -154,13 +162,23 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
@@ -168,6 +186,8 @@ LIBDL = @LIBDL@
 LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
 LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
 LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
 LIBM = @LIBM@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
 LIBNL_LIBS = @LIBNL_LIBS@
@@ -176,13 +196,15 @@ LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
-MKINSTALLDIRS = @MKINSTALLDIRS@
 MSGFMT = @MSGFMT@
-MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -208,13 +230,12 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POFILES = @POFILES@
 POLKIT_CFLAGS = @POLKIT_CFLAGS@
 POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
-PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
-PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
 RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
@@ -228,11 +249,15 @@ UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
 VERSION = @VERSION@
 XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -307,12 +332,7 @@ libmodem_manager_la_LIBADD = \
 	$(top_builddir)/src/logging/libnm-logging.la \
 	$(DBUS_LIBS)
 
-BUILT_SOURCES = \
-	nm-serial-device-glue.h
-
-CLEANFILES = $(BUILT_SOURCES)
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
+all: all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
@@ -517,12 +537,10 @@ distdir: $(DISTFILES)
 	  fi; \
 	done
 check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
+check: check-am
 all-am: Makefile $(LTLIBRARIES)
 installdirs:
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
+install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -539,7 +557,6 @@ install-strip:
 mostlyclean-generic:
 
 clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -548,7 +565,6 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
@@ -620,7 +636,7 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: all check install install-am install-strip
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
 	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
@@ -636,9 +652,6 @@ uninstall-am:
 	pdf pdf-am ps ps-am tags uninstall uninstall-am
 
 
-nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml
-	$(AM_V_GEN) dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $<
-
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/modem-manager/nm-modem-cdma.c b/src/modem-manager/nm-modem-cdma.c
index c32c1822..5db6a84f 100644
--- a/src/modem-manager/nm-modem-cdma.c
+++ b/src/modem-manager/nm-modem-cdma.c
@@ -15,16 +15,20 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2009 - 2010 Red Hat, Inc.
+ * Copyright (C) 2009 - 2011 Red Hat, Inc.
  * Copyright (C) 2009 Novell, Inc.
  */
 
+#include "config.h"
+
 #include <string.h>
+#include <glib/gi18n.h>
 
 #include "nm-dbus-glib-types.h"
 #include "nm-modem-cdma.h"
 #include "nm-modem-types.h"
 #include "nm-device.h"
+#include "nm-device-private.h"
 #include "nm-dbus-manager.h"
 #include "nm-setting-connection.h"
 #include "nm-setting-cdma.h"
@@ -270,6 +274,33 @@ real_check_connection_compatible (NMModem *modem,
 }
 
 static gboolean
+real_complete_connection (NMModem *modem,
+                          NMConnection *connection,
+                          const GSList *existing_connections,
+                          GError **error)
+{
+	NMSettingCdma *s_cdma;
+
+	s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA);
+	if (!s_cdma) {
+		s_cdma = (NMSettingCdma *) nm_setting_cdma_new ();
+		nm_connection_add_setting (connection, NM_SETTING (s_cdma));
+	}
+
+	if (!nm_setting_cdma_get_number (s_cdma))
+		g_object_set (G_OBJECT (s_cdma), NM_SETTING_CDMA_NUMBER, "#777", NULL);
+
+	nm_utils_complete_generic (connection,
+	                           NM_SETTING_CDMA_SETTING_NAME,
+	                           existing_connections,
+	                           _("CDMA connection %d"),
+	                           NULL,
+	                           FALSE); /* No IPv6 yet by default */
+
+	return TRUE;
+}
+
+static gboolean
 real_get_user_pass (NMModem *modem,
                     NMConnection *connection,
                     const char **user,
@@ -296,7 +327,7 @@ real_get_setting_name (NMModem *modem)
 }
 
 static void
-real_deactivate_quickly (NMModem *modem, NMDevice *device)
+real_deactivate (NMModem *modem, NMDevice *device)
 {
 	NMModemCdmaPrivate *priv = NM_MODEM_CDMA_GET_PRIVATE (modem);
 
@@ -308,7 +339,7 @@ real_deactivate_quickly (NMModem *modem, NMDevice *device)
 		priv->call = NULL;
 	}
 
-	NM_MODEM_CLASS (nm_modem_cdma_parent_class)->deactivate_quickly (modem, device);	
+	NM_MODEM_CLASS (nm_modem_cdma_parent_class)->deactivate (modem, device);	
 }
 
 /*****************************************************************************/
@@ -344,8 +375,9 @@ nm_modem_cdma_class_init (NMModemCdmaClass *klass)
 	modem_class->get_setting_name = real_get_setting_name;
 	modem_class->get_best_auto_connection = real_get_best_auto_connection;
 	modem_class->check_connection_compatible = real_check_connection_compatible;
+	modem_class->complete_connection = real_complete_connection;
 	modem_class->act_stage1_prepare = real_act_stage1_prepare;
-	modem_class->deactivate_quickly = real_deactivate_quickly;
+	modem_class->deactivate = real_deactivate;
 
 	dbus_g_error_domain_register (NM_CDMA_ERROR, NULL, NM_TYPE_CDMA_ERROR);
 }
diff --git a/src/modem-manager/nm-modem-gsm.c b/src/modem-manager/nm-modem-gsm.c
index abb96db1..9a96ae99 100644
--- a/src/modem-manager/nm-modem-gsm.c
+++ b/src/modem-manager/nm-modem-gsm.c
@@ -15,14 +15,19 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2009 - 2010 Red Hat, Inc.
+ * Copyright (C) 2009 - 2011 Red Hat, Inc.
  * Copyright (C) 2009 Novell, Inc.
  */
 
+#include "config.h"
+
 #include <string.h>
+#include <glib/gi18n.h>
+
 #include "nm-dbus-glib-types.h"
 #include "nm-modem-gsm.h"
 #include "nm-device.h"
+#include "nm-device-private.h"
 #include "nm-setting-connection.h"
 #include "nm-setting-gsm.h"
 #include "nm-modem-types.h"
@@ -177,12 +182,10 @@ ask_for_pin (NMModemGsm *self, gboolean always_ask)
 	if (!always_ask)
 		tries = priv->pin_tries++;
 
-	g_signal_emit_by_name (self, NM_MODEM_NEED_AUTH,
-	                       NM_SETTING_GSM_SETTING_NAME,
-	                       (tries || always_ask) ? TRUE : FALSE,
-	                       SECRETS_CALLER_MOBILE_BROADBAND,
-	                       NM_SETTING_GSM_PIN,
-	                       NULL);
+	nm_modem_get_secrets (NM_MODEM (self),
+	                      NM_SETTING_GSM_SETTING_NAME,
+	                      (tries || always_ask) ? TRUE : FALSE,
+	                      NM_SETTING_GSM_PIN);
 }
 
 static void
@@ -470,6 +473,37 @@ real_check_connection_compatible (NMModem *modem,
 }
 
 static gboolean
+real_complete_connection (NMModem *modem,
+                          NMConnection *connection,
+                          const GSList *existing_connections,
+                          GError **error)
+{
+	NMSettingGsm *s_gsm;
+
+	s_gsm = (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM);
+	if (!s_gsm || !nm_setting_gsm_get_apn (s_gsm)) {
+		/* Need an APN at least */
+		g_set_error_literal (error,
+		                     NM_SETTING_GSM_ERROR,
+		                     NM_SETTING_GSM_ERROR_MISSING_PROPERTY,
+		                     NM_SETTING_GSM_APN);
+		return FALSE;
+	}
+
+	if (!nm_setting_gsm_get_number (s_gsm))
+		g_object_set (G_OBJECT (s_gsm), NM_SETTING_GSM_NUMBER, "*99#", NULL);
+
+	nm_utils_complete_generic (connection,
+	                           NM_SETTING_GSM_SETTING_NAME,
+	                           existing_connections,
+	                           _("GSM connection %d"),
+	                           NULL,
+	                           FALSE); /* No IPv6 yet by default */
+
+	return TRUE;
+}
+
+static gboolean
 real_get_user_pass (NMModem *modem,
                     NMConnection *connection,
                     const char **user,
@@ -496,7 +530,7 @@ real_get_setting_name (NMModem *modem)
 }
 
 static void
-real_deactivate_quickly (NMModem *modem, NMDevice *device)
+real_deactivate (NMModem *modem, NMDevice *device)
 {
 	NMModemGsmPrivate *priv = NM_MODEM_GSM_GET_PRIVATE (modem);
 
@@ -510,7 +544,7 @@ real_deactivate_quickly (NMModem *modem, NMDevice *device)
 
 	priv->pin_tries = 0;
 
-	NM_MODEM_CLASS (nm_modem_gsm_parent_class)->deactivate_quickly (modem, device);	
+	NM_MODEM_CLASS (nm_modem_gsm_parent_class)->deactivate (modem, device);	
 }
 
 
@@ -547,8 +581,9 @@ nm_modem_gsm_class_init (NMModemGsmClass *klass)
 	modem_class->get_setting_name = real_get_setting_name;
 	modem_class->get_best_auto_connection = real_get_best_auto_connection;
 	modem_class->check_connection_compatible = real_check_connection_compatible;
+	modem_class->complete_connection = real_complete_connection;
 	modem_class->act_stage1_prepare = real_act_stage1_prepare;
-	modem_class->deactivate_quickly = real_deactivate_quickly;
+	modem_class->deactivate = real_deactivate;
 
 	dbus_g_error_domain_register (NM_GSM_ERROR, NULL, NM_TYPE_GSM_ERROR);
 }
diff --git a/src/modem-manager/nm-modem-manager.c b/src/modem-manager/nm-modem-manager.c
index 28f7b94d..f5ade50c 100644
--- a/src/modem-manager/nm-modem-manager.c
+++ b/src/modem-manager/nm-modem-manager.c
@@ -371,7 +371,7 @@ nm_modem_manager_init (NMModemManager *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_signal_connect (priv->dbus_mgr, NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
 					  G_CALLBACK (nm_modem_manager_name_owner_changed),
 					  self);
 
diff --git a/src/modem-manager/nm-modem.c b/src/modem-manager/nm-modem.c
index 9471ef87..33f10789 100644
--- a/src/modem-manager/nm-modem.c
+++ b/src/modem-manager/nm-modem.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2009 - 2010 Red Hat, Inc.
+ * Copyright (C) 2009 - 2011 Red Hat, Inc.
  * Copyright (C) 2009 Novell, Inc.
  */
 
@@ -33,8 +33,6 @@
 #include "nm-device-interface.h"
 #include "nm-dbus-glib-types.h"
 
-#include "nm-serial-device-glue.h"
-
 G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
 
 #define NM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM, NMModemPrivate))
@@ -62,7 +60,9 @@ typedef struct {
 	char *device;
 	char *iface;
 
+	NMActRequest *act_request;
 	guint32 secrets_tries;
+	guint32 secrets_id;
 
 	DBusGProxyCall *call;
 
@@ -78,7 +78,8 @@ enum {
 	PPP_FAILED,
 	PREPARE_RESULT,
 	IP4_CONFIG_RESULT,
-	NEED_AUTH,
+	AUTH_REQUESTED,
+	AUTH_RESULT,
 
 	LAST_SIGNAL
 };
@@ -467,67 +468,60 @@ nm_modem_stage4_get_ip4_config (NMModem *self,
 	return ret;
 }
 
-gboolean
-nm_modem_connection_secrets_updated (NMModem *self,
-                                     NMActRequest *req,
-                                     NMConnection *connection,
-                                     GSList *updated_settings,
-                                     RequestSecretsCaller caller)
+static void
+cancel_get_secrets (NMModem *self)
 {
-	NMModemPrivate *priv;
-	gboolean found = FALSE;
-	const char *setting_name;
-	GSList *iter;
-
-	g_return_val_if_fail (self != NULL, FALSE);
-	g_return_val_if_fail (NM_IS_MODEM (self), FALSE);
-	g_return_val_if_fail (req != NULL, FALSE);
-	g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
-	g_return_val_if_fail (connection != NULL, FALSE);
-	g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
-
-	priv = NM_MODEM_GET_PRIVATE (self);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
 
-	if (caller == SECRETS_CALLER_PPP) {
-		const char *user = NULL;
-		const char *pass = NULL;
-
-		g_return_val_if_fail (priv->ppp_manager != NULL, FALSE);
-
-		if (!NM_MODEM_GET_CLASS (self)->get_user_pass (self, connection, &user, &pass)) {
-			/* Shouldn't ever happen */
-			nm_ppp_manager_update_secrets (priv->ppp_manager,
-										   priv->iface,
-										   NULL,
-										   NULL,
-										   "missing GSM/CDMA setting; no secrets could be found.");
-		} else {
-			nm_ppp_manager_update_secrets (priv->ppp_manager,
-										   priv->iface,
-										   user ? user : "",
-										   pass ? pass : "",
-										   NULL);
-		}
-		return TRUE;
+	if (priv->secrets_id) {
+		nm_act_request_cancel_secrets (priv->act_request, priv->secrets_id);
+		priv->secrets_id = 0;
 	}
+}
 
-	g_return_val_if_fail (caller == SECRETS_CALLER_MOBILE_BROADBAND, FALSE);
+static void
+modem_secrets_cb (NMActRequest *req,
+                  guint32 call_id,
+                  NMConnection *connection,
+                  GError *error,
+                  gpointer user_data)
+{
+	NMModem *self = NM_MODEM (user_data);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
 
-	g_assert (NM_MODEM_GET_CLASS (self)->get_setting_name);
-	setting_name = NM_MODEM_GET_CLASS (self)->get_setting_name (self);
+	g_return_if_fail (call_id == priv->secrets_id);
 
-	for (iter = updated_settings; iter; iter = g_slist_next (iter)) {
-		const char *candidate_setting_name = (const char *) iter->data;
+	priv->secrets_id = 0;
 
-		if (!strcmp (candidate_setting_name, setting_name))
-			found = TRUE;
-		else {
-			nm_log_warn (LOGD_MB, "ignoring updated secrets for setting '%s'.",
-			            candidate_setting_name);
-		}
-	}
+	if (error)
+		nm_log_warn (LOGD_MB, "%s", error->message);
 
-	return found;
+	g_signal_emit (self, signals[AUTH_RESULT], 0, error);
+}
+
+gboolean
+nm_modem_get_secrets (NMModem *self,
+                      const char *setting_name,
+                      gboolean request_new,
+                      const char *hint)
+{
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
+	NMSettingsGetSecretsFlags flags = NM_SETTINGS_GET_SECRETS_FLAG_ALLOW_INTERACTION;
+
+	cancel_get_secrets (self);
+
+	if (request_new)
+		flags |= NM_SETTINGS_GET_SECRETS_FLAG_REQUEST_NEW;
+	priv->secrets_id = nm_act_request_get_secrets (priv->act_request,
+	                                               setting_name,
+	                                               flags,
+	                                               hint,
+	                                               modem_secrets_cb,
+	                                               self);
+	if (priv->secrets_id)
+		g_signal_emit (self, signals[AUTH_REQUESTED], 0);
+
+	return !!(priv->secrets_id);
 }
 
 static NMActStageReturn
@@ -550,6 +544,11 @@ nm_modem_act_stage1_prepare (NMModem *self,
 	NMActStageReturn ret;
 	GPtrArray *hints = NULL;
 	const char *setting_name = NULL;
+	NMSettingsGetSecretsFlags flags = NM_SETTINGS_GET_SECRETS_FLAG_ALLOW_INTERACTION;
+
+	if (priv->act_request)
+		g_object_unref (priv->act_request);
+	priv->act_request = g_object_ref (req);
 
 	ret = NM_MODEM_GET_CLASS (self)->act_stage1_prepare (self,
 	                                                     req,
@@ -557,23 +556,22 @@ nm_modem_act_stage1_prepare (NMModem *self,
 	                                                     &setting_name,
 	                                                     reason);
 	if ((ret == NM_ACT_STAGE_RETURN_POSTPONE) && setting_name) {
-		const char *hint1 = NULL, *hint2 = NULL;
-
-		/* Need some secrets */
-		if (hints) {
-			if (hints->len > 0)
-				hint1 = g_ptr_array_index (hints, 0);
-			if (hints->len > 1)
-				hint2 = g_ptr_array_index (hints, 1);
+		if (priv->secrets_tries++)
+			flags |= NM_SETTINGS_GET_SECRETS_FLAG_REQUEST_NEW;
+
+		priv->secrets_id = nm_act_request_get_secrets (req,
+		                                               setting_name,
+		                                               flags,
+		                                               hints ? g_ptr_array_index (hints, 0) : NULL,
+		                                               modem_secrets_cb,
+		                                               self);
+		if (priv->secrets_id)
+			g_signal_emit (self, signals[AUTH_REQUESTED], 0);
+		else {
+			*reason = NM_DEVICE_STATE_REASON_NO_SECRETS;
+			ret = NM_ACT_STAGE_RETURN_FAILURE;
 		}
 
-		g_signal_emit (self, signals[NEED_AUTH], 0,
-		               setting_name, 
-	                   priv->secrets_tries++ ? TRUE : FALSE,
-	                   SECRETS_CALLER_MOBILE_BROADBAND,
-	                   hint1,
-	                   hint2);
-
 		if (hints)
 			g_ptr_array_free (hints, TRUE);
 	}
@@ -616,8 +614,19 @@ nm_modem_check_connection_compatible (NMModem *self,
 	return FALSE;
 }
 
+gboolean
+nm_modem_complete_connection (NMModem *self,
+                              NMConnection *connection,
+                              const GSList *existing_connections,
+                              GError **error)
+{
+	if (NM_MODEM_GET_CLASS (self)->complete_connection)
+		return NM_MODEM_GET_CLASS (self)->complete_connection (self, connection, existing_connections, error);
+	return FALSE;
+}
+
 static void
-real_deactivate_quickly (NMModem *self, NMDevice *device)
+real_deactivate (NMModem *self, NMDevice *device)
 {
 	NMModemPrivate *priv;
 	const char *iface;
@@ -631,6 +640,12 @@ real_deactivate_quickly (NMModem *self, NMDevice *device)
 
 	priv->secrets_tries = 0;
 
+	if (priv->act_request) {
+		cancel_get_secrets (self);
+		g_object_unref (priv->act_request);
+		priv->act_request = NULL;
+	}
+
 	if (priv->call) {
 		dbus_g_proxy_cancel_call (priv->proxy, priv->call);
 		priv->call = NULL;
@@ -666,9 +681,9 @@ real_deactivate_quickly (NMModem *self, NMDevice *device)
 }
 
 void
-nm_modem_deactivate_quickly (NMModem *self, NMDevice *device)
+nm_modem_deactivate (NMModem *self, NMDevice *device)
 {
-	NM_MODEM_GET_CLASS (self)->deactivate_quickly (self, device);
+	NM_MODEM_GET_CLASS (self)->deactivate (self, device);
 }
 
 static void
@@ -690,6 +705,7 @@ nm_modem_device_state_changed (NMModem *self,
                                NMDeviceStateReason reason)
 {
 	gboolean was_connected = FALSE;
+	NMModemPrivate *priv;
 
 	g_return_if_fail (self != NULL);
 	g_return_if_fail (NM_IS_MODEM (self));
@@ -697,16 +713,26 @@ nm_modem_device_state_changed (NMModem *self,
 	if (IS_ACTIVATING_STATE (old_state) || (old_state == NM_DEVICE_STATE_ACTIVATED))
 		was_connected = TRUE;
 
+	priv = NM_MODEM_GET_PRIVATE (self);
+
 	/* Make sure we don't leave the serial device open */
 	switch (new_state) {
 	case NM_DEVICE_STATE_NEED_AUTH:
-		if (NM_MODEM_GET_PRIVATE (self)->ppp_manager)
+		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:
+		if (new_state != NM_DEVICE_STATE_NEED_AUTH) {
+			if (priv->act_request) {
+				cancel_get_secrets (self);
+				g_object_unref (priv->act_request);
+				priv->act_request = NULL;
+			}
+		}
+
 		if (was_connected) {
 			dbus_g_proxy_begin_call (nm_modem_get_proxy (self, MM_DBUS_INTERFACE_MODEM),
 			                         "Disconnect",
@@ -721,6 +747,12 @@ nm_modem_device_state_changed (NMModem *self,
 	}
 }
 
+static gboolean
+_state_is_active (NMDeviceState state)
+{
+	return (state >= NM_DEVICE_STATE_IP_CONFIG && state <= NM_DEVICE_STATE_DEACTIVATING);
+}
+
 gboolean
 nm_modem_hw_is_up (NMModem *self, NMDevice *device)
 {
@@ -731,7 +763,7 @@ nm_modem_hw_is_up (NMModem *self, NMDevice *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)
+		if (priv->pending_ip4_config || _state_is_active (state))
 			return nm_system_device_is_up (device);
 	}
 
@@ -748,7 +780,7 @@ nm_modem_hw_bring_up (NMModem *self, NMDevice *device, gboolean *no_firmware)
 		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)
+		if (priv->pending_ip4_config || _state_is_active (state))
 			return nm_system_device_set_up_down (device, TRUE, no_firmware);
 	}
 
@@ -1015,6 +1047,9 @@ finalize (GObject *object)
 {
 	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
 
+	if (priv->act_request)
+		g_object_unref (priv->act_request);
+
 	if (priv->proxy)
 		g_object_unref (priv->proxy);
 
@@ -1044,7 +1079,7 @@ nm_modem_class_init (NMModemClass *klass)
 	object_class->finalize = finalize;
 
 	klass->act_stage1_prepare = real_act_stage1_prepare;
-	klass->deactivate_quickly = real_deactivate_quickly;
+	klass->deactivate = real_deactivate;
 
 	/* Properties */
 	g_object_class_install_property
@@ -1127,20 +1162,22 @@ nm_modem_class_init (NMModemClass *klass)
 					  _nm_marshal_VOID__BOOLEAN_UINT,
 					  G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_UINT);
 
-	signals[NEED_AUTH] =
-		g_signal_new (NM_MODEM_NEED_AUTH,
+	signals[AUTH_REQUESTED] =
+		g_signal_new (NM_MODEM_AUTH_REQUESTED,
 					  G_OBJECT_CLASS_TYPE (object_class),
 					  G_SIGNAL_RUN_FIRST,
-					  G_STRUCT_OFFSET (NMModemClass, need_auth),
+					  G_STRUCT_OFFSET (NMModemClass, auth_requested),
 					  NULL, NULL,
-					  _nm_marshal_VOID__STRING_BOOLEAN_UINT_STRING_STRING,
-					  G_TYPE_NONE, 5,
-					  G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
-}
+					  g_cclosure_marshal_VOID__VOID,
+					  G_TYPE_NONE, 0);
 
-const DBusGObjectInfo *
-nm_modem_get_serial_dbus_info (void)
-{
-	return &dbus_glib_nm_serial_device_object_info;
+	signals[AUTH_RESULT] =
+		g_signal_new (NM_MODEM_AUTH_RESULT,
+					  G_OBJECT_CLASS_TYPE (object_class),
+					  G_SIGNAL_RUN_FIRST,
+					  G_STRUCT_OFFSET (NMModemClass, auth_result),
+					  NULL, NULL,
+					  g_cclosure_marshal_VOID__POINTER,
+					  G_TYPE_NONE, 1, G_TYPE_POINTER);
 }
 
diff --git a/src/modem-manager/nm-modem.h b/src/modem-manager/nm-modem.h
index 6e47c903..bad19b04 100644
--- a/src/modem-manager/nm-modem.h
+++ b/src/modem-manager/nm-modem.h
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2009 - 2011 Red Hat, Inc.
  * Copyright (C) 2009 Novell, Inc.
  */
 
@@ -46,7 +46,8 @@ G_BEGIN_DECLS
 #define NM_MODEM_PPP_FAILED        "ppp-failed"
 #define NM_MODEM_PREPARE_RESULT    "prepare-result"
 #define NM_MODEM_IP4_CONFIG_RESULT "ip4-config-result"
-#define NM_MODEM_NEED_AUTH         "need-auth"
+#define NM_MODEM_AUTH_REQUESTED    "auth-requested"
+#define NM_MODEM_AUTH_RESULT       "auth-result"
 
 typedef struct {
 	GObject parent;
@@ -66,6 +67,11 @@ typedef struct {
 	                                            NMConnection *connection,
 	                                            GError **error);
 
+	gboolean (*complete_connection)            (NMModem *modem,
+	                                            NMConnection *connection,
+	                                            const GSList *existing_connections,
+	                                            GError **error);
+
 	NMConnection * (*get_best_auto_connection) (NMModem *modem,
 	                                            GSList *connections,
 	                                            char **specific_object);
@@ -76,7 +82,7 @@ typedef struct {
 	                                            const char **out_setting_name,
 	                                            NMDeviceStateReason *reason);
 
-	void (*deactivate_quickly)                 (NMModem *self, NMDevice *device);
+	void (*deactivate)                         (NMModem *self, NMDevice *device);
 
 	/* Signals */
 	void (*ppp_stats)  (NMModem *self, guint32 in_bytes, guint32 out_bytes);
@@ -85,12 +91,8 @@ typedef struct {
 	void (*prepare_result)    (NMModem *self, gboolean success, NMDeviceStateReason reason);
 	void (*ip4_config_result) (NMModem *self, const char *iface, NMIP4Config *config, GError *error);
 
-	void (*need_auth)  (NMModem *self,
-	                    const char *setting_name,
-	                    gboolean retry,
-	                    RequestSecretsCaller caller,
-	                    const char *hint1,
-	                    const char *hint2);
+	void (*auth_requested)    (NMModem *self);
+	void (*auth_result)       (NMModem *self, GError *error);
 } NMModemClass;
 
 GType nm_modem_get_type (void);
@@ -109,6 +111,11 @@ gboolean nm_modem_check_connection_compatible (NMModem *self,
                                                NMConnection *connection,
                                                GError **error);
 
+gboolean nm_modem_complete_connection (NMModem *self,
+                                       NMConnection *connection,
+                                       const GSList *existing_connections,
+                                       GError **error);
+
 NMActStageReturn nm_modem_act_stage1_prepare (NMModem *modem,
                                               NMActRequest *req,
                                               NMDeviceStateReason *reason);
@@ -128,7 +135,12 @@ NMActStageReturn nm_modem_stage4_get_ip4_config (NMModem *modem,
                                                  NMIP4Config **config,
                                                  NMDeviceStateReason *reason);
 
-void nm_modem_deactivate_quickly (NMModem *modem, NMDevice *device);
+gboolean nm_modem_get_secrets (NMModem *modem,
+                               const char *setting_name,
+                               gboolean request_new,
+                               const char *hint);
+
+void nm_modem_deactivate (NMModem *modem, NMDevice *device);
 
 void nm_modem_device_state_changed (NMModem *modem,
                                     NMDeviceState new_state,
@@ -139,14 +151,6 @@ gboolean nm_modem_hw_is_up (NMModem *modem, NMDevice *device);
 
 gboolean nm_modem_hw_bring_up (NMModem *modem, NMDevice *device, gboolean *no_firmware);
 
-gboolean nm_modem_connection_secrets_updated (NMModem *modem,
-                                              NMActRequest *req,
-                                              NMConnection *connection,
-                                              GSList *updated_settings,
-                                              RequestSecretsCaller caller);
-
-const DBusGObjectInfo *nm_modem_get_serial_dbus_info (void);
-
 gboolean      nm_modem_get_mm_enabled (NMModem *self);
 
 void          nm_modem_set_mm_enabled (NMModem *self, gboolean enabled);