mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-09-10 13:00:08 +00:00
vfs301: Fix error handling on peeking events
This commit is contained in:
committed by
Marco Trevisan
parent
98891dc042
commit
7f9504afd5
@@ -85,6 +85,7 @@ enum {
|
||||
static void
|
||||
m_loop_state (FpiSsm *ssm, FpDevice *_dev)
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
|
||||
FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev);
|
||||
|
||||
@@ -101,10 +102,16 @@ m_loop_state (FpiSsm *ssm, FpDevice *_dev)
|
||||
break;
|
||||
|
||||
case M_CHECK_PRINT:
|
||||
if (!vfs301_proto_peek_event (self))
|
||||
fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT);
|
||||
else
|
||||
fpi_ssm_next_state (ssm);
|
||||
{
|
||||
int rv = vfs301_proto_peek_event (self, &error);
|
||||
|
||||
if (rv == VFS301_FAILURE)
|
||||
fpi_ssm_mark_failed (ssm, error);
|
||||
else if (rv == VFS301_ONGOING)
|
||||
fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT);
|
||||
else
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
break;
|
||||
|
||||
case M_READ_PRINT_START:
|
||||
|
||||
@@ -133,7 +133,8 @@ void vfs301_proto_deinit (FpDeviceVfs301 *dev);
|
||||
void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev);
|
||||
|
||||
/** returns 0 if no event is ready, or 1 if there is one... */
|
||||
int vfs301_proto_peek_event (FpDeviceVfs301 *dev);
|
||||
int vfs301_proto_peek_event (FpDeviceVfs301 *dev,
|
||||
GError **error);
|
||||
void vfs301_proto_process_event_start (FpDeviceVfs301 *dev);
|
||||
int vfs301_proto_process_event_poll (FpDeviceVfs301 *dev);
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ usb_print_packet (int dir, GError *error, const guint8 *data, int length)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
static gboolean
|
||||
usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error)
|
||||
{
|
||||
GError *err = NULL;
|
||||
@@ -87,10 +87,14 @@ usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **
|
||||
if (!error)
|
||||
g_warning ("Unhandled receive error: %s", err->message);
|
||||
g_propagate_error (error, err);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (out)
|
||||
*out = g_steal_pointer (&transfer);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
FP_GNUC_ACCESS (read_only, 2, 3)
|
||||
@@ -462,26 +466,25 @@ vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev)
|
||||
}
|
||||
|
||||
int
|
||||
vfs301_proto_peek_event (FpDeviceVfs301 *dev)
|
||||
vfs301_proto_peek_event (FpDeviceVfs301 *dev,
|
||||
GError **error)
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
g_autoptr(FpiUsbTransfer) transfer = NULL;
|
||||
|
||||
const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
USB_SEND (0x17, -1);
|
||||
usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, &error);
|
||||
|
||||
/* XXX: This is obviously not a sane error handling! */
|
||||
g_assert (!error);
|
||||
if (!usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, error))
|
||||
return -1;
|
||||
|
||||
if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0)
|
||||
return 0;
|
||||
else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0)
|
||||
return 1;
|
||||
else
|
||||
g_assert_not_reached ();
|
||||
|
||||
g_set_error (error, FP_DEVICE_ERROR_PROTO, 0, "Unexpected event response");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* XXX: We sometimes need to receive data on from two endpoints at the same
|
||||
|
||||
Reference in New Issue
Block a user