less coupling --- server/reds-stream.c | 31 +++++++++++-------------------- server/websocket.c | 25 +++++++++++++++++++++++++ server/websocket.h | 8 +++++--- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/server/reds-stream.c b/server/reds-stream.c index bf0cbbe..125aa68 100644 --- a/server/reds-stream.c +++ b/server/reds-stream.c @@ -1191,28 +1191,19 @@ bool reds_stream_is_websocket(RedsStream *stream, unsigned char *buf, int len) so it seems wisest to live with this theoretical flaw. */ - if (websocket_is_start(rbuf)) { - char outbuf[1024]; - - websocket_create_reply(rbuf, outbuf); - rc = stream->priv->write(stream, outbuf, strlen(outbuf)); - if (rc == strlen(outbuf)) { - stream->priv->ws = spice_malloc0(sizeof(*stream->priv->ws)); - - stream->priv->ws->raw_stream = stream; - stream->priv->ws->raw_read = stream->priv->read; - stream->priv->ws->raw_write = stream->priv->write; - - stream->priv->read = stream_websocket_read; - stream->priv->write = stream_websocket_write; - - if (stream->priv->writev) { - stream->priv->ws->raw_writev = stream->priv->writev; - stream->priv->writev = stream_websocket_writev; - } + stream->priv->ws = websocket_new(rbuf, stream, + (websocket_read_cb_t) stream->priv->read, + (websocket_write_cb_t) stream->priv->write, + (websocket_writev_cb_t) stream->priv->writev); + if (stream->priv->ws) { + stream->priv->read = stream_websocket_read; + stream->priv->write = stream_websocket_write; - return TRUE; + if (stream->priv->writev) { + stream->priv->writev = stream_websocket_writev; } + + return TRUE; } return FALSE; diff --git a/server/websocket.c b/server/websocket.c index 6f16f6f..fdf36c3 100644 --- a/server/websocket.c +++ b/server/websocket.c @@ -470,3 +470,28 @@ void websocket_create_reply(gchar *buf, gchar *outbuf) "Sec-WebSocket-Protocol: binary\r\n\r\n", key); g_free(key); } + +RedsWebSocket *websocket_new(gchar *rbuf, struct RedsStream *stream, websocket_read_cb_t read_cb, + websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb) +{ + if (!websocket_is_start(rbuf)) { + return NULL; + } + + char outbuf[1024]; + + websocket_create_reply(rbuf, outbuf); + int rc = write_cb(stream, outbuf, strlen(outbuf)); + if (rc != strlen(outbuf)) { + return NULL; + } + + RedsWebSocket *ws = spice_new0(RedsWebSocket, 1); + + ws->raw_stream = stream; + ws->raw_read = read_cb; + ws->raw_write = write_cb; + ws->raw_writev = writev_cb; + + return ws; +} diff --git a/server/websocket.h b/server/websocket.h index db02420..853820e 100644 --- a/server/websocket.h +++ b/server/websocket.h @@ -41,11 +41,13 @@ typedef struct { guint64 write_remainder; struct RedsStream *raw_stream; - ssize_t (*raw_read)(struct RedsStream *s, void *buf, size_t nbyte); - ssize_t (*raw_write)(struct RedsStream *s, const void *buf, size_t nbyte); - ssize_t (*raw_writev)(struct RedsStream *s, const struct iovec *iov, int iovcnt); + websocket_read_cb_t raw_read; + websocket_write_cb_t raw_write; + websocket_writev_cb_t raw_writev; } RedsWebSocket; +RedsWebSocket *websocket_new(gchar *buf, struct RedsStream *s, websocket_read_cb_t read_cb, + websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb); bool websocket_is_start(gchar *buf); void websocket_create_reply(gchar *buf, gchar *outbuf); int websocket_read(RedsWebSocket *ws, guchar *buf, size_t len); -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel