mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
egismoc: Do not store twice the number of enrolled IDs
We already store it in the array, so let's just use that value
This commit is contained in:
@@ -43,7 +43,6 @@ struct _FpiDeviceEgisMoc
|
|||||||
FpiUsbTransfer *cmd_transfer;
|
FpiUsbTransfer *cmd_transfer;
|
||||||
GCancellable *interrupt_cancellable;
|
GCancellable *interrupt_cancellable;
|
||||||
|
|
||||||
int enrolled_num;
|
|
||||||
GPtrArray *enrolled_ids;
|
GPtrArray *enrolled_ids;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -154,8 +153,6 @@ egismoc_task_ssm_done (FpiSsm *ssm,
|
|||||||
self->task_ssm = NULL;
|
self->task_ssm = NULL;
|
||||||
|
|
||||||
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
|
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
|
||||||
self->enrolled_ids = NULL;
|
|
||||||
self->enrolled_num = -1;
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
fpi_device_action_error (device, error);
|
fpi_device_action_error (device, error);
|
||||||
@@ -419,11 +416,13 @@ egismoc_get_enrolled_prints (FpDevice *device)
|
|||||||
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
|
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
|
||||||
|
|
||||||
g_autoptr(GPtrArray) result = g_ptr_array_new_with_free_func (g_object_unref);
|
g_autoptr(GPtrArray) result = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
FpPrint *print = NULL;
|
|
||||||
|
|
||||||
for (int i = 0; i < self->enrolled_num; i++)
|
if (!self->enrolled_ids)
|
||||||
|
return g_steal_pointer (&result);
|
||||||
|
|
||||||
|
for (guint i = 0; i < self->enrolled_ids->len; i++)
|
||||||
{
|
{
|
||||||
print = fp_print_new (device);
|
FpPrint *print = fp_print_new (device);
|
||||||
egismoc_set_print_data (print, g_ptr_array_index (self->enrolled_ids, i), NULL);
|
egismoc_set_print_data (print, g_ptr_array_index (self->enrolled_ids, i), NULL);
|
||||||
g_ptr_array_add (result, g_object_ref_sink (print));
|
g_ptr_array_add (result, g_object_ref_sink (print));
|
||||||
}
|
}
|
||||||
@@ -448,7 +447,6 @@ egismoc_list_fill_enrolled_ids_cb (FpDevice *device,
|
|||||||
|
|
||||||
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
|
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
|
||||||
self->enrolled_ids = g_ptr_array_new_with_free_func (g_free);
|
self->enrolled_ids = g_ptr_array_new_with_free_func (g_free);
|
||||||
self->enrolled_num = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Each fingerprint ID will be returned in this response as a 32 byte array
|
* Each fingerprint ID will be returned in this response as a 32 byte array
|
||||||
@@ -457,17 +455,17 @@ egismoc_list_fill_enrolled_ids_cb (FpDevice *device,
|
|||||||
*/
|
*/
|
||||||
for (int pos = EGISMOC_LIST_RESPONSE_PREFIX_SIZE;
|
for (int pos = EGISMOC_LIST_RESPONSE_PREFIX_SIZE;
|
||||||
pos < length_in - EGISMOC_LIST_RESPONSE_SUFFIX_SIZE;
|
pos < length_in - EGISMOC_LIST_RESPONSE_SUFFIX_SIZE;
|
||||||
pos += EGISMOC_FINGERPRINT_DATA_SIZE, self->enrolled_num++)
|
pos += EGISMOC_FINGERPRINT_DATA_SIZE)
|
||||||
{
|
{
|
||||||
g_autofree gchar *print_id = g_strndup ((gchar *) buffer_in + pos,
|
g_autofree gchar *print_id = g_strndup ((gchar *) buffer_in + pos,
|
||||||
EGISMOC_FINGERPRINT_DATA_SIZE);
|
EGISMOC_FINGERPRINT_DATA_SIZE);
|
||||||
fp_dbg ("Device fingerprint %0d: %.*s", self->enrolled_num,
|
fp_dbg ("Device fingerprint %0d: %.*s", self->enrolled_ids->len + 1,
|
||||||
EGISMOC_FINGERPRINT_DATA_SIZE, print_id);
|
EGISMOC_FINGERPRINT_DATA_SIZE, print_id);
|
||||||
g_ptr_array_add (self->enrolled_ids, g_steal_pointer (&print_id));
|
g_ptr_array_add (self->enrolled_ids, g_steal_pointer (&print_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
fp_info ("Number of currently enrolled fingerprints on the device is %d",
|
fp_info ("Number of currently enrolled fingerprints on the device is %d",
|
||||||
self->enrolled_num);
|
self->enrolled_ids->len);
|
||||||
|
|
||||||
if (self->task_ssm)
|
if (self->task_ssm)
|
||||||
fpi_ssm_next_state (self->task_ssm);
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
@@ -537,7 +535,12 @@ egismoc_get_delete_cmd (FpDevice *device,
|
|||||||
* identifiers (enrolled_list)
|
* identifiers (enrolled_list)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const int num_to_delete = (!delete_print) ? self->enrolled_num : 1;
|
int num_to_delete = 0;
|
||||||
|
if (delete_print)
|
||||||
|
num_to_delete = 1;
|
||||||
|
else if (self->enrolled_ids)
|
||||||
|
num_to_delete = self->enrolled_ids->len;
|
||||||
|
|
||||||
const gsize body_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE *
|
const gsize body_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE *
|
||||||
num_to_delete;
|
num_to_delete;
|
||||||
/* total_length is the 6 various bytes plus prefix and body payload */
|
/* total_length is the 6 various bytes plus prefix and body payload */
|
||||||
@@ -617,9 +620,9 @@ egismoc_get_delete_cmd (FpDevice *device,
|
|||||||
memcpy (result + pos, print_data_id, EGISMOC_FINGERPRINT_DATA_SIZE);
|
memcpy (result + pos, print_data_id, EGISMOC_FINGERPRINT_DATA_SIZE);
|
||||||
}
|
}
|
||||||
/* Otherwise assume this is a "clear" - just loop through and append all enrolled IDs */
|
/* Otherwise assume this is a "clear" - just loop through and append all enrolled IDs */
|
||||||
else
|
else if (self->enrolled_ids)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < self->enrolled_ids->len; i++)
|
for (guint i = 0; i < self->enrolled_ids->len; i++)
|
||||||
memcpy (result + pos + (EGISMOC_FINGERPRINT_DATA_SIZE * i),
|
memcpy (result + pos + (EGISMOC_FINGERPRINT_DATA_SIZE * i),
|
||||||
g_ptr_array_index (self->enrolled_ids, i),
|
g_ptr_array_index (self->enrolled_ids, i),
|
||||||
EGISMOC_FINGERPRINT_DATA_SIZE);
|
EGISMOC_FINGERPRINT_DATA_SIZE);
|
||||||
@@ -687,9 +690,7 @@ egismoc_delete_run_state (FpiSsm *ssm,
|
|||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case DELETE_GET_ENROLLED_IDS:
|
case DELETE_GET_ENROLLED_IDS:
|
||||||
/* get enrolled_ids and enrolled_num from device for use building
|
/* get enrolled_ids from device for use building delete payload below */
|
||||||
* delete payload below
|
|
||||||
*/
|
|
||||||
egismoc_exec_cmd (device, cmd_list, cmd_list_len, NULL,
|
egismoc_exec_cmd (device, cmd_list, cmd_list_len, NULL,
|
||||||
egismoc_list_fill_enrolled_ids_cb);
|
egismoc_list_fill_enrolled_ids_cb);
|
||||||
break;
|
break;
|
||||||
@@ -891,19 +892,20 @@ egismoc_get_check_cmd (FpDevice *device,
|
|||||||
* The final command body should contain:
|
* The final command body should contain:
|
||||||
* 1) hard-coded 00 00
|
* 1) hard-coded 00 00
|
||||||
* 2) 2-byte size indiciator, 20*Number enrolled identifiers plus 9 in form of:
|
* 2) 2-byte size indiciator, 20*Number enrolled identifiers plus 9 in form of:
|
||||||
* (enrolled_num + 1) * 0x20 + 0x09
|
* (enrolled_ids->len + 1) * 0x20 + 0x09
|
||||||
* Since max prints can be higher than 7 then this goes up to 2 bytes
|
* Since max prints can be higher than 7 then this goes up to 2 bytes
|
||||||
* (e9 + 9 = 109)
|
* (e9 + 9 = 109)
|
||||||
* 3) Hard-coded prefix (cmd_check_prefix)
|
* 3) Hard-coded prefix (cmd_check_prefix)
|
||||||
* 4) 2-byte size indiciator, 20*Number of enrolled identifiers without plus 9
|
* 4) 2-byte size indiciator, 20*Number of enrolled identifiers without plus 9
|
||||||
* ((enrolled_num + 1) * 0x20)
|
* ((enrolled_ids->len + 1) * 0x20)
|
||||||
* 5) Hard-coded 32 * 0x00 bytes
|
* 5) Hard-coded 32 * 0x00 bytes
|
||||||
* 6) All of the currently registered prints in their 32-byte device identifiers
|
* 6) All of the currently registered prints in their 32-byte device identifiers
|
||||||
* (enrolled_list)
|
* (enrolled_list)
|
||||||
* 7) Hard-coded suffix (cmd_check_suffix)
|
* 7) Hard-coded suffix (cmd_check_suffix)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const gsize body_length = sizeof (guchar) * self->enrolled_num *
|
g_assert (self->enrolled_ids);
|
||||||
|
const gsize body_length = sizeof (guchar) * self->enrolled_ids->len *
|
||||||
EGISMOC_FINGERPRINT_DATA_SIZE;
|
EGISMOC_FINGERPRINT_DATA_SIZE;
|
||||||
|
|
||||||
/* prefix length can depend on the type */
|
/* prefix length can depend on the type */
|
||||||
@@ -931,11 +933,11 @@ egismoc_get_check_cmd (FpDevice *device,
|
|||||||
* when we go to the 2nd byte
|
* when we go to the 2nd byte
|
||||||
* note this will not work in case any model ever supports more than 14 prints
|
* note this will not work in case any model ever supports more than 14 prints
|
||||||
* (assumed max is 10) */
|
* (assumed max is 10) */
|
||||||
if (self->enrolled_num > 6)
|
if (self->enrolled_ids->len > 6)
|
||||||
{
|
{
|
||||||
memset (result + pos, 0x01, sizeof (guchar));
|
memset (result + pos, 0x01, sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
memset (result + pos, ((self->enrolled_num - 7) * 0x20) + 0x09,
|
memset (result + pos, ((self->enrolled_ids->len - 7) * 0x20) + 0x09,
|
||||||
sizeof (guchar));
|
sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
}
|
}
|
||||||
@@ -943,7 +945,7 @@ egismoc_get_check_cmd (FpDevice *device,
|
|||||||
{
|
{
|
||||||
/* first byte is 0x00, just skip it */
|
/* first byte is 0x00, just skip it */
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
memset (result + pos, ((self->enrolled_num + 1) * 0x20) + 0x09,
|
memset (result + pos, ((self->enrolled_ids->len + 1) * 0x20) + 0x09,
|
||||||
sizeof (guchar));
|
sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
}
|
}
|
||||||
@@ -961,18 +963,18 @@ egismoc_get_check_cmd (FpDevice *device,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 2-bytes size logic for counter again */
|
/* 2-bytes size logic for counter again */
|
||||||
if (self->enrolled_num > 6)
|
if (self->enrolled_ids->len > 6)
|
||||||
{
|
{
|
||||||
memset (result + pos, 0x01, sizeof (guchar));
|
memset (result + pos, 0x01, sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
memset (result + pos, (self->enrolled_num - 7) * 0x20, sizeof (guchar));
|
memset (result + pos, (self->enrolled_ids->len - 7) * 0x20, sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* first byte is 0x00, just skip it */
|
/* first byte is 0x00, just skip it */
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
memset (result + pos, (self->enrolled_num + 1) * 0x20, sizeof (guchar));
|
memset (result + pos, (self->enrolled_ids->len + 1) * 0x20, sizeof (guchar));
|
||||||
pos += sizeof (guchar);
|
pos += sizeof (guchar);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -982,7 +984,7 @@ egismoc_get_check_cmd (FpDevice *device,
|
|||||||
/* append all currently registered 32-byte fingerprint IDs */
|
/* append all currently registered 32-byte fingerprint IDs */
|
||||||
const gsize print_id_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE;
|
const gsize print_id_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE;
|
||||||
|
|
||||||
for (int i = 0; i < self->enrolled_num; i++)
|
for (guint i = 0; i < self->enrolled_ids->len; i++)
|
||||||
{
|
{
|
||||||
gchar *device_print_id = g_ptr_array_index (self->enrolled_ids, i);
|
gchar *device_print_id = g_ptr_array_index (self->enrolled_ids, i);
|
||||||
memcpy (result + pos + (print_id_length * i), device_print_id, print_id_length);
|
memcpy (result + pos + (print_id_length * i), device_print_id, print_id_length);
|
||||||
@@ -1012,13 +1014,13 @@ egismoc_enroll_run_state (FpiSsm *ssm,
|
|||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case ENROLL_GET_ENROLLED_IDS:
|
case ENROLL_GET_ENROLLED_IDS:
|
||||||
/* get enrolled_ids and enrolled_num from device for use in check stages below */
|
/* get enrolled_ids from device for use in check stages below */
|
||||||
egismoc_exec_cmd (device, cmd_list, cmd_list_len,
|
egismoc_exec_cmd (device, cmd_list, cmd_list_len,
|
||||||
NULL, egismoc_list_fill_enrolled_ids_cb);
|
NULL, egismoc_list_fill_enrolled_ids_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENROLL_CHECK_ENROLLED_NUM:
|
case ENROLL_CHECK_ENROLLED_NUM:
|
||||||
if (self->enrolled_num >= EGISMOC_MAX_ENROLL_NUM)
|
if (self->enrolled_ids->len >= EGISMOC_MAX_ENROLL_NUM)
|
||||||
{
|
{
|
||||||
egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_DEVICE_FULL,
|
egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_DEVICE_FULL,
|
||||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL));
|
fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL));
|
||||||
@@ -1239,13 +1241,13 @@ egismoc_identify_run_state (FpiSsm *ssm,
|
|||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case IDENTIFY_GET_ENROLLED_IDS:
|
case IDENTIFY_GET_ENROLLED_IDS:
|
||||||
/* get enrolled_ids and enrolled_num from device for use in check stages below */
|
/* get enrolled_ids from device for use in check stages below */
|
||||||
egismoc_exec_cmd (device, cmd_list, cmd_list_len,
|
egismoc_exec_cmd (device, cmd_list, cmd_list_len,
|
||||||
NULL, egismoc_list_fill_enrolled_ids_cb);
|
NULL, egismoc_list_fill_enrolled_ids_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDENTIFY_CHECK_ENROLLED_NUM:
|
case IDENTIFY_CHECK_ENROLLED_NUM:
|
||||||
if (self->enrolled_num == 0)
|
if (self->enrolled_ids->len == 0)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (g_steal_pointer (&self->task_ssm),
|
fpi_ssm_mark_failed (g_steal_pointer (&self->task_ssm),
|
||||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
|
fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
|
||||||
|
|||||||
Reference in New Issue
Block a user