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