diff options
Diffstat (limited to 'libmm-glib/mm-manager.c')
-rw-r--r-- | libmm-glib/mm-manager.c | 284 |
1 files changed, 85 insertions, 199 deletions
diff --git a/libmm-glib/mm-manager.c b/libmm-glib/mm-manager.c index d539f33e..326e8142 100644 --- a/libmm-glib/mm-manager.c +++ b/libmm-glib/mm-manager.c @@ -42,15 +42,7 @@ * modem objects. */ -static void initable_iface_init (GInitableIface *iface); -static void async_initable_iface_init (GAsyncInitableIface *iface); - -static GInitableIface *initable_parent_iface; -static GAsyncInitableIface *async_initable_parent_iface; - -G_DEFINE_TYPE_EXTENDED (MMManager, mm_manager, MM_GDBUS_TYPE_OBJECT_MANAGER_CLIENT, 0, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init)) +G_DEFINE_TYPE (MMManager, mm_manager, MM_GDBUS_TYPE_OBJECT_MANAGER_CLIENT) struct _MMManagerPrivate { /* The proxy for the Manager interface */ @@ -95,6 +87,42 @@ get_proxy_type (GDBusObjectManagerClient *manager, /*****************************************************************************/ +static gboolean +ensure_modem_manager1_proxy (MMManager *self, + GError **error) +{ + gchar *name = NULL; + gchar *object_path = NULL; + GDBusObjectManagerClientFlags flags = G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE; + GDBusConnection *connection = NULL; + + if (self->priv->manager_iface_proxy) + return TRUE; + + /* Get the Manager proxy created synchronously now */ + g_object_get (self, + "name", &name, + "object-path", &object_path, + "flags", &flags, + "connection", &connection, + NULL); + + self->priv->manager_iface_proxy = + mm_gdbus_org_freedesktop_modem_manager1_proxy_new_sync (connection, + flags, + name, + object_path, + NULL, + error); + g_object_unref (connection); + g_free (object_path); + g_free (name); + + return !!self->priv->manager_iface_proxy; +} + +/*****************************************************************************/ + /** * mm_manager_new_finish: * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_manager_new(). @@ -196,11 +224,16 @@ mm_manager_new_sync (GDBusConnection *connection, * * Gets the #GDBusProxy interface of the @manager. * - * Returns: (transfer none): The #GDBusProxy interface of @manager. Do not free the returned object, it is owned by @manager. + * Returns: (transfer none): The #GDBusProxy interface of @manager, or #NULL if none. Do not free the returned object, it is owned by @manager. */ GDBusProxy * mm_manager_peek_proxy (MMManager *manager) { + g_return_val_if_fail (MM_IS_MANAGER (manager), NULL); + + if (!ensure_modem_manager1_proxy (manager, NULL)) + return NULL; + return G_DBUS_PROXY (manager->priv->manager_iface_proxy); } @@ -210,11 +243,16 @@ mm_manager_peek_proxy (MMManager *manager) * * Gets the #GDBusProxy interface of the @manager. * - * Returns: (transfer full): The #GDBusProxy interface of @manager, which must be freed with g_object_unref(). + * Returns: (transfer full): The #GDBusProxy interface of @manager, or #NULL if none. The returned object must be freed with g_object_unref(). */ GDBusProxy * mm_manager_get_proxy (MMManager *manager) { + g_return_val_if_fail (MM_IS_MANAGER (manager), NULL); + + if (!ensure_modem_manager1_proxy (manager, NULL)) + return NULL; + return G_DBUS_PROXY (g_object_ref (manager->priv->manager_iface_proxy)); } @@ -282,12 +320,22 @@ mm_manager_set_logging (MMManager *manager, gpointer user_data) { GSimpleAsyncResult *result; + GError *inner_error = NULL; + + g_return_if_fail (MM_IS_MANAGER (manager)); result = g_simple_async_result_new (G_OBJECT (manager), callback, user_data, mm_manager_set_logging); + if (!ensure_modem_manager1_proxy (manager, &inner_error)) { + g_simple_async_result_take_error (result, inner_error); + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); + return; + } + mm_gdbus_org_freedesktop_modem_manager1_call_set_logging ( manager->priv->manager_iface_proxy, level, @@ -317,6 +365,11 @@ mm_manager_set_logging_sync (MMManager *manager, GCancellable *cancellable, GError **error) { + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + + if (!ensure_modem_manager1_proxy (manager, error)) + return FALSE; + return (mm_gdbus_org_freedesktop_modem_manager1_call_set_logging_sync ( manager->priv->manager_iface_proxy, level, @@ -341,11 +394,7 @@ mm_manager_scan_devices_finish (MMManager *manager, GAsyncResult *res, GError **error) { - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), - error)) - return FALSE; - - return TRUE; + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); } static void @@ -390,12 +439,22 @@ mm_manager_scan_devices (MMManager *manager, gpointer user_data) { GSimpleAsyncResult *result; + GError *inner_error = NULL; + + g_return_if_fail (MM_IS_MANAGER (manager)); result = g_simple_async_result_new (G_OBJECT (manager), callback, user_data, mm_manager_scan_devices); + if (!ensure_modem_manager1_proxy (manager, &inner_error)) { + g_simple_async_result_take_error (result, inner_error); + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); + return; + } + mm_gdbus_org_freedesktop_modem_manager1_call_scan_devices ( manager->priv->manager_iface_proxy, cancellable, @@ -422,178 +481,20 @@ mm_manager_scan_devices_sync (MMManager *manager, GCancellable *cancellable, GError **error) { - return (mm_gdbus_org_freedesktop_modem_manager1_call_scan_devices_sync ( - manager->priv->manager_iface_proxy, - cancellable, - error)); -} - -/*****************************************************************************/ - -static gboolean -initable_init_sync (GInitable *initable, - GCancellable *cancellable, - GError **error) -{ - MMManagerPrivate *priv = MM_MANAGER (initable)->priv; - GError *inner_error = NULL; - gchar *name = NULL; - gchar *object_path = NULL; - GDBusObjectManagerClientFlags flags = G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE; - GDBusConnection *connection = NULL; - - /* Chain up parent's initable callback before calling child's one */ - if (!initable_parent_iface->init (initable, cancellable, &inner_error)) { - g_propagate_error (error, inner_error); - return FALSE; - } - - /* Get the Manager proxy created synchronously now */ - g_object_get (initable, - "name", &name, - "object-path", &object_path, - "flags", &flags, - "connection", &connection, - NULL); - priv->manager_iface_proxy = - mm_gdbus_org_freedesktop_modem_manager1_proxy_new_sync (connection, - flags, - name, - object_path, - cancellable, - &inner_error); - g_object_unref (connection); - g_free (object_path); - g_free (name); - - if (!priv->manager_iface_proxy) { - g_propagate_error (error, inner_error); - return FALSE; - } - - /* All good */ - return TRUE; -} - -/*****************************************************************************/ - -typedef struct { - GSimpleAsyncResult *result; - int io_priority; - GCancellable *cancellable; - MMManager *manager; -} InitAsyncContext; - -static void -init_async_context_free (InitAsyncContext *ctx) -{ - g_object_unref (ctx->manager); - g_object_unref (ctx->result); - if (ctx->cancellable) - g_object_unref (ctx->cancellable); - g_free (ctx); -} + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); -static gboolean -initable_init_finish (GAsyncInitable *initable, - GAsyncResult *result, - GError **error) -{ - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), - error)) + if (!manager->priv->manager_iface_proxy) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_NOT_FOUND, + "ModemManager unavailable"); return FALSE; - - return TRUE; -} - -static void -initable_init_async_manager_proxy_ready (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - GError *inner_error = NULL; - InitAsyncContext *ctx = user_data; - MMManagerPrivate *priv = ctx->manager->priv; - - priv->manager_iface_proxy = - mm_gdbus_org_freedesktop_modem_manager1_proxy_new_finish (res, - &inner_error); - if (!priv->manager_iface_proxy) - g_simple_async_result_take_error (ctx->result, inner_error); - else - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - - g_simple_async_result_complete (ctx->result); - init_async_context_free (ctx); -} - -static void -initable_init_async_parent_ready (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - GError *inner_error = NULL; - InitAsyncContext *ctx = user_data; - gchar *name = NULL; - gchar *object_path = NULL; - GDBusObjectManagerClientFlags flags = G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE; - GDBusConnection *connection = NULL; - - /* Parent init ready, check it */ - if (!async_initable_parent_iface->init_finish (G_ASYNC_INITABLE (source), - res, - &inner_error)) { - g_simple_async_result_take_error (ctx->result, inner_error); - g_simple_async_result_complete (ctx->result); - init_async_context_free (ctx); - return; } - /* Get the Manager proxy created asynchronously now */ - g_object_get (ctx->manager, - "name", &name, - "object-path", &object_path, - "flags", &flags, - "connection", &connection, - NULL); - mm_gdbus_org_freedesktop_modem_manager1_proxy_new (connection, - flags, - name, - object_path, - ctx->cancellable, - initable_init_async_manager_proxy_ready, - ctx); - g_object_unref (connection); - g_free (object_path); - g_free (name); -} - -static void -initable_init_async (GAsyncInitable *initable, - int io_priority, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - InitAsyncContext *ctx; - - ctx = g_new (InitAsyncContext, 1); - ctx->manager = g_object_ref (initable); - ctx->result = g_simple_async_result_new (G_OBJECT (initable), - callback, - user_data, - initable_init_async); - ctx->cancellable = (cancellable ? - g_object_ref (cancellable) : - NULL); - ctx->io_priority = io_priority; - - /* Chain up parent's initable callback before calling child's one */ - async_initable_parent_iface->init_async (initable, - io_priority, - cancellable, - initable_init_async_parent_ready, - ctx); + return (mm_gdbus_org_freedesktop_modem_manager1_call_scan_devices_sync ( + manager->priv->manager_iface_proxy, + cancellable, + error)); } /*****************************************************************************/ @@ -637,21 +538,6 @@ dispose (GObject *object) } static void -initable_iface_init (GInitableIface *iface) -{ - initable_parent_iface = g_type_interface_peek_parent (iface); - iface->init = initable_init_sync; -} - -static void -async_initable_iface_init (GAsyncInitableIface *iface) -{ - async_initable_parent_iface = g_type_interface_peek_parent (iface); - iface->init_async = initable_init_async; - iface->init_finish = initable_init_finish; -} - -static void mm_manager_class_init (MMManagerClass *manager_class) { GObjectClass *object_class = G_OBJECT_CLASS (manager_class); |