[Spice-devel] [PATCH spice-gtk 32/44] fixup! usb-redir: add implementation of emulated CD device

Frediano Ziglio fziglio at redhat.com
Tue Jul 30 12:03:20 UTC 2019


Update to new usb-backend interface.
---
 src/usb-device-cd.c | 47 +++++++++++++++++++++++++--------------------
 src/usb-device-cd.h | 37 +++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 21 deletions(-)
 create mode 100644 src/usb-device-cd.h

diff --git a/src/usb-device-cd.c b/src/usb-device-cd.c
index 78e8f408..a76ea43e 100644
--- a/src/usb-device-cd.c
+++ b/src/usb-device-cd.c
@@ -43,6 +43,7 @@
 #endif
 
 #include "usb-emulation.h"
+#include "usb-device-cd.h"
 #include "cd-usb-bulk-msd.h"
 
 typedef struct SpiceCdLU
@@ -74,7 +75,7 @@ struct BufferedBulkRead
     uint64_t id;
 };
 
-struct _SpiceUsbEmulatedDevice
+struct SpiceUsbEmulatedDevice
 {
     UsbDeviceOps dev_ops;
     SpiceUsbBackend *backend;
@@ -725,11 +726,12 @@ static const UsbDeviceOps devops =
     .unrealize = usb_cd_unrealize,
 };
 
-static int usb_cd_create(SpiceUsbBackend *be,
-                         SpiceUsbBackendDevice *parent,
-                         UsbCreateDeviceParameters *param,
-                         UsbCd **dev)
+static UsbCd* usb_cd_create(SpiceUsbBackend *be,
+                            SpiceUsbBackendDevice *parent,
+                            void *opaque_param,
+                            GError **err)
 {
+    CdEmulationParams *param = opaque_param;
     int error = 0;
     uint32_t unit = 0;
     UsbCd *d = g_new0(UsbCd, 1);
@@ -738,7 +740,7 @@ static int usb_cd_create(SpiceUsbBackend *be,
     d->dev_ops = devops;
     d->backend = be;
     d->parent  = parent;
-    d->delete_on_eject = !!param->device_param.create_cd.delete_on_eject;
+    d->delete_on_eject = !!param->delete_on_eject;
     d->locked = !d->delete_on_eject;
     d->serial[0] = 0x0308;
     d->serial[1] = 'X';
@@ -753,13 +755,13 @@ static int usb_cd_create(SpiceUsbBackend *be,
     d->msc = cd_usb_bulk_msd_alloc(d, MAX_LUN_PER_DEVICE);
     if (!d->msc) {
         g_clear_pointer(&d, g_free);
-        param->error = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
-                                   _("can't allocate device"));
-        return 1;
+        g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+                    _("can't allocate device"));
+        return NULL;
     }
     d->units[unit].blockSize = CD_DEV_BLOCK_SIZE;
     if (!cd_usb_bulk_msd_realize(d->msc, unit, &dev_params)) {
-        if (open_stream(&d->units[unit], param->device_param.create_cd.filename) &&
+        if (open_stream(&d->units[unit], param->filename) &&
             load_lun(d, unit, TRUE)) {
             if (d->locked) {
                 cd_usb_bulk_msd_lock(d->msc, unit, TRUE);
@@ -767,28 +769,31 @@ static int usb_cd_create(SpiceUsbBackend *be,
         } else {
             close_stream(&d->units[unit]);
             cd_usb_bulk_msd_unrealize(d->msc, unit);
-            param->error = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
-                                       _("can't create device with %s"),
-                                       param->device_param.create_cd.filename);
-            error = 3;
+            g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+                        _("can't create device with %s"),
+                        param->filename);
+            error = 1;
         }
     } else {
-        error = 2;
-        param->error = g_error_new(SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
-                                   _("can't allocate device"));
+        g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
+                    _("can't allocate device"));
+        error = 1;
     }
     if (error) {
         g_clear_pointer(&d->msc, cd_usb_bulk_msd_free);
         g_clear_pointer(&d, g_free);
+        return NULL;
     }
 
-    *dev = d;
-    return error;
+    return d;
 }
 
-void spice_usb_device_register_cd(SpiceUsbBackend *be)
+SpiceUsbBackendDevice*
+create_emulated_cd(SpiceUsbBackend *be,
+                   CdEmulationParams *param,
+                   GError **err)
 {
-    spice_usb_backend_register_device_type(be, USB_DEV_TYPE_CD, usb_cd_create);
+    return spice_usb_backend_create_emulated_device(be, usb_cd_create, param, err);
 }
 
 #endif /* USE_USBREDIR */
diff --git a/src/usb-device-cd.h b/src/usb-device-cd.h
new file mode 100644
index 00000000..eb082b78
--- /dev/null
+++ b/src/usb-device-cd.h
@@ -0,0 +1,37 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+    Copyright (C) 2019 Red Hat, Inc.
+
+    Red Hat Authors:
+    Yuri Benditovich<ybendito at redhat.com>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SPICE_GTK_USB_DEVICE_CD_H_
+#define SPICE_GTK_USB_DEVICE_CD_H_
+
+#include "usb-backend.h"
+
+typedef struct CdEmulationParams {
+    const char *filename;
+    uint32_t delete_on_eject : 1;
+} CdEmulationParams;
+
+SpiceUsbBackendDevice*
+create_emulated_cd(SpiceUsbBackend *be,
+                   CdEmulationParams *param,
+                   GError **err);
+
+#endif // SPICE_GTK_USB_DEVICE_CD_H_
-- 
2.20.1



More information about the Spice-devel mailing list