telemetry: Support custom 'out' directory
[chromium-blink-merge.git] / remoting / protocol / session_config.h
blobb3fa90a51178b5ffe78a2507002523223af184ef
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.
5 #ifndef REMOTING_PROTOCOL_SESSION_CONFIG_H_
6 #define REMOTING_PROTOCOL_SESSION_CONFIG_H_
8 #include <string>
9 #include <vector>
11 #include "base/basictypes.h"
12 #include "base/memory/scoped_ptr.h"
14 namespace remoting {
15 namespace protocol {
17 extern const int kDefaultStreamVersion;
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,
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,
40 // Creates a config with transport field set to TRANSPORT_NONE which indicates
41 // that corresponding channel is disabled.
42 static ChannelConfig None();
44 // Default constructor. Equivalent to None().
45 ChannelConfig();
47 // Creates a channel config with the specified parameters.
48 ChannelConfig(TransportType transport, int version, Codec codec);
50 // operator== is overloaded so that std::find() works with
51 // std::vector<ChannelConfig>.
52 bool operator==(const ChannelConfig& b) const;
54 TransportType transport;
55 int version;
56 Codec codec;
59 // SessionConfig is used by the chromoting Session to store negotiated
60 // chromotocol configuration.
61 class SessionConfig {
62 public:
63 SessionConfig();
65 void set_control_config(const ChannelConfig& control_config) {
66 control_config_ = control_config;
68 const ChannelConfig& control_config() const { return control_config_; }
69 void set_event_config(const ChannelConfig& event_config) {
70 event_config_ = event_config;
72 const ChannelConfig& event_config() const { return event_config_; }
73 void set_video_config(const ChannelConfig& video_config) {
74 video_config_ = video_config;
76 const ChannelConfig& video_config() const { return video_config_; }
77 void set_audio_config(const ChannelConfig& audio_config) {
78 audio_config_ = audio_config;
80 const ChannelConfig& audio_config() const { return audio_config_; }
82 bool is_audio_enabled() const {
83 return audio_config_.transport != ChannelConfig::TRANSPORT_NONE;
86 // Returns true if the control channel supports capabilities.
87 bool SupportsCapabilities() const;
89 // Returns a suitable session configuration for use in tests.
90 static SessionConfig ForTest();
92 private:
93 ChannelConfig control_config_;
94 ChannelConfig event_config_;
95 ChannelConfig video_config_;
96 ChannelConfig audio_config_;
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();
106 const std::vector<ChannelConfig>& control_configs() const {
107 return control_configs_;
110 std::vector<ChannelConfig>* mutable_control_configs() {
111 return &control_configs_;
114 const std::vector<ChannelConfig>& event_configs() const {
115 return event_configs_;
118 std::vector<ChannelConfig>* mutable_event_configs() {
119 return &event_configs_;
122 const std::vector<ChannelConfig>& video_configs() const {
123 return video_configs_;
126 std::vector<ChannelConfig>* mutable_video_configs() {
127 return &video_configs_;
130 const std::vector<ChannelConfig>& audio_configs() const {
131 return audio_configs_;
134 std::vector<ChannelConfig>* mutable_audio_configs() {
135 return &audio_configs_;
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);
145 // Returns true if |config| is supported.
146 bool IsSupported(const SessionConfig& config) const;
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;
154 scoped_ptr<CandidateSessionConfig> Clone() const;
156 static scoped_ptr<CandidateSessionConfig> CreateEmpty();
157 static scoped_ptr<CandidateSessionConfig> CreateFrom(
158 const SessionConfig& config);
159 static scoped_ptr<CandidateSessionConfig> CreateDefault();
161 // Modifies |config| to disable specific features.
162 static void DisableAudioChannel(CandidateSessionConfig* config);
163 static void DisableVideoCodec(CandidateSessionConfig* config,
164 ChannelConfig::Codec codec);
166 private:
167 CandidateSessionConfig();
168 explicit CandidateSessionConfig(const CandidateSessionConfig& config);
169 CandidateSessionConfig& operator=(const CandidateSessionConfig& b);
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);
178 std::vector<ChannelConfig> control_configs_;
179 std::vector<ChannelConfig> event_configs_;
180 std::vector<ChannelConfig> video_configs_;
181 std::vector<ChannelConfig> audio_configs_;
184 } // namespace protocol
185 } // namespace remoting
187 #endif // REMOTING_PROTOCOL_SESSION_CONFIG_H_