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

Side by Side 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, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698