blob: 3e3f44e7177c751299bf3dbb15f2cd1f0c6966bf [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_PROTOCOL_SESSION_CONFIG_H_
#define REMOTING_PROTOCOL_SESSION_CONFIG_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
namespace remoting {
namespace protocol {
extern const int kDefaultStreamVersion;
// Struct for configuration parameters of a single channel.
// Some channels (like video) may have multiple underlying sockets that need
// to be configured simultaneously.
struct ChannelConfig {
enum TransportType {
TRANSPORT_STREAM,
TRANSPORT_DATAGRAM,
TRANSPORT_SRTP,
TRANSPORT_RTP_DTLS,
};
enum Codec {
CODEC_UNDEFINED, // Used for event and control channels.
CODEC_VERBATIM,
CODEC_ZIP,
CODEC_VP8,
};
ChannelConfig();
ChannelConfig(TransportType transport, int version, Codec codec);
// operator== is overloaded so that std::find() works with
// std::vector<ChannelConfig>.
bool operator==(const ChannelConfig& b) const;
void Reset();
TransportType transport;
int version;
Codec codec;
};
struct ScreenResolution {
ScreenResolution();
ScreenResolution(int width, int height);
bool IsValid() const;
int width;
int height;
};
// SessionConfig is used by the chromoting Session to store negotiated
// chromotocol configuration.
class SessionConfig {
public:
SessionConfig();
~SessionConfig();
const ChannelConfig& control_config() const { return control_config_; }
const ChannelConfig& event_config() const { return event_config_; }
const ChannelConfig& video_config() const { return video_config_; }
const ScreenResolution& initial_resolution() const {
return initial_resolution_;
}
void SetControlConfig(const ChannelConfig& control_config);
void SetEventConfig(const ChannelConfig& event_config);
void SetVideoConfig(const ChannelConfig& video_config);
void SetInitialResolution(const ScreenResolution& initial_resolution);
static SessionConfig GetDefault();
private:
ChannelConfig control_config_;
ChannelConfig event_config_;
ChannelConfig video_config_;
ScreenResolution initial_resolution_;
};
// Defines session description that is sent from client to the host in the
// session-initiate message. It is different from the regular Config
// because it allows one to specify multiple configurations for each channel.
class CandidateSessionConfig {
public:
~CandidateSessionConfig();
const std::vector<ChannelConfig>& control_configs() const {
return control_configs_;
}
std::vector<ChannelConfig>* mutable_control_configs() {
return &control_configs_;
}
const std::vector<ChannelConfig>& event_configs() const {
return event_configs_;
}
std::vector<ChannelConfig>* mutable_event_configs() {
return &event_configs_;
}
const std::vector<ChannelConfig>& video_configs() const {
return video_configs_;
}
std::vector<ChannelConfig>* mutable_video_configs() {
return &video_configs_;
}
const ScreenResolution& initial_resolution() const {
return initial_resolution_;
}
ScreenResolution* mutable_initial_resolution() {
return &initial_resolution_;
}
// Selects session configuration that is supported by both participants.
// NULL is returned if such configuration doesn't exist. When selecting
// channel configuration priority is given to the configs listed first
// in |client_config|.
bool Select(const CandidateSessionConfig* client_config,
bool force_host_resolution,
SessionConfig* result);
// Returns true if |config| is supported.
bool IsSupported(const SessionConfig& config) const;
// Extracts final protocol configuration. Must be used for the description
// received in the session-accept stanza. If the selection is ambiguous
// (e.g. there is more than one configuration for one of the channel)
// or undefined (e.g. no configurations for a channel) then NULL is returned.
bool GetFinalConfig(SessionConfig* result) const;
CandidateSessionConfig* Clone() const;
static CandidateSessionConfig* CreateEmpty();
static CandidateSessionConfig* CreateFrom(const SessionConfig& config);
static CandidateSessionConfig* CreateDefault();
private:
CandidateSessionConfig();
explicit CandidateSessionConfig(const CandidateSessionConfig& config);
CandidateSessionConfig& operator=(const CandidateSessionConfig& b);
static bool SelectCommonChannelConfig(
const std::vector<ChannelConfig>& host_configs_,
const std::vector<ChannelConfig>& client_configs_,
ChannelConfig* config);
static bool IsChannelConfigSupported(const std::vector<ChannelConfig>& vector,
const ChannelConfig& value);
std::vector<ChannelConfig> control_configs_;
std::vector<ChannelConfig> event_configs_;
std::vector<ChannelConfig> video_configs_;
ScreenResolution initial_resolution_;
};
} // namespace protocol
} // namespace remoting
#endif // REMOTING_PROTOCOL_SESSION_CONFIG_H_