15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_PROTOCOL_SESSION_CONFIG_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_PROTOCOL_SESSION_CONFIG_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const int kDefaultStreamVersion; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct for configuration parameters of a single channel. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some channels (like video) may have multiple underlying sockets that need 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to be configured simultaneously. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChannelConfig { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum TransportType { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSPORT_STREAM, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSPORT_MUX_STREAM, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSPORT_DATAGRAM, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSPORT_NONE, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Codec { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_UNDEFINED, // Used for event and control channels. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_VERBATIM, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_ZIP, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_VP8, 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CODEC_VP9, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_OPUS, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CODEC_SPEEX, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a config with transport field set to TRANSPORT_NONE which indicates 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that corresponding channel is disabled. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ChannelConfig None(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default constructor. Equivalent to None(). 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a channel config with the specified parameters. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig(TransportType transport, int version, Codec codec); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operator== is overloaded so that std::find() works with 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // std::list<ChannelConfig>. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const ChannelConfig& b) const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportType transport; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int version; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Codec codec; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SessionConfig is used by the chromoting Session to store negotiated 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chromotocol configuration. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionConfig { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_control_config(const ChannelConfig& control_config) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_config_ = control_config; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChannelConfig& control_config() const { return control_config_; } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_event_config(const ChannelConfig& event_config) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_config_ = event_config; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChannelConfig& event_config() const { return event_config_; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_video_config(const ChannelConfig& video_config) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_config_ = video_config; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChannelConfig& video_config() const { return video_config_; } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_audio_config(const ChannelConfig& audio_config) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_config_ = audio_config; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChannelConfig& audio_config() const { return audio_config_; } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_audio_enabled() const { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return audio_config_.transport != ChannelConfig::TRANSPORT_NONE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a suitable session configuration for use in tests. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SessionConfig ForTest(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig control_config_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig event_config_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig video_config_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig audio_config_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines session description that is sent from client to the host in the 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// session-initiate message. It is different from the regular Config 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because it allows one to specify multiple configurations for each channel. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CandidateSessionConfig { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static scoped_ptr<CandidateSessionConfig> CreateEmpty(); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static scoped_ptr<CandidateSessionConfig> CreateFrom( 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SessionConfig& config); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static scoped_ptr<CandidateSessionConfig> CreateDefault(); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CandidateSessionConfig(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& control_configs() const { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return control_configs_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig>* mutable_control_configs() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &control_configs_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& event_configs() const { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event_configs_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig>* mutable_event_configs() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &event_configs_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& video_configs() const { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return video_configs_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig>* mutable_video_configs() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &video_configs_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& audio_configs() const { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return audio_configs_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig>* mutable_audio_configs() { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &audio_configs_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selects session configuration that is supported by both participants. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL is returned if such configuration doesn't exist. When selecting 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // channel configuration priority is given to the configs listed first 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in |client_config|. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Select(const CandidateSessionConfig* client_config, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionConfig* result); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |config| is supported. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSupported(const SessionConfig& config) const; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extracts final protocol configuration. Must be used for the description 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // received in the session-accept stanza. If the selection is ambiguous 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (e.g. there is more than one configuration for one of the channel) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or undefined (e.g. no configurations for a channel) then NULL is returned. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetFinalConfig(SessionConfig* result) const; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CandidateSessionConfig> Clone() const; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Helpers for enabling/disabling specific features. 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void DisableAudioChannel(); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void EnableVideoCodec(ChannelConfig::Codec codec); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CandidateSessionConfig(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CandidateSessionConfig(const CandidateSessionConfig& config); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CandidateSessionConfig& operator=(const CandidateSessionConfig& b); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SelectCommonChannelConfig( 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& host_configs_, 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::list<ChannelConfig>& client_configs_, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelConfig* config); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static bool IsChannelConfigSupported(const std::list<ChannelConfig>& list, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ChannelConfig& value); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig> control_configs_; 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig> event_configs_; 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig> video_configs_; 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<ChannelConfig> audio_configs_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_PROTOCOL_SESSION_CONFIG_H_ 184