diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-15 01:43:00 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-15 01:43:00 +0000 |
commit | a5284efd883797a78f9c7be3120384079a532225 (patch) | |
tree | 441884130d9b6ea0b80a54c49ae56aeb0200fba5 /remoting/protocol | |
parent | 7c477f8cea24d9e667fa30ff6674d4098080f838 (diff) | |
download | chromium_src-a5284efd883797a78f9c7be3120384079a532225.zip chromium_src-a5284efd883797a78f9c7be3120384079a532225.tar.gz chromium_src-a5284efd883797a78f9c7be3120384079a532225.tar.bz2 |
Add mux-stream transport support in session description
Also moved NameToValue() and ValueToName() from jingle_messages.cc to name_value_map.h . These functions simplify string<->enum mapping.
BUG=137135
Review URL: https://chromiumcodereview.appspot.com/10829324
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151629 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/protocol')
-rw-r--r-- | remoting/protocol/content_description.cc | 93 | ||||
-rw-r--r-- | remoting/protocol/jingle_messages.cc | 49 | ||||
-rw-r--r-- | remoting/protocol/name_value_map.h | 40 | ||||
-rw-r--r-- | remoting/protocol/session_config.h | 1 |
4 files changed, 72 insertions, 111 deletions
diff --git a/remoting/protocol/content_description.cc b/remoting/protocol/content_description.cc index 70ba05b..9f7d5d5 100644 --- a/remoting/protocol/content_description.cc +++ b/remoting/protocol/content_description.cc @@ -8,6 +8,7 @@ #include "base/string_number_conversions.h" #include "remoting/base/constants.h" #include "remoting/protocol/authenticator.h" +#include "remoting/protocol/name_value_map.h" #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" using buzz::QName; @@ -36,45 +37,19 @@ const char kCodecAttr[] = "codec"; const char kDeprecatedWidthAttr[] = "width"; const char kDeprecatedHeightAttr[] = "height"; -const char kStreamTransport[] = "stream"; -const char kDatagramTransport[] = "datagram"; -const char kNoneTransport[] = "none"; - -const char kVerbatimCodec[] = "verbatim"; -const char kVp8Codec[] = "vp8"; -const char kZipCodec[] = "zip"; -const char kVorbisCodec[] = "vorbis"; - -const char* GetTransportName(ChannelConfig::TransportType type) { - switch (type) { - case ChannelConfig::TRANSPORT_STREAM: - return kStreamTransport; - case ChannelConfig::TRANSPORT_DATAGRAM: - return kDatagramTransport; - case ChannelConfig::TRANSPORT_NONE: - return kNoneTransport; - } - NOTREACHED(); - return NULL; -} - -const char* GetCodecName(ChannelConfig::Codec type) { - switch (type) { - case ChannelConfig::CODEC_VERBATIM: - return kVerbatimCodec; - case ChannelConfig::CODEC_VP8: - return kVp8Codec; - case ChannelConfig::CODEC_ZIP: - return kZipCodec; - case ChannelConfig::CODEC_VORBIS: - return kVorbisCodec; - default: - break; - } - NOTREACHED(); - return NULL; -} +const NameMapElement<ChannelConfig::TransportType> kTransports[] = { + { ChannelConfig::TRANSPORT_STREAM, "stream" }, + { ChannelConfig::TRANSPORT_MUX_STREAM, "mux-stream" }, + { ChannelConfig::TRANSPORT_DATAGRAM, "datagram" }, + { ChannelConfig::TRANSPORT_NONE, "none" }, +}; +const NameMapElement<ChannelConfig::Codec> kCodecs[] = { + { ChannelConfig::CODEC_VERBATIM, "verbatim" }, + { ChannelConfig::CODEC_VP8, "vp8" }, + { ChannelConfig::CODEC_ZIP, "zip" }, + { ChannelConfig::CODEC_VORBIS, "vorbis" }, +}; // Format a channel configuration tag for chromotocol session description, // e.g. for video channel: @@ -85,61 +60,33 @@ XmlElement* FormatChannelConfig(const ChannelConfig& config, QName(kChromotingXmlNamespace, tag_name)); result->AddAttr(QName(kDefaultNs, kTransportAttr), - GetTransportName(config.transport)); + ValueToName(kTransports, config.transport)); result->AddAttr(QName(kDefaultNs, kVersionAttr), base::IntToString(config.version)); if (config.codec != ChannelConfig::CODEC_UNDEFINED) { result->AddAttr(QName(kDefaultNs, kCodecAttr), - GetCodecName(config.codec)); + ValueToName(kCodecs, config.codec)); } return result; } -bool ParseTransportName(const std::string& value, - ChannelConfig::TransportType* transport) { - if (value == kStreamTransport) { - *transport = ChannelConfig::TRANSPORT_STREAM; - } else if (value == kDatagramTransport) { - *transport = ChannelConfig::TRANSPORT_DATAGRAM; - } else if (value == kNoneTransport) { - *transport = ChannelConfig::TRANSPORT_NONE; - } else { - return false; - } - return true; -} - -bool ParseCodecName(const std::string& value, ChannelConfig::Codec* codec) { - if (value == kVerbatimCodec) { - *codec = ChannelConfig::CODEC_VERBATIM; - } else if (value == kVp8Codec) { - *codec = ChannelConfig::CODEC_VP8; - } else if (value == kZipCodec) { - *codec = ChannelConfig::CODEC_ZIP; - } else if (value == kVorbisCodec) { - *codec = ChannelConfig::CODEC_VORBIS; - } else { - return false; - } - return true; -} - // Returns false if the element is invalid. bool ParseChannelConfig(const XmlElement* element, bool codec_required, ChannelConfig* config) { - if (!ParseTransportName(element->Attr(QName(kDefaultNs, kTransportAttr)), - &config->transport) || + if (!NameToValue( + kTransports, element->Attr(QName(kDefaultNs, kTransportAttr)), + &config->transport) || !base::StringToInt(element->Attr(QName(kDefaultNs, kVersionAttr)), &config->version)) { return false; } if (codec_required) { - if (!ParseCodecName(element->Attr(QName(kDefaultNs, kCodecAttr)), - &config->codec)) { + if (!NameToValue(kCodecs, element->Attr(QName(kDefaultNs, kCodecAttr)), + &config->codec)) { return false; } } else { diff --git a/remoting/protocol/jingle_messages.cc b/remoting/protocol/jingle_messages.cc index cc55c76..7d82443 100644 --- a/remoting/protocol/jingle_messages.cc +++ b/remoting/protocol/jingle_messages.cc @@ -8,6 +8,7 @@ #include "base/string_number_conversions.h" #include "remoting/base/constants.h" #include "remoting/protocol/content_description.h" +#include "remoting/protocol/name_value_map.h" #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" using buzz::QName; @@ -28,32 +29,6 @@ const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace"; const int kPortMin = 1000; const int kPortMax = 65535; -template <typename T> -struct NameMapElement { - const T value; - const char* const name; -}; - -template <typename T> -const char* ValueToName(const NameMapElement<T> map[], size_t map_size, - T value) { - for (size_t i = 0; i < map_size; ++i) { - if (map[i].value == value) - return map[i].name; - } - return NULL; -} - -template <typename T> -T NameToValue(const NameMapElement<T> map[], size_t map_size, - const std::string& name, T default_value) { - for (size_t i = 0; i < map_size; ++i) { - if (map[i].name == name) - return map[i].value; - } - return default_value; -} - const NameMapElement<JingleMessage::ActionType> kActionTypes[] = { { JingleMessage::SESSION_INITIATE, "session-initiate" }, { JingleMessage::SESSION_ACCEPT, "session-accept" }, @@ -157,7 +132,7 @@ bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) { // static std::string JingleMessage::GetActionName(ActionType action) { - return ValueToName(kActionTypes, arraysize(kActionTypes), action); + return ValueToName(kActionTypes, action); } JingleMessage::JingleMessage() @@ -187,7 +162,7 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza, const XmlElement* jingle_tag = stanza->FirstNamed(QName(kJingleNamespace, "jingle")); - if (jingle_tag == NULL) { + if (!jingle_tag) { *error = "Not a jingle message"; return false; } @@ -200,9 +175,7 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza, *error = "action attribute is missing"; return false; } - action = NameToValue( - kActionTypes, arraysize(kActionTypes), action_str, UNKNOWN_ACTION); - if (action == UNKNOWN_ACTION) { + if (!NameToValue(kActionTypes, action_str, &action)) { *error = "Unknown action " + action_str; return false; } @@ -229,9 +202,10 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza, const XmlElement* reason_tag = jingle_tag->FirstNamed(QName(kJingleNamespace, "reason")); if (reason_tag && reason_tag->FirstElement()) { - reason = NameToValue( - kReasons, arraysize(kReasons), - reason_tag->FirstElement()->Name().LocalPart(), UNKNOWN_REASON); + if (!NameToValue(kReasons, reason_tag->FirstElement()->Name().LocalPart(), + &reason)) { + reason = UNKNOWN_REASON; + } } if (action == SESSION_TERMINATE) @@ -302,8 +276,7 @@ scoped_ptr<buzz::XmlElement> JingleMessage::ToXml() const { root->AddElement(jingle_tag); jingle_tag->AddAttr(QName(kEmptyNamespace, "sid"), sid); - const char* action_attr = ValueToName( - kActionTypes, arraysize(kActionTypes), action); + const char* action_attr = ValueToName(kActionTypes, action); if (!action_attr) LOG(FATAL) << "Invalid action value " << action; jingle_tag->AddAttr(QName(kEmptyNamespace, "action"), action_attr); @@ -321,8 +294,8 @@ scoped_ptr<buzz::XmlElement> JingleMessage::ToXml() const { XmlElement* reason_tag = new XmlElement(QName(kJingleNamespace, "reason")); jingle_tag->AddElement(reason_tag); const char* reason_string = - ValueToName(kReasons, arraysize(kReasons), reason); - if (reason_string == NULL) + ValueToName(kReasons, reason); + if (!reason_string) LOG(FATAL) << "Invalid reason: " << reason; reason_tag->AddElement(new XmlElement( QName(kJingleNamespace, reason_string))); diff --git a/remoting/protocol/name_value_map.h b/remoting/protocol/name_value_map.h new file mode 100644 index 0000000..79e8a47 --- /dev/null +++ b/remoting/protocol/name_value_map.h @@ -0,0 +1,40 @@ +// Copyright (c) 2012 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. +// +// Helper functions that allow to map enum values to strings. + +namespace remoting { +namespace protocol { + +template <typename T> +struct NameMapElement { + const T value; + const char* const name; +}; + +template <typename T, size_t N> +const char* ValueToName(const NameMapElement<T> (&map)[N], T value) { + for (size_t i = 0; i < N; ++i) { + if (map[i].value == value) + return map[i].name; + } + NOTREACHED(); + return NULL; +} + +template <typename T, size_t N> +bool NameToValue(const NameMapElement<T> (&map)[N], + const std::string& name, + T* result) { + for (size_t i = 0; i < N; ++i) { + if (map[i].name == name) { + *result = map[i].value; + return true; + } + } + return false; +} + +} // namespace protocol +} // namespace remoting diff --git a/remoting/protocol/session_config.h b/remoting/protocol/session_config.h index 02ee7f1..12466d3 100644 --- a/remoting/protocol/session_config.h +++ b/remoting/protocol/session_config.h @@ -22,6 +22,7 @@ extern const int kDefaultStreamVersion; struct ChannelConfig { enum TransportType { TRANSPORT_STREAM, + TRANSPORT_MUX_STREAM, TRANSPORT_DATAGRAM, TRANSPORT_NONE, }; |