On Mon, Jan 02, 2012 at 07:08:23PM +0800, Charles.Tsai-蔡清海-工程部 wrote: > Alon, > > I have another question regarding the USB redirect for Windows client. In > current spice release, the USB redirect only support for Linux client.
Right, but this is a temporary situation, it will be supported in windows clients. > If we send the printing data through the "spicevmc channel" to the Windows > client(not Linux), what is the corresponding channel(file and function) in > client to receive the printing data? That would be the SPICE_CHANNEL_PRINTER you would define. Look at the usbredir channel as an example, or the smartcard channel. (but usbredir is better). > Is there a files in LINUX client for us to do the design reference? look at the usbredir implementation in the spice-gtk client. channel-usbredir.c. > > > > -----Original Message----- > From: Alon Levy [mailto:al...@redhat.com] > Sent: Monday, January 02, 2012 6:19 PM > To: Charles.Tsai-蔡清海-工程部 > Cc: spice-devel@lists.freedesktop.org > Subject: Re: [Spice-devel] Access local network printer from guest OS > > On Mon, Jan 02, 2012 at 10:06:34AM +0800, Charles.Tsai-蔡清海-工程部 wrote: > > Alon, > > > > Let me recap what you suggest in case that I missed your point. > > sure. > > > > > 1. Capturing the printing data from the virtual printer driver. > > 2. send the captured data to the " cifs/ipp server" for printing data. > > 3. send the printing data to VDI port driver(virtioserial driver). > > 4. Spicevmc(in spice server)receives the printing data from VDI port > > driver. > > > > > > In the above scenario, there is nothing to be changed in spice server. Here > > is my questions regarding this design. > > > > 1. Why cannot virtual printer driver send the captured data to the VDI port > > driver directly? The spice agent talks to the VDI port driver directly, > > doesn't it? > > > > The virtual printer driver I want to implement is the printer port > > monitor driver. It captures the printing data between user-mode print > > spooler and the kernel-mode port drivers that access I/O port hardware. > > I didn't understand your suggestion to be so specific to windows guests. > If you intend to write a windows guest printer port monitor driver (I assume > it's a windows guest thing, right?) then of course you don't need an > additional guest side anything, and you are correct to point this out. > > > > > 2. Which files or functions in virtioserial driver talks to "spicevmc > > channel"? > > > > This question is related to question 1. If I know the way how the > > virtioserial and the spicevmc talk, I can modify my design too. > > > > You create a virtioserial port, you create a chardev, and you tell qemu to > connect the port to the chardev, all from the command line: > -device virtio-serial,multifunction=on -chardev > spicevmc,name=vdagent,id=vdagent -device > virtserialport,chardev=vdagent,name=com.redhat.spice.0 > > The first device is the virtio-serial bus (pci device), the chardev is that > spicevmc chardev, id is whatever you like, name is taken from a list of > possible names, see below. The third is the port device (needs to be created > after the chardev, the parameters are processed by order given in the command > line from left to right), the name is the guest visible device created, I > don't rememer exactly the device name in windows but something like > \\.\vportfoo-com.redhat.spice.0 > > > Adding a fourth SUBTYPE (there are currently three - VDAGENT, SMARTCARD, > USBREDIR) is something like this (and yes, it looks like it might be nice to > make it a switch): > > diff --git a/server/reds.c b/server/reds.c index acd8495..102c254 100644 > --- a/server/reds.c > +++ b/server/reds.c > @@ -3261,6 +3261,7 @@ SPICE_GNUC_VISIBLE void > spice_server_char_device_wakeup(SpiceCharDeviceInstance* > #define SUBTYPE_VDAGENT "vdagent" > #define SUBTYPE_SMARTCARD "smartcard" > #define SUBTYPE_USBREDIR "usbredir" > +#define SUBTYPE_PRINTER "printer" > > const char *spice_server_char_device_recognized_subtypes_list[] = { > SUBTYPE_VDAGENT, > @@ -3268,6 +3269,7 @@ const char > *spice_server_char_device_recognized_subtypes_list[] = { > SUBTYPE_SMARTCARD, > #endif > SUBTYPE_USBREDIR, > + SUBTYPE_PRINTER, > NULL, > }; > > @@ -3300,6 +3302,8 @@ static int > spice_server_char_device_add_interface(SpiceServer *s, #endif > else if (strcmp(char_device->subtype, SUBTYPE_USBREDIR) == 0) { > spicevmc_device_connect(char_device, SPICE_CHANNEL_USBREDIR); > + } else if (strcmp(char_device->subtype, SUBTYPE_PRINTER) == 0) { > + spicevmc_device_connect(char_device, SPICE_CHANNEL_PRINTER); > } > return 0; > } > > > Defining SPICE_CHANNEL_PRINTER is done via the codegen stuff, you just update > spice.proto and run something to produce an updated enums.h. > > > > > > > -----Original Message----- > > From: Alon Levy [mailto:al...@redhat.com] > > Sent: Sunday, January 01, 2012 10:19 PM > > To: Charles.Tsai-蔡清海-工程部 > > Cc: spice-devel@lists.freedesktop.org > > Subject: Re: [Spice-devel] Access local network printer from guest OS > > > > On Sun, Jan 01, 2012 at 09:08:52PM +0800, Charles.Tsai-蔡清海-工程部 wrote: > > > Hi Alon, > > > > > > Your information is extremely valuable for us. I think adding one > > > additional channel is a good solution. > > > Because I haven't programmed QEMU before, I have a question regarding > > > creating a virtual printer device. > > > In spice agent, the way that the SPICE agent talks to the SPICE server is > > > through a virtual serial port device. > > > For the virtual printer device, do I need to create a similar > > > virtual I/O for the printer? To send the printing data to the SPICE > > > server from guest OS, the virtual printer device driver will write the > > > printing data to the virtual I/O like a real hardware device. In QEMU, > > > can I find any information about this? > > > Thanks. > > > > > > > I am not sure how good the idea of creating a virtual printer is. I see two > > options, each not optimal: > > 1. expose the real printer. > > + all features of real printer are avaliable > > - guest has to have real printer drivers (so each new client or new > > printer on client side requires guest driver installation). This is > > not neccessarily hard/bad. > > 2. expose a fixed printer (this is what you are proposing) > > - subset / fixed set of features. > > + no new driver to install, only one time driver install. > > > > We have previously intended the tunnel channel to provide the printer > > remoting. But you don't have to expose a whole network tunnel, you could > > implement a cifs/ipp server with printing services. That could be > > implemented as a guest daemon talking over a virtioserial port and a > > spicevmc channel to the client, which means you won't have to change qemu > > at all, but you would have to add a guest feature (so needs to be > > implemented and installed for every guest os you want to support). I > > suppose such a service could also be implemented at the qemu level, and > > still use a spicevmc channel so no spice server changes either way. I'm not > > sure what kind of virtual printer you have in mind. > > > > I haven't actually answer you so far: > > - no, you don't need to create a new virtual I/O channel, virtioserial > > is just the virtual I/O you need. > > > > HTH > > Alon > > > > > > > > > > > -----Original Message----- > > > From: Alon Levy [mailto:al...@redhat.com] > > > Sent: Sunday, January 01, 2012 7:45 PM > > > To: Charles.Tsai-蔡清海-工程部 > > > Cc: spice-devel@lists.freedesktop.org > > > Subject: Re: [Spice-devel] Access local network printer from guest > > > OS > > > > > > On Sun, Jan 01, 2012 at 10:41:14AM +0800, Charles.Tsai-蔡清海-工程部 wrote: > > > > All, > > > > > > > > > > > > > > > > We planned to implement the software to access the local network > > > > printer > > > > from the guest OS over the SPICE. I did see someone post a message > > > > before > > > > talking about the implementation of the network redirect before. But > > > > the > > > > solution seems to be too complicated for us. Here is my design ideas > > > > to > > > > implement the access of the local network printer from the guest OS. > > > > > > > > > > > > > > > > > > > > > > > > 1. Implemented a virtual printer driver in the guest OS. > > > > > > > > 2. Intercept the printing data from the virtual printer driver > > > > and > > > > forward it to the spice agent. > > > > > > > > 3. Deliver the printing data from the spice agent through the > > > > .$B!H.(Bmain channel.$B!I.(B > > > > > > > > 4. Spice client receives the printing data and set it to the > > > > local > > > > network printer. > > > > > > > > > > > > > > > > Based on my design ideas, I have a couple of questions. > > > > > > > > > > > > > > > > 1. Currently, main channel is used by spice agent for > > > > enchaining the > > > > user experience. Can I expand it to delivered printing data? Any > > > > pros and > > > > cons? > > > > > > > > 2. How easily it is to expand one additional channel for > > > > priming > > > > data if .$B!H.(Bmain channel.$B!I.(B is not a good approach to send > > > > printing data? > > > > > > > > > > I would suggest going with adding an additional channel rather then > > > adding messages to main channel. imo the existance of agent data in the > > > main channel is not a good thing and shouldn't be taken as an example of > > > how to do things. > > > > > > To add a new channel you basically need to: > > > 1. add the channel to spice.proto (in spice repository) There are two > > > options here - you can use an opaque channel, and by opaque I mean that > > > the messages it contains are Data messages, no additional information is > > > in them and you have to do parsing "yourself", without the code > > > generation done from spice.proto. If you want to use the code generator > > > then you can take any other channel message as an example. You will then > > > need to update the spice-protocol headers as well, common/messages.h 2. > > > implement server side - the steps are: > > > create the new channel. Follow the inputs channel as a good example. > > > (server/inputs_channel.c:inputs_init) > > > advertise the new channel. This is taken care of by calling > > > reds_register_channel. > > > you will need to do work based on some call backs from either > > > direction: > > > qemu initiated (guest did something to the virtual printer device) > > > client initiated (callback set during channel creation, in inputs > > > it is inputs_channel_handle_parsed) 3. client side implementation: > > > you should be working on the spice-gtk client, it is in it's own > > > repository. You will have to make sure the changes (if any) you do to > > > the common subdirectory are copied over since it has it's own copy. > > > Haven't worked on spice-gtk but it looks like again starting from some > > > existing channel like gtk/channel-inputs could be a good idea. > > > > > > HTH, > > > Alon > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > > Spice-devel mailing list > > > > Spice-devel@lists.freedesktop.org > > > > http://lists.freedesktop.org/mailman/listinfo/spice-devel > > > _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel