Compare commits

..

1 Commits

Author SHA1 Message Date
Benjamin Berg
1528c962fa tests: Adjust timeouts to avoid CI failures
The virtual-image test is quite CPU intensive and can take a long time
in the CI setup. Adjust the timeouts so that it runs reliably.
2020-03-27 15:20:08 +00:00
55 changed files with 235 additions and 928 deletions

View File

@@ -48,11 +48,6 @@ build:
<<: *build_one_driver <<: *build_one_driver
<<: *build <<: *build
# <<: *check_abi # <<: *check_abi
artifacts:
expose_as: "HTML Documentation"
paths:
- _build/doc/html/
expire_in: 1 week
test: test:
stage: test stage: test
@@ -62,7 +57,7 @@ test:
script: script:
- meson --werror -Ddrivers=all -Db_coverage=true . _build - meson --werror -Ddrivers=all -Db_coverage=true . _build
- ninja -C _build - ninja -C _build
- meson test -C _build --verbose --no-stdsplit --timeout-multiplier 3 - meson test -C _build --verbose --no-stdsplit
- ninja -C _build coverage - ninja -C _build coverage
- cat _build/meson-logs/coverage.txt - cat _build/meson-logs/coverage.txt
artifacts: artifacts:
@@ -80,32 +75,13 @@ test_valgrind:
- ninja -C _build - ninja -C _build
- meson test -C _build --verbose --no-stdsplit --setup=valgrind - meson test -C _build --verbose --no-stdsplit --setup=valgrind
test_scan_build:
stage: test
except:
variables:
- $CI_PIPELINE_SOURCE == "schedule"
allow_failure: true
script:
- meson -Ddrivers=all . _build
# This is ugly, the wrapper disables the malloc checker
- SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build ninja -C _build scan-build
# Check that the directory is empty
- "! ls -A _build/meson-logs/scanbuild | grep -q ."
artifacts:
paths:
- _build/meson-logs
expire_in: 1 week
test_indent: test_indent:
stage: check-source stage: check-source
except: except:
variables: variables:
- $CI_PIPELINE_SOURCE == "schedule" - $CI_PIPELINE_SOURCE == "schedule"
script: script:
- scripts/uncrustify.sh - scripts/uncrustify.sh --check
- git diff
- "! git status -s | grep -q ."
.flatpak_script_template: &flatpak_script .flatpak_script_template: &flatpak_script
script: script:

View File

@@ -24,4 +24,3 @@
umockdev umockdev
uncrustify uncrustify
valgrind valgrind
clang-analyzer

View File

@@ -1,4 +0,0 @@
#!/bin/sh
# This wrapper just disables the malloc checker
exec /usr/bin/scan-build -disable-checker unix.Malloc "$@"

View File

@@ -1,13 +0,0 @@
Current maintainers of libfprint are:
* Benjamin Berg <bberg@redhat.com>
* Marco Trevisan (Treviño) <mail@3v1n0.net>
Many drivers are not actively maintained and may not be fully functional.
We are happy to receive contributions, but the support we can give is
limitted unfortunately. For many drivers we may not even have test devices.
Maintained drivers are:
* synaptics:
Contributed and maintained by Synaptics Inc.
Contact: Vincent Huang <vincent.huang@tw.synaptics.com>

View File

@@ -175,7 +175,7 @@ fpi_image_resize
<SECTION> <SECTION>
<FILE>fpi-image-device</FILE> <FILE>fpi-image-device</FILE>
<TITLE>Internal FpImageDevice</TITLE> <TITLE>FpImageDevice</TITLE>
FpiImageDeviceState FpiImageDeviceState
FpImageDeviceClass FpImageDeviceClass
fpi_image_device_session_error fpi_image_device_session_error
@@ -207,8 +207,6 @@ fpi_print_set_type
fpi_print_set_device_stored fpi_print_set_device_stored
fpi_print_add_from_image fpi_print_add_from_image
fpi_print_bz3_match fpi_print_bz3_match
fpi_print_generate_user_id
fpi_print_fill_from_user_id
</SECTION> </SECTION>
<SECTION> <SECTION>

View File

@@ -1,6 +1,6 @@
/* /*
* Example fingerprint enrollment program * Example fingerprint enrollment program
* Enrolls your chosen finger and saves the print to disk * Enrolls your choosen finger and saves the print to disk
* Copyright (C) 2007 Daniel Drake <dsd@gentoo.org> * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
* Copyright (C) 2019 Marco Trevisan <marco.trevisan@canonical.com> * Copyright (C) 2019 Marco Trevisan <marco.trevisan@canonical.com>
* *
@@ -23,7 +23,6 @@
#include <stdio.h> #include <stdio.h>
#include <libfprint/fprint.h> #include <libfprint/fprint.h>
#include <glib-unix.h>
#include "storage.h" #include "storage.h"
#include "utilities.h" #include "utilities.h"
@@ -31,8 +30,6 @@
typedef struct _EnrollData typedef struct _EnrollData
{ {
GMainLoop *loop; GMainLoop *loop;
GCancellable *cancellable;
unsigned int sigint_handler;
FpFinger finger; FpFinger finger;
int ret_value; int ret_value;
} EnrollData; } EnrollData;
@@ -40,8 +37,6 @@ typedef struct _EnrollData
static void static void
enroll_data_free (EnrollData *enroll_data) enroll_data_free (EnrollData *enroll_data)
{ {
g_clear_handle_id (&enroll_data->sigint_handler, g_source_remove);
g_clear_object (&enroll_data->cancellable);
g_main_loop_unref (enroll_data->loop); g_main_loop_unref (enroll_data->loop);
g_free (enroll_data); g_free (enroll_data);
} }
@@ -142,22 +137,11 @@ on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
printf ("Scan your finger now.\n"); printf ("Scan your finger now.\n");
print_template = print_create_template (dev, enroll_data->finger); print_template = print_create_template (dev, enroll_data->finger);
fp_device_enroll (dev, print_template, enroll_data->cancellable, fp_device_enroll (dev, print_template, NULL, on_enroll_progress, NULL,
on_enroll_progress, NULL, NULL, NULL, (GAsyncReadyCallback) on_enroll_completed,
(GAsyncReadyCallback) on_enroll_completed,
enroll_data); enroll_data);
} }
static gboolean
sigint_cb (void *user_data)
{
EnrollData *enroll_data = user_data;
g_cancellable_cancel (enroll_data->cancellable);
return G_SOURCE_CONTINUE;
}
int int
main (void) main (void)
{ {
@@ -204,15 +188,8 @@ main (void)
enroll_data->finger = finger; enroll_data->finger = finger;
enroll_data->ret_value = EXIT_FAILURE; enroll_data->ret_value = EXIT_FAILURE;
enroll_data->loop = g_main_loop_new (NULL, FALSE); enroll_data->loop = g_main_loop_new (NULL, FALSE);
enroll_data->cancellable = g_cancellable_new ();
enroll_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH,
SIGINT,
sigint_cb,
enroll_data,
NULL);
fp_device_open (dev, enroll_data->cancellable, fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened,
(GAsyncReadyCallback) on_device_opened,
enroll_data); enroll_data);
g_main_loop_run (enroll_data->loop); g_main_loop_run (enroll_data->loop);

View File

@@ -23,7 +23,6 @@
#include <stdio.h> #include <stdio.h>
#include <libfprint/fprint.h> #include <libfprint/fprint.h>
#include <glib-unix.h>
#include "storage.h" #include "storage.h"
#include "utilities.h" #include "utilities.h"
@@ -31,8 +30,6 @@
typedef struct _VerifyData typedef struct _VerifyData
{ {
GMainLoop *loop; GMainLoop *loop;
GCancellable *cancellable;
unsigned int sigint_handler;
FpFinger finger; FpFinger finger;
int ret_value; int ret_value;
} VerifyData; } VerifyData;
@@ -40,8 +37,6 @@ typedef struct _VerifyData
static void static void
verify_data_free (VerifyData *verify_data) verify_data_free (VerifyData *verify_data)
{ {
g_clear_handle_id (&verify_data->sigint_handler, g_source_remove);
g_clear_object (&verify_data->cancellable);
g_main_loop_unref (verify_data->loop); g_main_loop_unref (verify_data->loop);
g_free (verify_data); g_free (verify_data);
} }
@@ -201,7 +196,7 @@ on_list_completed (FpDevice *dev, GAsyncResult *res, gpointer user_data)
fp_print_get_description (verify_print)); fp_print_get_description (verify_print));
g_print ("Print loaded. Time to verify!\n"); g_print ("Print loaded. Time to verify!\n");
fp_device_verify (dev, verify_print, verify_data->cancellable, fp_device_verify (dev, verify_print, NULL,
on_match_cb, verify_data, NULL, on_match_cb, verify_data, NULL,
(GAsyncReadyCallback) on_verify_completed, (GAsyncReadyCallback) on_verify_completed,
verify_data); verify_data);
@@ -255,7 +250,7 @@ start_verification (FpDevice *dev, VerifyData *verify_data)
} }
g_print ("Print loaded. Time to verify!\n"); g_print ("Print loaded. Time to verify!\n");
fp_device_verify (dev, verify_print, verify_data->cancellable, fp_device_verify (dev, verify_print, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
(GAsyncReadyCallback) on_verify_completed, (GAsyncReadyCallback) on_verify_completed,
verify_data); verify_data);
@@ -281,16 +276,6 @@ on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
start_verification (dev, verify_data); start_verification (dev, verify_data);
} }
static gboolean
sigint_cb (void *user_data)
{
VerifyData *verify_data = user_data;
g_cancellable_cancel (verify_data->cancellable);
return G_SOURCE_CONTINUE;
}
int int
main (void) main (void)
{ {
@@ -321,14 +306,8 @@ main (void)
verify_data = g_new0 (VerifyData, 1); verify_data = g_new0 (VerifyData, 1);
verify_data->ret_value = EXIT_FAILURE; verify_data->ret_value = EXIT_FAILURE;
verify_data->loop = g_main_loop_new (NULL, FALSE); verify_data->loop = g_main_loop_new (NULL, FALSE);
verify_data->cancellable = g_cancellable_new ();
verify_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH, fp_device_open (dev, NULL, (GAsyncReadyCallback) on_device_opened,
SIGINT,
sigint_cb,
verify_data,
NULL);
fp_device_open (dev, verify_data->cancellable,
(GAsyncReadyCallback) on_device_opened,
verify_data); verify_data);
g_main_loop_run (verify_data->loop); g_main_loop_run (verify_data->loop);

View File

@@ -614,7 +614,6 @@ capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *device,
self->strips = g_slist_reverse (self->strips); self->strips = g_slist_reverse (self->strips);
fpi_do_movement_estimation (&assembling_ctx, self->strips); fpi_do_movement_estimation (&assembling_ctx, self->strips);
img = fpi_assemble_frames (&assembling_ctx, self->strips); img = fpi_assemble_frames (&assembling_ctx, self->strips);
img->flags |= FPI_IMAGE_PARTIAL;
g_slist_free_full (self->strips, g_free); g_slist_free_full (self->strips, g_free);
self->strips = NULL; self->strips = NULL;

View File

@@ -458,7 +458,6 @@ capture_read_strip_cb (FpiUsbTransfer *transfer, FpDevice *_dev,
fpi_do_movement_estimation (&assembling_ctx, self->strips); fpi_do_movement_estimation (&assembling_ctx, self->strips);
img = fpi_assemble_frames (&assembling_ctx, img = fpi_assemble_frames (&assembling_ctx,
self->strips); self->strips);
img->flags |= FPI_IMAGE_PARTIAL;
g_slist_free_full (self->strips, g_free); g_slist_free_full (self->strips, g_free);
self->strips = NULL; self->strips = NULL;
self->strips_len = 0; self->strips_len = 0;

View File

@@ -230,7 +230,6 @@ capture_set_idle_reqs_cb (FpiUsbTransfer *transfer,
self->strips = g_slist_reverse (self->strips); self->strips = g_slist_reverse (self->strips);
img = fpi_assemble_frames (&assembling_ctx, self->strips); img = fpi_assemble_frames (&assembling_ctx, self->strips);
img->flags |= FPI_IMAGE_PARTIAL;
g_slist_free_full (self->strips, g_free); g_slist_free_full (self->strips, g_free);
self->strips = NULL; self->strips = NULL;
self->strips_len = 0; self->strips_len = 0;

View File

@@ -331,7 +331,6 @@ capture_set_idle_cmd_cb (FpiUsbTransfer *transfer, FpDevice *device,
priv->strips = g_slist_reverse (priv->strips); priv->strips = g_slist_reverse (priv->strips);
img = fpi_assemble_frames (cls->assembling_ctx, priv->strips); img = fpi_assemble_frames (cls->assembling_ctx, priv->strips);
img->flags |= FPI_IMAGE_PARTIAL;
g_slist_foreach (priv->strips, (GFunc) g_free, NULL); g_slist_foreach (priv->strips, (GFunc) g_free, NULL);
g_slist_free (priv->strips); g_slist_free (priv->strips);
priv->strips = NULL; priv->strips = NULL;

View File

@@ -207,7 +207,6 @@ elan_save_img_frame (FpiDeviceElan *elandev)
unsigned int frame_size = elandev->frame_width * elandev->frame_height; unsigned int frame_size = elandev->frame_width * elandev->frame_height;
unsigned short *frame = g_malloc (frame_size * sizeof (short)); unsigned short *frame = g_malloc (frame_size * sizeof (short));
elan_save_frame (elandev, frame); elan_save_frame (elandev, frame);
unsigned int sum = 0; unsigned int sum = 0;
@@ -245,7 +244,6 @@ elan_process_frame_linear (unsigned short *raw_frame,
G_DEBUG_HERE (); G_DEBUG_HERE ();
unsigned short min = 0xffff, max = 0; unsigned short min = 0xffff, max = 0;
for (int i = 0; i < frame_size; i++) for (int i = 0; i < frame_size; i++)
{ {
if (raw_frame[i] < min) if (raw_frame[i] < min)
@@ -257,7 +255,6 @@ elan_process_frame_linear (unsigned short *raw_frame,
g_assert (max != min); g_assert (max != min);
unsigned short px; unsigned short px;
for (int i = 0; i < frame_size; i++) for (int i = 0; i < frame_size; i++)
{ {
px = raw_frame[i]; px = raw_frame[i];
@@ -281,7 +278,6 @@ elan_process_frame_thirds (unsigned short *raw_frame,
unsigned short lvl0, lvl1, lvl2, lvl3; unsigned short lvl0, lvl1, lvl2, lvl3;
unsigned short *sorted = g_malloc (frame_size * sizeof (short)); unsigned short *sorted = g_malloc (frame_size * sizeof (short));
memcpy (sorted, raw_frame, frame_size * sizeof (short)); memcpy (sorted, raw_frame, frame_size * sizeof (short));
qsort (sorted, frame_size, sizeof (short), cmp_short); qsort (sorted, frame_size, sizeof (short), cmp_short);
lvl0 = sorted[0]; lvl0 = sorted[0];
@@ -291,7 +287,6 @@ elan_process_frame_thirds (unsigned short *raw_frame,
g_free (sorted); g_free (sorted);
unsigned short px; unsigned short px;
for (int i = 0; i < frame_size; i++) for (int i = 0; i < frame_size; i++)
{ {
px = raw_frame[i]; px = raw_frame[i];
@@ -325,7 +320,6 @@ elan_submit_image (FpImageDevice *dev)
g_slist_foreach (raw_frames, (GFunc) self->process_frame, &frames); g_slist_foreach (raw_frames, (GFunc) self->process_frame, &frames);
fpi_do_movement_estimation (&assembling_ctx, frames); fpi_do_movement_estimation (&assembling_ctx, frames);
img = fpi_assemble_frames (&assembling_ctx, frames); img = fpi_assemble_frames (&assembling_ctx, frames);
img->flags |= FPI_IMAGE_PARTIAL;
g_slist_free_full (frames, g_free); g_slist_free_full (frames, g_free);
@@ -515,7 +509,6 @@ elan_stop_capture (FpDevice *dev)
FpiSsm *ssm = FpiSsm *ssm =
fpi_ssm_new (dev, stop_capture_run_state, STOP_CAPTURE_NUM_STATES); fpi_ssm_new (dev, stop_capture_run_state, STOP_CAPTURE_NUM_STATES);
fpi_ssm_start (ssm, stop_capture_complete); fpi_ssm_start (ssm, stop_capture_complete);
} }
@@ -626,7 +619,6 @@ elan_capture (FpDevice *dev)
elan_dev_reset_state (self); elan_dev_reset_state (self);
FpiSsm *ssm = FpiSsm *ssm =
fpi_ssm_new (dev, capture_run_state, CAPTURE_NUM_STATES); fpi_ssm_new (dev, capture_run_state, CAPTURE_NUM_STATES);
fpi_ssm_start (ssm, capture_complete); fpi_ssm_start (ssm, capture_complete);
} }
@@ -741,7 +733,7 @@ calibrate_run_state (FpiSsm *ssm, FpDevice *dev)
fp_dbg ("calibration failed"); fp_dbg ("calibration failed");
fpi_ssm_mark_failed (ssm, fpi_ssm_mark_failed (ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Calibration failed!")); "Callibration failed!"));
} }
break; break;
@@ -805,7 +797,6 @@ elan_calibrate (FpDevice *dev)
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), calibrate_run_state, FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (dev), calibrate_run_state,
CALIBRATE_NUM_STATES); CALIBRATE_NUM_STATES);
fpi_ssm_start (ssm, calibrate_complete); fpi_ssm_start (ssm, calibrate_complete);
} }
@@ -901,7 +892,6 @@ elan_activate (FpImageDevice *dev)
FpiSsm *ssm = FpiSsm *ssm =
fpi_ssm_new (FP_DEVICE (dev), activate_run_state, fpi_ssm_new (FP_DEVICE (dev), activate_run_state,
ACTIVATE_NUM_STATES); ACTIVATE_NUM_STATES);
fpi_ssm_start (ssm, activate_complete); fpi_ssm_start (ssm, activate_complete);
} }
@@ -998,7 +988,7 @@ static void
elan_change_state_async (FpDevice *dev, elan_change_state_async (FpDevice *dev,
void *data) void *data)
{ {
fp_dbg ("state change dev: %p", dev); g_message ("state change dev: %p", dev);
elan_change_state (FP_IMAGE_DEVICE (dev)); elan_change_state (FP_IMAGE_DEVICE (dev));
} }

View File

@@ -859,15 +859,13 @@ m_capture_state (FpiSsm *ssm, FpDevice *dev)
} }
else else
{ {
FpImage *img;
unsigned int img_size;
/* Remove empty parts 2 times for the 2 frames */ /* Remove empty parts 2 times for the 2 frames */
process_removefpi_end (self); process_removefpi_end (self);
process_removefpi_end (self); process_removefpi_end (self);
img_size = self->fp_height * FE_WIDTH;
if (self->fp_height >= FE_WIDTH) img = fp_image_new (FE_WIDTH, self->fp_height);
{
FpImage *img = fp_image_new (FE_WIDTH, self->fp_height);
unsigned int img_size = self->fp_height * FE_WIDTH;
/* Images received are white on black, so invert it. */ /* Images received are white on black, so invert it. */
/* TODO detect sweep direction */ /* TODO detect sweep direction */
img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED; img->flags = FPI_IMAGE_COLORS_INVERTED | FPI_IMAGE_V_FLIPPED;
@@ -876,12 +874,6 @@ m_capture_state (FpiSsm *ssm, FpDevice *dev)
fp_dbg ("Sending the raw fingerprint image (%dx%d)", fp_dbg ("Sending the raw fingerprint image (%dx%d)",
img->width, img->height); img->width, img->height);
fpi_image_device_image_captured (idev, img); fpi_image_device_image_captured (idev, img);
}
else
{
fpi_image_device_retry_scan (idev, FP_DEVICE_RETRY_TOO_SHORT);
}
fpi_image_device_report_finger_status (idev, FALSE); fpi_image_device_report_finger_status (idev, FALSE);
fpi_ssm_mark_completed (ssm); fpi_ssm_mark_completed (ssm);
} }

View File

@@ -206,7 +206,6 @@ parse_get_enrolled_users_report (bmkt_msg_resp_t *msg_resp, bmkt_response_t *res
get_enroll_templates_resp->query_sequence = extract8 (msg_resp->payload, &offset); get_enroll_templates_resp->query_sequence = extract8 (msg_resp->payload, &offset);
int n = 0; int n = 0;
for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++) for (n = 0; n < BMKT_MAX_NUM_TEMPLATES_INTERNAL_FLASH; n++)
{ {
if (offset >= msg_resp->payload_len) if (offset >= msg_resp->payload_len)

View File

@@ -316,7 +316,7 @@ typedef struct bmkt_init_resp
*/ */
typedef struct bmkt_enroll_resp typedef struct bmkt_enroll_resp
{ {
int progress; /**< Shows current progress status [0-100] */ int progress; /**< Shows current progress stutus [0-100] */
uint8_t finger_id; /**< User's finger id [1-10] */ uint8_t finger_id; /**< User's finger id [1-10] */
uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */ uint8_t user_id[BMKT_MAX_USER_ID_LEN]; /**< User name to be enrolled */
} bmkt_enroll_resp_t; } bmkt_enroll_resp_t;

View File

@@ -35,7 +35,7 @@ static const FpIdEntry id_table[] = {
static void static void
cmd_receive_cb (FpiUsbTransfer *transfer, cmd_recieve_cb (FpiUsbTransfer *transfer,
FpDevice *device, FpDevice *device,
gpointer user_data, gpointer user_data,
GError *error) GError *error)
@@ -234,7 +234,7 @@ synaptics_cmd_run_state (FpiSsm *ssm,
fpi_usb_transfer_submit (transfer, fpi_usb_transfer_submit (transfer,
5000, 5000,
NULL, NULL,
cmd_receive_cb, cmd_recieve_cb,
fpi_ssm_get_data (ssm)); fpi_ssm_get_data (ssm));
break; break;
@@ -321,7 +321,7 @@ synaptics_sensor_cmd (FpiDeviceSynaptics *self,
g_assert (payload || payload_len == 0); g_assert (payload || payload_len == 0);
/* seq_num of 0 means a normal command, -1 means the current commands /* seq_num of 0 means a normal command, -1 means the current commands
* sequence number should not be updated (i.e. second async command which * sequence number should not be udpated (i.e. second async command which
* may only be a cancellation currently). */ * may only be a cancellation currently). */
if (seq_num <= 0) if (seq_num <= 0)
{ {
@@ -515,7 +515,39 @@ list_msg_cb (FpiDeviceSynaptics *self,
g_object_set (print, "fpi-data", data, NULL); g_object_set (print, "fpi-data", data, NULL);
g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL); g_object_set (print, "description", get_enroll_templates_resp->templates[n].user_id, NULL);
fpi_print_fill_from_user_id (print, userid); /* The format has 24 bytes at the start and some dashes in the right places */
if (g_str_has_prefix (userid, "FP1-") && strlen (userid) >= 24 &&
userid[12] == '-' && userid[14] == '-' && userid[23] == '-')
{
g_autofree gchar *copy = g_strdup (userid);
g_autoptr(GDate) date = NULL;
gint32 date_ymd;
gint32 finger;
gchar *username;
/* Try to parse information from the string. */
copy[12] = '\0';
date_ymd = g_ascii_strtod (copy + 4, NULL);
if (date_ymd > 0)
date = g_date_new_dmy (date_ymd % 100,
(date_ymd / 100) % 100,
date_ymd / 10000);
else
date = g_date_new ();
fp_print_set_enroll_date (print, date);
copy[14] = '\0';
finger = g_ascii_strtoll (copy + 13, NULL, 16);
fp_print_set_finger (print, finger);
/* We ignore the next chunk, it is just random data.
* Then comes the username; nobody is the default if the metadata
* is unknown */
username = copy + 24;
if (strlen (username) > 0 && g_strcmp0 (username, "nobody") != 0)
fp_print_set_username (print, username);
}
g_ptr_array_add (self->list_result, g_object_ref_sink (print)); g_ptr_array_add (self->list_result, g_object_ref_sink (print));
} }
@@ -603,7 +635,7 @@ verify_msg_cb (FpiDeviceSynaptics *self,
else if (resp->result == BMKT_FP_NO_MATCH) else if (resp->result == BMKT_FP_NO_MATCH)
{ {
fp_info ("Print didn't match"); fp_info ("Print didn't match");
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, NULL); fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
verify_complete_after_finger_removal (self); verify_complete_after_finger_removal (self);
} }
else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS) else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS)
@@ -698,7 +730,7 @@ enroll_msg_cb (FpiDeviceSynaptics *self,
if (enroll_resp->progress < 100) if (enroll_resp->progress < 100)
done_stages = MIN (done_stages, ENROLL_SAMPLES - 1); done_stages = MIN (done_stages, ENROLL_SAMPLES - 1);
/* Emit a retry error if there has been no discernible /* Emit a retry error if there has been no discernable
* progress. Some firmware revisions report more required * progress. Some firmware revisions report more required
* touches. */ * touches. */
if (self->enroll_stage == done_stages) if (self->enroll_stage == done_stages)
@@ -763,6 +795,8 @@ enroll_msg_cb (FpiDeviceSynaptics *self,
} }
} }
#define TEMPLATE_ID_SIZE 20
static void static void
enroll (FpDevice *device) enroll (FpDevice *device)
{ {
@@ -770,21 +804,52 @@ enroll (FpDevice *device)
FpPrint *print = NULL; FpPrint *print = NULL;
GVariant *data = NULL; GVariant *data = NULL;
GVariant *uid = NULL; GVariant *uid = NULL;
const gchar *username;
guint finger; guint finger;
g_autofree gchar *user_id = NULL; g_autofree gchar *user_id = NULL;
gssize user_id_len; gssize user_id_len;
g_autofree guint8 *payload = NULL; g_autofree guint8 *payload = NULL;
const GDate *date;
gint y, m, d;
gint32 rand_id = 0;
fpi_device_get_enroll_data (device, &print); fpi_device_get_enroll_data (device, &print);
G_DEBUG_HERE (); G_DEBUG_HERE ();
user_id = fpi_print_generate_user_id (print); date = fp_print_get_enroll_date (print);
if (date && g_date_valid (date))
{
y = g_date_get_year (date);
m = g_date_get_month (date);
d = g_date_get_day (date);
}
else
{
y = 0;
m = 0;
d = 0;
}
username = fp_print_get_username (print);
if (!username)
username = "nobody";
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
rand_id = 0;
else
rand_id = g_random_int ();
user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s",
y, m, d,
fp_print_get_finger (print),
rand_id,
username);
user_id_len = strlen (user_id); user_id_len = strlen (user_id);
user_id_len = MIN (BMKT_MAX_USER_ID_LEN, user_id_len); user_id_len = MIN (BMKT_MAX_USER_ID_LEN, user_id_len);
/* We currently always use finger 1 from the devices point of view */ /* We currently always use finger 1 from the devices piont of view */
finger = 1; finger = 1;
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
@@ -964,7 +1029,7 @@ dev_probe (FpDevice *device)
if (!read_ok) if (!read_ok)
{ {
g_warning ("Transfer in response to version query was too short"); g_warning ("Transfer in response to verison query was too short");
error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO); error = fpi_device_error_new (FP_DEVICE_ERROR_PROTO);
goto err_close; goto err_close;
} }

View File

@@ -310,7 +310,6 @@ capture_read_data_cb (FpiUsbTransfer *transfer, FpDevice *device,
fp_dbg ("Image size is %lu\n", fp_dbg ("Image size is %lu\n",
self->image_size); self->image_size);
img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT); img = fp_image_new (IMAGE_WIDTH, IMAGE_HEIGHT);
img->flags |= FPI_IMAGE_PARTIAL;
memcpy (img->data, self->image_bits, memcpy (img->data, self->image_bits,
IMAGE_SIZE); IMAGE_SIZE);
fpi_image_device_image_captured (dev, img); fpi_image_device_image_captured (dev, img);

View File

@@ -35,6 +35,7 @@
#define TIMEOUT 5000 #define TIMEOUT 5000
#define MSG_READ_BUF_SIZE 0x40 #define MSG_READ_BUF_SIZE 0x40
#define MAX_DATA_IN_READ_BUF (MSG_READ_BUF_SIZE - 9)
struct _FpiDeviceUpekts struct _FpiDeviceUpekts
{ {
@@ -235,18 +236,12 @@ __handle_incoming_msg (FpDevice *device,
{ {
GError *error = NULL; GError *error = NULL;
guint8 *buf = udata->buffer; guint8 *buf = udata->buffer;
guint16 len; guint16 len = ((buf[5] & 0xf) << 8) | buf[6];
guint16 computed_crc; guint16 computed_crc = udf_crc (buf + 4, len + 3);
guint16 msg_crc; guint16 msg_crc = (buf[len + 8] << 8) | buf[len + 7];
unsigned char *retdata = NULL;
unsigned char code_a, code_b; unsigned char code_a, code_b;
g_assert (udata->buflen >= 6);
len = ((buf[5] & 0xf) << 8) | buf[6];
g_assert (udata->buflen >= len + 9);
computed_crc = udf_crc (buf + 4, len + 3);
msg_crc = (buf[len + 8] << 8) | buf[len + 7];
if (computed_crc != msg_crc) if (computed_crc != msg_crc)
{ {
fp_err ("CRC failed, got %04x expected %04x", msg_crc, computed_crc); fp_err ("CRC failed, got %04x expected %04x", msg_crc, computed_crc);
@@ -272,7 +267,12 @@ __handle_incoming_msg (FpDevice *device,
return; return;
} }
udata->callback (device, READ_MSG_CMD, code_a, 0, buf + 7, len, if (len > 0)
{
retdata = g_malloc (len);
memcpy (retdata, buf + 7, len);
}
udata->callback (device, READ_MSG_CMD, code_a, 0, retdata, len,
udata->user_data, NULL); udata->user_data, NULL);
goto done; goto done;
} }
@@ -309,8 +309,14 @@ __handle_incoming_msg (FpDevice *device,
innerlen = innerlen - 3; innerlen = innerlen - 3;
_subcmd = innerbuf[5]; _subcmd = innerbuf[5];
fp_dbg ("device responds to subcmd %x with %d bytes", _subcmd, innerlen); fp_dbg ("device responds to subcmd %x with %d bytes", _subcmd, innerlen);
if (innerlen > 0)
{
retdata = g_malloc (innerlen);
memcpy (retdata, innerbuf + 6, innerlen);
}
udata->callback (device, READ_MSG_RESPONSE, code_b, _subcmd, udata->callback (device, READ_MSG_RESPONSE, code_b, _subcmd,
innerbuf + 6, innerlen, udata->user_data, NULL); retdata, innerlen, udata->user_data, NULL);
g_free (retdata);
goto done; goto done;
} }
else else
@@ -352,8 +358,7 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
gpointer user_data, GError *error) gpointer user_data, GError *error)
{ {
struct read_msg_data *udata = user_data; struct read_msg_data *udata = user_data;
guint16 payload_len; guint16 len;
gsize packet_len;
if (error) if (error)
{ {
@@ -378,15 +383,14 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
goto err; goto err;
} }
payload_len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6]; len = ((udata->buffer[5] & 0xf) << 8) | udata->buffer[6];
packet_len = payload_len + 9;
if (transfer->actual_length != MSG_READ_BUF_SIZE && if (transfer->actual_length != MSG_READ_BUF_SIZE &&
packet_len > transfer->actual_length) (len + 9) > transfer->actual_length)
{ {
/* Check that the length claimed inside the message is in line with /* Check that the length claimed inside the message is in line with
* the amount of data that was transferred over USB. */ * the amount of data that was transferred over USB. */
fp_err ("msg didn't include enough data, expected=%d recv=%d", fp_err ("msg didn't include enough data, expected=%d recv=%d",
(gint) packet_len, (gint) transfer->actual_length); len + 9, (gint) transfer->actual_length);
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Packet from device didn't include data"); "Packet from device didn't include data");
goto err; goto err;
@@ -395,14 +399,14 @@ read_msg_cb (FpiUsbTransfer *transfer, FpDevice *device,
/* We use a 64 byte buffer for reading messages. However, sometimes /* We use a 64 byte buffer for reading messages. However, sometimes
* messages are longer, in which case we have to do another USB bulk read * messages are longer, in which case we have to do another USB bulk read
* to read the remainder. This is handled below. */ * to read the remainder. This is handled below. */
if (packet_len > MSG_READ_BUF_SIZE) if (len > MAX_DATA_IN_READ_BUF)
{ {
int needed = packet_len - MSG_READ_BUF_SIZE; int needed = len - MAX_DATA_IN_READ_BUF;
FpiUsbTransfer *etransfer = fpi_usb_transfer_new (device); FpiUsbTransfer *etransfer = fpi_usb_transfer_new (device);
fp_dbg ("didn't fit in buffer, need to extend by %d bytes", needed); fp_dbg ("didn't fit in buffer, need to extend by %d bytes", needed);
udata->buffer = g_realloc ((gpointer) udata->buffer, packet_len); udata->buffer = g_realloc ((gpointer) udata->buffer, len);
udata->buflen = packet_len; udata->buflen = len;
fpi_usb_transfer_fill_bulk_full (etransfer, EP_IN, fpi_usb_transfer_fill_bulk_full (etransfer, EP_IN,
udata->buffer + MSG_READ_BUF_SIZE, udata->buffer + MSG_READ_BUF_SIZE,
@@ -696,7 +700,7 @@ initsm_run_state (FpiSsm *ssm, FpDevice *dev)
break; break;
case SEND_RESP03:; case SEND_RESP03:;
transfer = alloc_send_cmdresponse_transfer (dev, ++upekdev->seq, init_resp03, sizeof (init_resp03)); transfer = alloc_send_cmd28_transfer (dev, ++upekdev->seq, init_resp03, sizeof (init_resp03));
transfer->ssm = ssm; transfer->ssm = ssm;
transfer->short_is_error = TRUE; transfer->short_is_error = TRUE;
fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL); fpi_usb_transfer_submit (transfer, TIMEOUT, NULL, fpi_ssm_usb_transfer_cb, NULL);
@@ -853,15 +857,22 @@ dev_init (FpDevice *dev)
} }
static void static void
dev_exit (FpDevice *dev) deinitsm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
{ {
GError *error = NULL; g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, NULL);
g_usb_device_release_interface (fpi_device_get_usb_device (dev), 0, 0, &error);
fpi_device_close_complete (dev, error); fpi_device_close_complete (dev, error);
} }
static void
dev_exit (FpDevice *dev)
{
FpiSsm *ssm;
ssm = fpi_ssm_new (dev, deinitsm_state_handler, DEINITSM_NUM_STATES);
fpi_ssm_start (ssm, deinitsm_done);
}
static const unsigned char enroll_init[] = { static const unsigned char enroll_init[] = {
0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08 0x02, 0xc0, 0xd4, 0x01, 0x00, 0x04, 0x00, 0x08
}; };
@@ -972,9 +983,7 @@ enroll_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
if (error) if (error)
fp_warn ("Error deinitializing: %s", error->message); fp_warn ("Error deinitializing: %s", error->message);
fpi_device_enroll_complete (dev, fpi_device_enroll_complete (dev, data->print, data->error);
g_steal_pointer (&data->print),
g_steal_pointer (&data->error));
} }
static void static void
@@ -983,7 +992,7 @@ do_enroll_stop (FpDevice *dev, FpPrint *print, GError *error)
EnrollStopData *data = g_new0 (EnrollStopData, 1); EnrollStopData *data = g_new0 (EnrollStopData, 1);
FpiSsm *ssm = deinitsm_new (dev, data); FpiSsm *ssm = deinitsm_new (dev, data);
data->print = print; data->print = g_object_ref (print);
data->error = error; data->error = error;
fpi_ssm_start (ssm, enroll_stop_deinit_cb); fpi_ssm_start (ssm, enroll_stop_deinit_cb);
@@ -1110,6 +1119,7 @@ e_handle_resp02 (FpDevice *dev, unsigned char *data,
else else
{ {
GVariant *fp_data; GVariant *fp_data;
print = fp_print_new (dev);
fpi_device_get_enroll_data (dev, &print); fpi_device_get_enroll_data (dev, &print);
@@ -1118,7 +1128,6 @@ e_handle_resp02 (FpDevice *dev, unsigned char *data,
data_len - sizeof (scan_comp), data_len - sizeof (scan_comp),
1); 1);
fpi_print_set_type (print, FPI_PRINT_RAW);
g_object_set (print, "fpi-data", fp_data, NULL); g_object_set (print, "fpi-data", fp_data, NULL);
g_object_ref (print); g_object_ref (print);
} }
@@ -1237,11 +1246,11 @@ verify_stop_deinit_cb (FpiSsm *ssm, FpDevice *dev, GError *error)
fp_warn ("Error deinitializing: %s", error->message); fp_warn ("Error deinitializing: %s", error->message);
if (data->error) if (data->error)
fpi_device_verify_complete (dev, g_steal_pointer (&data->error)); fpi_device_verify_complete (dev, data->error);
else else
fpi_device_verify_complete (dev, g_steal_pointer (&error)); fpi_device_verify_complete (dev, g_steal_pointer (&error));
g_clear_error (&error); g_error_free (error);
} }
static void static void
@@ -1251,7 +1260,7 @@ do_verify_stop (FpDevice *dev, FpiMatchResult res, GError *error)
FpiSsm *ssm = deinitsm_new (dev, data); FpiSsm *ssm = deinitsm_new (dev, data);
/* Report the error immediately if possible, otherwise delay it. */ /* Report the error immediately if possible, otherwise delay it. */
if (error && error->domain == FP_DEVICE_RETRY) if (!error && error->domain != FP_DEVICE_RETRY)
fpi_device_verify_report (dev, res, NULL, error); fpi_device_verify_report (dev, res, NULL, error);
else else
data->error = error; data->error = error;
@@ -1293,7 +1302,7 @@ verify_start_sm_run_state (FpiSsm *ssm, FpDevice *dev)
case VERIFY_INIT: case VERIFY_INIT:
fpi_device_get_verify_data (dev, &print); fpi_device_get_verify_data (dev, &print);
g_object_get (print, "fpi-data", &fp_data, NULL); g_object_get (dev, "fpi-data", &fp_data, NULL);
data = g_variant_get_fixed_array (fp_data, &data_len, 1); data = g_variant_get_fixed_array (fp_data, &data_len, 1);

View File

@@ -156,8 +156,6 @@ async_abort (FpDevice *dev, FpiSsm *ssm, int ep)
else else
fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE); fpi_usb_transfer_fill_bulk (transfer, ep, VFS_USB_BUFFER_SIZE);
transfer->ssm = ssm;
fpi_usb_transfer_submit (transfer, VFS_USB_ABORT_TIMEOUT, NULL, fpi_usb_transfer_submit (transfer, VFS_USB_ABORT_TIMEOUT, NULL,
async_abort_callback, NULL); async_abort_callback, NULL);
} }
@@ -242,7 +240,6 @@ prepare_image (FpDeviceVfs0050 *vdev)
/* Building GSList */ /* Building GSList */
GSList *lines = NULL; GSList *lines = NULL;
for (int i = height - 1; i >= 0; --i) for (int i = height - 1; i >= 0; --i)
lines = g_slist_prepend (lines, vdev->lines_buffer + i); lines = g_slist_prepend (lines, vdev->lines_buffer + i);
@@ -467,8 +464,8 @@ receive_callback (FpiUsbTransfer *transfer, FpDevice *device,
if (error) if (error)
g_error_free (error); g_error_free (error);
/* Capture is done when there is no more data to transfer or device timed out */ /* Check if fingerprint data is over */
if (transfer->actual_length <= 0) if (transfer->actual_length == 0)
{ {
fpi_ssm_next_state (transfer->ssm); fpi_ssm_next_state (transfer->ssm);
} }
@@ -476,7 +473,7 @@ receive_callback (FpiUsbTransfer *transfer, FpDevice *device,
{ {
self->bytes += transfer->actual_length; self->bytes += transfer->actual_length;
/* Try reading more data */ /* We need more data */
fpi_ssm_jump_to_state (transfer->ssm, fpi_ssm_jump_to_state (transfer->ssm,
fpi_ssm_get_cur_state (transfer->ssm)); fpi_ssm_get_cur_state (transfer->ssm));
} }
@@ -598,7 +595,8 @@ activate_ssm (FpiSsm *ssm, FpDevice *dev)
/* Receive chunk of data */ /* Receive chunk of data */
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
fpi_usb_transfer_fill_bulk_full (transfer, 0x82, fpi_usb_transfer_fill_bulk_full (transfer, 0x82,
(guint8 *) self->lines_buffer + self->bytes, (guint8 *)
(self->lines_buffer + self->bytes),
VFS_USB_BUFFER_SIZE, NULL); VFS_USB_BUFFER_SIZE, NULL);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL, fpi_usb_transfer_submit (transfer, VFS_USB_TIMEOUT, NULL,
@@ -670,7 +668,6 @@ dev_activate (FpImageDevice *idev)
self->ssm_active = 1; self->ssm_active = 1;
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES); FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
fpi_ssm_start (ssm, dev_activate_callback); fpi_ssm_start (ssm, dev_activate_callback);
} }
@@ -714,7 +711,6 @@ dev_open (FpImageDevice *idev)
/* Clearing previous device state */ /* Clearing previous device state */
FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES); FpiSsm *ssm = fpi_ssm_new (FP_DEVICE (idev), activate_ssm, SSM_STATES);
fpi_ssm_start (ssm, dev_open_callback); fpi_ssm_start (ssm, dev_open_callback);
} }

View File

@@ -177,7 +177,6 @@ translate_str (const char **srcL, gssize *len)
src_len += tmp; src_len += tmp;
} }
g_assert (src_len >= 2);
*len = src_len / 2; *len = src_len / 2;
res = g_malloc0 (*len); res = g_malloc0 (*len);
dst = res; dst = res;

View File

@@ -381,8 +381,9 @@ submit_image (FpiSsm *ssm,
{ {
FpImage *img; FpImage *img;
if (self->lines_recorded < VFS5011_IMAGE_WIDTH) if (self->lines_recorded == 0)
{ {
/* == FP_ENROLL_RETRY_TOO_SHORT */
fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT); fpi_image_device_retry_scan (dev, FP_DEVICE_RETRY_TOO_SHORT);
return; return;
} }

View File

@@ -21,7 +21,7 @@
/* /*
* This is a virtual driver to debug the image based drivers. A small * This is a virtual driver to debug the image based drivers. A small
* python script is provided to connect to it via a socket, allowing * python script is provided to connect to it via a socket, allowing
* prints to be sent to this device programmatically. * prints to be sent to this device programatically.
* Using this it is possible to test libfprint and fprintd. * Using this it is possible to test libfprint and fprintd.
*/ */
@@ -252,7 +252,6 @@ dev_init (FpImageDevice *dev)
g_autoptr(GSocketListener) listener = NULL; g_autoptr(GSocketListener) listener = NULL;
FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev); FpDeviceVirtualImage *self = FPI_DEVICE_VIRTUAL_IMAGE (dev);
const char *env; const char *env;
g_autoptr(GSocketAddress) addr = NULL; g_autoptr(GSocketAddress) addr = NULL;
G_DEBUG_HERE (); G_DEBUG_HERE ();

View File

@@ -94,21 +94,22 @@ async_device_init_done_cb (GObject *source_object, GAsyncResult *res, gpointer u
FpContext *context; FpContext *context;
FpContextPrivate *priv; FpContextPrivate *priv;
device = FP_DEVICE (g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), device = (FpDevice *) g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, &error);
res, &error)); if (!device)
{
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
return; return;
context = FP_CONTEXT (user_data); context = FP_CONTEXT (user_data);
priv = fp_context_get_instance_private (context); priv = fp_context_get_instance_private (context);
priv->pending_devices--; priv->pending_devices--;
if (error)
{
g_message ("Ignoring device due to initialization error: %s", error->message); g_message ("Ignoring device due to initialization error: %s", error->message);
return; return;
} }
context = FP_CONTEXT (user_data);
priv = fp_context_get_instance_private (context);
priv->pending_devices--;
g_ptr_array_add (priv->devices, device); g_ptr_array_add (priv->devices, device);
g_signal_emit (context, signals[DEVICE_ADDED_SIGNAL], 0, device); g_signal_emit (context, signals[DEVICE_ADDED_SIGNAL], 0, device);
} }
@@ -158,7 +159,7 @@ usb_device_added_cb (FpContext *self, GUsbDevice *device, GUsbContext *usb_ctx)
if (found_driver == G_TYPE_NONE) if (found_driver == G_TYPE_NONE)
{ {
g_debug ("No driver found for USB device %04X:%04X", vid, pid); g_debug ("No driver found for USB device %04X:%04X", pid, vid);
return; return;
} }

View File

@@ -24,11 +24,16 @@
#include "fp-device-private.h" #include "fp-device-private.h"
/** /**
* SECTION: fp-device * SECTION: fpi-device
* @title: FpDevice * @title: Internal FpDevice
* @short_description: Fingerpint device routines * @short_description: Internal device routines
* *
* These are the public #FpDevice routines. * The methods that are availabe for drivers to manipulate a device. See
* #FpDeviceClass for more information. Also note that most of these are
* not relevant for image based devices, see #FpImageDeviceClass in that
* case.
*
* Also see the public #FpDevice routines.
*/ */
static void fp_device_async_initable_iface_init (GAsyncInitableIface *iface); static void fp_device_async_initable_iface_init (GAsyncInitableIface *iface);
@@ -334,7 +339,7 @@ fp_device_class_init (FpDeviceClass *klass)
properties[PROP_OPEN] = properties[PROP_OPEN] =
g_param_spec_boolean ("open", g_param_spec_boolean ("open",
"Opened", "Opened",
"Whether the device is open or not", FALSE, "Wether the device is open or not", FALSE,
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
/** /**

View File

@@ -79,7 +79,7 @@ typedef enum {
/** /**
* FpDeviceError: * FpDeviceError:
* @FP_DEVICE_ERROR_GENERAL: A general error occurred. * @FP_DEVICE_ERROR_GENERAL: A general error occured.
* @FP_DEVICE_ERROR_NOT_SUPPORTED: The device does not support the requested * @FP_DEVICE_ERROR_NOT_SUPPORTED: The device does not support the requested
* operation. * operation.
* @FP_DEVICE_ERROR_NOT_OPEN: The device needs to be opened to start this * @FP_DEVICE_ERROR_NOT_OPEN: The device needs to be opened to start this
@@ -113,7 +113,7 @@ GQuark fp_device_error_quark (void);
* FpEnrollProgress: * FpEnrollProgress:
* @device: a #FpDevice * @device: a #FpDevice
* @completed_stages: Number of completed stages * @completed_stages: Number of completed stages
* @print: (nullable) (transfer none): The last scanned print * @print: (nullable) (transfer none): The last scaned print
* @user_data: (nullable) (transfer none): User provided data * @user_data: (nullable) (transfer none): User provided data
* @error: (nullable) (transfer none): #GError or %NULL * @error: (nullable) (transfer none): #GError or %NULL
* *

View File

@@ -100,7 +100,7 @@ fp_image_device_close (FpDevice *device)
* 1. We are inactive * 1. We are inactive
* -> immediately close * -> immediately close
* 2. We are waiting for finger off * 2. We are waiting for finger off
* -> immediately deactivate * -> imediately deactivate
* 3. We are deactivating * 3. We are deactivating
* -> handled by deactivate_complete */ * -> handled by deactivate_complete */

View File

@@ -184,8 +184,10 @@ fp_image_detect_minutiae_cb (GObject *source_object,
GTask *task = G_TASK (res); GTask *task = G_TASK (res);
FpImage *image; FpImage *image;
DetectMinutiaeData *data = g_task_get_task_data (task); DetectMinutiaeData *data = g_task_get_task_data (task);
GCancellable *cancellable;
if (!g_task_had_error (task)) cancellable = g_task_get_cancellable (task);
if (!cancellable || !g_cancellable_is_cancelled (cancellable))
{ {
gint i; gint i;
image = FP_IMAGE (source_object); image = FP_IMAGE (source_object);
@@ -281,7 +283,6 @@ fp_image_detect_minutiae_thread_func (GTask *task,
gint map_w, map_h; gint map_w, map_h;
gint bw, bh, bd; gint bw, bh, bd;
gint r; gint r;
g_autofree LFSPARMS *lfsparms;
/* Normalize the image first */ /* Normalize the image first */
if (data->flags & FPI_IMAGE_H_FLIPPED) if (data->flags & FPI_IMAGE_H_FLIPPED)
@@ -295,15 +296,12 @@ fp_image_detect_minutiae_thread_func (GTask *task,
data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED); data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED);
lfsparms = g_memdup (&g_lfsparms_V2, sizeof (LFSPARMS));
lfsparms->remove_perimeter_pts = data->flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE;
timer = g_timer_new (); timer = g_timer_new ();
r = get_minutiae (&minutiae, &quality_map, &direction_map, r = get_minutiae (&minutiae, &quality_map, &direction_map,
&low_contrast_map, &low_flow_map, &high_curve_map, &low_contrast_map, &low_flow_map, &high_curve_map,
&map_w, &map_h, &bdata, &bw, &bh, &bd, &map_w, &map_h, &bdata, &bw, &bh, &bd,
data->image, data->width, data->height, 8, data->image, data->width, data->height, 8,
data->ppmm, lfsparms); data->ppmm, &g_lfsparms_V2);
g_timer_stop (timer); g_timer_stop (timer);
fp_dbg ("Minutiae scan completed in %f secs", g_timer_elapsed (timer, NULL)); fp_dbg ("Minutiae scan completed in %f secs", g_timer_elapsed (timer, NULL));
@@ -318,14 +316,6 @@ fp_image_detect_minutiae_thread_func (GTask *task,
return; return;
} }
if (!data->minutiae || data->minutiae->num == 0)
{
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
"No minutiae found");
g_object_unref (task);
return;
}
g_task_return_boolean (task, TRUE); g_task_return_boolean (task, TRUE);
g_object_unref (task); g_object_unref (task);
} }

View File

@@ -51,7 +51,7 @@ enum {
PROP_IMAGE, PROP_IMAGE,
/* The following is metadata that is stored by default for each print. /* The following is metadata that is stored by default for each print.
* Drivers may make use of these during enrollment (e.g. to additionally store * Drivers may make use of these during enrollment (e.g. to additionaly store
* the metadata on the device). */ * the metadata on the device). */
PROP_FINGER, PROP_FINGER,
PROP_USERNAME, PROP_USERNAME,
@@ -588,7 +588,7 @@ fp_print_equal (FpPrint *self, FpPrint *other)
} }
else if (self->type == FPI_PRINT_NBIS) else if (self->type == FPI_PRINT_NBIS)
{ {
guint i; gint i;
if (self->prints->len != other->prints->len) if (self->prints->len != other->prints->len)
return FALSE; return FALSE;
@@ -661,7 +661,7 @@ fp_print_serialize (FpPrint *print,
if (print->type == FPI_PRINT_NBIS) if (print->type == FPI_PRINT_NBIS)
{ {
GVariantBuilder nested = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("(a(aiaiai))")); GVariantBuilder nested = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("(a(aiaiai))"));
guint i; gint i;
g_variant_builder_open (&nested, G_VARIANT_TYPE ("a(aiaiai)")); g_variant_builder_open (&nested, G_VARIANT_TYPE ("a(aiaiai)"));
for (i = 0; i < print->prints->len; i++) for (i = 0; i < print->prints->len; i++)
@@ -812,7 +812,7 @@ fp_print_deserialize (const guchar *data,
if (type == FPI_PRINT_NBIS) if (type == FPI_PRINT_NBIS)
{ {
g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0); g_autoptr(GVariant) prints = g_variant_get_child_value (print_data, 0);
guint i; gint i;
result = g_object_new (FP_TYPE_PRINT, result = g_object_new (FP_TYPE_PRINT,
"driver", driver, "driver", driver,
@@ -822,7 +822,7 @@ fp_print_deserialize (const guchar *data,
fpi_print_set_type (result, FPI_PRINT_NBIS); fpi_print_set_type (result, FPI_PRINT_NBIS);
for (i = 0; i < g_variant_n_children (prints); i++) for (i = 0; i < g_variant_n_children (prints); i++)
{ {
g_autofree struct xyt_struct *xyt = NULL; g_autofree struct xyt_struct *xyt = g_new0 (struct xyt_struct, 1);
const gint32 *xcol, *ycol, *thetacol; const gint32 *xcol, *ycol, *thetacol;
gsize xlen, ylen, thetalen; gsize xlen, ylen, thetalen;
g_autoptr(GVariant) xyt_data = NULL; g_autoptr(GVariant) xyt_data = NULL;
@@ -848,7 +848,6 @@ fp_print_deserialize (const guchar *data,
if (xlen > G_N_ELEMENTS (xyt->xcol)) if (xlen > G_N_ELEMENTS (xyt->xcol))
goto invalid_format; goto invalid_format;
xyt = g_new0 (struct xyt_struct, 1);
xyt->nrows = xlen; xyt->nrows = xlen;
memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen); memcpy (xyt->xcol, xcol, sizeof (xcol[0]) * xlen);
memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen); memcpy (xyt->ycol, ycol, sizeof (xcol[0]) * xlen);

View File

@@ -28,7 +28,7 @@
* @title: Internal FpDevice * @title: Internal FpDevice
* @short_description: Internal device routines * @short_description: Internal device routines
* *
* The methods that are available for drivers to manipulate a device. See * The methods that are availabe for drivers to manipulate a device. See
* #FpDeviceClass for more information. Also note that most of these are * #FpDeviceClass for more information. Also note that most of these are
* not relevant for image based devices, see #FpImageDeviceClass in that * not relevant for image based devices, see #FpImageDeviceClass in that
* case. * case.
@@ -100,7 +100,7 @@ fpi_device_error_new (FpDeviceError error)
switch (error) switch (error)
{ {
case FP_DEVICE_ERROR_GENERAL: case FP_DEVICE_ERROR_GENERAL:
msg = "An unspecified error occurred!"; msg = "An unspecified error occured!";
break; break;
case FP_DEVICE_ERROR_NOT_SUPPORTED: case FP_DEVICE_ERROR_NOT_SUPPORTED:
@@ -138,7 +138,7 @@ fpi_device_error_new (FpDeviceError error)
default: default:
g_warning ("Unsupported error, returning general error instead!"); g_warning ("Unsupported error, returning general error instead!");
error = FP_DEVICE_ERROR_GENERAL; error = FP_DEVICE_ERROR_GENERAL;
msg = "An unspecified error occurred!"; msg = "An unspecified error occured!";
} }
return g_error_new_literal (FP_DEVICE_ERROR, error, msg); return g_error_new_literal (FP_DEVICE_ERROR, error, msg);
@@ -912,20 +912,6 @@ fpi_device_enroll_complete (FpDevice *device, FpPrint *print, GError *error)
{ {
if (FP_IS_PRINT (print)) if (FP_IS_PRINT (print))
{ {
FpiPrintType print_type;
g_object_get (print, "fpi-type", &print_type, NULL);
if (print_type == FPI_PRINT_UNDEFINED)
{
g_warning ("Driver did not set the type on the returned print!");
g_clear_object (&print);
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Driver provided incorrect print data!");
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_ERROR, error);
return;
}
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_OBJECT, print); fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_OBJECT, print);
} }
else else

View File

@@ -65,10 +65,10 @@ struct _FpIdEntry
* @probe: Called immediately for all devices. Most drivers will not need to * @probe: Called immediately for all devices. Most drivers will not need to
* implement this. Drivers should setup the device identifier from the probe * implement this. Drivers should setup the device identifier from the probe
* callback which will be used to verify the compatibility of stored * callback which will be used to verify the compatibility of stored
* #FpPrint's. It is permissible to temporarily open the USB device if this * #FpPrint's. It is permissable to temporarily open the USB device if this
* is required for the operation. If an error is returned, then the device * is required for the operation. If an error is returned, then the device
* will be destroyed again immediately and never reported to the API user. * will be destroyed again immediately and never reported to the API user.
* @open: Open the device for further operations. Any of the normal actions are * @open: Open the device for futher operations. Any of the normal actions are
* guaranteed to only happen when the device is open (this includes delete). * guaranteed to only happen when the device is open (this includes delete).
* @close: Close the device again * @close: Close the device again
* @enroll: Start an enroll operation * @enroll: Start an enroll operation

View File

@@ -24,11 +24,12 @@
#include "fp-image-device.h" #include "fp-image-device.h"
/** /**
* SECTION: fpi-image-device * SECTION: fpi-image
* @title: Internal FpImageDevice * @title: Internal FpImage
* @short_description: Internal image device functions * @short_description: Internal image handling routines
* *
* Internal image device functions. See #FpImageDevice for public routines. * Internal image handling routines. Also see the public <ulink
* url="libfprint-FpImage.html">FpImage routines</ulink>.
*/ */
/* Manually redefine what G_DEFINE_* macro does */ /* Manually redefine what G_DEFINE_* macro does */
@@ -170,16 +171,7 @@ fpi_image_device_minutiae_detected (GObject *source_object, GAsyncResult *res, g
print = fp_print_new (device); print = fp_print_new (device);
fpi_print_set_type (print, FPI_PRINT_NBIS); fpi_print_set_type (print, FPI_PRINT_NBIS);
if (!fpi_print_add_from_image (print, image, &error)) if (!fpi_print_add_from_image (print, image, &error))
{
g_clear_object (&print); g_clear_object (&print);
if (error->domain != FP_DEVICE_RETRY)
{
fpi_device_action_error (device, error);
fpi_image_device_deactivate (self);
return;
}
}
} }
if (action == FPI_DEVICE_ACTION_ENROLL) if (action == FPI_DEVICE_ACTION_ENROLL)

View File

@@ -34,7 +34,8 @@
* @title: Internal FpImage * @title: Internal FpImage
* @short_description: Internal image handling routines * @short_description: Internal image handling routines
* *
* Internal image handling routines. See #FpImage for public routines. * Internal image handling routines. Also see the public <ulink
* url="libfprint-FpImage.html">FpImage routines</ulink>.
*/ */
/** /**

View File

@@ -37,7 +37,6 @@ typedef enum {
FPI_IMAGE_V_FLIPPED = 1 << 0, FPI_IMAGE_V_FLIPPED = 1 << 0,
FPI_IMAGE_H_FLIPPED = 1 << 1, FPI_IMAGE_H_FLIPPED = 1 << 1,
FPI_IMAGE_COLORS_INVERTED = 1 << 2, FPI_IMAGE_COLORS_INVERTED = 1 << 2,
FPI_IMAGE_PARTIAL = 1 << 3,
} FpiImageFlags; } FpiImageFlags;
/** /**

View File

@@ -23,7 +23,6 @@
#include "fp-print-private.h" #include "fp-print-private.h"
#include "fpi-device.h" #include "fpi-device.h"
#include "fpi-compat.h"
/** /**
* SECTION: fpi-print * SECTION: fpi-print
@@ -248,115 +247,3 @@ fpi_print_bz3_match (FpPrint *template, FpPrint *print, gint bz3_threshold, GErr
return FPI_MATCH_FAIL; return FPI_MATCH_FAIL;
} }
/**
* fpi_print_generate_user_id:
* @print: #FpPrint to generate the ID for
*
* Generates a string identifier for the represented print. This identifier
* encodes some metadata about the print. It also includes a random string
* and may be assumed to be unique.
*
* This is useful if devices are able to store a string identifier, but more
* storing more metadata may be desirable. In effect, this means the driver
* can provide somewhat more meaningful data to fp_device_list_prints().
*
* The generated ID may be truncated after 23 characters. However, more space
* is required to include the username, and it is recommended to store at
* at least 31 bytes.
*
* The generated format may change in the future. It is versioned though and
* decoding should remain functional.
*
* Returns: A unique string of 23 + strlen(username) characters
*/
gchar *
fpi_print_generate_user_id (FpPrint *print)
{
const gchar *username = NULL;
gchar *user_id = NULL;
const GDate *date;
gint y = 0, m = 0, d = 0;
gint32 rand_id = 0;
g_assert (print);
date = fp_print_get_enroll_date (print);
if (date && g_date_valid (date))
{
y = g_date_get_year (date);
m = g_date_get_month (date);
d = g_date_get_day (date);
}
username = fp_print_get_username (print);
if (!username)
username = "nobody";
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
rand_id = 0;
else
rand_id = g_random_int ();
user_id = g_strdup_printf ("FP1-%04d%02d%02d-%X-%08X-%s",
y, m, d,
fp_print_get_finger (print),
rand_id,
username);
return user_id;
}
/**
* fpi_print_fill_from_user_id:
* @print: #FpPrint to fill metadata into
* @user_id: An ID that was likely encoded using fpi_print_generate_user_id()
*
* This is the reverse operation of fpi_print_generate_user_id(), allowing
* the driver to encode some print metadata in a string.
*
* Returns: Whether a valid ID was found
*/
gboolean
fpi_print_fill_from_user_id (FpPrint *print, const char *user_id)
{
g_return_val_if_fail (user_id, FALSE);
/* The format has 24 bytes at the start and some dashes in the right places */
if (g_str_has_prefix (user_id, "FP1-") && strlen (user_id) >= 24 &&
user_id[12] == '-' && user_id[14] == '-' && user_id[23] == '-')
{
g_autofree gchar *copy = g_strdup (user_id);
g_autoptr(GDate) date = NULL;
gint32 date_ymd;
gint32 finger;
gchar *username;
/* Try to parse information from the string. */
copy[12] = '\0';
date_ymd = g_ascii_strtod (copy + 4, NULL);
if (date_ymd > 0)
date = g_date_new_dmy (date_ymd % 100,
(date_ymd / 100) % 100,
date_ymd / 10000);
else
date = g_date_new ();
fp_print_set_enroll_date (print, date);
copy[14] = '\0';
finger = g_ascii_strtoll (copy + 13, NULL, 16);
fp_print_set_finger (print, finger);
/* We ignore the next chunk, it is just random data.
* Then comes the username; nobody is the default if the metadata
* is unknown */
username = copy + 24;
if (strlen (username) > 0 && g_strcmp0 (username, "nobody") != 0)
fp_print_set_username (print, username);
return TRUE;
}
return FALSE;
}

View File

@@ -20,7 +20,7 @@ typedef enum {
/** /**
* FpiMatchResult: * FpiMatchResult:
* @FPI_MATCH_ERROR: An error occurred during matching * @FPI_MATCH_ERROR: An error occured during matching
* @FPI_MATCH_FAIL: The prints did not match * @FPI_MATCH_FAIL: The prints did not match
* @FPI_MATCH_SUCCESS: The prints matched * @FPI_MATCH_SUCCESS: The prints matched
*/ */
@@ -47,9 +47,4 @@ FpiMatchResult fpi_print_bz3_match (FpPrint * template,
gint bz3_threshold, gint bz3_threshold,
GError **error); GError **error);
/* Helpers to encode metadata into user ID strings. */
gchar * fpi_print_generate_user_id (FpPrint *print);
gboolean fpi_print_fill_from_user_id (FpPrint *print,
const char *user_id);
G_END_DECLS G_END_DECLS

View File

@@ -366,7 +366,7 @@ transfer_finish_cb (GObject *source_object, GAsyncResult *res, gpointer user_dat
* *
* Note that #FpiUsbTransfer will be stolen when this function is called. * Note that #FpiUsbTransfer will be stolen when this function is called.
* So that all associated data will be free'ed automatically, after the * So that all associated data will be free'ed automatically, after the
* callback ran unless fpi_usb_transfer_ref() is explicitly called. * callback ran unless fpi_usb_transfer_ref() is explictly called.
*/ */
void void
fpi_usb_transfer_submit (FpiUsbTransfer *transfer, fpi_usb_transfer_submit (FpiUsbTransfer *transfer,

View File

@@ -61,7 +61,7 @@ typedef enum {
* @length: The requested length of the transfer in bytes. * @length: The requested length of the transfer in bytes.
* @actual_length: The actual length of the transfer * @actual_length: The actual length of the transfer
* (see also fpi_usb_transfer_set_short_error()) * (see also fpi_usb_transfer_set_short_error())
* @buffer: The transferred data. * @buffer: The transfered data.
* *
* Helper for handling USB transfers. * Helper for handling USB transfers.
*/ */

View File

@@ -2,7 +2,7 @@
* Copyright (C) 2009 Red Hat <mjg@redhat.com> * Copyright (C) 2009 Red Hat <mjg@redhat.com>
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net> * Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
* Copyright (C) 2019 Benjamin Berg <bberg@redhat.com> * Coypright (C) 2019 Benjamin Berg <bberg@redhat.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public

View File

@@ -2,7 +2,7 @@
* Copyright (C) 2009 Red Hat <mjg@redhat.com> * Copyright (C) 2009 Red Hat <mjg@redhat.com>
* Copyright (C) 2008 Bastien Nocera <hadess@hadess.net> * Copyright (C) 2008 Bastien Nocera <hadess@hadess.net>
* Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net> * Copyright (C) 2008 Timo Hoenig <thoenig@suse.de>, <thoenig@nouse.net>
* Copyright (C) 2019 Benjamin Berg <bberg@redhat.com> * Coypright (C) 2019 Benjamin Berg <bberg@redhat.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public

View File

@@ -1,57 +0,0 @@
diff --git a/libfprint/nbis/mindtct/contour.c b/libfprint/nbis/mindtct/contour.c
index 3e9416c..31f32d0 100644
--- mindtct/contour.c
+++ mindtct/contour.c
@@ -440,6 +440,8 @@ int get_centered_contour(int **ocontour_x, int **ocontour_y,
int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour;
int i, j, ret;
+ g_assert (half_contour > 0);
+
/* Compute maximum length of complete contour */
/* (2 half contours + feature point). */
max_contour = (half_contour<<1) + 1;
diff --git a/libfprint/nbis/mindtct/minutia.c b/libfprint/nbis/mindtct/minutia.c
index 0b29aa0..77cf09d 100644
--- mindtct/minutia.c
+++ mindtct/minutia.c
@@ -1625,7 +1625,7 @@ int process_horizontal_scan_minutia_V2(MINUTIAE *minutiae,
dmapval, bdata, iw, ih, lfsparms);
/* If minuitia IGNORED and not added to the minutia list ... */
- if(ret == IGNORE)
+ if(ret != 0)
/* Deallocate the minutia. */
free_minutia(minutia);
@@ -1776,7 +1776,7 @@ int process_vertical_scan_minutia_V2(MINUTIAE *minutiae,
dmapval, bdata, iw, ih, lfsparms);
/* If minuitia IGNORED and not added to the minutia list ... */
- if(ret == IGNORE)
+ if(ret != 0)
/* Deallocate the minutia. */
free_minutia(minutia);
diff --git a/libfprint/nbis/mindtct/ridges.c b/libfprint/nbis/mindtct/ridges.c
index f0d9cd3..9902585 100644
--- mindtct/ridges.c
+++ mindtct/ridges.c
@@ -147,6 +147,8 @@ int count_minutia_ridges(const int first, MINUTIAE *minutiae,
{
int i, ret, *nbr_list, *nbr_nridges, nnbrs;
+ g_assert (lfsparms->max_nbrs > 0);
+
/* Find up to the maximum number of qualifying neighbors. */
nbr_list = NULL;
if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs,
@@ -407,6 +409,8 @@ int insert_neighbor(const int pos, const int nbr_index, const double nbr_dist2,
{
int i;
+ g_assert (pos >= 0);
+
/* If the desired insertion position is beyond one passed the last */
/* neighbor in the lists OR greater than equal to the maximum ... */
/* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */

View File

@@ -260,8 +260,6 @@ typedef struct g_lfsparms{
int pores_steps_bwd; int pores_steps_bwd;
double pores_min_dist2; double pores_min_dist2;
double pores_max_ratio; double pores_max_ratio;
int remove_perimeter_pts;
int min_pp_distance;
/* Ridge Counting Controls */ /* Ridge Counting Controls */
int max_nbrs; int max_nbrs;
@@ -611,9 +609,6 @@ typedef struct g_lfsparms{
/* contour points to be considered a pore. */ /* contour points to be considered a pore. */
#define PORES_MAX_RATIO 2.25 #define PORES_MAX_RATIO 2.25
/* Points which are closer than this distance to scan perimeter will be removed */
#define PERIMETER_PTS_DISTANCE 10
/***** RIDGE COUNTING CONSTANTS *****/ /***** RIDGE COUNTING CONSTANTS *****/
@@ -1128,9 +1123,6 @@ extern int remove_or_adjust_side_minutiae(MINUTIAE *, unsigned char *,
extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *, extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *,
unsigned char *, const int, const int, unsigned char *, const int, const int,
int *, const int, const int, const LFSPARMS *); int *, const int, const int, const LFSPARMS *);
extern int remove_perimeter_pts(MINUTIAE *minutiae,
unsigned char *bdata, const int iw, const int ih,
const LFSPARMS *lfsparms);
/* results.c */ /* results.c */
extern int write_text_results(char *, const int, const int, const int, extern int write_text_results(char *, const int, const int, const int,

View File

@@ -440,8 +440,6 @@ int get_centered_contour(int **ocontour_x, int **ocontour_y,
int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour; int *contour_x, *contour_y, *contour_ex, *contour_ey, ncontour;
int i, j, ret; int i, j, ret;
g_assert (half_contour > 0);
/* Compute maximum length of complete contour */ /* Compute maximum length of complete contour */
/* (2 half contours + feature point). */ /* (2 half contours + feature point). */
max_contour = (half_contour<<1) + 1; max_contour = (half_contour<<1) + 1;

View File

@@ -150,8 +150,6 @@ LFSPARMS g_lfsparms = {
PORES_STEPS_BWD, PORES_STEPS_BWD,
PORES_MIN_DIST2, PORES_MIN_DIST2,
PORES_MAX_RATIO, PORES_MAX_RATIO,
FALSE, /* not removing perimeter points by default */
PERIMETER_PTS_DISTANCE,
/* Ridge Counting Controls */ /* Ridge Counting Controls */
MAX_NBRS, MAX_NBRS,
@@ -236,8 +234,6 @@ LFSPARMS g_lfsparms_V2 = {
PORES_STEPS_BWD, PORES_STEPS_BWD,
PORES_MIN_DIST2, PORES_MIN_DIST2,
PORES_MAX_RATIO, PORES_MAX_RATIO,
FALSE, /* not removing perimeter points by default */
PERIMETER_PTS_DISTANCE,
/* Ridge Counting Controls */ /* Ridge Counting Controls */
MAX_NBRS, MAX_NBRS,

View File

@@ -1625,7 +1625,7 @@ int process_horizontal_scan_minutia_V2(MINUTIAE *minutiae,
dmapval, bdata, iw, ih, lfsparms); dmapval, bdata, iw, ih, lfsparms);
/* If minuitia IGNORED and not added to the minutia list ... */ /* If minuitia IGNORED and not added to the minutia list ... */
if(ret != 0) if(ret == IGNORE)
/* Deallocate the minutia. */ /* Deallocate the minutia. */
free_minutia(minutia); free_minutia(minutia);
@@ -1776,7 +1776,7 @@ int process_vertical_scan_minutia_V2(MINUTIAE *minutiae,
dmapval, bdata, iw, ih, lfsparms); dmapval, bdata, iw, ih, lfsparms);
/* If minuitia IGNORED and not added to the minutia list ... */ /* If minuitia IGNORED and not added to the minutia list ... */
if(ret != 0) if(ret == IGNORE)
/* Deallocate the minutia. */ /* Deallocate the minutia. */
free_minutia(minutia); free_minutia(minutia);

View File

@@ -195,11 +195,6 @@ int remove_false_minutia_V2(MINUTIAE *minutiae,
return(ret); return(ret);
} }
/* 11. Remove minutiae on image edge */
if((ret = remove_perimeter_pts(minutiae, bdata, iw, ih, lfsparms))) {
return (ret);
}
return(0); return(0);
} }
@@ -1334,159 +1329,6 @@ int remove_pointing_invblock_V2(MINUTIAE *minutiae,
return(0); return(0);
} }
static void mark_minutiae_in_range(MINUTIAE *minutiae, int *to_remove, int x, int y,
const LFSPARMS *lfsparms)
{
int i, dist;
for (i = 0; i < minutiae->num; i++) {
if (to_remove[i])
continue;
dist = (int)sqrt((x - minutiae->list[i]->x) * (x - minutiae->list[i]->x) +
(y - minutiae->list[i]->y) * (y - minutiae->list[i]->y));
if (dist < lfsparms->min_pp_distance) {
to_remove[i] = 1;
}
}
}
/*************************************************************************
**************************************************************************
#cat: remove_perimeter_pts - Takes a list of true and false minutiae and
#cat: attempts to detect and remove those false minutiae that
#cat: belong to image edge
Input:
minutiae - list of true and false minutiae
bdata - binary image data (0==while & 1==black)
iw - width (in pixels) of image
ih - height (in pixels) of image
lfsparms - parameters and thresholds for controlling LFS
Output:
minutiae - list of pruned minutiae
Return Code:
Zero - successful completion
Negative - system error
**************************************************************************/
int remove_perimeter_pts(MINUTIAE *minutiae,
unsigned char *bdata, const int iw, const int ih,
const LFSPARMS *lfsparms)
{
int i, j, ret, *to_remove;
int *left, *left_up, *left_down;
int *right, *right_up, *right_down;
int removed = 0;
int left_min, right_max;
if (!lfsparms->remove_perimeter_pts)
return(0);
to_remove = calloc(minutiae->num, sizeof(int));
left = calloc(ih, sizeof(int));
left_up = calloc(ih, sizeof(int));
left_down = calloc(ih, sizeof(int));
right = calloc(ih, sizeof(int));
right_up = calloc(ih, sizeof(int));
right_down = calloc(ih, sizeof(int));
/* Pass downwards */
left_min = iw - 1;
right_max = 0;
for (i = 0; i < ih; i++) {
for (j = 0; j < left_min; j++) {
if ((bdata[i * iw + j] != 0)) {
left_min = j;
break;
}
}
if (left_min == (iw - 1))
left_down[i] = -1;
else
left_down[i] = left_min;
for (j = iw - 1; j >= right_max; j--) {
if ((bdata[i * iw + j] != 0)) {
right_max = j;
break;
}
}
if (right_max == 0)
right_down[i] = -1;
else
right_down[i] = right_max;
}
/* Pass upwards */
left_min = iw - 1;
right_max = 0;
for (i = ih - 1; i >= 0; i--) {
for (j = 0; j < left_min; j++) {
if ((bdata[i * iw + j] != 0)) {
left_min = j;
break;
}
}
if (left_min == (iw - 1))
left_up[i] = -1;
else
left_up[i] = left_min;
for (j = iw - 1; j >= right_max; j--) {
if ((bdata[i * iw + j] != 0)) {
right_max = j;
break;
}
}
if (right_max == 0)
right_up[i] = -1;
else
right_up[i] = right_max;
}
/* Merge */
left_min = left_down[ih - 1];
right_max = right_down[ih - 1];
for (i = 0; i < ih; i++) {
if (left_down[i] != left_min)
left[i] = left_down[i];
else
left[i] = left_up[i];
if (right_down[i] != right_max)
right[i] = right_down[i];
else
right[i] = right_up[i];
}
free(left_up);
free(left_down);
free(right_up);
free(right_down);
/* Mark minitiae close to the edge */
for (i = 0; i < ih; i++) {
if (left[i] != -1)
mark_minutiae_in_range(minutiae, to_remove, left[i], i, lfsparms);
if (right[i] != -1)
mark_minutiae_in_range(minutiae, to_remove, right[i], i, lfsparms);
}
free(left);
free(right);
for (i = minutiae->num - 1; i >= 0; i--) {
/* If the current minutia index is flagged for removal ... */
if (to_remove[i]){
removed ++;
/* Remove the minutia from the minutiae list. */
if((ret = remove_minutia(i, minutiae))){
free(to_remove);
return(ret);
}
}
}
free(to_remove);
return (0);
}
/************************************************************************* /*************************************************************************
************************************************************************** **************************************************************************
#cat: remove_overlaps - Takes a list of true and false minutiae and #cat: remove_overlaps - Takes a list of true and false minutiae and

View File

@@ -147,8 +147,6 @@ int count_minutia_ridges(const int first, MINUTIAE *minutiae,
{ {
int i, ret, *nbr_list, *nbr_nridges, nnbrs; int i, ret, *nbr_list, *nbr_nridges, nnbrs;
g_assert (lfsparms->max_nbrs > 0);
/* Find up to the maximum number of qualifying neighbors. */ /* Find up to the maximum number of qualifying neighbors. */
nbr_list = NULL; nbr_list = NULL;
if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs, if((ret = find_neighbors(&nbr_list, &nnbrs, lfsparms->max_nbrs,
@@ -409,8 +407,6 @@ int insert_neighbor(const int pos, const int nbr_index, const double nbr_dist2,
{ {
int i; int i;
g_assert (pos >= 0);
/* If the desired insertion position is beyond one passed the last */ /* If the desired insertion position is beyond one passed the last */
/* neighbor in the lists OR greater than equal to the maximum ... */ /* neighbor in the lists OR greater than equal to the maximum ... */
/* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */ /* NOTE: pos is zero-oriented while nnbrs and max_nbrs are 1-oriented. */

View File

@@ -1,231 +0,0 @@
diff --git nbis/include/lfs.h nbis/include/lfs.h
index f4f38d7..8b12e73 100644
--- nbis/include/lfs.h
+++ nbis/include/lfs.h
@@ -260,6 +260,8 @@ typedef struct g_lfsparms{
int pores_steps_bwd;
double pores_min_dist2;
double pores_max_ratio;
+ int remove_perimeter_pts;
+ int min_pp_distance;
/* Ridge Counting Controls */
int max_nbrs;
@@ -609,6 +611,9 @@ typedef struct g_lfsparms{
/* contour points to be considered a pore. */
#define PORES_MAX_RATIO 2.25
+/* Points which are closer than this distance to scan perimeter will be removed */
+#define PERIMETER_PTS_DISTANCE 10
+
/***** RIDGE COUNTING CONSTANTS *****/
@@ -1123,6 +1128,9 @@ extern int remove_or_adjust_side_minutiae(MINUTIAE *, unsigned char *,
extern int remove_or_adjust_side_minutiae_V2(MINUTIAE *,
unsigned char *, const int, const int,
int *, const int, const int, const LFSPARMS *);
+extern int remove_perimeter_pts(MINUTIAE *minutiae,
+ unsigned char *bdata, const int iw, const int ih,
+ const LFSPARMS *lfsparms);
/* results.c */
extern int write_text_results(char *, const int, const int, const int,
diff --git nbis/mindtct/globals.c nbis/mindtct/globals.c
index da10c15..79bc583 100644
--- nbis/mindtct/globals.c
+++ nbis/mindtct/globals.c
@@ -150,6 +150,8 @@ LFSPARMS g_lfsparms = {
PORES_STEPS_BWD,
PORES_MIN_DIST2,
PORES_MAX_RATIO,
+ FALSE, /* not removing perimeter points by default */
+ PERIMETER_PTS_DISTANCE,
/* Ridge Counting Controls */
MAX_NBRS,
@@ -234,6 +236,8 @@ LFSPARMS g_lfsparms_V2 = {
PORES_STEPS_BWD,
PORES_MIN_DIST2,
PORES_MAX_RATIO,
+ FALSE, /* not removing perimeter points by default */
+ PERIMETER_PTS_DISTANCE,
/* Ridge Counting Controls */
MAX_NBRS,
diff --git nbis/mindtct/remove.c nbis/mindtct/remove.c
index af5ab7d..7311f1c 100644
--- nbis/mindtct/remove.c
+++ nbis/mindtct/remove.c
@@ -195,6 +195,11 @@ int remove_false_minutia_V2(MINUTIAE *minutiae,
return(ret);
}
+ /* 11. Remove minutiae on image edge */
+ if((ret = remove_perimeter_pts(minutiae, bdata, iw, ih, lfsparms))) {
+ return (ret);
+ }
+
return(0);
}
@@ -1329,6 +1334,159 @@ int remove_pointing_invblock_V2(MINUTIAE *minutiae,
return(0);
}
+static void mark_minutiae_in_range(MINUTIAE *minutiae, int *to_remove, int x, int y,
+ const LFSPARMS *lfsparms)
+{
+ int i, dist;
+ for (i = 0; i < minutiae->num; i++) {
+ if (to_remove[i])
+ continue;
+ dist = (int)sqrt((x - minutiae->list[i]->x) * (x - minutiae->list[i]->x) +
+ (y - minutiae->list[i]->y) * (y - minutiae->list[i]->y));
+ if (dist < lfsparms->min_pp_distance) {
+ to_remove[i] = 1;
+ }
+ }
+}
+
+/*************************************************************************
+**************************************************************************
+#cat: remove_perimeter_pts - Takes a list of true and false minutiae and
+#cat: attempts to detect and remove those false minutiae that
+#cat: belong to image edge
+
+ Input:
+ minutiae - list of true and false minutiae
+ bdata - binary image data (0==while & 1==black)
+ iw - width (in pixels) of image
+ ih - height (in pixels) of image
+ lfsparms - parameters and thresholds for controlling LFS
+ Output:
+ minutiae - list of pruned minutiae
+ Return Code:
+ Zero - successful completion
+ Negative - system error
+**************************************************************************/
+int remove_perimeter_pts(MINUTIAE *minutiae,
+ unsigned char *bdata, const int iw, const int ih,
+ const LFSPARMS *lfsparms)
+{
+ int i, j, ret, *to_remove;
+ int *left, *left_up, *left_down;
+ int *right, *right_up, *right_down;
+ int removed = 0;
+ int left_min, right_max;
+
+ if (!lfsparms->remove_perimeter_pts)
+ return(0);
+
+ to_remove = calloc(minutiae->num, sizeof(int));
+ left = calloc(ih, sizeof(int));
+ left_up = calloc(ih, sizeof(int));
+ left_down = calloc(ih, sizeof(int));
+ right = calloc(ih, sizeof(int));
+ right_up = calloc(ih, sizeof(int));
+ right_down = calloc(ih, sizeof(int));
+
+ /* Pass downwards */
+ left_min = iw - 1;
+ right_max = 0;
+ for (i = 0; i < ih; i++) {
+ for (j = 0; j < left_min; j++) {
+ if ((bdata[i * iw + j] != 0)) {
+ left_min = j;
+ break;
+ }
+ }
+ if (left_min == (iw - 1))
+ left_down[i] = -1;
+ else
+ left_down[i] = left_min;
+ for (j = iw - 1; j >= right_max; j--) {
+ if ((bdata[i * iw + j] != 0)) {
+ right_max = j;
+ break;
+ }
+ }
+ if (right_max == 0)
+ right_down[i] = -1;
+ else
+ right_down[i] = right_max;
+ }
+
+ /* Pass upwards */
+ left_min = iw - 1;
+ right_max = 0;
+ for (i = ih - 1; i >= 0; i--) {
+ for (j = 0; j < left_min; j++) {
+ if ((bdata[i * iw + j] != 0)) {
+ left_min = j;
+ break;
+ }
+ }
+ if (left_min == (iw - 1))
+ left_up[i] = -1;
+ else
+ left_up[i] = left_min;
+ for (j = iw - 1; j >= right_max; j--) {
+ if ((bdata[i * iw + j] != 0)) {
+ right_max = j;
+ break;
+ }
+ }
+ if (right_max == 0)
+ right_up[i] = -1;
+ else
+ right_up[i] = right_max;
+ }
+
+ /* Merge */
+ left_min = left_down[ih - 1];
+ right_max = right_down[ih - 1];
+ for (i = 0; i < ih; i++) {
+ if (left_down[i] != left_min)
+ left[i] = left_down[i];
+ else
+ left[i] = left_up[i];
+
+ if (right_down[i] != right_max)
+ right[i] = right_down[i];
+ else
+ right[i] = right_up[i];
+ }
+ free(left_up);
+ free(left_down);
+ free(right_up);
+ free(right_down);
+
+ /* Mark minitiae close to the edge */
+ for (i = 0; i < ih; i++) {
+ if (left[i] != -1)
+ mark_minutiae_in_range(minutiae, to_remove, left[i], i, lfsparms);
+ if (right[i] != -1)
+ mark_minutiae_in_range(minutiae, to_remove, right[i], i, lfsparms);
+ }
+
+ free(left);
+ free(right);
+
+ for (i = minutiae->num - 1; i >= 0; i--) {
+ /* If the current minutia index is flagged for removal ... */
+ if (to_remove[i]){
+ removed ++;
+ /* Remove the minutia from the minutiae list. */
+ if((ret = remove_minutia(i, minutiae))){
+ free(to_remove);
+ return(ret);
+ }
+ }
+ }
+
+ free(to_remove);
+
+ return (0);
+}
+
/*************************************************************************
**************************************************************************
#cat: remove_overlaps - Takes a list of true and false minutiae and

View File

@@ -192,9 +192,3 @@ spatch --sp-file remove-global-y.cocci bozorth3/* include/bozorth.h --in-place
# The above leaves an unused variable around, triggering a warning # The above leaves an unused variable around, triggering a warning
# remove it. # remove it.
patch -p0 < glib-mem-warning.patch patch -p0 < glib-mem-warning.patch
# Also fix some scan-build warnings, mostly by adding assertions
patch -p0 < fix-scan-build-reports.patch
# Add pass to remove perimeter points
patch -p0 < remove-perimeter-pts.patch

File diff suppressed because one or more lines are too long

View File

@@ -30,6 +30,7 @@ if get_option('introspection')
unittest_inspector = find_program('unittest_inspector.py') unittest_inspector = find_program('unittest_inspector.py')
base_args = files('virtual-image.py') base_args = files('virtual-image.py')
suite = [] suite = []
timeout = 30
r = run_command(unittest_inspector, files('virtual-image.py')) r = run_command(unittest_inspector, files('virtual-image.py'))
unit_tests = r.stdout().strip().split('\n') unit_tests = r.stdout().strip().split('\n')
@@ -38,6 +39,7 @@ if get_option('introspection')
suite += 'virtual-image' suite += 'virtual-image'
else else
unit_tests = ['virtual-image'] unit_tests = ['virtual-image']
timeout = 120
endif endif
foreach ut: unit_tests foreach ut: unit_tests
@@ -53,6 +55,7 @@ if get_option('introspection')
suite: ut_suite, suite: ut_suite,
depends: libfprint_typelib, depends: libfprint_typelib,
env: envs, env: envs,
timeout: timeout,
) )
endforeach endforeach
else else

View File

@@ -100,10 +100,7 @@ fpi_device_fake_enroll (FpDevice *device)
fpi_device_get_enroll_data (device, (FpPrint **) &fake_dev->action_data); fpi_device_get_enroll_data (device, (FpPrint **) &fake_dev->action_data);
if (!print && !fake_dev->ret_error) if (!print && !fake_dev->ret_error)
{
fpi_device_get_enroll_data (device, &print); fpi_device_get_enroll_data (device, &print);
fpi_print_set_type (print, FPI_PRINT_RAW);
}
fpi_device_enroll_complete (device, fpi_device_enroll_complete (device,
print ? g_object_ref (print) : NULL, print ? g_object_ref (print) : NULL,

View File

@@ -81,8 +81,6 @@ test_frame_assembling (void)
ctx.frame_height = 20; ctx.frame_height = 20;
ctx.image_width = width; ctx.image_width = width;
g_assert (height > ctx.frame_height);
offset = 10; offset = 10;
test_height = height - (height - ctx.frame_height) % offset; test_height = height - (height - ctx.frame_height) % offset;

View File

@@ -541,24 +541,6 @@ test_driver_enroll_error_no_print (void)
g_assert_true (error == g_steal_pointer (&fake_dev->ret_error)); g_assert_true (error == g_steal_pointer (&fake_dev->ret_error));
g_assert_null (out_print); g_assert_null (out_print);
g_assert_null (fake_dev->ret_print); g_assert_null (fake_dev->ret_print);
g_clear_error (&error);
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
"*Driver did not set the type on the returned print*");
fake_dev->ret_error = NULL;
fake_dev->ret_print = fp_print_new (device); /* Type not set. */
g_object_add_weak_pointer (G_OBJECT (fake_dev->ret_print),
(gpointer) (&fake_dev->ret_print));
out_print =
fp_device_enroll_sync (device, fp_print_new (device), NULL, NULL, NULL, &error);
g_test_assert_expected_messages ();
g_assert (fake_dev->last_called_function == dev_class->enroll);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
g_assert_null (out_print);
g_assert_null (fake_dev->ret_print);
g_clear_error (&error);
} }
typedef struct typedef struct
@@ -653,7 +635,7 @@ test_driver_enroll_progress (void)
{ {
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class (); g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpAutoCloseDevice) device = NULL; g_autoptr(FpAutoCloseDevice) device = NULL;
G_GNUC_UNUSED g_autoptr(FpPrint) enrolled_print = NULL; g_autoptr(FpPrint) enrolled_print = NULL;
ExpectedEnrollData expected_enroll_data = {0}; ExpectedEnrollData expected_enroll_data = {0};
FpiDeviceFake *fake_dev; FpiDeviceFake *fake_dev;
@@ -977,7 +959,7 @@ test_driver_verify_complete_retry (void)
g_test_assert_expected_messages (); g_test_assert_expected_messages ();
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error)); g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
g_steal_pointer (&fake_dev->user_data); g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
g_assert_true (match_data->called); g_assert_true (match_data->called);
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT); g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
@@ -999,7 +981,7 @@ test_driver_verify_complete_retry (void)
g_test_assert_expected_messages (); g_test_assert_expected_messages ();
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error)); g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
g_steal_pointer (&fake_dev->user_data); g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
g_assert_true (match_data->called); g_assert_true (match_data->called);
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT); g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
@@ -1019,7 +1001,7 @@ test_driver_verify_complete_retry (void)
g_test_assert_expected_messages (); g_test_assert_expected_messages ();
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error)); g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
g_steal_pointer (&fake_dev->user_data); g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
g_assert_error (error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL); g_assert_error (error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
g_assert_true (match_data->called); g_assert_true (match_data->called);
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL); g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_GENERAL);
@@ -1314,7 +1296,7 @@ test_driver_identify_complete_retry (void)
g_test_assert_expected_messages (); g_test_assert_expected_messages ();
g_assert_true (error != g_steal_pointer (&fake_dev->ret_error)); g_assert_true (error != g_steal_pointer (&fake_dev->ret_error));
g_steal_pointer (&fake_dev->user_data); g_assert_true (error != g_steal_pointer (&fake_dev->user_data));
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
g_assert_true (match_data->called); g_assert_true (match_data->called);
g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT); g_assert_error (match_data->error, FP_DEVICE_RETRY, FP_DEVICE_RETRY_TOO_SHORT);
@@ -1373,7 +1355,7 @@ test_driver_identify_report_no_callback (void)
g_autoptr(MatchCbData) match_data = g_new0 (MatchCbData, 1); g_autoptr(MatchCbData) match_data = g_new0 (MatchCbData, 1);
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
g_autoptr(FpAutoCloseDevice) device = NULL; g_autoptr(FpAutoCloseDevice) device = NULL;
G_GNUC_UNUSED g_autoptr(FpPrint) enrolled_print = NULL; g_autoptr(FpPrint) enrolled_print = NULL;
g_autoptr(FpPrint) print = NULL; g_autoptr(FpPrint) print = NULL;
g_autoptr(FpPrint) match = NULL; g_autoptr(FpPrint) match = NULL;
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
@@ -1511,7 +1493,6 @@ test_driver_list (void)
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new (); g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
unsigned int i; unsigned int i;
@@ -1534,7 +1515,6 @@ test_driver_list_error (void)
g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new (); g_autoptr(FpAutoCloseDevice) device = auto_close_fake_device_new ();
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device); FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
g_autoptr(GPtrArray) prints = NULL; g_autoptr(GPtrArray) prints = NULL;
fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_GENERAL); fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_GENERAL);
@@ -1911,7 +1891,7 @@ test_driver_action_error_all (void)
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
FpiDeviceFake *fake_dev; FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
fake_dev = FPI_DEVICE_FAKE (device); fake_dev = FPI_DEVICE_FAKE (device);
fake_dev->return_action_error = TRUE; fake_dev->return_action_error = TRUE;
@@ -1982,7 +1962,7 @@ test_driver_action_error_fallback_all (void)
g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) prints = g_ptr_array_new_with_free_func (g_object_unref);
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device); FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
FpiDeviceFake *fake_dev; FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
fake_dev = FPI_DEVICE_FAKE (device); fake_dev = FPI_DEVICE_FAKE (device);
fake_dev->return_action_error = TRUE; fake_dev->return_action_error = TRUE;

View File

@@ -200,7 +200,7 @@ test_ssm_new_full (void)
static void static void
test_ssm_new_no_handler (void) test_ssm_new_no_handler (void)
{ {
G_GNUC_UNUSED g_autoptr(FpiSsm) ssm = NULL; g_autoptr(FpiSsm) ssm = NULL;
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*BUG:*handler*"); "*BUG:*handler*");
@@ -211,7 +211,7 @@ test_ssm_new_no_handler (void)
static void static void
test_ssm_new_wrong_states (void) test_ssm_new_wrong_states (void)
{ {
G_GNUC_UNUSED g_autoptr(FpiSsm) ssm = NULL; g_autoptr(FpiSsm) ssm = NULL;
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"*BUG:*nr_states*"); "*BUG:*nr_states*");
@@ -1172,7 +1172,6 @@ test_ssm_subssm_start (void)
g_autoptr(FpiSsm) subssm = g_autoptr(FpiSsm) subssm =
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM"); ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
FpiSsmTestData *data = fpi_ssm_get_data (ssm); FpiSsmTestData *data = fpi_ssm_get_data (ssm);
g_autoptr(FpiSsmTestData) subdata = g_autoptr(FpiSsmTestData) subdata =
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm)); fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
@@ -1263,7 +1262,6 @@ test_ssm_subssm_start_with_started (void)
g_autoptr(FpiSsm) subssm = g_autoptr(FpiSsm) subssm =
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM"); ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
FpiSsmTestData *data = fpi_ssm_get_data (ssm); FpiSsmTestData *data = fpi_ssm_get_data (ssm);
g_autoptr(FpiSsmTestData) subdata = g_autoptr(FpiSsmTestData) subdata =
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm)); fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
@@ -1307,7 +1305,6 @@ test_ssm_subssm_start_with_delayed (void)
g_autoptr(FpiSsm) subssm = g_autoptr(FpiSsm) subssm =
ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM"); ssm_test_new_full (FPI_TEST_SSM_STATE_NUM, "FPI_TEST_SUB_SSM");
FpiSsmTestData *data = fpi_ssm_get_data (ssm); FpiSsmTestData *data = fpi_ssm_get_data (ssm);
g_autoptr(FpiSsmTestData) subdata = g_autoptr(FpiSsmTestData) subdata =
fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm)); fpi_ssm_test_data_ref (fpi_ssm_get_data (subssm));
gpointer timeout_tracker = GUINT_TO_POINTER (TRUE); gpointer timeout_tracker = GUINT_TO_POINTER (TRUE);

View File

@@ -3,10 +3,11 @@
import sys import sys
try: try:
import gi import gi
gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib, Gio
import os import os
import sys
from gi.repository import GLib, Gio
import unittest import unittest
import socket import socket
import struct import struct
@@ -19,8 +20,6 @@ except Exception as e:
print("Missing dependencies: %s" % str(e)) print("Missing dependencies: %s" % str(e))
sys.exit(77) sys.exit(77)
FPrint = None
# Re-run the test with the passed wrapper if set # Re-run the test with the passed wrapper if set
wrapper = os.getenv('LIBFPRINT_TEST_WRAPPER') wrapper = os.getenv('LIBFPRINT_TEST_WRAPPER')
if wrapper: if wrapper:
@@ -102,14 +101,12 @@ class VirtualImage(unittest.TestCase):
del self.con del self.con
self.dev.close_sync() self.dev.close_sync()
def send_retry(self, retry_error=None, iterate=True): def send_retry(self, retry_error=FPrint.DeviceRetry.TOO_SHORT, iterate=True):
retry_error = retry_error if retry_error else FPrint.DeviceRetry.TOO_SHORT
self.con.sendall(struct.pack('ii', -1, retry_error)) self.con.sendall(struct.pack('ii', -1, retry_error))
while iterate and ctx.pending(): while iterate and ctx.pending():
ctx.iteration(False) ctx.iteration(False)
def send_error(self, device_error=None, iterate=True): def send_error(self, device_error=FPrint.DeviceError.GENERAL, iterate=True):
device_error = device_error if device_error else FPrint.DeviceError.GENERAL
self.con.sendall(struct.pack('ii', -2, device_error)) self.con.sendall(struct.pack('ii', -2, device_error))
while iterate and ctx.pending(): while iterate and ctx.pending():
ctx.iteration(False) ctx.iteration(False)
@@ -349,12 +346,5 @@ class VirtualImage(unittest.TestCase):
assert(not self._verify_match) assert(not self._verify_match)
if __name__ == '__main__': if __name__ == '__main__':
try:
gi.require_version('FPrint', '2.0')
from gi.repository import FPrint
except Exception as e:
print("Missing dependencies: %s" % str(e))
sys.exit(77)
# avoid writing to stderr # avoid writing to stderr
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2)) unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))