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.
This commit is contained in:
+52
-39
@@ -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
|
||||
@@ -878,6 +885,12 @@ finalize (GObject *object)
|
||||
G_OBJECT_CLASS (mm_manager_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
initable_iface_init (GInitableIface *iface)
|
||||
{
|
||||
iface->init = initable_init;
|
||||
}
|
||||
|
||||
static void
|
||||
mm_manager_class_init (MMManagerClass *manager_class)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user