diff options
Diffstat (limited to 'libmm-glib/mm-manager.c')
-rw-r--r-- | libmm-glib/mm-manager.c | 640 |
1 files changed, 544 insertions, 96 deletions
diff --git a/libmm-glib/mm-manager.c b/libmm-glib/mm-manager.c index 8275f791..1100b2d9 100644 --- a/libmm-glib/mm-manager.c +++ b/libmm-glib/mm-manager.c @@ -17,14 +17,14 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * - * Copyright (C) 2011 - 2012 Aleksander Morgado <aleksander@gnu.org> * Copyright (C) 2011 - 2012 Google, Inc. - * - * Author: Aleksander Morgado <aleksander@lanedo.com> + * Copyright (C) 2011 - 2018 Aleksander Morgado <aleksander@aleksander.es> */ #include <ModemManager.h> +#include "mm-helpers.h" +#include "mm-common-helpers.h" #include "mm-errors-types.h" #include "mm-gdbus-manager.h" #include "mm-manager.h" @@ -66,18 +66,20 @@ get_proxy_type (GDBusObjectManagerClient *manager, if (g_once_init_enter (&once_init_value)) { lookup_hash = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_TYPE_MODEM)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Messaging", GSIZE_TO_POINTER (MM_TYPE_MODEM_MESSAGING)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Location", GSIZE_TO_POINTER (MM_TYPE_MODEM_LOCATION)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Time", GSIZE_TO_POINTER (MM_TYPE_MODEM_TIME)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Signal", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIGNAL)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Firmware", GSIZE_TO_POINTER (MM_TYPE_MODEM_FIRMWARE)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Oma", GSIZE_TO_POINTER (MM_TYPE_MODEM_OMA)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.ModemCdma", GSIZE_TO_POINTER (MM_TYPE_MODEM_CDMA)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_USSD)); - g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Simple", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIMPLE)); - /* g_hash_table_insert (lookup_hash, "org.freedesktop.ModemManager1.Modem.Contacts", GSIZE_TO_POINTER (MM_GDBUS_TYPE_MODEM_CONTACTS_PROXY)); */ + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem", GSIZE_TO_POINTER (MM_TYPE_MODEM)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Messaging", GSIZE_TO_POINTER (MM_TYPE_MODEM_MESSAGING)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Voice", GSIZE_TO_POINTER (MM_TYPE_MODEM_VOICE)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Location", GSIZE_TO_POINTER (MM_TYPE_MODEM_LOCATION)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Time", GSIZE_TO_POINTER (MM_TYPE_MODEM_TIME)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Sar", GSIZE_TO_POINTER (MM_TYPE_MODEM_SAR)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Signal", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIGNAL)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Firmware", GSIZE_TO_POINTER (MM_TYPE_MODEM_FIRMWARE)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Oma", GSIZE_TO_POINTER (MM_TYPE_MODEM_OMA)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.ModemCdma", GSIZE_TO_POINTER (MM_TYPE_MODEM_CDMA)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Modem3gpp", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Modem3gpp.ProfileManager", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_PROFILE_MANAGER)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd", GSIZE_TO_POINTER (MM_TYPE_MODEM_3GPP_USSD)); + g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.ModemManager1.Modem.Simple", GSIZE_TO_POINTER (MM_TYPE_MODEM_SIMPLE)); g_once_init_leave (&once_init_value, 1); } @@ -89,13 +91,23 @@ get_proxy_type (GDBusObjectManagerClient *manager, /*****************************************************************************/ +static void +cleanup_modem_manager1_proxy (MMManager *self) +{ + if (self->priv->manager_iface_proxy) { + g_signal_handlers_disconnect_by_func (self, cleanup_modem_manager1_proxy, NULL); + g_clear_object (&self->priv->manager_iface_proxy); + } +} + static gboolean ensure_modem_manager1_proxy (MMManager *self, GError **error) { gchar *name = NULL; gchar *object_path = NULL; - GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_NONE; + GDBusObjectManagerClientFlags obj_manager_flags = G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE; + GDBusProxyFlags proxy_flags = G_DBUS_PROXY_FLAGS_NONE; GDBusConnection *connection = NULL; if (self->priv->manager_iface_proxy) @@ -105,13 +117,16 @@ ensure_modem_manager1_proxy (MMManager *self, g_object_get (self, "name", &name, "object-path", &object_path, - "flags", &flags, + "flags", &obj_manager_flags, "connection", &connection, NULL); + if (obj_manager_flags & G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START) + proxy_flags |= G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; + self->priv->manager_iface_proxy = mm_gdbus_org_freedesktop_modem_manager1_proxy_new_sync (connection, - flags, + proxy_flags, name, object_path, NULL, @@ -120,6 +135,12 @@ ensure_modem_manager1_proxy (MMManager *self, g_free (object_path); g_free (name); + if (self->priv->manager_iface_proxy) + g_signal_connect (self, + "notify::name-owner", + G_CALLBACK (cleanup_modem_manager1_proxy), + NULL); + return !!self->priv->manager_iface_proxy; } @@ -127,21 +148,28 @@ ensure_modem_manager1_proxy (MMManager *self, /** * mm_manager_new_finish: - * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_manager_new(). + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_new(). * @error: Return location for error or %NULL * * Finishes an operation started with mm_manager_new(). * - * Returns: (transfer full) (type MMManager): The constructed object manager client or %NULL if @error is set. + * Returns: (transfer full) (type MMManager): The constructed object manager + * client or %NULL if @error is set. + * + * Since: 1.0 */ MMManager * mm_manager_new_finish (GAsyncResult *res, GError **error) { - GDBusObjectManager *ret; + GObject *ret; + GObject *source_object; - ret = mm_gdbus_object_manager_client_new_finish (res, error); - return (ret ? MM_MANAGER (ret) : NULL); + source_object = g_async_result_get_source_object (res); + ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error); + g_object_unref (source_object); + return MM_MANAGER (ret); } /** @@ -160,7 +188,10 @@ mm_manager_new_finish (GAsyncResult *res, * * You can then call mm_manager_new_finish() to get the result of the operation. * - * See mm_manager_new_sync() for the synchronous, blocking version of this constructor. + * See mm_manager_new_sync() for the synchronous, blocking version of this + * constructor. + * + * Since: 1.0 */ void mm_manager_new (GDBusConnection *connection, @@ -195,7 +226,10 @@ mm_manager_new (GDBusConnection *connection, * * See mm_manager_new() for the asynchronous version of this constructor. * - * Returns: (transfer full) (type MMManager): The constructed object manager client or %NULL if @error is set. + * Returns: (transfer full) (type MMManager): The constructed object manager + * client or %NULL if @error is set. + * + * Since: 1.0 */ MMManager * mm_manager_new_sync (GDBusConnection *connection, @@ -203,19 +237,15 @@ mm_manager_new_sync (GDBusConnection *connection, GCancellable *cancellable, GError **error) { - GInitable *ret; - - ret = g_initable_new (MM_TYPE_MANAGER, - cancellable, - error, - "name", MM_DBUS_SERVICE, - "object-path", MM_DBUS_PATH, - "flags", flags, - "connection", connection, - "get-proxy-type-func", get_proxy_type, - NULL); - - return (ret ? MM_MANAGER (ret) : NULL); + return MM_MANAGER (g_initable_new (MM_TYPE_MANAGER, + cancellable, + error, + "name", MM_DBUS_SERVICE, + "object-path", MM_DBUS_PATH, + "flags", flags, + "connection", connection, + "get-proxy-type-func", get_proxy_type, + NULL)); } /*****************************************************************************/ @@ -226,7 +256,10 @@ mm_manager_new_sync (GDBusConnection *connection, * * Gets the #GDBusProxy interface of the @manager. * - * Returns: (transfer none): The #GDBusProxy interface of @manager, or #NULL if none. 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. + * + * Since: 1.0 */ GDBusProxy * mm_manager_peek_proxy (MMManager *manager) @@ -245,7 +278,10 @@ mm_manager_peek_proxy (MMManager *manager) * * Gets the #GDBusProxy interface of the @manager. * - * Returns: (transfer full): The #GDBusProxy interface of @manager, or #NULL if none. The returned object 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(). + * + * Since: 1.0 */ GDBusProxy * mm_manager_get_proxy (MMManager *manager) @@ -261,40 +297,69 @@ mm_manager_get_proxy (MMManager *manager) /*****************************************************************************/ /** + * mm_manager_get_version: + * @manager: A #MMManager. + * + * Gets the ModemManager version, as reported by the daemon. + * + * It is safe to assume this value never changes during runtime. + * + * Returns: (transfer none): The version, or %NULL if none available. Do not + * free the returned value, it belongs to @self. + * + * Since: 1.0 + */ +const gchar * +mm_manager_get_version (MMManager *manager) +{ + g_return_val_if_fail (MM_IS_MANAGER (manager), NULL); + + if (!ensure_modem_manager1_proxy (manager, NULL)) + return NULL; + + RETURN_NON_EMPTY_CONSTANT_STRING ( + mm_gdbus_org_freedesktop_modem_manager1_get_version (manager->priv->manager_iface_proxy)); +} + +/*****************************************************************************/ + +/** * mm_manager_set_logging_finish: * @manager: A #MMManager. - * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_manager_set_logging(). + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_set_logging(). * @error: Return location for error or %NULL. * * Finishes an operation started with mm_manager_set_logging(). * - * Returns: %TRUE if the call succeded, %FALSE if @error is set. + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.0 */ gboolean mm_manager_set_logging_finish (MMManager *manager, GAsyncResult *res, GError **error) { - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); + return g_task_propagate_boolean (G_TASK (res), error); } static void set_logging_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, GAsyncResult *res, - GSimpleAsyncResult *simple) + GTask *task) { GError *error = NULL; - if (mm_gdbus_org_freedesktop_modem_manager1_call_set_logging_finish ( + if (!mm_gdbus_org_freedesktop_modem_manager1_call_set_logging_finish ( manager_iface_proxy, res, &error)) - g_simple_async_result_take_error (simple, error); + g_task_return_error (task, error); else - g_simple_async_result_set_op_res_gboolean (simple, TRUE); + g_task_return_boolean (task, TRUE); - g_simple_async_result_complete (simple); - g_object_unref (simple); + g_object_unref (task); } /** @@ -302,7 +367,8 @@ set_logging_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, * @manager: A #MMManager. * @level: the login level to set. * @cancellable: (allow-none): A #GCancellable or %NULL. - * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. * @user_data: User data to pass to @callback. * * Asynchronously requests to set the specified logging level in the daemon. @@ -312,7 +378,10 @@ set_logging_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, * of the thread you are calling this method from. You can then call * mm_manager_set_logging_finish() to get the result of the operation. * - * See mm_manager_set_logging_sync() for the synchronous, blocking version of this method. + * See mm_manager_set_logging_sync() for the synchronous, blocking version of + * this method. + * + * Since: 1.0 */ void mm_manager_set_logging (MMManager *manager, @@ -321,20 +390,16 @@ mm_manager_set_logging (MMManager *manager, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *result; + GTask *task; 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); + task = g_task_new (manager, cancellable, callback, user_data); 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); + g_task_return_error (task, inner_error); + g_object_unref (task); return; } @@ -343,7 +408,7 @@ mm_manager_set_logging (MMManager *manager, level, cancellable, (GAsyncReadyCallback)set_logging_ready, - result); + task); } /** @@ -353,13 +418,15 @@ mm_manager_set_logging (MMManager *manager, * @cancellable: (allow-none): A #GCancellable or %NULL. * @error: Return location for error or %NULL. * - * Synchronously requests to set the specified logging level in the daemon.. + * Synchronously requests to set the specified logging level in the daemon. * * The calling thread is blocked until a reply is received. * * See mm_manager_set_logging() for the asynchronous version of this method. * - * Returns: %TRUE if the call succeded, %FALSE if @error is set. + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.0 */ gboolean mm_manager_set_logging_sync (MMManager *manager, @@ -384,45 +451,48 @@ mm_manager_set_logging_sync (MMManager *manager, /** * mm_manager_scan_devices_finish: * @manager: A #MMManager. - * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to mm_manager_scan_devices(). + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_scan_devices(). * @error: Return location for error or %NULL. * * Finishes an operation started with mm_manager_scan_devices(). * - * Returns: %TRUE if the call succeded, %FALSE if @error is set. + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.0 */ gboolean mm_manager_scan_devices_finish (MMManager *manager, GAsyncResult *res, GError **error) { - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); + return g_task_propagate_boolean (G_TASK (res), error); } static void scan_devices_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, GAsyncResult *res, - GSimpleAsyncResult *simple) + GTask *task) { GError *error = NULL; - if (mm_gdbus_org_freedesktop_modem_manager1_call_scan_devices_finish ( + if (!mm_gdbus_org_freedesktop_modem_manager1_call_scan_devices_finish ( manager_iface_proxy, res, &error)) - g_simple_async_result_take_error (simple, error); + g_task_return_error (task, error); else - g_simple_async_result_set_op_res_gboolean (simple, TRUE); + g_task_return_boolean (task, TRUE); - g_simple_async_result_complete (simple); - g_object_unref (simple); + g_object_unref (task); } /** * mm_manager_scan_devices: * @manager: A #MMManager. * @cancellable: (allow-none): A #GCancellable or %NULL. - * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. * @user_data: User data to pass to @callback. * * Asynchronously requests to scan looking for devices. @@ -432,7 +502,10 @@ scan_devices_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, * of the thread you are calling this method from. You can then call * mm_manager_scan_devices_finish() to get the result of the operation. * - * See mm_manager_scan_devices_sync() for the synchronous, blocking version of this method. + * See mm_manager_scan_devices_sync() for the synchronous, blocking version of + * this method. + * + * Since: 1.0 */ void mm_manager_scan_devices (MMManager *manager, @@ -440,20 +513,16 @@ mm_manager_scan_devices (MMManager *manager, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *result; + GTask *task; 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); + task = g_task_new (manager, cancellable, callback, user_data); 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); + g_task_return_error (task, inner_error); + g_object_unref (task); return; } @@ -461,7 +530,7 @@ mm_manager_scan_devices (MMManager *manager, manager->priv->manager_iface_proxy, cancellable, (GAsyncReadyCallback)scan_devices_ready, - result); + task); } /** @@ -476,7 +545,9 @@ mm_manager_scan_devices (MMManager *manager, * * See mm_manager_scan_devices() for the asynchronous version of this method. * - * Returns: %TRUE if the call succeded, %FALSE if @error is set. + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.0 */ gboolean mm_manager_scan_devices_sync (MMManager *manager, @@ -496,30 +567,407 @@ mm_manager_scan_devices_sync (MMManager *manager, /*****************************************************************************/ +/** + * mm_manager_report_kernel_event_finish: + * @manager: A #MMManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_report_kernel_event(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_manager_report_kernel_event(). + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 1.8 + */ +gboolean +mm_manager_report_kernel_event_finish (MMManager *manager, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + static void -register_dbus_errors (void) +report_kernel_event_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, + GAsyncResult *res, + GTask *task) { - static volatile guint32 aux = 0; + GError *error = NULL; - if (aux) - return; + if (!mm_gdbus_org_freedesktop_modem_manager1_call_report_kernel_event_finish ( + manager_iface_proxy, + res, + &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} - /* Register all known own errors */ - aux |= MM_CORE_ERROR; - aux |= MM_MOBILE_EQUIPMENT_ERROR; - aux |= MM_CONNECTION_ERROR; - aux |= MM_SERIAL_ERROR; - aux |= MM_MESSAGE_ERROR; - aux |= MM_CDMA_ACTIVATION_ERROR; +/** + * mm_manager_report_kernel_event: + * @manager: A #MMManager. + * @properties: the properties of the kernel event. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously report kernel event. + * + * When the operation is finished, @callback will be invoked in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * of the thread you are calling this method from. You can then call + * mm_manager_report_kernel_event_finish() to get the result of the operation. + * + * See mm_manager_report_kernel_event_sync() for the synchronous, blocking + * version of this method. + * + * Since: 1.8 + */ +void +mm_manager_report_kernel_event (MMManager *manager, + MMKernelEventProperties *properties, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *inner_error = NULL; + GVariant *dictionary; + + g_return_if_fail (MM_IS_MANAGER (manager)); + + task = g_task_new (manager, cancellable, callback, user_data); + + if (!ensure_modem_manager1_proxy (manager, &inner_error)) { + g_task_return_error (task, inner_error); + g_object_unref (task); + return; + } + + dictionary = mm_kernel_event_properties_get_dictionary (properties); + mm_gdbus_org_freedesktop_modem_manager1_call_report_kernel_event ( + manager->priv->manager_iface_proxy, + dictionary, + cancellable, + (GAsyncReadyCallback)report_kernel_event_ready, + task); + g_variant_unref (dictionary); } +/** + * mm_manager_report_kernel_event_sync: + * @manager: A #MMManager. + * @properties: the properties of the kernel event. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously report kernel event. + * + * The calling thread is blocked until a reply is received. + * + * See mm_manager_report_kernel_event() for the asynchronous version of this + * method. + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 1.8 + */ +gboolean +mm_manager_report_kernel_event_sync (MMManager *manager, + MMKernelEventProperties *properties, + GCancellable *cancellable, + GError **error) +{ + GVariant *dictionary; + gboolean result; + + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + + if (!ensure_modem_manager1_proxy (manager, error)) + return FALSE; + + dictionary = mm_kernel_event_properties_get_dictionary (properties); + result = (mm_gdbus_org_freedesktop_modem_manager1_call_report_kernel_event_sync ( + manager->priv->manager_iface_proxy, + dictionary, + cancellable, + error)); + g_variant_unref (dictionary); + return result; +} + +/*****************************************************************************/ + +static gboolean +common_inhibit_device_finish (MMManager *manager, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +inhibit_ready (MmGdbusOrgFreedesktopModemManager1 *manager_iface_proxy, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + + if (!mm_gdbus_org_freedesktop_modem_manager1_call_inhibit_device_finish (manager_iface_proxy, res, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +common_inhibit_device (MMManager *manager, + const gchar *uid, + gboolean inhibit, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *inner_error = NULL; + + task = g_task_new (manager, cancellable, callback, user_data); + + if (!ensure_modem_manager1_proxy (manager, &inner_error)) { + g_task_return_error (task, inner_error); + g_object_unref (task); + return; + } + + mm_gdbus_org_freedesktop_modem_manager1_call_inhibit_device ( + manager->priv->manager_iface_proxy, + uid, + inhibit, + cancellable, + (GAsyncReadyCallback)inhibit_ready, + task); +} + +static gboolean +common_inhibit_device_sync (MMManager *manager, + const gchar *uid, + gboolean inhibit, + GCancellable *cancellable, + GError **error) +{ + if (!ensure_modem_manager1_proxy (manager, error)) + return FALSE; + + return (mm_gdbus_org_freedesktop_modem_manager1_call_inhibit_device_sync ( + manager->priv->manager_iface_proxy, + uid, + inhibit, + cancellable, + error)); +} + +/** + * mm_manager_inhibit_device_finish: + * @manager: A #MMManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_inhibit_device(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_manager_inhibit_device(). + * + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.10 + */ +gboolean +mm_manager_inhibit_device_finish (MMManager *manager, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + return common_inhibit_device_finish (manager, res, error); +} + +/** + * mm_manager_inhibit_device: + * @manager: A #MMManager. + * @uid: the unique ID of the physical device. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously requests to add an inhibition on the device identified by + * @uid. + * + * The @uid must be the unique ID retrieved from an existing #MMModem using + * mm_modem_get_device(). The caller should keep track of this @uid and use it + * in the mm_manager_uninhibit_device() call when the inhibition is no longer + * required. + * + * The inhibition added with this method may also be automatically removed when + * the caller program disappears from the bus (e.g. if the program ends before + * having called mm_manager_uninhibit_device() explicitly). + * + * When the operation is finished, @callback will be invoked in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * of the thread you are calling this method from. You can then call + * mm_manager_inhibit_device_finish() to get the result of the operation. + * + * See mm_manager_inhibit_device_sync() for the synchronous, blocking version of + * this method. + * + * Since: 1.10 + */ +void +mm_manager_inhibit_device (MMManager *manager, + const gchar *uid, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MANAGER (manager)); + common_inhibit_device (manager, uid, TRUE, cancellable, callback, user_data); +} + +/** + * mm_manager_inhibit_device_sync: + * @manager: A #MMManager. + * @uid: the unique ID of the physical device. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously requests to add an inhibition on the device identified by @uid. + * + * The @uid must be the unique ID retrieved from an existing #MMModem using + * mm_modem_get_device(). The caller should keep track of this @uid and use it + * in the mm_manager_uninhibit_device_sync() call when the inhibition is no + * longer required. + * + * The inhibition added with this method may also be automatically removed when + * the caller program disappears from the bus (e.g. if the program ends before + * having called mm_manager_uninhibit_device_sync() explicitly). + * + * See mm_manager_inhibit_device() for the asynchronous version of this method. + * + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.10 + */ +gboolean +mm_manager_inhibit_device_sync (MMManager *manager, + const gchar *uid, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + return common_inhibit_device_sync (manager, uid, TRUE, cancellable, error); +} + +/** + * mm_manager_uninhibit_device_finish: + * @manager: A #MMManager. + * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to + * mm_manager_uninhibit_device(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with mm_manager_uninhibit_device(). + * + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.10 + */ +gboolean +mm_manager_uninhibit_device_finish (MMManager *manager, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + return common_inhibit_device_finish (manager, res, error); +} + +/** + * mm_manager_uninhibit_device: + * @manager: A #MMManager. + * @uid: the unique ID of the physical device. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied or + * %NULL. + * @user_data: User data to pass to @callback. + * + * Asynchronously requests to remove an inhibition on the device identified by + * @uid. + * + * The @uid must be the same unique ID that was sent in the inhibition request. + * + * Only the same program that placed an inhibition on a given device is able to + * remove the inhibition. + * + * When the operation is finished, @callback will be invoked in the + * <link linkend="g-main-context-push-thread-default">thread-default main loop</link> + * of the thread you are calling this method from. You can then call + * mm_manager_uninhibit_device_finish() to get the result of the operation. + * + * See mm_manager_uninhibit_device_sync() for the synchronous, blocking version + * of this method. + * + * Since: 1.10 + */ +void +mm_manager_uninhibit_device (MMManager *manager, + const gchar *uid, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MANAGER (manager)); + common_inhibit_device (manager, uid, FALSE, cancellable, callback, user_data); +} + +/** + * mm_manager_uninhibit_device_sync: + * @manager: A #MMManager. + * @uid: the unique ID of the physical device. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously requests to remove an inhibition on the device identified by + * @uid. + * + * The @uid must be the same unique ID that was sent in the inhibition request. + * + * Only the same program that placed an inhibition on a given device is able to + * remove the inhibition. + * + * See mm_manager_uninhibit_device() for the asynchronous version of this + * method. + * + * Returns: %TRUE if the call succeeded, %FALSE if @error is set. + * + * Since: 1.10 + */ +gboolean +mm_manager_uninhibit_device_sync (MMManager *manager, + const gchar *uid, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (MM_IS_MANAGER (manager), FALSE); + return common_inhibit_device_sync (manager, uid, FALSE, cancellable, error); +} + +/*****************************************************************************/ + static void mm_manager_init (MMManager *manager) { - register_dbus_errors (); + mm_common_register_errors (); /* Setup private data */ - manager->priv = G_TYPE_INSTANCE_GET_PRIVATE ((manager), + manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, MM_TYPE_MANAGER, MMManagerPrivate); } |