Hi On Mon, Jun 20, 2022 at 6:09 PM Nick Couchman <vn...@apache.org> wrote:
> Hello, everyone, > I've posted here, before, with some questions during my journey of trying > to add support for the SPICE protocol to the Guacamole project. The good > news is that I've actually made measurable progress in the implementation - > I can now connect to a SPICE server, and the basics work (mouse and > keyboard - mostly anyway), so I'm moving on to the extra stuff - clipboard, > audio, file transfer, etc. > > In working on the clipboard integration, I'm currently running into an > issue with a couple of the callback functions, specifically the clipboard > grab/release functions, where the number of arguments seems to be > mismatched. According to the documentation, these callbacks should be > called with the following arguments: > > gboolean > user_function (SpiceMainChannel *main, > guint selection, > gpointer types, > guint ntypes, > gpointer user_data) > > types is actually guint32*, but that's not the problem here. > void > user_function (SpiceMainChannel *main, > guint selection, > gpointer user_data) > > I've implemented the callbacks with those arguments, as follows: > > void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel, > guint selection, gpointer types, guint ntypes, guac_client* client) > > void guac_spice_clipboard_selection_release_handler(SpiceMainChannel > channel, > guint selection, guac_client* client) > It looks correct. Can you point to your code connecting the signals with the handlers? > > and registered them appropriately. However, if I use them as implemented > above, when the callbacks are triggered, the application segfaults when I > try to access the "guac_client* client" data structure. I used GDB to try > to help track this down, and I noticed that the value of "client" was 0x1, > which looks less like a pointer to a memory location and more like the > number 1. > > So, I decided to add another argument to the callback functions, just > before the client argument: > > void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel, > guint selection, gpointer types, guint ntypes, guint extra, > guac_client* client) > > void guac_spice_clipboard_selection_release_handler(SpiceMainChannel > channel, > guint selection, guint extra, guac_client* client) > > Strangely, this works - the client data structure can be referenced, there > are no segfaults (yet), etc. So, I decided to print the values that are > being passed for all of these parameters, and I get the following: > > guacd[100252]: DEBUG: Notifying client of clipboard grab in the guest. > guacd[100252]: DEBUG: Arg: channel: 0x00000000 > guacd[100252]: DEBUG: Arg: selection: 1275303536 > guacd[100252]: DEBUG: Arg: types: 0x00000001 > guacd[100252]: DEBUG: Arg: ntypes: 1276022924 > guacd[100252]: DEBUG: Arg: extra: 1 > > Weird > I printed them in the format I thought they should be in based on what the > arguments are supposed to be - I probably should have just done all hex. > But, it seems like maybe the "extra" parameter being passed is in front of > the channel, since the channel is showing up as all zeros? > > I was trying to find the code where the callbacks are actually called - > I'm guessing, since this is clipboard integration, it'll be in the vdagent > code somewhere - but I was having trouble tracking that down. > > The callbacks are not directly called, since those a GObject signals. The main channel will call g_signal_emit(). > If anyone has any ideas, I'd appreciate the insight into this - I'm > puzzled by this apparent mismatch in the number of arguments. Also, if it > matters, I'm running CentOS 8 Stream, using Xspice to provide a test SPICE > server, and running spice-vdagentd/spice-vdagent within my X session. Yes, > I know Xspice is unmaintained, but I just needed something simple and that > I didn't have to spend a bunch of time building in order to give me a spice > server to point at, and, so far, this has been pretty reliable. Also, at > its core, it appears to use the same spice-qxl X driver that x11spice uses, > just with a simple Python wrapper script for generating an X config file > and starting the X server/display. So, I think it's still pretty "safe" for > attempting to develop this Guacamole integration - if for some reason you > believe me to be wrong about that, please let me know. > Your testing environment shouldn't be a problem, it's really your client-side code integration with spice-glib that looks broken. -- Marc-André Lureau