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 <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_OPUS,
     36     CODEC_SPEEX,
     37   };
     38 
     39   // Creates a config with transport field set to TRANSPORT_NONE which indicates
     40   // that corresponding channel is disabled.
     41   static ChannelConfig None();
     42 
     43   // Default constructor. Equivalent to None().
     44   ChannelConfig();
     45 
     46   // Creates a channel config with the specified parameters.
     47   ChannelConfig(TransportType transport, int version, Codec codec);
     48 
     49   // operator== is overloaded so that std::find() works with
     50   // std::vector<ChannelConfig>.
     51   bool operator==(const ChannelConfig& b) const;
     52 
     53   TransportType transport;
     54   int version;
     55   Codec codec;
     56 };
     57 
     58 // SessionConfig is used by the chromoting Session to store negotiated
     59 // chromotocol configuration.
     60 class SessionConfig {
     61  public:
     62   SessionConfig();
     63 
     64   void set_control_config(const ChannelConfig& control_config) {
     65     control_config_ = control_config;
     66   }
     67   const ChannelConfig& control_config() const { return control_config_; }
     68   void set_event_config(const ChannelConfig& event_config) {
     69     event_config_ = event_config;
     70   }
     71   const ChannelConfig& event_config() const { return event_config_; }
     72   void set_video_config(const ChannelConfig& video_config) {
     73     video_config_ = video_config;
     74   }
     75   const ChannelConfig& video_config() const { return video_config_; }
     76   void set_audio_config(const ChannelConfig& audio_config) {
     77     audio_config_ = audio_config;
     78   }
     79   const ChannelConfig& audio_config() const { return audio_config_; }
     80 
     81   bool is_audio_enabled() const {
     82     return audio_config_.transport != ChannelConfig::TRANSPORT_NONE;
     83   }
     84 
     85   // Returns true if the control channel supports capabilities.
     86   bool SupportsCapabilities() const;
     87 
     88   // Returns a suitable session configuration for use in tests.
     89   static SessionConfig ForTest();
     90 
     91  private:
     92   ChannelConfig control_config_;
     93   ChannelConfig event_config_;
     94   ChannelConfig video_config_;
     95   ChannelConfig audio_config_;
     96 };
     97 
     98 // Defines session description that is sent from client to the host in the
     99 // session-initiate message. It is different from the regular Config
    100 // because it allows one to specify multiple configurations for each channel.
    101 class CandidateSessionConfig {
    102  public:
    103   ~CandidateSessionConfig();
    104 
    105   const std::vector<ChannelConfig>& control_configs() const {
    106     return control_configs_;
    107   }
    108 
    109   std::vector<ChannelConfig>* mutable_control_configs() {
    110     return &control_configs_;
    111   }
    112 
    113   const std::vector<ChannelConfig>& event_configs() const {
    114     return event_configs_;
    115   }
    116 
    117   std::vector<ChannelConfig>* mutable_event_configs() {
    118     return &event_configs_;
    119   }
    120 
    121   const std::vector<ChannelConfig>& video_configs() const {
    122     return video_configs_;
    123   }
    124 
    125   std::vector<ChannelConfig>* mutable_video_configs() {
    126     return &video_configs_;
    127   }
    128 
    129   const std::vector<ChannelConfig>& audio_configs() const {
    130     return audio_configs_;
    131   }
    132 
    133   std::vector<ChannelConfig>* mutable_audio_configs() {
    134     return &audio_configs_;
    135   }
    136 
    137   // Selects session configuration that is supported by both participants.
    138   // NULL is returned if such configuration doesn't exist. When selecting
    139   // channel configuration priority is given to the configs listed first
    140   // in |client_config|.
    141   bool Select(const CandidateSessionConfig* client_config,
    142               SessionConfig* result);
    143 
    144   // Returns true if |config| is supported.
    145   bool IsSupported(const SessionConfig& config) const;
    146 
    147   // Extracts final protocol configuration. Must be used for the description
    148   // received in the session-accept stanza. If the selection is ambiguous
    149   // (e.g. there is more than one configuration for one of the channel)
    150   // or undefined (e.g. no configurations for a channel) then NULL is returned.
    151   bool GetFinalConfig(SessionConfig* result) const;
    152 
    153   scoped_ptr<CandidateSessionConfig> Clone() const;
    154 
    155   static scoped_ptr<CandidateSessionConfig> CreateEmpty();
    156   static scoped_ptr<CandidateSessionConfig> CreateFrom(
    157       const SessionConfig& config);
    158   static scoped_ptr<CandidateSessionConfig> CreateDefault();
    159 
    160   // Helper method that modifies |config| to disable audio support.
    161   static void DisableAudioChannel(CandidateSessionConfig* config);
    162 
    163  private:
    164   CandidateSessionConfig();
    165   explicit CandidateSessionConfig(const CandidateSessionConfig& config);
    166   CandidateSessionConfig& operator=(const CandidateSessionConfig& b);
    167 
    168   static bool SelectCommonChannelConfig(
    169       const std::vector<ChannelConfig>& host_configs_,
    170       const std::vector<ChannelConfig>& client_configs_,
    171       ChannelConfig* config);
    172   static bool IsChannelConfigSupported(const std::vector<ChannelConfig>& vector,
    173                                        const ChannelConfig& value);
    174 
    175   std::vector<ChannelConfig> control_configs_;
    176   std::vector<ChannelConfig> event_configs_;
    177   std::vector<ChannelConfig> video_configs_;
    178   std::vector<ChannelConfig> audio_configs_;
    179 };
    180 
    181 }  // namespace protocol
    182 }  // namespace remoting
    183 
    184 #endif  // REMOTING_PROTOCOL_SESSION_CONFIG_H_
    185