mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-09-10 21:06:51 +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
|
static void
|
||||||
m_loop_state (FpiSsm *ssm, FpDevice *_dev)
|
m_loop_state (FpiSsm *ssm, FpDevice *_dev)
|
||||||
{
|
{
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
|
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
|
||||||
FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev);
|
FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev);
|
||||||
|
|
||||||
@@ -101,10 +102,16 @@ m_loop_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case M_CHECK_PRINT:
|
case M_CHECK_PRINT:
|
||||||
if (!vfs301_proto_peek_event (self))
|
{
|
||||||
fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT);
|
int rv = vfs301_proto_peek_event (self, &error);
|
||||||
else
|
|
||||||
fpi_ssm_next_state (ssm);
|
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;
|
break;
|
||||||
|
|
||||||
case M_READ_PRINT_START:
|
case M_READ_PRINT_START:
|
||||||
|
|||||||
@@ -133,7 +133,8 @@ void vfs301_proto_deinit (FpDeviceVfs301 *dev);
|
|||||||
void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev);
|
void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev);
|
||||||
|
|
||||||
/** returns 0 if no event is ready, or 1 if there is one... */
|
/** 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);
|
void vfs301_proto_process_event_start (FpDeviceVfs301 *dev);
|
||||||
int vfs301_proto_process_event_poll (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
|
#endif
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error)
|
usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
@@ -87,10 +87,14 @@ usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **
|
|||||||
if (!error)
|
if (!error)
|
||||||
g_warning ("Unhandled receive error: %s", err->message);
|
g_warning ("Unhandled receive error: %s", err->message);
|
||||||
g_propagate_error (error, err);
|
g_propagate_error (error, err);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out)
|
if (out)
|
||||||
*out = g_steal_pointer (&transfer);
|
*out = g_steal_pointer (&transfer);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
FP_GNUC_ACCESS (read_only, 2, 3)
|
FP_GNUC_ACCESS (read_only, 2, 3)
|
||||||
@@ -462,26 +466,25 @@ vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
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;
|
g_autoptr(FpiUsbTransfer) transfer = NULL;
|
||||||
|
|
||||||
const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00};
|
const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
USB_SEND (0x17, -1);
|
USB_SEND (0x17, -1);
|
||||||
usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, &error);
|
if (!usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, error))
|
||||||
|
return -1;
|
||||||
/* XXX: This is obviously not a sane error handling! */
|
|
||||||
g_assert (!error);
|
|
||||||
|
|
||||||
if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0)
|
if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0)
|
else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0)
|
||||||
return 1;
|
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
|
/* XXX: We sometimes need to receive data on from two endpoints at the same
|
||||||
|
|||||||
Reference in New Issue
Block a user