synaptics: Improve identify handler and return a new print

It is easier (and more correct) to create a new print from the reported
data and match that against the prints in the gallery.

We continue to return NULL during verify as we cannot provide any
additional information in that case.
This commit is contained in:
Benjamin Berg 2020-12-09 15:04:08 +01:00 committed by Benjamin Berg
parent 2ee0d16784
commit 3d5db6a391

View file

@ -451,6 +451,37 @@ parse_print_data (GVariant *data,
return TRUE; return TRUE;
} }
static FpPrint *
create_print (FpiDeviceSynaptics *self,
guint8 *user_id,
guint8 finger_id)
{
FpPrint *print;
g_autofree gchar *user_id_safe;
GVariant *data = NULL;
GVariant *uid = NULL;
user_id_safe = g_strndup ((char *) user_id, BMKT_MAX_USER_ID_LEN);
print = fp_print_new (FP_DEVICE (self));
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
user_id_safe,
strlen (user_id_safe),
1);
data = g_variant_new ("(y@ay)",
finger_id,
uid);
fpi_print_set_type (print, FPI_PRINT_RAW);
fpi_print_set_device_stored (print, TRUE);
g_object_set (print, "fpi-data", data, NULL);
g_object_set (print, "description", user_id_safe, NULL);
fpi_print_fill_from_user_id (print, user_id_safe);
return print;
}
static void static void
list_msg_cb (FpiDeviceSynaptics *self, list_msg_cb (FpiDeviceSynaptics *self,
bmkt_response_t *resp, bmkt_response_t *resp,
@ -503,10 +534,7 @@ list_msg_cb (FpiDeviceSynaptics *self,
for (int n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) for (int n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++)
{ {
GVariant *data = NULL;
GVariant *uid = NULL;
FpPrint *print; FpPrint *print;
gchar *userid;
if (get_enroll_templates_resp->templates[n].user_id_len == 0) if (get_enroll_templates_resp->templates[n].user_id_len == 0)
continue; continue;
@ -519,23 +547,9 @@ list_msg_cb (FpiDeviceSynaptics *self,
get_enroll_templates_resp->templates[n].user_id, get_enroll_templates_resp->templates[n].user_id,
get_enroll_templates_resp->templates[n].finger_id); get_enroll_templates_resp->templates[n].finger_id);
userid = (gchar *) get_enroll_templates_resp->templates[n].user_id; print = create_print (self,
print = fp_print_new (FP_DEVICE (self));
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
get_enroll_templates_resp->templates[n].user_id, get_enroll_templates_resp->templates[n].user_id,
get_enroll_templates_resp->templates[n].user_id_len, get_enroll_templates_resp->templates[n].finger_id);
1);
data = g_variant_new ("(y@ay)",
get_enroll_templates_resp->templates[n].finger_id,
uid);
fpi_print_set_type (print, FPI_PRINT_RAW);
fpi_print_set_device_stored (print, TRUE);
g_object_set (print, "fpi-data", data, NULL);
g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL);
fpi_print_fill_from_user_id (print, userid);
g_ptr_array_add (self->list_result, g_object_ref_sink (print)); g_ptr_array_add (self->list_result, g_object_ref_sink (print));
} }
@ -760,37 +774,28 @@ identify_msg_cb (FpiDeviceSynaptics *self,
FpPrint *print = NULL; FpPrint *print = NULL;
GPtrArray *prints = NULL; GPtrArray *prints = NULL;
g_autoptr(GVariant) data = NULL; g_autoptr(GVariant) data = NULL;
guint8 finger; gboolean found = FALSE;
const guint8 *user_id; guint index;
gsize user_id_len = 0;
gint cnt = 0; print = create_print (self,
gboolean find = FALSE; resp->response.id_resp.user_id,
resp->response.id_resp.finger_id);
fpi_device_get_identify_data (device, &prints); fpi_device_get_identify_data (device, &prints);
for (cnt = 0; cnt < prints->len; cnt++) found = g_ptr_array_find_with_equal_func (prints,
print,
(GEqualFunc) fp_print_equal,
&index);
if (found)
{ {
print = g_ptr_array_index (prints, cnt); fpi_device_identify_report (device, g_ptr_array_index (prints, index), print, NULL);
g_object_get (print, "fpi-data", &data, NULL);
g_debug ("data is %p", data);
parse_print_data (data, &finger, &user_id, &user_id_len);
if (user_id)
{
if (memcmp (resp->response.id_resp.user_id, user_id, user_id_len) == 0)
{
find = TRUE;
break;
}
}
}
if(find)
{
fpi_device_identify_report (device, print, print, NULL);
fpi_device_identify_complete (device, NULL); fpi_device_identify_complete (device, NULL);
} }
else else
{ {
fpi_device_identify_report (device, NULL, NULL, NULL); fpi_device_identify_report (device, NULL, print, NULL);
identify_complete_after_finger_removal (self); identify_complete_after_finger_removal (self);
} }
} }