fingerprint-manager: Add completion callback to update state
This commit is contained in:
parent
e935cb9d74
commit
d8c119db2d
3 changed files with 62 additions and 21 deletions
|
@ -121,7 +121,7 @@ cc_fingerprint_manager_set_property (GObject *object,
|
|||
static void
|
||||
cc_fingerprint_manager_constructed (GObject *object)
|
||||
{
|
||||
cc_fingerprint_manager_update_state (CC_FINGERPRINT_MANAGER (object));
|
||||
cc_fingerprint_manager_update_state (CC_FINGERPRINT_MANAGER (object), NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -329,6 +329,12 @@ set_state (CcFingerprintManager *self,
|
|||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATE]);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint waiting_devices;
|
||||
CcFingerprintStateUpdated callback;
|
||||
gpointer user_data;
|
||||
} UpdateStateData;
|
||||
|
||||
static void
|
||||
update_state_callback (GObject *object,
|
||||
|
@ -339,11 +345,16 @@ update_state_callback (GObject *object,
|
|||
CcFingerprintManagerPrivate *priv = cc_fingerprint_manager_get_instance_private (self);
|
||||
g_autoptr(GError) error = NULL;
|
||||
CcFingerprintState state;
|
||||
UpdateStateData *data;
|
||||
GTask *task;
|
||||
|
||||
g_return_if_fail (g_task_is_valid (res, self));
|
||||
|
||||
priv->current_task = NULL;
|
||||
state = g_task_propagate_int (G_TASK (res), &error);
|
||||
task = G_TASK (res);
|
||||
g_assert (g_steal_pointer (&priv->current_task) == task);
|
||||
|
||||
state = g_task_propagate_int (task, &error);
|
||||
data = g_task_get_task_data (task);
|
||||
|
||||
if (error)
|
||||
{
|
||||
|
@ -357,6 +368,9 @@ update_state_callback (GObject *object,
|
|||
}
|
||||
|
||||
set_state (self, state);
|
||||
|
||||
if (data->callback)
|
||||
data->callback (self, state, data->user_data, error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -368,27 +382,25 @@ on_device_list_enrolled (GObject *object,
|
|||
g_autoptr(GTask) task = G_TASK (user_data);
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_auto(GStrv) enrolled_fingers = NULL;
|
||||
guint waiting_devices;
|
||||
UpdateStateData *data = g_task_get_task_data (task);
|
||||
guint num_enrolled_fingers;
|
||||
|
||||
waiting_devices = GPOINTER_TO_UINT (g_task_get_task_data (task));
|
||||
|
||||
cc_fprintd_device_call_list_enrolled_fingers_finish (fprintd_device,
|
||||
&enrolled_fingers,
|
||||
res, &error);
|
||||
waiting_devices--;
|
||||
g_task_set_task_data (task, GUINT_TO_POINTER (waiting_devices), NULL);
|
||||
|
||||
if (g_task_get_completed (task))
|
||||
if (data->waiting_devices == 0)
|
||||
return;
|
||||
|
||||
data->waiting_devices--;
|
||||
|
||||
if (error)
|
||||
{
|
||||
g_autofree char *dbus_error = g_dbus_error_get_remote_error (error);
|
||||
|
||||
if (!g_str_equal (dbus_error, CC_FPRINTD_NAME ".Error.NoEnrolledPrints"))
|
||||
{
|
||||
if (waiting_devices == 0)
|
||||
if (data->waiting_devices == 0)
|
||||
g_task_return_error (task, g_steal_pointer (&error));
|
||||
else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Impossible to list enrolled fingers: %s", error->message);
|
||||
|
@ -404,9 +416,14 @@ on_device_list_enrolled (GObject *object,
|
|||
num_enrolled_fingers);
|
||||
|
||||
if (num_enrolled_fingers > 0)
|
||||
g_task_return_int (task, CC_FINGERPRINT_STATE_ENABLED);
|
||||
else if (waiting_devices == 0)
|
||||
g_task_return_int (task, CC_FINGERPRINT_STATE_DISABLED);
|
||||
{
|
||||
data->waiting_devices = 0;
|
||||
g_task_return_int (task, CC_FINGERPRINT_STATE_ENABLED);
|
||||
}
|
||||
else if (data->waiting_devices == 0)
|
||||
{
|
||||
g_task_return_int (task, CC_FINGERPRINT_STATE_DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -419,6 +436,7 @@ on_manager_devices_list (GObject *object,
|
|||
g_autolist(CcFprintdDevice) fprintd_devices = NULL;
|
||||
g_autoptr(GTask) task = G_TASK (user_data);
|
||||
g_autoptr(GError) error = NULL;
|
||||
UpdateStateData *data = g_task_get_task_data (task);
|
||||
const char *user_name;
|
||||
GList *l;
|
||||
|
||||
|
@ -438,7 +456,6 @@ on_manager_devices_list (GObject *object,
|
|||
}
|
||||
|
||||
user_name = act_user_get_user_name (priv->user);
|
||||
g_task_set_task_data (task, GUINT_TO_POINTER (g_list_length (fprintd_devices)), NULL);
|
||||
|
||||
for (l = fprintd_devices; l; l = l->next)
|
||||
{
|
||||
|
@ -447,6 +464,7 @@ on_manager_devices_list (GObject *object,
|
|||
g_debug ("Connected to device %s, looking for enrolled fingers",
|
||||
cc_fprintd_device_get_name (device));
|
||||
|
||||
data->waiting_devices++;
|
||||
cc_fprintd_device_call_list_enrolled_fingers (device, user_name,
|
||||
g_task_get_cancellable (task),
|
||||
on_device_list_enrolled,
|
||||
|
@ -455,10 +473,13 @@ on_manager_devices_list (GObject *object,
|
|||
}
|
||||
|
||||
void
|
||||
cc_fingerprint_manager_update_state (CcFingerprintManager *self)
|
||||
cc_fingerprint_manager_update_state (CcFingerprintManager *self,
|
||||
CcFingerprintStateUpdated callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
CcFingerprintManagerPrivate *priv = cc_fingerprint_manager_get_instance_private (self);
|
||||
g_autoptr(GCancellable) cancellable = NULL;
|
||||
UpdateStateData *data;
|
||||
|
||||
g_return_if_fail (priv->current_task == NULL);
|
||||
|
||||
|
@ -469,11 +490,14 @@ cc_fingerprint_manager_update_state (CcFingerprintManager *self)
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
cancellable = g_cancellable_new ();
|
||||
data = g_new0 (UpdateStateData, 1);
|
||||
data->callback = callback;
|
||||
data->user_data = user_data;
|
||||
|
||||
priv->current_task = g_task_new (self, cancellable, update_state_callback, NULL);
|
||||
g_task_set_source_tag (priv->current_task, cc_fingerprint_manager_update_state);
|
||||
g_task_set_task_data (priv->current_task, data, g_free);
|
||||
|
||||
cc_fingerprint_manager_get_devices (self, cancellable, on_manager_devices_list,
|
||||
priv->current_task);
|
||||
|
|
|
@ -45,11 +45,18 @@ typedef enum {
|
|||
CC_FINGERPRINT_STATE_DISABLED,
|
||||
} CcFingerprintState;
|
||||
|
||||
typedef void (*CcFingerprintStateUpdated) (CcFingerprintManager *fp_manager,
|
||||
CcFingerprintState state,
|
||||
gpointer user_data,
|
||||
GError *error);
|
||||
|
||||
CcFingerprintManager * cc_fingerprint_manager_new (ActUser *user);
|
||||
|
||||
CcFingerprintState cc_fingerprint_manager_get_state (CcFingerprintManager *fp_manager);
|
||||
|
||||
void cc_fingerprint_manager_update_state (CcFingerprintManager *fp_manager);
|
||||
void cc_fingerprint_manager_update_state (CcFingerprintManager *fp_manager,
|
||||
CcFingerprintStateUpdated callback,
|
||||
gpointer user_data);
|
||||
|
||||
void cc_fingerprint_manager_get_devices (CcFingerprintManager *fp_manager,
|
||||
GCancellable *cancellable,
|
||||
|
|
|
@ -182,6 +182,17 @@ get_error_dialog (const char *title,
|
|||
return error_dialog;
|
||||
}
|
||||
|
||||
static void
|
||||
on_state_updated (CcFingerprintManager *fp_manager,
|
||||
CcFingerprintState state,
|
||||
gpointer user_data,
|
||||
GError *error)
|
||||
{
|
||||
g_autoptr (GtkWidget) fingerprint_row = GTK_WIDGET (user_data);
|
||||
|
||||
gtk_widget_set_sensitive (fingerprint_row, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
set_fingerprint_row_cb (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
|
@ -200,9 +211,8 @@ set_fingerprint_row_cb (GObject *source_object,
|
|||
}
|
||||
}
|
||||
|
||||
gtk_widget_set_sensitive (fingerprint_row, TRUE);
|
||||
|
||||
cc_fingerprint_manager_update_state (fingerprint_manager);
|
||||
cc_fingerprint_manager_update_state (fingerprint_manager, on_state_updated,
|
||||
g_object_ref (fingerprint_row));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -412,7 +422,7 @@ static void
|
|||
assistant_cancelled (GtkAssistant *ass, EnrollData *data)
|
||||
{
|
||||
enroll_data_destroy (data);
|
||||
cc_fingerprint_manager_update_state (fingerprint_manager);
|
||||
cc_fingerprint_manager_update_state (fingerprint_manager, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Reference in a new issue