summaryrefslogtreecommitdiffstats
path: root/remoting/protocol
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-15 01:43:00 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-15 01:43:00 +0000
commita5284efd883797a78f9c7be3120384079a532225 (patch)
tree441884130d9b6ea0b80a54c49ae56aeb0200fba5 /remoting/protocol
parent7c477f8cea24d9e667fa30ff6674d4098080f838 (diff)
downloadchromium_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.cc93
-rw-r--r--remoting/protocol/jingle_messages.cc49
-rw-r--r--remoting/protocol/name_value_map.h40
-rw-r--r--remoting/protocol/session_config.h1
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,
};