From 49a8d68303f3d8681a9c61d74e0675279649d480 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Wed, 8 Aug 2012 12:13:25 +0300 Subject: red_channel: add red_channel_test_remote_cap for checking if all the channel clients connected support the cap --- server/red_channel.c | 28 ++++++++++++++++++++++++++++ server/red_channel.h | 4 ++++ 2 files changed, 32 insertions(+) (limited to 'server') diff --git a/server/red_channel.c b/server/red_channel.c index 2a7acbfc..1cad9eb3 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -560,6 +560,34 @@ int red_channel_client_test_remote_cap(RedChannelClient *rcc, uint32_t cap) cap); } +int red_channel_test_remote_common_cap(RedChannel *channel, uint32_t cap) +{ + RingItem *link; + + RING_FOREACH(link, &channel->clients) { + RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link); + + if (!red_channel_client_test_remote_common_cap(rcc, cap)) { + return FALSE; + } + } + return TRUE; +} + +int red_channel_test_remote_cap(RedChannel *channel, uint32_t cap) +{ + RingItem *link; + + RING_FOREACH(link, &channel->clients) { + RedChannelClient *rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link); + + if (!red_channel_client_test_remote_cap(rcc, cap)) { + return FALSE; + } + } + return TRUE; +} + static int red_channel_client_pre_create_validate(RedChannel *channel, RedClient *client) { if (red_client_get_channel(client, channel->type, channel->id)) { diff --git a/server/red_channel.h b/server/red_channel.h index e77e484a..acb49cd0 100644 --- a/server/red_channel.h +++ b/server/red_channel.h @@ -363,6 +363,10 @@ void red_channel_destroy(RedChannel *channel); int red_channel_client_test_remote_common_cap(RedChannelClient *rcc, uint32_t cap); int red_channel_client_test_remote_cap(RedChannelClient *rcc, uint32_t cap); +/* return true if all the channel clients support the cap */ +int red_channel_test_remote_common_cap(RedChannel *channel, uint32_t cap); +int red_channel_test_remote_cap(RedChannel *channel, uint32_t cap); + /* shutdown is the only safe thing to do out of the client/channel * thread. It will not touch the rings, just shutdown the socket. * It should be followed by some way to gurantee a disconnection. */ -- cgit