Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Unified Diff: remoting/protocol/jingle_messages.cc

Issue 8046018: Parse termination reason and propagate the error to the Session interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/protocol/jingle_messages.h ('k') | remoting/protocol/jingle_session.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/protocol/jingle_messages.cc
diff --git a/remoting/protocol/jingle_messages.cc b/remoting/protocol/jingle_messages.cc
index a7c71c3f3b1e7e8a614bdba3e88477229b654550..de8e137185b3ad90654b3f756b5614a7c719a50e 100644
--- a/remoting/protocol/jingle_messages.cc
+++ b/remoting/protocol/jingle_messages.cc
@@ -26,14 +26,48 @@ namespace {
const char kEmptyNamespace[] = "";
const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace";
-const char kSessionInitiateAction[] = "session-initiate";
-const char kSessionAcceptAction[] = "session-accept";
-const char kSessionTerminateAction[] = "session-terminate";
-const char kTransportInfoAction[] = "transport-info";
-
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;
+}
+
+static const NameMapElement<JingleMessage::ActionType> kActionTypes[] = {
+ { JingleMessage::SESSION_INITIATE, "session-initiate" },
+ { JingleMessage::SESSION_ACCEPT, "session-accept" },
+ { JingleMessage::SESSION_TERMINATE, "session-terminate" },
+ { JingleMessage::TRANSPORT_INFO, "transport-info" },
+};
+
+static const NameMapElement<JingleMessage::Reason> kReasons[] = {
+ { JingleMessage::SUCCESS, "success" },
+ { JingleMessage::DECLINE, "decline" },
+ { JingleMessage::INCOMPATIBLE_PARAMETERS, "incompatible-parameters" },
+};
+
bool ParseCandidate(const buzz::XmlElement* element,
cricket::Candidate* candidate) {
DCHECK(element->Name() == QName(kP2PTransportNamespace, "candidate"));
@@ -104,7 +138,7 @@ bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) {
JingleMessage::JingleMessage()
: action(UNKNOWN_ACTION),
- termination_reason(kJingleNamespace, "success") {
+ reason(UNKNOWN_REASON) {
}
JingleMessage::JingleMessage(
@@ -135,15 +169,10 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza,
if (action_str.empty()) {
*error = "action attribute is missing";
return false;
- } else if (action_str == kSessionInitiateAction) {
- action = SESSION_INITIATE;
- } else if (action_str == kSessionAcceptAction) {
- action = SESSION_ACCEPT;
- } else if (action_str == kSessionTerminateAction) {
- action = SESSION_TERMINATE;
- } else if (action_str == kTransportInfoAction) {
- action = TRANSPORT_INFO;
- } else {
+ }
+ action = NameToValue(
+ kActionTypes, arraysize(kActionTypes), action_str, UNKNOWN_ACTION);
+ if (action == UNKNOWN_ACTION) {
*error = "Unknown action " + action_str;
return false;
}
@@ -154,14 +183,17 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza,
return false;
}
- if (action == SESSION_TERMINATE) {
- const XmlElement* reason_tag =
- jingle_tag->FirstNamed(QName(kJingleNamespace, "reason"));
- if (reason_tag && reason_tag->FirstElement())
- termination_reason = reason_tag->FirstElement()->Name();
- return true;
+ 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 (action == SESSION_TERMINATE)
+ return true;
+
const XmlElement* content_tag =
jingle_tag->FirstNamed(QName(kJingleNamespace, "content"));
if (!content_tag) {
@@ -227,35 +259,27 @@ buzz::XmlElement* JingleMessage::ToXml() {
root->AddElement(jingle_tag);
jingle_tag->AddAttr(QName(kEmptyNamespace, "sid"), sid);
- std::string action_attr;
- switch (action) {
- case SESSION_INITIATE:
- action_attr = kSessionInitiateAction;
- break;
- case SESSION_ACCEPT:
- action_attr = kSessionAcceptAction;
- break;
- case SESSION_TERMINATE:
- action_attr = kSessionTerminateAction;
- break;
- case TRANSPORT_INFO:
- action_attr = kTransportInfoAction;
- break;
- default:
- NOTREACHED();
- break;
- }
+ const char* action_attr = ValueToName(
+ kActionTypes, arraysize(kActionTypes), action);
+ if (!action_attr)
+ LOG(FATAL) << "Invalid action value " << action;
jingle_tag->AddAttr(QName(kEmptyNamespace, "action"), action_attr);
if (action == SESSION_INITIATE)
jingle_tag->AddAttr(QName(kEmptyNamespace, "initiator"), from);
- if (action == SESSION_TERMINATE) {
+ if (reason != UNKNOWN_REASON) {
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)
+ LOG(FATAL) << "Invalid reason: " << reason;
+ reason_tag->AddElement(new XmlElement(
+ QName(kJingleNamespace, reason_string)));
+ }
- reason_tag->AddElement(new XmlElement(termination_reason));
- } else {
+ if (action != SESSION_TERMINATE) {
XmlElement* content_tag =
new XmlElement(QName(kJingleNamespace, "content"));
jingle_tag->AddElement(content_tag);
« no previous file with comments | « remoting/protocol/jingle_messages.h ('k') | remoting/protocol/jingle_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698