[Spice-devel] [RFC PATCH spice-server v3 04/20] stream-channel: Write a really base channel to implement the streaming

Jonathon Jongsma jjongsma at redhat.com
Thu Aug 24 17:05:24 UTC 2017


Acked-by: Jonathon Jongsma <jjongsma at redhat.com>


On Wed, 2017-08-23 at 10:14 +0100, Frediano Ziglio wrote:
> Currently only compile, not used and not much sense
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/Makefile.am      |   2 +
>  server/stream-channel.c | 171
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  server/stream-channel.h |  53 +++++++++++++++
>  3 files changed, 226 insertions(+)
>  create mode 100644 server/stream-channel.c
>  create mode 100644 server/stream-channel.h
> 
> diff --git a/server/Makefile.am b/server/Makefile.am
> index 495a7a20..e1240425 100644
> --- a/server/Makefile.am
> +++ b/server/Makefile.am
> @@ -164,6 +164,8 @@ libserver_la_SOURCES =				
> \
>  	stat.h					\
>  	stream.c				\
>  	stream.h				\
> +	stream-channel.c			\
> +	stream-channel.h			\
>  	stream-device.c				\
>  	sw-canvas.c				\
>  	tree.c					\
> diff --git a/server/stream-channel.c b/server/stream-channel.c
> new file mode 100644
> index 00000000..804db77d
> --- /dev/null
> +++ b/server/stream-channel.c
> @@ -0,0 +1,171 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2017 Red Hat, Inc.
> +
> +   This library 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 2.1 of the License, or (at your option) any later
> version.
> +
> +   This library 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 this library; if not, see <http://www.gnu.org/
> licenses/>.
> +*/
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include "red-channel-client.h"
> +#include "stream-channel.h"
> +#include "reds.h"
> +#include "common-graphics-channel.h"
> +
> +#define TYPE_STREAM_CHANNEL_CLIENT stream_channel_client_get_type()
> +
> +#define STREAM_CHANNEL_CLIENT(obj) \
> +    (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_STREAM_CHANNEL_CLIENT,
> StreamChannelClient))
> +#define STREAM_CHANNEL_CLIENT_CLASS(klass) \
> +    (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_STREAM_CHANNEL_CLIENT,
> StreamChannelClientClass))
> +#define IS_STREAM_CHANNEL_CLIENT(obj) \
> +    (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_STREAM_CHANNEL_CLIENT))
> +#define IS_STREAM_CHANNEL_CLIENT_CLASS(klass) \
> +    (G_TYPE_CHECK_CLASS_TYPE((klass), TYPE_STREAM_CHANNEL_CLIENT))
> +#define STREAM_CHANNEL_CLIENT_GET_CLASS(obj) \
> +    (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_STREAM_CHANNEL_CLIENT,
> StreamChannelClientClass))
> +
> +typedef struct StreamChannelClient StreamChannelClient;
> +typedef struct StreamChannelClientClass StreamChannelClientClass;
> +
> +/* we need to inherit from CommonGraphicsChannelClient
> + * to get buffer handling */
> +struct StreamChannelClient {
> +    CommonGraphicsChannelClient parent;
> +};
> +
> +struct StreamChannelClientClass {
> +    CommonGraphicsChannelClientClass parent_class;
> +};
> +
> +GType stream_channel_client_get_type(void) G_GNUC_CONST;
> +
> +G_DEFINE_TYPE(StreamChannelClient, stream_channel_client,
> TYPE_COMMON_GRAPHICS_CHANNEL_CLIENT)
> +
> +struct StreamChannel {
> +    RedChannel parent;
> +};
> +
> +struct StreamChannelClass {
> +    RedChannelClass parent_class;
> +};
> +
> +G_DEFINE_TYPE(StreamChannel, stream_channel, RED_TYPE_CHANNEL)
> +
> +static void
> +stream_channel_client_class_init(StreamChannelClientClass *klass)
> +{
> +}
> +
> +static void
> +stream_channel_client_init(StreamChannelClient *client)
> +{
> +}
> +
> +static void
> +stream_channel_client_on_disconnect(RedChannelClient *rcc)
> +{
> +}
> +
> +static StreamChannelClient*
> +stream_channel_client_new(StreamChannel *channel, RedClient *client,
> RedsStream *stream,
> +                          int mig_target, RedChannelCapabilities
> *caps)
> +{
> +    StreamChannelClient *rcc;
> +
> +    rcc = g_initable_new(TYPE_STREAM_CHANNEL_CLIENT,
> +                         NULL, NULL,
> +                         "channel", channel,
> +                         "client", client,
> +                         "stream", stream,
> +                         "monitor-latency", FALSE,
> +                         "caps", caps,
> +                         NULL);
> +
> +    return rcc;
> +}
> +
> +static void
> +stream_channel_send_item(RedChannelClient *rcc, RedPipeItem
> *pipe_item)
> +{
> +    switch (pipe_item->type) {
> +    default:
> +        spice_error("invalid pipe item type");
> +    }
> +
> +    red_channel_client_begin_send_message(rcc);
> +}
> +
> +StreamChannel*
> +stream_channel_new(RedsState *server)
> +{
> +    return g_object_new(TYPE_STREAM_CHANNEL,
> +                        "spice-server", server,
> +                        "core-interface",
> reds_get_core_interface(server),
> +                        "channel-type", SPICE_CHANNEL_DISPLAY,
> +                        // TODO this id should be after all qxl
> devices
> +                        "id", 1, // TODO proper id
> +                        "migration-flags", 0,
> +                        "handle-acks", TRUE, // TODO sure ??
> +                        NULL);
> +}
> +
> +static void
> +stream_channel_connect(RedChannel *red_channel, RedClient
> *red_client, RedsStream *stream,
> +                       int migration, RedChannelCapabilities *caps)
> +{
> +    StreamChannel *channel = STREAM_CHANNEL(red_channel);
> +    StreamChannelClient *client;
> +
> +    spice_return_if_fail(stream != NULL);
> +
> +    client = stream_channel_client_new(channel, red_client, stream,
> migration, caps);
> +    spice_return_if_fail(client != NULL);
> +}
> +
> +static void
> +stream_channel_constructed(GObject *object)
> +{
> +    ClientCbs client_cbs = { NULL, };
> +    RedChannel *red_channel = RED_CHANNEL(object);
> +    RedsState *reds = red_channel_get_server(red_channel);
> +
> +    G_OBJECT_CLASS(stream_channel_parent_class)-
> >constructed(object);
> +
> +    client_cbs.connect = stream_channel_connect;
> +    red_channel_register_client_cbs(red_channel, &client_cbs, NULL);
> +
> +    reds_register_channel(reds, red_channel);
> +}
> +
> +static void
> +stream_channel_class_init(StreamChannelClass *klass)
> +{
> +    GObjectClass *object_class = G_OBJECT_CLASS(klass);
> +    RedChannelClass *channel_class = RED_CHANNEL_CLASS(klass);
> +
> +    object_class->constructed = stream_channel_constructed;
> +
> +    channel_class->parser =
> spice_get_client_channel_parser(SPICE_CHANNEL_DISPLAY, NULL);
> +    channel_class->handle_message =
> red_channel_client_handle_message;
> +
> +    channel_class->on_disconnect =
> stream_channel_client_on_disconnect;
> +    channel_class->send_item = stream_channel_send_item;
> +}
> +
> +static void
> +stream_channel_init(StreamChannel *channel)
> +{
> +}
> diff --git a/server/stream-channel.h b/server/stream-channel.h
> new file mode 100644
> index 00000000..5691008c
> --- /dev/null
> +++ b/server/stream-channel.h
> @@ -0,0 +1,53 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> +   Copyright (C) 2017 Red Hat, Inc.
> +
> +   This library 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 2.1 of the License, or (at your option) any later
> version.
> +
> +   This library 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 this library; if not, see <http://www.gnu.org/
> licenses/>.
> +*/
> +
> +#ifndef STREAM_CHANNEL_H_
> +#define STREAM_CHANNEL_H_
> +
> +#include "red-channel.h"
> +
> +G_BEGIN_DECLS
> +
> +/**
> + * This type it's a RedChannel class which implement display
> + * channel with input only by stream.
> + * A pointer to StreamChannel can be converted to a RedChannel.
> + */
> +typedef struct StreamChannel StreamChannel;
> +typedef struct StreamChannelClass StreamChannelClass;
> +
> +#define TYPE_STREAM_CHANNEL stream_channel_get_type()
> +
> +#define STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
> TYPE_STREAM_CHANNEL, StreamChannel))
> +#define STREAM_CHANNEL_CLASS(klass) \
> +    (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_STREAM_CHANNEL,
> StreamChannelClass))
> +#define IS_STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
> TYPE_STREAM_CHANNEL))
> +#define IS_STREAM_CHANNEL_CLASS(klass)
> (G_TYPE_CHECK_CLASS_TYPE((klass), TYPE_STREAM_CHANNEL))
> +#define STREAM_CHANNEL_GET_CLASS(obj) \
> +    (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_STREAM_CHANNEL,
> StreamChannelClass))
> +
> +GType stream_channel_get_type(void) G_GNUC_CONST;
> +
> +/**
> + * Create StreamChannel.
> + */
> +StreamChannel* stream_channel_new(RedsState *server);
> +
> +G_END_DECLS
> +
> +#endif /* STREAM_CHANNEL_H_ */


More information about the Spice-devel mailing list