aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-10-25 17:13:12 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:21 +0100
commit0cc17ed82f8a2c3b5b12158bf138007459ef289f (patch)
treed2f0147041f82d7c18963be480ffbbca81bb85ca
parentbc78453d794e7e82d5cc726d716b1a84454763de (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.c91
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);