1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef REMOTING_PROTOCOL_SESSION_CONFIG_H_ 6 #define REMOTING_PROTOCOL_SESSION_CONFIG_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/memory/scoped_ptr.h" 13 14 namespace remoting { 15 namespace protocol { 16 17 extern const int kDefaultStreamVersion; 18 19 // Struct for configuration parameters of a single channel. 20 // Some channels (like video) may have multiple underlying sockets that need 21 // to be configured simultaneously. 22 struct ChannelConfig { 23 enum TransportType { 24 TRANSPORT_STREAM, 25 TRANSPORT_MUX_STREAM, 26 TRANSPORT_DATAGRAM, 27 TRANSPORT_NONE, 28 }; 29 30 enum Codec { 31 CODEC_UNDEFINED, // Used for event and control channels. 32 CODEC_VERBATIM, 33 CODEC_ZIP, 34 CODEC_VP8, 35 CODEC_VP9, 36 CODEC_OPUS, 37 CODEC_SPEEX, 38 }; 39 40 // Creates a config with transport field set to TRANSPORT_NONE which indicates 41 // that corresponding channel is disabled. 42 static ChannelConfig None(); 43 44 // Default constructor. Equivalent to None(). 45 ChannelConfig(); 46 47 // Creates a channel config with the specified parameters. 48 ChannelConfig(TransportType transport, int version, Codec codec); 49 50 // operator== is overloaded so that std::find() works with 51 // std::vector<ChannelConfig>. 52 bool operator==(const ChannelConfig& b) const; 53 54 TransportType transport; 55 int version; 56 Codec codec; 57 }; 58 59 // SessionConfig is used by the chromoting Session to store negotiated 60 // chromotocol configuration. 61 class SessionConfig { 62 public: 63 SessionConfig(); 64 set_control_config(const ChannelConfig & control_config)65 void set_control_config(const ChannelConfig& control_config) { 66 control_config_ = control_config; 67 } control_config()68 const ChannelConfig& control_config() const { return control_config_; } set_event_config(const ChannelConfig & event_config)69 void set_event_config(const ChannelConfig& event_config) { 70 event_config_ = event_config; 71 } event_config()72 const ChannelConfig& event_config() const { return event_config_; } set_video_config(const ChannelConfig & video_config)73 void set_video_config(const ChannelConfig& video_config) { 74 video_config_ = video_config; 75 } video_config()76 const ChannelConfig& video_config() const { return video_config_; } set_audio_config(const ChannelConfig & audio_config)77 void set_audio_config(const ChannelConfig& audio_config) { 78 audio_config_ = audio_config; 79 } audio_config()80 const ChannelConfig& audio_config() const { return audio_config_; } 81 is_audio_enabled()82 bool is_audio_enabled() const { 83 return audio_config_.transport != ChannelConfig::TRANSPORT_NONE; 84 } 85 86 // Returns true if the control channel supports capabilities. 87 bool SupportsCapabilities() const; 88 89 // Returns a suitable session configuration for use in tests. 90 static SessionConfig ForTest(); 91 92 private: 93 ChannelConfig control_config_; 94 ChannelConfig event_config_; 95 ChannelConfig video_config_; 96 ChannelConfig audio_config_; 97 }; 98 99 // Defines session description that is sent from client to the host in the 100 // session-initiate message. It is different from the regular Config 101 // because it allows one to specify multiple configurations for each channel. 102 class CandidateSessionConfig { 103 public: 104 ~CandidateSessionConfig(); 105 control_configs()106 const std::vector<ChannelConfig>& control_configs() const { 107 return control_configs_; 108 } 109 mutable_control_configs()110 std::vector<ChannelConfig>* mutable_control_configs() { 111 return &control_configs_; 112 } 113 event_configs()114 const std::vector<ChannelConfig>& event_configs() const { 115 return event_configs_; 116 } 117 mutable_event_configs()118 std::vector<ChannelConfig>* mutable_event_configs() { 119 return &event_configs_; 120 } 121 video_configs()122 const std::vector<ChannelConfig>& video_configs() const { 123 return video_configs_; 124 } 125 mutable_video_configs()126 std::vector<ChannelConfig>* mutable_video_configs() { 127 return &video_configs_; 128 } 129 audio_configs()130 const std::vector<ChannelConfig>& audio_configs() const { 131 return audio_configs_; 132 } 133 mutable_audio_configs()134 std::vector<ChannelConfig>* mutable_audio_configs() { 135 return &audio_configs_; 136 } 137 138 // Selects session configuration that is supported by both participants. 139 // NULL is returned if such configuration doesn't exist. When selecting 140 // channel configuration priority is given to the configs listed first 141 // in |client_config|. 142 bool Select(const CandidateSessionConfig* client_config, 143 SessionConfig* result); 144 145 // Returns true if |config| is supported. 146 bool IsSupported(const SessionConfig& config) const; 147 148 // Extracts final protocol configuration. Must be used for the description 149 // received in the session-accept stanza. If the selection is ambiguous 150 // (e.g. there is more than one configuration for one of the channel) 151 // or undefined (e.g. no configurations for a channel) then NULL is returned. 152 bool GetFinalConfig(SessionConfig* result) const; 153 154 scoped_ptr<CandidateSessionConfig> Clone() const; 155 156 static scoped_ptr<CandidateSessionConfig> CreateEmpty(); 157 static scoped_ptr<CandidateSessionConfig> CreateFrom( 158 const SessionConfig& config); 159 static scoped_ptr<CandidateSessionConfig> CreateDefault(); 160 161 // Modifies |config| to disable specific features. 162 static void DisableAudioChannel(CandidateSessionConfig* config); 163 static void DisableVideoCodec(CandidateSessionConfig* config, 164 ChannelConfig::Codec codec); 165 166 private: 167 CandidateSessionConfig(); 168 explicit CandidateSessionConfig(const CandidateSessionConfig& config); 169 CandidateSessionConfig& operator=(const CandidateSessionConfig& b); 170 171 static bool SelectCommonChannelConfig( 172 const std::vector<ChannelConfig>& host_configs_, 173 const std::vector<ChannelConfig>& client_configs_, 174 ChannelConfig* config); 175 static bool IsChannelConfigSupported(const std::vector<ChannelConfig>& vector, 176 const ChannelConfig& value); 177 178 std::vector<ChannelConfig> control_configs_; 179 std::vector<ChannelConfig> event_configs_; 180 std::vector<ChannelConfig> video_configs_; 181 std::vector<ChannelConfig> audio_configs_; 182 }; 183 184 } // namespace protocol 185 } // namespace remoting 186 187 #endif // REMOTING_PROTOCOL_SESSION_CONFIG_H_ 188