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