OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/extensions/api/cast_channel/cast_channel_api.h" | 5 #include "chrome/browser/extensions/api/cast_channel/cast_channel_api.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 EXTENSION_FUNCTION_VALIDATE(params_.get()); | 273 EXTENSION_FUNCTION_VALIDATE(params_.get()); |
274 // The connect_info parameter may be a string URL like cast:// or casts:// or | 274 // The connect_info parameter may be a string URL like cast:// or casts:// or |
275 // a ConnectInfo object. | 275 // a ConnectInfo object. |
276 std::string cast_url; | 276 std::string cast_url; |
277 switch (params_->connect_info->GetType()) { | 277 switch (params_->connect_info->GetType()) { |
278 case base::Value::TYPE_STRING: | 278 case base::Value::TYPE_STRING: |
279 CHECK(params_->connect_info->GetAsString(&cast_url)); | 279 CHECK(params_->connect_info->GetAsString(&cast_url)); |
280 connect_info_.reset(new ConnectInfo); | 280 connect_info_.reset(new ConnectInfo); |
281 if (!ParseChannelUrl(GURL(cast_url), connect_info_.get())) { | 281 if (!ParseChannelUrl(GURL(cast_url), connect_info_.get())) { |
282 connect_info_.reset(); | 282 connect_info_.reset(); |
283 SetError("Invalid Cast URL " + cast_url); | |
284 return false; | |
283 } | 285 } |
284 break; | 286 break; |
285 case base::Value::TYPE_DICTIONARY: | 287 case base::Value::TYPE_DICTIONARY: |
286 connect_info_ = ConnectInfo::FromValue(*(params_->connect_info)); | 288 connect_info_ = ConnectInfo::FromValue(*(params_->connect_info)); |
287 break; | 289 break; |
288 default: | 290 default: |
289 break; | 291 break; |
290 } | 292 } |
291 if (connect_info_.get()) { | 293 if (connect_info_.get()) { |
292 channel_auth_ = connect_info_->auth; | 294 channel_auth_ = connect_info_->auth; |
293 ip_endpoint_.reset(ParseConnectInfo(*connect_info_)); | 295 ip_endpoint_.reset(ParseConnectInfo(*connect_info_)); |
294 return ip_endpoint_.get() != NULL; | 296 if (!ip_endpoint_.get()) { |
297 SetError("Invalid connect_info"); | |
298 } | |
299 } else { | |
300 SetError("Invalid connect_info"); | |
295 } | 301 } |
296 return false; | 302 return ip_endpoint_.get() != NULL; |
297 } | 303 } |
298 | 304 |
299 void CastChannelOpenFunction::AsyncWorkStart() { | 305 void CastChannelOpenFunction::AsyncWorkStart() { |
300 DCHECK(api_); | 306 DCHECK(api_); |
301 DCHECK(ip_endpoint_.get()); | 307 DCHECK(ip_endpoint_.get()); |
302 scoped_ptr<CastSocket> socket = api_->CreateCastSocket( | 308 scoped_ptr<CastSocket> socket = api_->CreateCastSocket( |
303 extension_->id(), *ip_endpoint_, channel_auth_); | 309 extension_->id(), *ip_endpoint_, channel_auth_); |
304 new_channel_id_ = AddSocket(socket.release()); | 310 new_channel_id_ = AddSocket(socket.release()); |
305 GetSocket(new_channel_id_)->Connect( | 311 GetSocket(new_channel_id_)->Connect( |
306 base::Bind(&CastChannelOpenFunction::OnOpen, this)); | 312 base::Bind(&CastChannelOpenFunction::OnOpen, this)); |
307 } | 313 } |
308 | 314 |
309 void CastChannelOpenFunction::OnOpen(int result) { | 315 void CastChannelOpenFunction::OnOpen(int result) { |
310 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 316 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
311 SetResultFromSocket(new_channel_id_); | 317 SetResultFromSocket(new_channel_id_); |
312 AsyncWorkCompleted(); | 318 AsyncWorkCompleted(); |
313 } | 319 } |
314 | 320 |
315 CastChannelSendFunction::CastChannelSendFunction() { } | 321 CastChannelSendFunction::CastChannelSendFunction() { } |
316 | 322 |
317 CastChannelSendFunction::~CastChannelSendFunction() { } | 323 CastChannelSendFunction::~CastChannelSendFunction() { } |
318 | 324 |
319 bool CastChannelSendFunction::Prepare() { | 325 bool CastChannelSendFunction::Prepare() { |
320 params_ = Send::Params::Create(*args_); | 326 params_ = Send::Params::Create(*args_); |
321 EXTENSION_FUNCTION_VALIDATE(params_.get()); | 327 EXTENSION_FUNCTION_VALIDATE(params_.get()); |
322 return true; | 328 if (params_->message.namespace_.empty()) { |
329 SetError("message_info.namespace_ is required"); | |
330 return false; | |
331 } | |
332 if (params_->message.source_id.empty()) { | |
333 SetError("message_info.source_id is required"); | |
334 return false; | |
335 } | |
336 if (params_->message.destination_id.empty()) { | |
337 SetError("message_info.destination_id is required"); | |
338 return false; | |
339 } | |
340 switch (params_->message.data->GetType()) { | |
341 case base::Value::TYPE_STRING: | |
342 case base::Value::TYPE_BINARY: | |
343 return true; | |
imcheng
2014/04/24 22:13:18
super nit: I'd prefer to see validation logic retu
| |
344 default: | |
345 break; | |
346 } | |
347 SetError("Invalid type of message_info.data"); | |
348 return false; | |
323 } | 349 } |
324 | 350 |
325 void CastChannelSendFunction::AsyncWorkStart() { | 351 void CastChannelSendFunction::AsyncWorkStart() { |
326 CastSocket* socket = GetSocketOrCompleteWithError( | 352 CastSocket* socket = GetSocketOrCompleteWithError( |
327 params_->channel.channel_id); | 353 params_->channel.channel_id); |
328 if (socket) | 354 if (socket) |
329 socket->SendMessage(params_->message, | 355 socket->SendMessage(params_->message, |
330 base::Bind(&CastChannelSendFunction::OnSend, this)); | 356 base::Bind(&CastChannelSendFunction::OnSend, this)); |
331 } | 357 } |
332 | 358 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
364 SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR); | 390 SetResultFromError(cast_channel::CHANNEL_ERROR_SOCKET_ERROR); |
365 } else { | 391 } else { |
366 int channel_id = params_->channel.channel_id; | 392 int channel_id = params_->channel.channel_id; |
367 SetResultFromSocket(channel_id); | 393 SetResultFromSocket(channel_id); |
368 RemoveSocket(channel_id); | 394 RemoveSocket(channel_id); |
369 } | 395 } |
370 AsyncWorkCompleted(); | 396 AsyncWorkCompleted(); |
371 } | 397 } |
372 | 398 |
373 } // namespace extensions | 399 } // namespace extensions |
OLD | NEW |