diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-manager.c | 91 |
1 files changed, 52 insertions, 39 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c index 6ab3b4f4..ad348bf9 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -41,7 +41,11 @@ static void grab_port (MMManager *manager, GUdevDevice *device, GUdevDevice *physical_device); -G_DEFINE_TYPE (MMManager, mm_manager, MM_GDBUS_TYPE_ORG_FREEDESKTOP_MODEM_MANAGER1_SKELETON); +static void initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_EXTENDED (MMManager, mm_manager, MM_GDBUS_TYPE_ORG_FREEDESKTOP_MODEM_MANAGER1_SKELETON, 0, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + initable_iface_init)); enum { PROP_0, @@ -758,45 +762,13 @@ MMManager * mm_manager_new (GDBusConnection *connection, GError **error) { - MMManager *manager; - g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); - manager = (MMManager *) g_object_new (MM_TYPE_MANAGER, - MM_MANAGER_CONNECTION, connection, - NULL); - if (manager) { - - g_assert (manager->priv->connection); - - manager->priv->plugin_manager = mm_plugin_manager_new (error); - if (!manager->priv->plugin_manager) { - g_object_unref (manager); - return NULL; - } - - /* Enable processing of input DBus messages */ - g_signal_connect (manager, - "handle-set-logging", - G_CALLBACK (handle_set_logging), - NULL); - g_signal_connect (manager, - "handle-scan-devices", - G_CALLBACK (handle_scan_devices), - NULL); - - /* Export the manager interface */ - if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (manager), - manager->priv->connection, - MM_DBUS_PATH, - error)) - { - g_object_unref (manager); - return NULL; - } - } - - return manager; + return g_initable_new (MM_TYPE_MANAGER, + NULL, /* cancellable */ + error, + MM_MANAGER_CONNECTION, connection, + NULL); } static void @@ -848,13 +820,48 @@ mm_manager_init (MMManager *manager) MM_TYPE_MANAGER, MMManagerPrivate); + /* Setup authentication provider */ priv->authp = mm_auth_provider_get (); + /* Setup internal list of modem objects */ priv->modems = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + /* Setup UDev client */ priv->udev = g_udev_client_new (subsys); - g_assert (manager->priv->udev); g_signal_connect (priv->udev, "uevent", G_CALLBACK (handle_uevent), manager); + + /* Enable processing of input DBus messages */ + g_signal_connect (manager, + "handle-set-logging", + G_CALLBACK (handle_set_logging), + NULL); + g_signal_connect (manager, + "handle-scan-devices", + G_CALLBACK (handle_scan_devices), + NULL); +} + +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + MMManagerPrivate *priv = MM_MANAGER (initable)->priv; + + /* Create plugin manager */ + priv->plugin_manager = mm_plugin_manager_new (error); + if (!priv->plugin_manager) + return FALSE; + + /* Export the manager interface */ + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (initable), + priv->connection, + MM_DBUS_PATH, + error)) + return FALSE; + + /* All good */ + return TRUE; } static void @@ -879,6 +886,12 @@ finalize (GObject *object) } static void +initable_iface_init (GInitableIface *iface) +{ + iface->init = initable_init; +} + +static void mm_manager_class_init (MMManagerClass *manager_class) { GObjectClass *object_class = G_OBJECT_CLASS (manager_class); |