virtual-device: Add ability to close a device with delay or with error
This commit is contained in:
parent
88a38c38af
commit
cfde050220
2 changed files with 37 additions and 0 deletions
|
@ -78,6 +78,10 @@ maybe_continue_current_action (FpDeviceVirtualDevice *self)
|
||||||
FP_DEVICE_GET_CLASS (self)->delete (dev);
|
FP_DEVICE_GET_CLASS (self)->delete (dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FPI_DEVICE_ACTION_CLOSE:
|
||||||
|
FP_DEVICE_GET_CLASS (self)->close (dev);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -635,8 +639,20 @@ dev_cancel (FpDevice *dev)
|
||||||
static void
|
static void
|
||||||
dev_deinit (FpDevice *dev)
|
dev_deinit (FpDevice *dev)
|
||||||
{
|
{
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
FpDeviceVirtualDevice *self = FP_DEVICE_VIRTUAL_DEVICE (dev);
|
FpDeviceVirtualDevice *self = FP_DEVICE_VIRTUAL_DEVICE (dev);
|
||||||
|
|
||||||
|
process_cmds (self, FALSE, &error);
|
||||||
|
if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
||||||
|
{
|
||||||
|
fpi_device_close_complete (dev, g_steal_pointer (&error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (self->sleep_timeout_id)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
g_clear_handle_id (&self->wait_command_id, g_source_remove);
|
g_clear_handle_id (&self->wait_command_id, g_source_remove);
|
||||||
g_clear_handle_id (&self->sleep_timeout_id, g_source_remove);
|
g_clear_handle_id (&self->sleep_timeout_id, g_source_remove);
|
||||||
g_cancellable_cancel (self->cancellable);
|
g_cancellable_cancel (self->cancellable);
|
||||||
|
|
|
@ -544,6 +544,27 @@ class VirtualDevice(unittest.TestCase):
|
||||||
self.complete_verify()
|
self.complete_verify()
|
||||||
self.assertTrue(self._verify_reported)
|
self.assertTrue(self._verify_reported)
|
||||||
|
|
||||||
|
def test_close_error(self):
|
||||||
|
self._close_on_teardown = False
|
||||||
|
close_res = None
|
||||||
|
|
||||||
|
def on_closed(dev, res):
|
||||||
|
nonlocal close_res
|
||||||
|
try:
|
||||||
|
close_res = dev.close_finish(res)
|
||||||
|
except GLib.Error as e:
|
||||||
|
close_res = e
|
||||||
|
|
||||||
|
self.send_command('SLEEP', 100)
|
||||||
|
self.send_error(FPrint.DeviceError.BUSY)
|
||||||
|
self.dev.close(callback=on_closed)
|
||||||
|
self.wait_timeout(2)
|
||||||
|
self.assertIsNone(close_res)
|
||||||
|
|
||||||
|
while not close_res:
|
||||||
|
ctx.iteration(True)
|
||||||
|
|
||||||
|
self.assertEqual(close_res.code, int(FPrint.DeviceError.BUSY))
|
||||||
|
|
||||||
class VirtualDeviceStorage(VirtualDevice):
|
class VirtualDeviceStorage(VirtualDevice):
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue