lib: Implement up_client_get_devices_async()

This commit is contained in:
Bastien Nocera 2022-01-23 22:48:17 +01:00
parent 95618dfad4
commit 1fdc0824b6
3 changed files with 89 additions and 3 deletions

View file

@ -160,6 +160,71 @@ up_client_get_devices2 (UpClient *client)
} }
return ret; return ret;
} }
static void
get_devices_async_thread (GTask *task,
gpointer source_object,
gpointer task_data,
GCancellable *cancellable)
{
GError *error = NULL;
GPtrArray *array;
array = up_client_get_devices_full (UP_CLIENT (source_object), cancellable, &error);
if (!array)
g_task_return_error (task, error);
else
g_task_return_pointer (task, array, (GDestroyNotify) g_ptr_array_unref);
}
/**
* up_client_get_devices_async:
* @client: a #UpClient instance.
* @cancellable: (nullable): a #GCancellable or %NULL
* @callback: a #GAsyncReadyCallback to call when the request is satisfied
* @user_data: the data to pass to @callback
*
* Asynchronously fetches the list of #UpDevice objects.
*
* Since: 0.99.14
**/
void
up_client_get_devices_async (UpClient *client,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
task = g_task_new (client, cancellable, callback, user_data);
g_task_set_source_tag (task, (gpointer) G_STRFUNC);
g_task_run_in_thread (task, get_devices_async_thread);
}
/**
* up_client_get_devices_finish:
* @client: a #UpClient instance.
* @res: a #GAsyncResult obtained from the #GAsyncReadyCallback passed
* to up_client_get_devices_async()
*
* Finishes an operation started with up_client_get_devices_async().
*
* Return value: (element-type UpDevice) (transfer full): an array of
* #UpDevice objects or %NULL on error.
**/
GPtrArray *
up_client_get_devices_finish (UpClient *client,
GAsyncResult *res,
GError **error)
{
g_return_val_if_fail (UP_IS_CLIENT (client), NULL);
g_return_val_if_fail (g_task_is_valid (res, client), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
return g_task_propagate_pointer (G_TASK (res), error);
}
/** /**
* up_client_get_display_device: * up_client_get_display_device:
* @client: a #UpClient instance. * @client: a #UpClient instance.

View file

@ -86,6 +86,13 @@ char * up_client_get_critical_action (UpClient *client);
/* accessors */ /* accessors */
GPtrArray *up_client_get_devices (UpClient *client) G_DEPRECATED_FOR(up_client_get_devices2); GPtrArray *up_client_get_devices (UpClient *client) G_DEPRECATED_FOR(up_client_get_devices2);
GPtrArray *up_client_get_devices2 (UpClient *client); GPtrArray *up_client_get_devices2 (UpClient *client);
void up_client_get_devices_async (UpClient *client,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
GPtrArray *up_client_get_devices_finish (UpClient *client,
GAsyncResult *res,
GError **error);
const gchar *up_client_get_daemon_version (UpClient *client); const gchar *up_client_get_daemon_version (UpClient *client);
G_DEPRECATED G_DEPRECATED
gboolean up_client_get_lid_is_closed (UpClient *client); gboolean up_client_get_lid_is_closed (UpClient *client);

View file

@ -1967,18 +1967,32 @@ class Tests(dbusmock.DBusTestCase):
def test_lib_up_client_async(self): def test_lib_up_client_async(self):
'''Test up_client_async_new()''' '''Test up_client_async_new()'''
ac = self.testbed.add_device('power_supply', 'AC', None,
['type', 'Mains', 'online', '1'], [])
self.start_daemon() self.start_daemon()
def client_new_cb(obj, task): def client_new_cb(obj, res):
nonlocal ml nonlocal ml, client
client = UPowerGlib.Client.new_finish(task) client = UPowerGlib.Client.new_finish(res)
self.assertRegex(client.get_daemon_version(), '^[0-9.]+$') self.assertRegex(client.get_daemon_version(), '^[0-9.]+$')
ml.quit() ml.quit()
def get_devices_cb(obj, res):
nonlocal ml, client
devs = client.get_devices_finish(res)
self.assertEqual(len(devs), 1)
ml.quit()
client = None
ml = GLib.MainLoop() ml = GLib.MainLoop()
UPowerGlib.Client.new_async(None, client_new_cb) UPowerGlib.Client.new_async(None, client_new_cb)
ml.run() ml.run()
# This will crash, see:
# https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/305
# client.get_devices_async(None, get_devices_cb)
# ml.run()
# #
# Helper methods # Helper methods
# #