Enrollment: improved error reporting

Convert enrollment function to return a signed integer, which is negative
on error or corresponds into fp_enroll_result otherwise.
Now we can treat a 'FAIL' condition differently from an actual error: fail
means that enrollment didn't complete because the data was nonsense or
whatever (e.g. scanned a different finger for each stage?).

Updated upekts accordingly.
This commit is contained in:
Daniel Drake
2007-10-14 00:45:49 +01:00
committed by Daniel Drake
parent ab5b1ca8e9
commit 39271b4fe5
5 changed files with 62 additions and 36 deletions

View File

@@ -18,10 +18,11 @@
*/
#include <config.h>
#include <errno.h>
#include <stdio.h>
#include <glib.h>
#include <usb.h>
#include <stdio.h>
#include "fp_internal.h"
@@ -227,18 +228,18 @@ API_EXPORTED const char *fp_driver_get_full_name(const struct fp_driver *drv)
return drv->full_name;
}
API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
API_EXPORTED int fp_enroll_finger(struct fp_dev *dev,
struct fp_print_data **print_data)
{
const struct fp_driver *drv = dev->drv;
enum fp_enroll_status ret;
int ret;
int stage = dev->__enroll_stage;
gboolean initial = FALSE;
if (!dev->nr_enroll_stages || !drv->enroll) {
fp_err("driver %s has 0 enroll stages or no enroll func",
dev->drv->name);
return FP_ENROLL_FAIL;
drv->name);
return -ENOTSUP;
}
if (stage == -1) {
@@ -248,13 +249,19 @@ API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
if (stage >= dev->nr_enroll_stages) {
fp_err("exceeding number of enroll stages for device claimed by "
"driver %s (%d stages)", dev->drv->name, dev->nr_enroll_stages);
return FP_ENROLL_FAIL;
"driver %s (%d stages)", drv->name, dev->nr_enroll_stages);
dev->__enroll_stage = -1;
return -EINVAL;
}
fp_dbg("%s will handle enroll stage %d/%d%s", drv->name, stage,
dev->nr_enroll_stages - 1, initial ? " (initial)" : "");
ret = drv->enroll(dev, initial, stage, print_data);
if (ret < 0) {
fp_err("enroll failed with code %d", ret);
dev->__enroll_stage = -1;
return ret;
}
switch (ret) {
case FP_ENROLL_PASS:
fp_dbg("enroll stage passed");
@@ -273,6 +280,9 @@ API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
case FP_ENROLL_RETRY_CENTER_FINGER:
fp_dbg("finger was not centered, enroll should retry");
break;
case FP_ENROLL_RETRY_REMOVE_FINGER:
fp_dbg("scan failed, remove finger and retry");
break;
case FP_ENROLL_FAIL:
fp_err("enroll failed");
dev->__enroll_stage = -1;
@@ -280,7 +290,7 @@ API_EXPORTED enum fp_enroll_status fp_enroll_finger(struct fp_dev *dev,
default:
fp_err("unrecognised return code %d", ret);
dev->__enroll_stage = -1;
return FP_ENROLL_FAIL;
return -EINVAL;
}
return ret;
}