diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-10-25 17:13:12 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:21 +0100 |
commit | 0cc17ed82f8a2c3b5b12158bf138007459ef289f (patch) | |
tree | d2f0147041f82d7c18963be480ffbbca81bb85ca | |
parent | bc78453d794e7e82d5cc726d716b1a84454763de (diff) |
manager: let it be initable
The MMManager object creation may fail due to environment reasons (i.e. no
plugins found, or problems exporting DBus interfaces), so we can use the
initable interface to properly handle those situations.
-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); |