OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_channel_api.h" | 5 #include "extensions/browser/api/cast_channel/cast_channel_api.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <limits> | 10 #include <limits> |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 *ip_endpoint_, ExtensionsBrowserClient::Get()->GetNetLog(), | 287 *ip_endpoint_, ExtensionsBrowserClient::Get()->GetNetLog(), |
288 base::TimeDelta::FromMilliseconds(connect_info.timeout.get() | 288 base::TimeDelta::FromMilliseconds(connect_info.timeout.get() |
289 ? *connect_info.timeout | 289 ? *connect_info.timeout |
290 : kDefaultConnectTimeoutMillis), | 290 : kDefaultConnectTimeoutMillis), |
291 liveness_timeout_, ping_interval_, api_->GetLogger(), | 291 liveness_timeout_, ping_interval_, api_->GetLogger(), |
292 connect_info.capabilities.get() ? *connect_info.capabilities | 292 connect_info.capabilities.get() ? *connect_info.capabilities |
293 : CastDeviceCapability::NONE); | 293 : CastDeviceCapability::NONE); |
294 } | 294 } |
295 new_channel_id_ = cast_socket_service_->AddSocket(base::WrapUnique(socket)); | 295 new_channel_id_ = cast_socket_service_->AddSocket(base::WrapUnique(socket)); |
296 | 296 |
| 297 auto* observer = cast_socket_service_->GetObserver(extension_->id()); |
| 298 if (!observer) { |
| 299 observer = cast_socket_service_->AddObserver( |
| 300 extension_->id(), base::MakeUnique<CastMessageHandler>( |
| 301 base::Bind(&CastChannelAPI::SendEvent, |
| 302 api_->AsWeakPtr(), extension_->id()), |
| 303 api_->GetLogger())); |
| 304 } |
| 305 |
| 306 socket->AddObserver(observer); |
297 // Construct read delegates. | 307 // Construct read delegates. |
298 std::unique_ptr<CastTransport::Delegate> delegate( | 308 socket->Connect(base::Bind(&CastChannelOpenFunction::OnOpen, this)); |
299 base::MakeUnique<CastMessageHandler>( | |
300 base::Bind(&CastChannelAPI::SendEvent, api_->AsWeakPtr(), | |
301 extension_->id()), | |
302 socket, api_->GetLogger())); | |
303 socket->Connect(std::move(delegate), | |
304 base::Bind(&CastChannelOpenFunction::OnOpen, this)); | |
305 } | 309 } |
306 | 310 |
307 void CastChannelOpenFunction::OnOpen(ChannelError result) { | 311 void CastChannelOpenFunction::OnOpen(ChannelError result) { |
308 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 312 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
309 VLOG(1) << "Connect finished, OnOpen invoked."; | 313 VLOG(1) << "Connect finished, OnOpen invoked."; |
310 // TODO: If we failed to open the CastSocket, we may want to clean up here, | 314 // TODO: If we failed to open the CastSocket, we may want to clean up here, |
311 // rather than relying on the extension to call close(). This can be done by | 315 // rather than relying on the extension to call close(). This can be done by |
312 // calling RemoveSocket() and api_->GetLogger()->ClearLastError(channel_id). | 316 // calling RemoveSocket() and api_->GetLogger()->ClearLastError(channel_id). |
313 if (result != ChannelError::UNKNOWN) { | 317 if (result != ChannelError::UNKNOWN) { |
314 CastSocket* socket = cast_socket_service_->GetSocket(new_channel_id_); | 318 CastSocket* socket = cast_socket_service_->GetSocket(new_channel_id_); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 SetResultFromSocket(*socket); | 429 SetResultFromSocket(*socket); |
426 // This will delete |socket|. | 430 // This will delete |socket|. |
427 cast_socket_service_->RemoveSocket(channel_id); | 431 cast_socket_service_->RemoveSocket(channel_id); |
428 api_->GetLogger()->ClearLastError(channel_id); | 432 api_->GetLogger()->ClearLastError(channel_id); |
429 } | 433 } |
430 AsyncWorkCompleted(); | 434 AsyncWorkCompleted(); |
431 } | 435 } |
432 | 436 |
433 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( | 437 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( |
434 const EventDispatchCallback& ui_dispatch_cb, | 438 const EventDispatchCallback& ui_dispatch_cb, |
435 CastSocket* socket, | |
436 scoped_refptr<Logger> logger) | 439 scoped_refptr<Logger> logger) |
437 : ui_dispatch_cb_(ui_dispatch_cb), socket_(socket), logger_(logger) { | 440 : ui_dispatch_cb_(ui_dispatch_cb), logger_(logger) { |
438 DCHECK(socket_); | |
439 DCHECK(logger_); | 441 DCHECK(logger_); |
440 } | 442 } |
441 | 443 |
442 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { | 444 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { |
443 } | 445 } |
444 | 446 |
445 void CastChannelOpenFunction::CastMessageHandler::OnError( | 447 void CastChannelOpenFunction::CastMessageHandler::OnError( |
| 448 const cast_channel::CastSocket& socket, |
446 ChannelError error_state) { | 449 ChannelError error_state) { |
447 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 450 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
448 | 451 |
449 ChannelInfo channel_info; | 452 ChannelInfo channel_info; |
450 FillChannelInfo(*socket_, &channel_info); | 453 FillChannelInfo(socket, &channel_info); |
451 channel_info.error_state = api::cast_channel::ToChannelError(error_state); | 454 channel_info.error_state = api::cast_channel::ToChannelError(error_state); |
452 ErrorInfo error_info; | 455 ErrorInfo error_info; |
453 FillErrorInfo(channel_info.error_state, logger_->GetLastError(socket_->id()), | 456 FillErrorInfo(channel_info.error_state, logger_->GetLastError(socket.id()), |
454 &error_info); | 457 &error_info); |
455 | 458 |
456 std::unique_ptr<base::ListValue> results = | 459 std::unique_ptr<base::ListValue> results = |
457 OnError::Create(channel_info, error_info); | 460 OnError::Create(channel_info, error_info); |
458 std::unique_ptr<Event> event(new Event( | 461 std::unique_ptr<Event> event(new Event( |
459 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); | 462 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); |
460 BrowserThread::PostTask( | 463 BrowserThread::PostTask( |
461 BrowserThread::UI, FROM_HERE, | 464 BrowserThread::UI, FROM_HERE, |
462 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 465 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
463 } | 466 } |
464 | 467 |
465 void CastChannelOpenFunction::CastMessageHandler::OnMessage( | 468 void CastChannelOpenFunction::CastMessageHandler::OnMessage( |
| 469 const cast_channel::CastSocket& socket, |
466 const CastMessage& message) { | 470 const CastMessage& message) { |
467 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 471 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
468 | 472 |
469 MessageInfo message_info; | 473 MessageInfo message_info; |
470 CastMessageToMessageInfo(message, &message_info); | 474 CastMessageToMessageInfo(message, &message_info); |
471 ChannelInfo channel_info; | 475 ChannelInfo channel_info; |
472 FillChannelInfo(*socket_, &channel_info); | 476 FillChannelInfo(socket, &channel_info); |
473 VLOG(1) << "Received message " << ParamToString(message_info) | 477 VLOG(1) << "Received message " << ParamToString(message_info) |
474 << " on channel " << ParamToString(channel_info); | 478 << " on channel " << ParamToString(channel_info); |
475 | 479 |
476 std::unique_ptr<base::ListValue> results = | 480 std::unique_ptr<base::ListValue> results = |
477 OnMessage::Create(channel_info, message_info); | 481 OnMessage::Create(channel_info, message_info); |
478 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, | 482 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, |
479 OnMessage::kEventName, | 483 OnMessage::kEventName, |
480 std::move(results))); | 484 std::move(results))); |
481 BrowserThread::PostTask( | 485 BrowserThread::PostTask( |
482 BrowserThread::UI, FROM_HERE, | 486 BrowserThread::UI, FROM_HERE, |
483 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 487 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
484 } | 488 } |
485 | 489 |
486 void CastChannelOpenFunction::CastMessageHandler::Start() { | |
487 } | |
488 | |
489 } // namespace extensions | 490 } // namespace extensions |
OLD | NEW |