OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/content_description.h" | 5 #include "remoting/protocol/content_description.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/authenticator.h" | 10 #include "remoting/protocol/authenticator.h" |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 const XmlElement* const element, | 228 const XmlElement* const element, |
229 const char tag_name[], | 229 const char tag_name[], |
230 bool codec_required, | 230 bool codec_required, |
231 bool optional, | 231 bool optional, |
232 std::vector<ChannelConfig>* const configs) { | 232 std::vector<ChannelConfig>* const configs) { |
233 | 233 |
234 QName tag(kChromotingXmlNamespace, tag_name); | 234 QName tag(kChromotingXmlNamespace, tag_name); |
235 const XmlElement* child = element->FirstNamed(tag); | 235 const XmlElement* child = element->FirstNamed(tag); |
236 while (child) { | 236 while (child) { |
237 ChannelConfig channel_config; | 237 ChannelConfig channel_config; |
238 if (!ParseChannelConfig(child, codec_required, &channel_config)) | 238 if (ParseChannelConfig(child, codec_required, &channel_config)) { |
239 return false; | 239 configs->push_back(channel_config); |
240 configs->push_back(channel_config); | 240 } |
241 child = child->NextNamed(tag); | 241 child = child->NextNamed(tag); |
242 } | 242 } |
243 if (optional && configs->empty()) { | 243 if (optional && configs->empty()) { |
244 // If there's no mention of the tag, implicitly assume | 244 // If there's no mention of the tag, implicitly assume |
245 // TRANSPORT_NONE for the channel. | 245 // TRANSPORT_NONE for the channel. |
246 configs->push_back(ChannelConfig(ChannelConfig::TRANSPORT_NONE, | 246 configs->push_back(ChannelConfig(ChannelConfig::TRANSPORT_NONE, |
247 kDefaultStreamVersion, | 247 kDefaultStreamVersion, |
248 ChannelConfig::CODEC_VERBATIM)); | 248 ChannelConfig::CODEC_VERBATIM)); |
249 } | 249 } |
250 return true; | 250 return true; |
251 } | 251 } |
252 | 252 |
253 // static | 253 // static |
254 ContentDescription* ContentDescription::ParseXml( | 254 scoped_ptr<ContentDescription> ContentDescription::ParseXml( |
255 const XmlElement* element) { | 255 const XmlElement* element) { |
256 if (element->Name() == QName(kChromotingXmlNamespace, kDescriptionTag)) { | 256 if (element->Name() != QName(kChromotingXmlNamespace, kDescriptionTag)) { |
257 scoped_ptr<CandidateSessionConfig> config( | 257 LOG(ERROR) << "Invalid description: " << element->Str(); |
258 CandidateSessionConfig::CreateEmpty()); | 258 return scoped_ptr<ContentDescription>(); |
259 const XmlElement* child = NULL; | 259 } |
| 260 scoped_ptr<CandidateSessionConfig> config( |
| 261 CandidateSessionConfig::CreateEmpty()); |
| 262 if (!ParseChannelConfigs(element, kControlTag, false, false, |
| 263 config->mutable_control_configs()) || |
| 264 !ParseChannelConfigs(element, kEventTag, false, false, |
| 265 config->mutable_event_configs()) || |
| 266 !ParseChannelConfigs(element, kVideoTag, true, false, |
| 267 config->mutable_video_configs()) || |
| 268 !ParseChannelConfigs(element, kAudioTag, true, true, |
| 269 config->mutable_audio_configs())) { |
| 270 return scoped_ptr<ContentDescription>(); |
| 271 } |
260 | 272 |
261 if (!ParseChannelConfigs(element, kControlTag, false, false, | 273 scoped_ptr<XmlElement> authenticator_message; |
262 config->mutable_control_configs())) { | 274 const XmlElement* child = Authenticator::FindAuthenticatorMessage(element); |
263 return NULL; | 275 if (child) |
264 } | 276 authenticator_message.reset(new XmlElement(*child)); |
265 if (!ParseChannelConfigs(element, kEventTag, false, false, | |
266 config->mutable_event_configs())) { | |
267 return NULL; | |
268 } | |
269 if (!ParseChannelConfigs(element, kVideoTag, true, false, | |
270 config->mutable_video_configs())) { | |
271 return NULL; | |
272 } | |
273 if (!ParseChannelConfigs(element, kAudioTag, true, true, | |
274 config->mutable_audio_configs())) { | |
275 return NULL; | |
276 } | |
277 | 277 |
278 scoped_ptr<XmlElement> authenticator_message; | 278 return scoped_ptr<ContentDescription>( |
279 child = Authenticator::FindAuthenticatorMessage(element); | 279 new ContentDescription(config.Pass(), authenticator_message.Pass())); |
280 if (child) | |
281 authenticator_message.reset(new XmlElement(*child)); | |
282 | |
283 return new ContentDescription(config.Pass(), authenticator_message.Pass()); | |
284 } | |
285 LOG(ERROR) << "Invalid description: " << element->Str(); | |
286 return NULL; | |
287 } | 280 } |
288 | 281 |
289 } // namespace protocol | 282 } // namespace protocol |
290 } // namespace remoting | 283 } // namespace remoting |
OLD | NEW |