summaryrefslogtreecommitdiffstats
path: root/remoting/protocol/jingle_messages.cc
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/protocol/jingle_messages.cc')
-rw-r--r--remoting/protocol/jingle_messages.cc248
1 files changed, 42 insertions, 206 deletions
diff --git a/remoting/protocol/jingle_messages.cc b/remoting/protocol/jingle_messages.cc
index 7e4c21e..c2c9b80 100644
--- a/remoting/protocol/jingle_messages.cc
+++ b/remoting/protocol/jingle_messages.cc
@@ -17,16 +17,11 @@ using buzz::XmlElement;
namespace remoting {
namespace protocol {
-namespace {
-
const char kJabberNamespace[] = "jabber:client";
const char kJingleNamespace[] = "urn:xmpp:jingle:1";
+const char kP2PTransportNamespace[] = "http://www.google.com/transport/p2p";
-// Namespace for transport messages for legacy GICE.
-const char kGiceTransportNamespace[] = "http://www.google.com/transport/p2p";
-
-// Namespace for transport messages when using standard ICE.
-const char kIceTransportNamespace[] = "google:remoting:ice";
+namespace {
const char kEmptyNamespace[] = "";
const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace";
@@ -50,101 +45,9 @@ const NameMapElement<JingleMessage::Reason> kReasons[] = {
{ JingleMessage::INCOMPATIBLE_PARAMETERS, "incompatible-parameters" },
};
-bool ParseIceCredentials(const buzz::XmlElement* element,
- JingleMessage::IceCredentials* credentials) {
- DCHECK(element->Name() == QName(kIceTransportNamespace, "credentials"));
-
- const std::string& channel = element->Attr(QName(kEmptyNamespace, "channel"));
- const std::string& ufrag =
- element->Attr(QName(kEmptyNamespace, "ufrag"));
- const std::string& password =
- element->Attr(QName(kEmptyNamespace, "password"));
-
- if (channel.empty() || ufrag.empty() || password.empty()) {
- return false;
- }
-
- credentials->channel = channel;
- credentials->ufrag = ufrag;
- credentials->password = password;
-
- return true;
-}
-
-bool ParseIceCandidate(const buzz::XmlElement* element,
- JingleMessage::NamedCandidate* candidate) {
- DCHECK(element->Name() == QName(kIceTransportNamespace, "candidate"));
-
- const std::string& name = element->Attr(QName(kEmptyNamespace, "name"));
- const std::string& foundation =
- element->Attr(QName(kEmptyNamespace, "foundation"));
- const std::string& address = element->Attr(QName(kEmptyNamespace, "address"));
- const std::string& port_str = element->Attr(QName(kEmptyNamespace, "port"));
- const std::string& type = element->Attr(QName(kEmptyNamespace, "type"));
- const std::string& protocol =
- element->Attr(QName(kEmptyNamespace, "protocol"));
- const std::string& priority_str =
- element->Attr(QName(kEmptyNamespace, "priority"));
- const std::string& generation_str =
- element->Attr(QName(kEmptyNamespace, "generation"));
-
- int port;
- unsigned priority;
- int generation;
- if (name.empty() || foundation.empty() || address.empty() ||
- !base::StringToInt(port_str, &port) || port < kPortMin ||
- port > kPortMax || type.empty() || protocol.empty() ||
- !base::StringToUint(priority_str, &priority) ||
- !base::StringToInt(generation_str, &generation)) {
- return false;
- }
-
- candidate->name = name;
-
- candidate->candidate.set_foundation(foundation);
- candidate->candidate.set_address(rtc::SocketAddress(address, port));
- candidate->candidate.set_type(type);
- candidate->candidate.set_protocol(protocol);
- candidate->candidate.set_priority(priority);
- candidate->candidate.set_generation(generation);
-
- return true;
-}
-
-bool ParseIceTransportInfo(
- const buzz::XmlElement* element,
- std::list<JingleMessage::IceCredentials>* ice_credentials,
- std::list<JingleMessage::NamedCandidate>* candidates) {
- DCHECK(element->Name() == QName(kIceTransportNamespace, "transport"));
-
- ice_credentials->clear();
- candidates->clear();
-
- QName qn_credentials(kIceTransportNamespace, "credentials");
- for (const XmlElement* credentials_tag = element->FirstNamed(qn_credentials);
- credentials_tag;
- credentials_tag = credentials_tag->NextNamed(qn_credentials)) {
- JingleMessage::IceCredentials credentials;
- if (!ParseIceCredentials(credentials_tag, &credentials))
- return false;
- ice_credentials->push_back(credentials);
- }
-
- QName qn_candidate(kIceTransportNamespace, "candidate");
- for (const XmlElement* candidate_tag = element->FirstNamed(qn_candidate);
- candidate_tag; candidate_tag = candidate_tag->NextNamed(qn_candidate)) {
- JingleMessage::NamedCandidate candidate;
- if (!ParseIceCandidate(candidate_tag, &candidate))
- return false;
- candidates->push_back(candidate);
- }
-
- return true;
-}
-
-bool ParseGiceCandidate(const buzz::XmlElement* element,
- JingleMessage::NamedCandidate* candidate) {
- DCHECK(element->Name() == QName(kGiceTransportNamespace, "candidate"));
+bool ParseCandidate(const buzz::XmlElement* element,
+ JingleMessage::NamedCandidate* candidate) {
+ DCHECK(element->Name() == QName(kP2PTransportNamespace, "candidate"));
const std::string& name = element->Attr(QName(kEmptyNamespace, "name"));
const std::string& address = element->Attr(QName(kEmptyNamespace, "address"));
@@ -185,59 +88,9 @@ bool ParseGiceCandidate(const buzz::XmlElement* element,
return true;
}
-bool ParseGiceTransportInfo(
- const buzz::XmlElement* element,
- std::list<JingleMessage::NamedCandidate>* candidates) {
- DCHECK(element->Name() == QName(kGiceTransportNamespace, "transport"));
-
- candidates->clear();
-
- QName qn_candidate(kGiceTransportNamespace, "candidate");
- for (const XmlElement* candidate_tag = element->FirstNamed(qn_candidate);
- candidate_tag; candidate_tag = candidate_tag->NextNamed(qn_candidate)) {
- JingleMessage::NamedCandidate candidate;
- if (!ParseGiceCandidate(candidate_tag, &candidate))
- return false;
- candidates->push_back(candidate);
- }
-
- return true;
-}
-
-XmlElement* FormatIceCredentials(
- const JingleMessage::IceCredentials& credentials) {
- XmlElement* result =
- new XmlElement(QName(kIceTransportNamespace, "credentials"));
- result->SetAttr(QName(kEmptyNamespace, "channel"), credentials.channel);
- result->SetAttr(QName(kEmptyNamespace, "ufrag"), credentials.ufrag);
- result->SetAttr(QName(kEmptyNamespace, "password"), credentials.password);
- return result;
-}
-
-XmlElement* FormatIceCandidate(const JingleMessage::NamedCandidate& candidate) {
- XmlElement* result =
- new XmlElement(QName(kIceTransportNamespace, "candidate"));
- result->SetAttr(QName(kEmptyNamespace, "name"), candidate.name);
- result->SetAttr(QName(kEmptyNamespace, "foundation"),
- candidate.candidate.foundation());
- result->SetAttr(QName(kEmptyNamespace, "address"),
- candidate.candidate.address().ipaddr().ToString());
- result->SetAttr(QName(kEmptyNamespace, "port"),
- base::IntToString(candidate.candidate.address().port()));
- result->SetAttr(QName(kEmptyNamespace, "type"), candidate.candidate.type());
- result->SetAttr(QName(kEmptyNamespace, "protocol"),
- candidate.candidate.protocol());
- result->SetAttr(QName(kEmptyNamespace, "priority"),
- base::DoubleToString(candidate.candidate.priority()));
- result->SetAttr(QName(kEmptyNamespace, "generation"),
- base::IntToString(candidate.candidate.generation()));
- return result;
-}
-
-XmlElement* FormatGiceCandidate(
- const JingleMessage::NamedCandidate& candidate) {
+XmlElement* FormatCandidate(const JingleMessage::NamedCandidate& candidate) {
XmlElement* result =
- new XmlElement(QName(kGiceTransportNamespace, "candidate"));
+ new XmlElement(QName(kP2PTransportNamespace, "candidate"));
result->SetAttr(QName(kEmptyNamespace, "name"), candidate.name);
result->SetAttr(QName(kEmptyNamespace, "address"),
candidate.candidate.address().ipaddr().ToString());
@@ -259,6 +112,9 @@ XmlElement* FormatGiceCandidate(
} // namespace
+JingleMessage::NamedCandidate::NamedCandidate() {
+}
+
JingleMessage::NamedCandidate::NamedCandidate(
const std::string& name,
const cricket::Candidate& candidate)
@@ -266,12 +122,6 @@ JingleMessage::NamedCandidate::NamedCandidate(
candidate(candidate) {
}
-JingleMessage::IceCredentials::IceCredentials(std::string channel,
- std::string ufrag,
- std::string password)
- : channel(channel), ufrag(ufrag), password(password) {
-}
-
// static
bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) {
return stanza->Name() == QName(kJabberNamespace, "iq") &&
@@ -284,13 +134,19 @@ std::string JingleMessage::GetActionName(ActionType action) {
return ValueToName(kActionTypes, action);
}
-JingleMessage::JingleMessage() {
+JingleMessage::JingleMessage()
+ : action(UNKNOWN_ACTION),
+ reason(UNKNOWN_REASON) {
}
-JingleMessage::JingleMessage(const std::string& to,
- ActionType action,
- const std::string& sid)
- : to(to), action(action), sid(sid) {
+JingleMessage::JingleMessage(
+ const std::string& to_value,
+ ActionType action_value,
+ const std::string& sid_value)
+ : to(to_value),
+ action(action_value),
+ sid(sid_value),
+ reason(UNKNOWN_REASON) {
}
JingleMessage::~JingleMessage() {
@@ -384,26 +240,21 @@ bool JingleMessage::ParseXml(const buzz::XmlElement* stanza,
}
}
- const XmlElement* ice_transport_tag = content_tag->FirstNamed(
- QName(kIceTransportNamespace, "transport"));
- const XmlElement* gice_transport_tag = content_tag->FirstNamed(
- QName(kGiceTransportNamespace, "transport"));
- if (ice_transport_tag && gice_transport_tag) {
- *error = "ICE and GICE transport information is found in the same message";
- return false;
- } else if (ice_transport_tag) {
- standard_ice = true;
- if (!ParseIceTransportInfo(ice_transport_tag, &ice_credentials,
- &candidates)) {
- *error = "Failed to parse transport info";
- return false;
- }
- } else if (gice_transport_tag) {
- standard_ice = false;
- ice_credentials.clear();
- if (!ParseGiceTransportInfo(gice_transport_tag, &candidates)) {
- *error = "Failed to parse transport info";
- return false;
+ candidates.clear();
+ const XmlElement* transport_tag = content_tag->FirstNamed(
+ QName(kP2PTransportNamespace, "transport"));
+ if (transport_tag) {
+ QName qn_candidate(kP2PTransportNamespace, "candidate");
+ for (const XmlElement* candidate_tag =
+ transport_tag->FirstNamed(qn_candidate);
+ candidate_tag != nullptr;
+ candidate_tag = candidate_tag->NextNamed(qn_candidate)) {
+ NamedCandidate candidate;
+ if (!ParseCandidate(candidate_tag, &candidate)) {
+ *error = "Failed to parse candidates";
+ return false;
+ }
+ candidates.push_back(candidate);
}
}
@@ -462,27 +313,12 @@ scoped_ptr<buzz::XmlElement> JingleMessage::ToXml() const {
if (description.get())
content_tag->AddElement(description->ToXml());
- if (standard_ice) {
- XmlElement* transport_tag =
- new XmlElement(QName(kIceTransportNamespace, "transport"), true);
- content_tag->AddElement(transport_tag);
- for (std::list<IceCredentials>::const_iterator it =
- ice_credentials.begin();
- it != ice_credentials.end(); ++it) {
- transport_tag->AddElement(FormatIceCredentials(*it));
- }
- for (std::list<NamedCandidate>::const_iterator it = candidates.begin();
- it != candidates.end(); ++it) {
- transport_tag->AddElement(FormatIceCandidate(*it));
- }
- } else {
- XmlElement* transport_tag =
- new XmlElement(QName(kGiceTransportNamespace, "transport"), true);
- content_tag->AddElement(transport_tag);
- for (std::list<NamedCandidate>::const_iterator it = candidates.begin();
- it != candidates.end(); ++it) {
- transport_tag->AddElement(FormatGiceCandidate(*it));
- }
+ XmlElement* transport_tag =
+ new XmlElement(QName(kP2PTransportNamespace, "transport"), true);
+ content_tag->AddElement(transport_tag);
+ for (std::list<NamedCandidate>::const_iterator it = candidates.begin();
+ it != candidates.end(); ++it) {
+ transport_tag->AddElement(FormatCandidate(*it));
}
}