[Spice-devel] [spice-gtk 3/9] usb-redir: Prepare for creation of emulated CD drive
Yuri Benditovich
yuri.benditovich at daynix.com
Thu Jul 25 14:48:19 UTC 2019
On Thu, Jul 25, 2019 at 1:32 PM Victor Toso <victortoso at redhat.com> wrote:
>
> Hi,
>
> On Thu, Jul 25, 2019 at 05:09:17AM -0400, Frediano Ziglio wrote:
> > >
> > > Added command-line option for shared CD devices and respective
> > > property in usb-device-manager.
> > >
> > > Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
> > > ---
> > > src/spice-option.c | 15 +++++++++++++++
> > > src/usb-device-manager.c | 33 +++++++++++++++++++++++++++++++++
> > > 2 files changed, 48 insertions(+)
> > >
> > > diff --git a/src/spice-option.c b/src/spice-option.c
> > > index c2b059e..4fbca9f 100644
> > > --- a/src/spice-option.c
> > > +++ b/src/spice-option.c
> > > @@ -32,6 +32,7 @@ static char *smartcard_db = NULL;
> > > static char *smartcard_certificates = NULL;
> > > static char *usbredir_auto_redirect_filter = NULL;
> > > static char *usbredir_redirect_on_connect = NULL;
> > > +static gchar **cd_share_files = NULL;
> > > static gboolean smartcard = FALSE;
> > > static gboolean disable_audio = FALSE;
> > > static gboolean disable_usbredir = FALSE;
> > > @@ -183,6 +184,8 @@ GOptionGroup* spice_get_option_group(void)
> > > N_("Filter selecting USB devices to be auto-redirected when
> > > plugged in"), N_("<filter-string>") },
> > > { "spice-usbredir-redirect-on-connect", '\0', 0,
> > > G_OPTION_ARG_STRING, &usbredir_redirect_on_connect,
> > > N_("Filter selecting USB devices to redirect on connect"),
> > > N_("<filter-string>") },
> > > + { "spice-share-cd", '\0', 0, G_OPTION_ARG_STRING_ARRAY,
> > > &cd_share_files,
> > > + N_("Name of ISO file or CD/DVD device to share"), N_("<filename>
> > > (repeat allowed)") },
> > > { "spice-cache-size", '\0', 0, G_OPTION_ARG_INT, &cache_size,
> > > N_("Image cache size (deprecated)"), N_("<bytes>") },
> > > { "spice-glz-window-size", '\0', 0, G_OPTION_ARG_INT,
> > > &glz_window_size,
> > > @@ -272,6 +275,18 @@ void spice_set_session_option(SpiceSession *session)
> > > g_object_set(m, "redirect-on-connect",
> > > usbredir_redirect_on_connect, NULL);
> > > }
> > > + if (cd_share_files) {
> > > + SpiceUsbDeviceManager *m = spice_usb_device_manager_get(session,
> > > NULL);
> > > + if (m) {
> > > + gchar **name = cd_share_files;
> > > + while (name && *name) {
> > > + g_object_set(m, "share-cd", *name, NULL);
> > > + name++;
> > > + }
> > > + }
> > > + g_strfreev(cd_share_files);
> > > + cd_share_files = NULL;
> > > + }
> > > if (disable_usbredir)
> > > g_object_set(session, "enable-usbredir", FALSE, NULL);
> > > if (disable_audio)
> > > diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
> > > index 0961d16..b11bb15 100644
> > > --- a/src/usb-device-manager.c
> > > +++ b/src/usb-device-manager.c
> > > @@ -75,6 +75,7 @@ enum {
> > > PROP_AUTO_CONNECT_FILTER,
> > > PROP_REDIRECT_ON_CONNECT,
> > > PROP_FREE_CHANNELS,
> > > + PROP_SHARE_CD
> > > };
> > >
> > > enum
> > > @@ -433,6 +434,26 @@ static void
> > > spice_usb_device_manager_set_property(GObject *gobject,
> > > priv->redirect_on_connect = g_strdup(filter);
> > > break;
> > > }
> > > + case PROP_SHARE_CD:
> > > + {
> > > +#ifdef USE_USBREDIR
> > > + UsbCreateDeviceParameters param = { 0 };
> > > + const gchar *name = g_value_get_string(value);
> > > + /* the string is temporary, no need to keep it */
> > > + SPICE_DEBUG("share_cd set to %s", name);
> > > + if (name[0] == '!') {
> > > + name++;
> > > + param.device_param.create_cd.delete_on_eject = 1;
> > > + }
> >
> > This "!" should be documented if the interface should be public.
> >
> > > + param.device_param.create_cd.filename = name;
> > > + if (!spice_usb_backend_create_device(priv->context, USB_DEV_TYPE_CD,
> > > ¶m)) {
> > > + g_warning(param.error->message);
> > > + spice_usb_device_manager_device_error(self, NULL, param.error);
> > > + g_error_free(param.error);
> > > + }
> > > +#endif
> > > + break;
> > > + }
> >
> > This is not a property. This is the property interface used to add a device.
>
> Yes, not quite sure why this is done this way. Perhaps there is a
> reason in future patches but I'd say it is better to have some
> public api to add/remove cd-rom instead of a reusable string
> property that itself it doesn't hold any value in the object
Public interface is not something we can easily change in future, so I would not
run to define it before there is decision about UI.
>
> >
> > > default:
> > > G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
> > > break;
> > > @@ -523,6 +544,18 @@ static void
> > > spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
> > > g_object_class_install_property(gobject_class, PROP_REDIRECT_ON_CONNECT,
> > > pspec);
> > >
> > > + /**
> > > + * SpiceUsbDeviceManager:share-cd:
> > > + *
> > > + * Set a string specifying a filename (ISO) or physical CD/DVD device
> > > + * to share via USB after a Spice connection has been established.
> > > + *
> > > + */
> > > + pspec = g_param_spec_string("share-cd", "Share ISO file or device as
> > > CD",
> > > + "File or device name to share", NULL,
> > > + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
> > > + g_object_class_install_property(gobject_class, PROP_SHARE_CD, pspec);
> > > +
> > > /**
> > > * SpiceUsbDeviceManager:free-channels:
> > > *
> >
> > Frediano
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list