[Spice-devel] [PATCH 2/2] SPICE port basic implementation

Pavel Grunt pgrunt at redhat.com
Fri Sep 30 08:51:38 UTC 2016


Hi Oliver,

I tested it (in FF) and it works nicely, I just have minor comments:
in the console:
SPICE port com.spice.fc.1 event data: Uint8Array { 0=0}
SPICE port com.spice.fc.1 message text: CHILI
SPICE port com.spice.fc.1 event data: Uint8Array { 0=1}

1) what is the Uint8Array - it has just one value (port opened ?), a
boolean could be more clear

2) there is no guarantee that data are text, i think it would be
better to have it as Uint8Array

3) not sure if it is a good idea to print to console by default,
consider someone does:
dd=if=/dev/urandom of=/dev/virtio-ports/port ...
it could block the browser


The code handling the event in the html files could be just an comment
(to server as an example for somebody implementing something on top of
the port channel)

Thanks for the contribution,
Pavel


On Thu, 2016-09-29 at 08:59 +0200, Oliver Gutierrez wrote:
> Here is an small guide to test this for the ones that want to check
> it faster:
> 
> Add a spiceport to a virtual machine adding this under devices in
> the XML
> 
> <channel type='spiceport'>
>       <source channel='org.freedesktop.FleetCommander.0'/>
>       <target type='virtio'
> name='org.freedesktop.FleetCommander.0'/>
>       <address type='virtio-serial' controller='0' bus='0'
> port='2'/>
>     </channel>
> 
> 
> Boot machine, Connect to it as usual using spice-html5 and as root:
> 
> echo "CHILI" > /dev/virtio-ports/org.freedesktop.FleetCommander.0
> 
> In the browser console yo sould see the events for opening the port,
> the message and the port closing.
> 
> If in a week or so there is no other feedback then I will contact
> you Jeremy.
> 
> Thanks and cheers!
> 
> On Wed, Sep 28, 2016 at 10:10 PM, Jeremy White <jwhite at codeweavers.c
> om> wrote:
> > Looks good to me.  I don't have the time to test this myself, so
> > I'll
> > leave this open for others to kibitz for now.
> > 
> > I don't think it will do harm, so if no one else expresses an
> > opinion
> > after a while, you can probably nudge me into pushing it.
> > 
> > Reviewed-by: Jeremy White <jwhite at codeweavers.com>
> > 
> > Cheers,
> > 
> > Jeremy
> > 
> > On 09/27/2016 10:29 AM, Oliver Gutierrez wrote:
> > > ---
> > >  enums.js        |  9 ++++++
> > >  main.js         |  3 ++
> > >  port.js         | 85
> > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > >  spice.html      | 10 +++++++
> > >  spice_auto.html | 10 +++++++
> > >  spicemsg.js     | 18 ++++++++++++
> > >  utils.js        |  7 +++++
> > >  7 files changed, 142 insertions(+)
> > >  create mode 100644 port.js
> > >
> > > diff --git a/enums.js b/enums.js
> > > index 301fea0..b6e013c 100644
> > > --- a/enums.js
> > > +++ b/enums.js
> > > @@ -166,6 +166,15 @@ var SPICE_MSG_PLAYBACK_VOLUME           =
> > 105;
> > >  var SPICE_MSG_PLAYBACK_MUTE             = 106;
> > >  var SPICE_MSG_PLAYBACK_LATENCY          = 107;
> > >
> > > +var SPICE_MSG_SPICEVMC_DATA             = 101;
> > > +var SPICE_MSG_PORT_INIT                 = 201;
> > > +var SPICE_MSG_PORT_EVENT                = 202;
> > > +var SPICE_MSG_END_PORT                  = 203;
> > > +
> > > +var SPICE_MSGC_SPICEVMC_DATA            = 101;
> > > +var SPICE_MSGC_PORT_EVENT               = 201;
> > > +var SPICE_MSGC_END_PORT                 = 202;
> > > +
> > >  var SPICE_PLAYBACK_CAP_CELT_0_5_1       = 0;
> > >  var SPICE_PLAYBACK_CAP_VOLUME           = 1;
> > >  var SPICE_PLAYBACK_CAP_LATENCY          = 2;
> > > diff --git a/main.js b/main.js
> > > index 874a038..2d8a1ff 100644
> > > --- a/main.js
> > > +++ b/main.js
> > > @@ -59,6 +59,7 @@ function SpiceMainConn()
> > >      this.file_xfer_tasks = {};
> > >      this.file_xfer_task_id = 0;
> > >      this.file_xfer_read_queue = [];
> > > +    this.ports = [];
> > >  }
> > >
> > >  SpiceMainConn.prototype = Object.create(SpiceConn.prototype);
> > > @@ -154,6 +155,8 @@
> > SpiceMainConn.prototype.process_channel_message = function(msg)
> > >                  this.cursor = new SpiceCursorConn(conn);
> > >              else if (chans.channels[i].type ==
> > SPICE_CHANNEL_PLAYBACK)
> > >                  this.cursor = new SpicePlaybackConn(conn);
> > > +            else if (chans.channels[i].type ==
> > SPICE_CHANNEL_PORT)
> > > +                this.ports.push(new SpicePortConn(conn));
> > >              else
> > >              {
> > >                  if (! ("extra_channels" in this))
> > > diff --git a/port.js b/port.js
> > > new file mode 100644
> > > index 0000000..ee22073
> > > --- /dev/null
> > > +++ b/port.js
> > > @@ -0,0 +1,85 @@
> > > +"use strict";
> > > +/*
> > > +   Copyright (C) 2016 by Oliver Gutierrez <ogutsua at gmail.com>
> > > +                         Miroslav Chodil <mchodil at redhat.com>
> > > +
> > > +   This file is part of spice-html5.
> > > +
> > > +   spice-html5 is free software: you can redistribute it and/or
> > modify
> > > +   it under the terms of the GNU Lesser General Public License
> > as published by
> > > +   the Free Software Foundation, either version 3 of the
> > License, or
> > > +   (at your option) any later version.
> > > +
> > > +   spice-html5 is distributed in the hope that it will be
> > useful,
> > > +   but WITHOUT ANY WARRANTY; without even the implied warranty
> > of
> > > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> > the
> > > +   GNU Lesser General Public License for more details.
> > > +
> > > +   You should have received a copy of the GNU Lesser General
> > Public License
> > > +   along with spice-html5.  If not, see <http://www.gnu.org/lic
> > enses/>.
> > > +*/
> > > +
> > > +/*-------------------------------------------------------------
> > ---------------
> > > +**  SpicePortConn
> > > +**      Drive the Spice Port Channel
> > > +**-------------------------------------------------------------
> > -------------*/
> > > +function SpicePortConn()
> > > +{
> > > +    DEBUG > 0 && console.log('SPICE port: created SPICE port
> > channel. Args:', arguments);
> > > +    SpiceConn.apply(this, arguments);
> > > +    this.port_name = null;
> > > +}
> > > +
> > > +SpicePortConn.prototype = Object.create(SpiceConn.prototype);
> > > +
> > > +SpicePortConn.prototype.process_channel_message = function(msg)
> > > +{
> > > +    if (msg.type == SPICE_MSG_PORT_INIT)
> > > +    {
> > > +        if (this.port_name === null)
> > > +        {
> > > +            var m = new SpiceMsgPortInit(msg.data);
> > > +            this.portName = arraybuffer_to_str(new
> > Uint8Array(m.name));
> > > +            this.portOpened = m.opened
> > > +            DEBUG > 0 && console.log('SPICE port: Port',
> > this.portName, 'initialized');
> > > +            return true;
> > > +        }
> > > +
> > > +        DEBUG > 0 && console.log('SPICE port: Port',
> > this.port_name, 'is already initialized.');
> > > +    }
> > > +    else if (msg.type == SPICE_MSG_PORT_EVENT)
> > > +    {
> > > +        DEBUG > 0 && console.log('SPICE port: Port event
> > received for', this.portName, msg);
> > > +        var event = new CustomEvent('spice-port-event', {
> > > +            detail: {
> > > +                channel: this,
> > > +                spiceEvent: new Uint8Array(msg.data)
> > > +            },
> > > +            bubbles: true,
> > > +            cancelable: true
> > > +        });
> > > +
> > > +        window.dispatchEvent(event);
> > > +        return true;
> > > +    }
> > > +    else if (msg.type == SPICE_MSG_SPICEVMC_DATA)
> > > +    {
> > > +        DEBUG > 0 && console.log('SPICE port: Data received in
> > port', this.portName, msg);
> > > +        var event = new CustomEvent('spice-port-data', {
> > > +            detail: {
> > > +                channel: this,
> > > +                data: msg.data
> > > +            },
> > > +            bubbles: true,
> > > +            cancelable: true
> > > +        });
> > > +        window.dispatchEvent(event);
> > > +        return true;
> > > +    }
> > > +    else
> > > +    {
> > > +        DEBUG > 0 && console.log('SPICE port: SPICE message
> > type not recognized:', msg)
> > > +    }
> > > +
> > > +    return false;
> > > +};
> > > diff --git a/spice.html b/spice.html
> > > index c473678..f736c59 100644
> > > --- a/spice.html
> > > +++ b/spice.html
> > > @@ -42,6 +42,7 @@
> > >          <script src="wire.js"></script>
> > >          <script src="spiceconn.js"></script>
> > >          <script src="display.js"></script>
> > > +        <script src="port.js"></script>
> > >          <script src="main.js"></script>
> > >          <script src="inputs.js"></script>
> > >          <script src="webm.js"></script>
> > > @@ -142,6 +143,15 @@
> > >                  }
> > >              }
> > >
> > > +            window.addEventListener('spice-port-data',
> > function(event) {
> > > +                var msg_text = arraybuffer_to_str(new
> > Uint8Array(event.detail.data));
> > > +                console.log('SPICE port',
> > event.detail.channel.portName, 'message text:', msg_text);
> > > +            });
> > > +
> > > +            window.addEventListener('spice-port-event',
> > function(event) {
> > > +                console.log('SPICE port',
> > event.detail.channel.portName, 'event data:',
> > event.detail.spiceEvent);
> > > +            });
> > > +
> > >          </script>
> > >
> > >      </head>
> > > diff --git a/spice_auto.html b/spice_auto.html
> > > index 1179ebe..304655c 100644
> > > --- a/spice_auto.html
> > > +++ b/spice_auto.html
> > > @@ -42,6 +42,7 @@
> > >          <script src="wire.js"></script>
> > >          <script src="spiceconn.js"></script>
> > >          <script src="display.js"></script>
> > > +        <script src="port.js"></script>
> > >          <script src="main.js"></script>
> > >          <script src="inputs.js"></script>
> > >          <script src="webm.js"></script>
> > > @@ -182,6 +183,15 @@
> > >                  }
> > >              }
> > >
> > > +            window.addEventListener('spice-port-data',
> > function(event) {
> > > +                var msg_text = arraybuffer_to_str(new
> > Uint8Array(event.detail.data));
> > > +                console.log('SPICE port',
> > event.detail.channel.portName, 'message text:', msg_text);
> > > +            });
> > > +
> > > +            window.addEventListener('spice-port-event',
> > function(event) {
> > > +                console.log('SPICE port',
> > event.detail.channel.portName, 'event data:',
> > event.detail.spiceEvent);
> > > +            });
> > > +
> > >              connect();
> > >          </script>
> > >
> > > diff --git a/spicemsg.js b/spicemsg.js
> > > index 0321cc7..3619996 100644
> > > --- a/spicemsg.js
> > > +++ b/spicemsg.js
> > > @@ -1278,3 +1278,21 @@ SpiceMsgDisplayInvalList.prototype =
> > >          }
> > >      },
> > >  }
> > > +
> > > +function SpiceMsgPortInit(a, at)
> > > +{
> > > +    this.from_buffer(a,at);
> > > +};
> > > +
> > > +SpiceMsgPortInit.prototype =
> > > +{
> > > +    from_buffer: function (a, at)
> > > +    {
> > > +        at = at || 0;
> > > +        var dv = new SpiceDataView(a);
> > > +        var namesize = dv.getUint32(at, true); at += 4;
> > > +        var offset = dv.getUint32(at, true); at += 4;
> > > +        this.opened = dv.getUint8(at, true); at += 1;
> > > +        this.name = a.slice(offset, offset + namesize - 1);
> > > +    }
> > > +}
> > > diff --git a/utils.js b/utils.js
> > > index 9093a24..a22d0ae 100644
> > > --- a/utils.js
> > > +++ b/utils.js
> > > @@ -100,6 +100,13 @@ function hexdump_buffer(a)
> > >  }
> > >
> > >  /*-------------------------------------------------------------
> > ---------------
> > > +**  Convert arraybuffer to string
> > > +**-------------------------------------------------------------
> > -------------*/
> > > +function arraybuffer_to_str(buf) {
> > > +  return String.fromCharCode.apply(null, new Uint16Array(buf));
> > > +}
> > > +
> > > +/*-------------------------------------------------------------
> > ---------------
> > >  ** Converting keycodes to AT scancodes is very hard.
> > >  ** luckly there are some resources on the web and in the Xorg
> > driver that help
> > >  ** us figure out what browser dependent keycodes match to what
> > scancodes.
> > >
> > 
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
> > 
> 
> 
> 
> 
> _______________________________________________
> 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