[Spice-devel] Access local network printer from guest OS
Alon Levy
alevy at redhat.com
Sun Jan 1 03:45:14 PST 2012
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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list