Home | History | Annotate | Download | only in protocol
      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 <list>
      9 #include <string>
     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::list<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 
     65   void set_control_config(const ChannelConfig& control_config) {
     66     control_config_ = control_config;
     67   }
     68   const ChannelConfig& control_config() const { return control_config_; }
     69   void set_event_config(const ChannelConfig& event_config) {
     70     event_config_ = event_config;
     71   }
     72   const ChannelConfig& event_config() const { return event_config_; }
     73   void set_video_config(const ChannelConfig& video_config) {
     74     video_config_ = video_config;
     75   }
     76   const ChannelConfig& video_config() const { return video_config_; }
     77   void set_audio_config(const ChannelConfig& audio_config) {
     78     audio_config_ = audio_config;
     79   }
     80   const ChannelConfig& audio_config() const { return audio_config_; }
     81 
     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   static scoped_ptr<CandidateSessionConfig> CreateEmpty();
    105   static scoped_ptr<CandidateSessionConfig> CreateFrom(
    106       const SessionConfig& config);
    107   static scoped_ptr<CandidateSessionConfig> CreateDefault();
    108 
    109   ~CandidateSessionConfig();
    110 
    111   const std::list<ChannelConfig>& control_configs() const {
    112     return control_configs_;
    113   }
    114 
    115   std::list<ChannelConfig>* mutable_control_configs() {
    116     return &control_configs_;
    117   }
    118 
    119   const std::list<ChannelConfig>& event_configs() const {
    120     return event_configs_;
    121   }
    122 
    123   std::list<ChannelConfig>* mutable_event_configs() {
    124     return &event_configs_;
    125   }
    126 
    127   const std::list<ChannelConfig>& video_configs() const {
    128     return video_configs_;
    129   }
    130 
    131   std::list<ChannelConfig>* mutable_video_configs() {
    132     return &video_configs_;
    133   }
    134 
    135   const std::list<ChannelConfig>& audio_configs() const {
    136     return audio_configs_;
    137   }
    138 
    139   std::list<ChannelConfig>* mutable_audio_configs() {
    140     return &audio_configs_;
    141   }
    142 
    143   // Selects session configuration that is supported by both participants.
    144   // NULL is returned if such configuration doesn't exist. When selecting
    145   // channel configuration priority is given to the configs listed first
    146   // in |client_config|.
    147   bool Select(const CandidateSessionConfig* client_config,
    148               SessionConfig* result);
    149 
    150   // Returns true if |config| is supported.
    151   bool IsSupported(const SessionConfig& config) const;
    152 
    153   // Extracts final protocol configuration. Must be used for the description
    154   // received in the session-accept stanza. If the selection is ambiguous
    155   // (e.g. there is more than one configuration for one of the channel)
    156   // or undefined (e.g. no configurations for a channel) then NULL is returned.
    157   bool GetFinalConfig(SessionConfig* result) const;
    158 
    159   scoped_ptr<CandidateSessionConfig> Clone() const;
    160 
    161   // Helpers for enabling/disabling specific features.
    162   void DisableAudioChannel();
    163   void EnableVideoCodec(ChannelConfig::Codec codec);
    164 
    165  private:
    166   CandidateSessionConfig();
    167   explicit CandidateSessionConfig(const CandidateSessionConfig& config);
    168   CandidateSessionConfig& operator=(const CandidateSessionConfig& b);
    169 
    170   static bool SelectCommonChannelConfig(
    171       const std::list<ChannelConfig>& host_configs_,
    172       const std::list<ChannelConfig>& client_configs_,
    173       ChannelConfig* config);
    174   static bool IsChannelConfigSupported(const std::list<ChannelConfig>& list,
    175                                        const ChannelConfig& value);
    176 
    177   std::list<ChannelConfig> control_configs_;
    178   std::list<ChannelConfig> event_configs_;
    179   std::list<ChannelConfig> video_configs_;
    180   std::list<ChannelConfig> audio_configs_;
    181 };
    182 
    183 }  // namespace protocol
    184 }  // namespace remoting
    185 
    186 #endif  // REMOTING_PROTOCOL_SESSION_CONFIG_H_
    187