Less coupling. This is a preparation for next patch. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red-stream.c | 31 +++++++++++-------------------- server/websocket.c | 25 +++++++++++++++++++++++++ server/websocket.h | 8 +++++--- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/server/red-stream.c b/server/red-stream.c index d6a00dd9f..fd3fdced8 100644 --- a/server/red-stream.c +++ b/server/red-stream.c @@ -1215,28 +1215,19 @@ bool red_stream_is_websocket(RedStream *stream, const void *buf, size_t 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 = g_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 1b18aa614..03d931023 100644 --- a/server/websocket.c +++ b/server/websocket.c @@ -478,3 +478,28 @@ void websocket_create_reply(char *buf, char *outbuf) "Sec-WebSocket-Protocol: binary\r\n\r\n", key); g_free(key); } + +RedsWebSocket *websocket_new(char *rbuf, struct RedStream *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 = g_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 173109050..ab9eb8126 100644 --- a/server/websocket.h +++ b/server/websocket.h @@ -41,11 +41,13 @@ typedef struct { uint64_t write_remainder; struct RedStream *raw_stream; - ssize_t (*raw_read)(struct RedStream *s, void *buf, size_t nbyte); - ssize_t (*raw_write)(struct RedStream *s, const void *buf, size_t nbyte); - ssize_t (*raw_writev)(struct RedStream *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(char *buf, struct RedStream *s, websocket_read_cb_t read_cb, + websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb); bool websocket_is_start(char *buf); void websocket_create_reply(char *buf, char *outbuf); int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t len); -- 2.20.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel