mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
Allow FpPrint data to be extended on enrollment.
* Allow FPI_PRINT_NBIS to be extended rather than overridden if a user supplies an existing FpPrint template with data; * Prints will only be extended if a device has the required feature. For image-based devices this feature is added by default since they typically do not have storage (this can be overridden at the child class level). Extending an existing FpPrint requires passing a template print with existing data during the enrollment process. This is done because the caller is responsible for maintaining the fingerprint database and doing the necessary deserialization operations if needed. The existing example program is updated to show how to do that.
This commit is contained in:
committed by
Benjamin Berg
parent
e198b04222
commit
999bca076c
@@ -1189,10 +1189,11 @@ fp_device_resume_finish (FpDevice *device,
|
||||
* fp_device_enroll_finish().
|
||||
*
|
||||
* The @template_print parameter is a #FpPrint with available metadata filled
|
||||
* in. The driver may make use of this metadata, when e.g. storing the print on
|
||||
* device memory. It is undefined whether this print is filled in by the driver
|
||||
* and returned, or whether the driver will return a newly created print after
|
||||
* enrollment succeeded.
|
||||
* in and, optionally, with existing fingerprint data to be updated with newly
|
||||
* enrolled fingerprints if a device driver supports it. The driver may make use
|
||||
* of the metadata, when e.g. storing the print on device memory. It is undefined
|
||||
* whether this print is filled in by the driver and returned, or whether the
|
||||
* driver will return a newly created print after enrollment succeeded.
|
||||
*/
|
||||
void
|
||||
fp_device_enroll (FpDevice *device,
|
||||
@@ -1229,19 +1230,30 @@ fp_device_enroll (FpDevice *device,
|
||||
|
||||
if (!FP_IS_PRINT (template_print))
|
||||
{
|
||||
g_warning ("User did not pass a print template!");
|
||||
g_task_return_error (task,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
|
||||
"User did not pass a print template!"));
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_get (template_print, "fpi-type", &print_type, NULL);
|
||||
if (print_type != FPI_PRINT_UNDEFINED)
|
||||
{
|
||||
g_warning ("Passed print template must be newly created and blank!");
|
||||
g_task_return_error (task,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
|
||||
return;
|
||||
if (!fp_device_has_feature (device, FP_DEVICE_FEATURE_UPDATE_PRINT))
|
||||
{
|
||||
g_task_return_error (task,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
|
||||
"A device does not support print updates!"));
|
||||
return;
|
||||
}
|
||||
if (!fp_print_compatible (template_print, device))
|
||||
{
|
||||
g_task_return_error (task,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
|
||||
"The print and device must have a matching driver and device id"
|
||||
" for a fingerprint update to succeed"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
priv->current_action = FPI_DEVICE_ACTION_ENROLL;
|
||||
|
||||
@@ -59,6 +59,7 @@ typedef enum {
|
||||
* @FP_DEVICE_FEATURE_STORAGE_CLEAR: Supports clearing the whole storage
|
||||
* @FP_DEVICE_FEATURE_DUPLICATES_CHECK: Natively supports duplicates detection
|
||||
* @FP_DEVICE_FEATURE_ALWAYS_ON: Whether the device can run continuously
|
||||
* @FP_DEVICE_FEATURE_UPDATE_PRINT: Supports updating an existing print record using new scans
|
||||
*/
|
||||
typedef enum /*< flags >*/ {
|
||||
FP_DEVICE_FEATURE_NONE = 0,
|
||||
@@ -71,6 +72,7 @@ typedef enum /*< flags >*/ {
|
||||
FP_DEVICE_FEATURE_STORAGE_CLEAR = 1 << 6,
|
||||
FP_DEVICE_FEATURE_DUPLICATES_CHECK = 1 << 7,
|
||||
FP_DEVICE_FEATURE_ALWAYS_ON = 1 << 8,
|
||||
FP_DEVICE_FEATURE_UPDATE_PRINT = 1 << 9,
|
||||
} FpDeviceFeature;
|
||||
|
||||
/**
|
||||
|
||||
@@ -101,6 +101,7 @@ fp_image_device_start_capture_action (FpDevice *device)
|
||||
FpImageDevice *self = FP_IMAGE_DEVICE (device);
|
||||
FpImageDevicePrivate *priv = fp_image_device_get_instance_private (self);
|
||||
FpiDeviceAction action;
|
||||
FpiPrintType print_type;
|
||||
|
||||
/* There is just one action that we cannot support out
|
||||
* of the box, which is a capture without first waiting
|
||||
@@ -124,7 +125,9 @@ fp_image_device_start_capture_action (FpDevice *device)
|
||||
FpPrint *enroll_print = NULL;
|
||||
|
||||
fpi_device_get_enroll_data (device, &enroll_print);
|
||||
fpi_print_set_type (enroll_print, FPI_PRINT_NBIS);
|
||||
g_object_get (enroll_print, "fpi-type", &print_type, NULL);
|
||||
if (print_type != FPI_PRINT_NBIS)
|
||||
fpi_print_set_type (enroll_print, FPI_PRINT_NBIS);
|
||||
}
|
||||
|
||||
priv->enroll_stage = 0;
|
||||
@@ -221,6 +224,7 @@ fp_image_device_class_init (FpImageDeviceClass *klass)
|
||||
fp_device_class->cancel = fp_image_device_cancel_action;
|
||||
|
||||
fpi_device_class_auto_initialize_features (fp_device_class);
|
||||
fp_device_class->features |= FP_DEVICE_FEATURE_UPDATE_PRINT;
|
||||
|
||||
/* Default implementations */
|
||||
klass->activate = fp_image_device_default_activate;
|
||||
|
||||
@@ -61,6 +61,7 @@ enum {
|
||||
/* Private property*/
|
||||
PROP_FPI_TYPE,
|
||||
PROP_FPI_DATA,
|
||||
PROP_FPI_PRINTS,
|
||||
N_PROPS
|
||||
};
|
||||
|
||||
@@ -133,6 +134,10 @@ fp_print_get_property (GObject *object,
|
||||
g_value_set_variant (value, self->data);
|
||||
break;
|
||||
|
||||
case PROP_FPI_PRINTS:
|
||||
g_value_set_pointer (value, self->prints);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
@@ -188,6 +193,11 @@ fp_print_set_property (GObject *object,
|
||||
self->data = g_value_dup_variant (value);
|
||||
break;
|
||||
|
||||
case PROP_FPI_PRINTS:
|
||||
g_clear_pointer (&self->prints, g_ptr_array_unref);
|
||||
self->prints = g_value_get_pointer (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
@@ -299,6 +309,19 @@ fp_print_class_init (FpPrintClass *klass)
|
||||
NULL,
|
||||
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
|
||||
|
||||
/**
|
||||
* FpPrint::fpi-prints: (skip)
|
||||
*
|
||||
* This property is only for internal purposes.
|
||||
*
|
||||
* Stability: private
|
||||
*/
|
||||
properties[PROP_FPI_PRINTS] =
|
||||
g_param_spec_pointer ("fpi-prints",
|
||||
"Prints",
|
||||
"Prints for internal use only",
|
||||
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
|
||||
|
||||
g_object_class_install_properties (object_class, N_PROPS, properties);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user