Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/protocol/jingle_messages.h" | 5 #include "remoting/protocol/jingle_messages.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
| 9 #include "remoting/base/constants.h" | 9 #include "remoting/base/constants.h" |
| 10 #include "remoting/protocol/content_description.h" | 10 #include "remoting/protocol/content_description.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 const char kP2PTransportNamespace[] = "http://www.google.com/transport/p2p"; | 22 const char kP2PTransportNamespace[] = "http://www.google.com/transport/p2p"; |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const char kEmptyNamespace[] = ""; | 26 const char kEmptyNamespace[] = ""; |
| 27 const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace"; | 27 const char kXmlNamespace[] = "http://www.w3.org/XML/1998/namespace"; |
| 28 | 28 |
| 29 const char kSessionInitiateAction[] = "session-initiate"; | 29 const char kSessionInitiateAction[] = "session-initiate"; |
| 30 const char kSessionAcceptAction[] = "session-accept"; | 30 const char kSessionAcceptAction[] = "session-accept"; |
| 31 const char kSessionTerminateAction[] = "session-terminate"; | 31 const char kSessionTerminateAction[] = "session-terminate"; |
| 32 const char kSessionRejectAction[] = "session-return"; | |
| 33 const char kTransportInfoAction[] = "transport-info"; | 32 const char kTransportInfoAction[] = "transport-info"; |
| 34 | 33 |
| 35 const int kPortMin = 1000; | 34 const int kPortMin = 1000; |
| 36 const int kPortMax = 65535; | 35 const int kPortMax = 65535; |
| 37 | 36 |
| 38 bool ParseCandidate(const buzz::XmlElement* element, | 37 bool ParseCandidate(const buzz::XmlElement* element, |
| 39 cricket::Candidate* candidate) { | 38 cricket::Candidate* candidate) { |
| 40 DCHECK(element->Name() == QName(kP2PTransportNamespace, "candidate")); | 39 DCHECK(element->Name() == QName(kP2PTransportNamespace, "candidate")); |
| 41 | 40 |
| 42 const std::string& name = element->Attr(QName(kEmptyNamespace, "name")); | 41 const std::string& name = element->Attr(QName(kEmptyNamespace, "name")); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 | 97 |
| 99 } // namespace | 98 } // namespace |
| 100 | 99 |
| 101 // static | 100 // static |
| 102 bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) { | 101 bool JingleMessage::IsJingleMessage(const buzz::XmlElement* stanza) { |
| 103 return stanza->FirstNamed(QName(kJingleNamespace, "jingle")) != NULL; | 102 return stanza->FirstNamed(QName(kJingleNamespace, "jingle")) != NULL; |
| 104 } | 103 } |
| 105 | 104 |
| 106 JingleMessage::JingleMessage() | 105 JingleMessage::JingleMessage() |
| 107 : action(UNKNOWN_ACTION), | 106 : action(UNKNOWN_ACTION), |
| 108 termination_reason(kJingleNamespace, "success") { | 107 reason(UNKNOWN_REASON) { |
| 109 } | 108 } |
| 110 | 109 |
| 111 JingleMessage::JingleMessage( | 110 JingleMessage::JingleMessage( |
| 112 const std::string& to_value, | 111 const std::string& to_value, |
| 113 ActionType action_value, | 112 ActionType action_value, |
| 114 const std::string& sid_value) | 113 const std::string& sid_value) |
| 115 : to(to_value), | 114 : to(to_value), |
| 116 action(action_value), | 115 action(action_value), |
| 117 sid(sid_value) { | 116 sid(sid_value) { |
| 118 } | 117 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 135 std::string action_str = jingle_tag->Attr(QName(kEmptyNamespace, "action")); | 134 std::string action_str = jingle_tag->Attr(QName(kEmptyNamespace, "action")); |
| 136 if (action_str.empty()) { | 135 if (action_str.empty()) { |
| 137 *error = "action attribute is missing"; | 136 *error = "action attribute is missing"; |
| 138 return false; | 137 return false; |
| 139 } else if (action_str == kSessionInitiateAction) { | 138 } else if (action_str == kSessionInitiateAction) { |
| 140 action = SESSION_INITIATE; | 139 action = SESSION_INITIATE; |
| 141 } else if (action_str == kSessionAcceptAction) { | 140 } else if (action_str == kSessionAcceptAction) { |
| 142 action = SESSION_ACCEPT; | 141 action = SESSION_ACCEPT; |
| 143 } else if (action_str == kSessionTerminateAction) { | 142 } else if (action_str == kSessionTerminateAction) { |
| 144 action = SESSION_TERMINATE; | 143 action = SESSION_TERMINATE; |
| 145 } else if (action_str == kSessionRejectAction) { | |
| 146 action = SESSION_REJECT; | |
| 147 } else if (action_str == kTransportInfoAction) { | 144 } else if (action_str == kTransportInfoAction) { |
| 148 action = TRANSPORT_INFO; | 145 action = TRANSPORT_INFO; |
| 149 } else { | 146 } else { |
| 150 *error = "Unknown action " + action_str; | 147 *error = "Unknown action " + action_str; |
| 151 return false; | 148 return false; |
| 152 } | 149 } |
| 153 | 150 |
| 154 sid = jingle_tag->Attr(QName(kEmptyNamespace, "sid")); | 151 sid = jingle_tag->Attr(QName(kEmptyNamespace, "sid")); |
| 155 if (sid.empty()) { | 152 if (sid.empty()) { |
| 156 *error = "sid attribute is missing"; | 153 *error = "sid attribute is missing"; |
| 157 return false; | 154 return false; |
| 158 } | 155 } |
| 159 | 156 |
| 160 if (action == SESSION_TERMINATE || action == SESSION_REJECT) { | 157 const XmlElement* reason_tag = |
| 161 const XmlElement* reason_tag = | 158 jingle_tag->FirstNamed(QName(kJingleNamespace, "reason")); |
| 162 jingle_tag->FirstNamed(QName(kJingleNamespace, "reason")); | 159 if (reason_tag && reason_tag->FirstElement()) { |
| 163 if (reason_tag && reason_tag->FirstElement()) | 160 const QName& reason_qname(reason_tag->FirstElement()->Name()); |
| 164 termination_reason = reason_tag->FirstElement()->Name(); | 161 if (reason_qname == QName(kJingleNamespace, "success")) { |
| 162 reason = SUCCESS; | |
| 163 } else if (reason_qname == QName(kJingleNamespace, "decline")) { | |
| 164 reason = DECLINED; | |
| 165 } else if (reason_qname == | |
| 166 QName(kJingleNamespace, "incompatible-parameters")) { | |
| 167 reason = INCOMPATIBLE_PARAMETERS; | |
| 168 } else { | |
| 169 reason = UNKNOWN_REASON; | |
| 170 } | |
| 171 } | |
| 172 | |
| 173 if (action == SESSION_TERMINATE) | |
| 165 return true; | 174 return true; |
| 166 } | |
| 167 | 175 |
| 168 const XmlElement* content_tag = | 176 const XmlElement* content_tag = |
| 169 jingle_tag->FirstNamed(QName(kJingleNamespace, "content")); | 177 jingle_tag->FirstNamed(QName(kJingleNamespace, "content")); |
| 170 if (!content_tag) { | 178 if (!content_tag) { |
| 171 *error = "content tag is missing"; | 179 *error = "content tag is missing"; |
| 172 return false; | 180 return false; |
| 173 } | 181 } |
| 174 | 182 |
| 175 std::string content_name = content_tag->Attr(QName(kEmptyNamespace, "name")); | 183 std::string content_name = content_tag->Attr(QName(kEmptyNamespace, "name")); |
| 176 if (content_name != ContentDescription::kChromotingContentName) { | 184 if (content_name != ContentDescription::kChromotingContentName) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 234 switch (action) { | 242 switch (action) { |
| 235 case SESSION_INITIATE: | 243 case SESSION_INITIATE: |
| 236 action_attr = kSessionInitiateAction; | 244 action_attr = kSessionInitiateAction; |
| 237 break; | 245 break; |
| 238 case SESSION_ACCEPT: | 246 case SESSION_ACCEPT: |
| 239 action_attr = kSessionAcceptAction; | 247 action_attr = kSessionAcceptAction; |
| 240 break; | 248 break; |
| 241 case SESSION_TERMINATE: | 249 case SESSION_TERMINATE: |
| 242 action_attr = kSessionTerminateAction; | 250 action_attr = kSessionTerminateAction; |
| 243 break; | 251 break; |
| 244 case SESSION_REJECT: | |
| 245 action_attr = kSessionRejectAction; | |
| 246 break; | |
| 247 case TRANSPORT_INFO: | 252 case TRANSPORT_INFO: |
| 248 action_attr = kTransportInfoAction; | 253 action_attr = kTransportInfoAction; |
| 249 break; | 254 break; |
| 250 default: | 255 default: |
| 251 NOTREACHED(); | 256 NOTREACHED(); |
| 252 break; | 257 break; |
| 253 } | 258 } |
| 254 jingle_tag->AddAttr(QName(kEmptyNamespace, "action"), action_attr); | 259 jingle_tag->AddAttr(QName(kEmptyNamespace, "action"), action_attr); |
| 255 | 260 |
| 256 if (action == SESSION_INITIATE) | 261 if (action == SESSION_INITIATE) |
| 257 jingle_tag->AddAttr(QName(kEmptyNamespace, "initiator"), from); | 262 jingle_tag->AddAttr(QName(kEmptyNamespace, "initiator"), from); |
| 258 | 263 |
| 259 if (action == SESSION_TERMINATE || action == SESSION_REJECT) { | 264 if (reason != UNKNOWN_REASON) { |
| 260 XmlElement* reason_tag = new XmlElement(QName(kJingleNamespace, "reason")); | 265 XmlElement* reason_tag = new XmlElement(QName(kJingleNamespace, "reason")); |
| 261 jingle_tag->AddElement(reason_tag); | 266 jingle_tag->AddElement(reason_tag); |
| 267 std::string reason_string; | |
| 268 switch (reason) { | |
| 269 case SUCCESS: | |
| 270 reason_string = "success"; | |
| 271 break; | |
| 272 case DECLINED: | |
| 273 reason_string = "decline"; | |
| 274 break; | |
| 275 case INCOMPATIBLE_PARAMETERS: | |
| 276 reason_string = "incompatible-parameters"; | |
| 277 break; | |
| 278 default: | |
| 279 DLOG(FATAL) << "Invalid reason: " << reason; | |
| 280 reason_string = "success"; | |
| 281 } | |
|
simonmorris
2011/09/26 23:33:44
Factor out the map from Reason to string, so it do
Sergey Ulanov
2011/09/27 01:09:46
Done. Also refactored ActionType->string mapping.
| |
| 282 reason_tag->AddElement(new XmlElement( | |
| 283 QName(kJingleNamespace, reason_string))); | |
| 284 } | |
| 262 | 285 |
| 263 reason_tag->AddElement(new XmlElement(termination_reason)); | 286 if (action != SESSION_TERMINATE) { |
| 264 } else { | |
| 265 XmlElement* content_tag = | 287 XmlElement* content_tag = |
| 266 new XmlElement(QName(kJingleNamespace, "content")); | 288 new XmlElement(QName(kJingleNamespace, "content")); |
| 267 jingle_tag->AddElement(content_tag); | 289 jingle_tag->AddElement(content_tag); |
| 268 | 290 |
| 269 content_tag->AddAttr(QName(kEmptyNamespace, "name"), | 291 content_tag->AddAttr(QName(kEmptyNamespace, "name"), |
| 270 ContentDescription::kChromotingContentName); | 292 ContentDescription::kChromotingContentName); |
| 271 content_tag->AddAttr(QName(kEmptyNamespace, "creator"), "initiator"); | 293 content_tag->AddAttr(QName(kEmptyNamespace, "creator"), "initiator"); |
| 272 | 294 |
| 273 if (description.get()) | 295 if (description.get()) |
| 274 content_tag->AddElement(description->ToXml()); | 296 content_tag->AddElement(description->ToXml()); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 text_elem->SetAttr(QName(kXmlNamespace, "lang"), "en"); | 398 text_elem->SetAttr(QName(kXmlNamespace, "lang"), "en"); |
| 377 text_elem->SetBodyText(error_text); | 399 text_elem->SetBodyText(error_text); |
| 378 error->AddElement(text_elem); | 400 error->AddElement(text_elem); |
| 379 } | 401 } |
| 380 | 402 |
| 381 return iq; | 403 return iq; |
| 382 } | 404 } |
| 383 | 405 |
| 384 } // namespace protocol | 406 } // namespace protocol |
| 385 } // namespace remoting | 407 } // namespace remoting |
| OLD | NEW |