Chromium Code Reviews| 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 if (!socket->HasObserver(extension_->id())) { | |
|
imcheng
2017/06/16 23:39:25
Since we are thinking about sharing CastSocket acr
zhaobin
2017/06/20 00:54:36
Doing it a little differently.
1. Create one obse
| |
| 298 socket->AddObserver(extension_->id(), | |
|
mark a. foltz
2017/06/16 23:26:14
I think this code should only run once per extensi
zhaobin
2017/06/20 00:54:36
Yes.
Done.
| |
| 299 base::MakeUnique<CastMessageHandler>( | |
| 300 base::Bind(&CastChannelAPI::SendEvent, | |
| 301 api_->AsWeakPtr(), extension_->id()), | |
| 302 api_->GetLogger())); | |
| 303 } | |
| 297 // Construct read delegates. | 304 // Construct read delegates. |
| 298 std::unique_ptr<CastTransport::Delegate> delegate( | 305 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 } | 306 } |
| 306 | 307 |
| 307 void CastChannelOpenFunction::OnOpen(ChannelError result) { | 308 void CastChannelOpenFunction::OnOpen(ChannelError result) { |
| 308 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 309 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 309 VLOG(1) << "Connect finished, OnOpen invoked."; | 310 VLOG(1) << "Connect finished, OnOpen invoked."; |
| 310 // TODO: If we failed to open the CastSocket, we may want to clean up here, | 311 // 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 | 312 // rather than relying on the extension to call close(). This can be done by |
| 312 // calling RemoveSocket() and api_->GetLogger()->ClearLastError(channel_id). | 313 // calling RemoveSocket() and api_->GetLogger()->ClearLastError(channel_id). |
| 313 if (result != ChannelError::UNKNOWN) { | 314 if (result != ChannelError::UNKNOWN) { |
| 314 CastSocket* socket = cast_socket_service_->GetSocket(new_channel_id_); | 315 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); | 426 SetResultFromSocket(*socket); |
| 426 // This will delete |socket|. | 427 // This will delete |socket|. |
| 427 cast_socket_service_->RemoveSocket(channel_id); | 428 cast_socket_service_->RemoveSocket(channel_id); |
| 428 api_->GetLogger()->ClearLastError(channel_id); | 429 api_->GetLogger()->ClearLastError(channel_id); |
| 429 } | 430 } |
| 430 AsyncWorkCompleted(); | 431 AsyncWorkCompleted(); |
| 431 } | 432 } |
| 432 | 433 |
| 433 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( | 434 CastChannelOpenFunction::CastMessageHandler::CastMessageHandler( |
| 434 const EventDispatchCallback& ui_dispatch_cb, | 435 const EventDispatchCallback& ui_dispatch_cb, |
| 435 CastSocket* socket, | |
| 436 scoped_refptr<Logger> logger) | 436 scoped_refptr<Logger> logger) |
| 437 : ui_dispatch_cb_(ui_dispatch_cb), socket_(socket), logger_(logger) { | 437 : ui_dispatch_cb_(ui_dispatch_cb), logger_(logger) { |
| 438 DCHECK(socket_); | |
| 439 DCHECK(logger_); | 438 DCHECK(logger_); |
| 440 } | 439 } |
| 441 | 440 |
| 442 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { | 441 CastChannelOpenFunction::CastMessageHandler::~CastMessageHandler() { |
| 443 } | 442 } |
| 444 | 443 |
| 445 void CastChannelOpenFunction::CastMessageHandler::OnError( | 444 void CastChannelOpenFunction::CastMessageHandler::OnError( |
| 445 const cast_channel::CastSocket& socket, | |
| 446 ChannelError error_state) { | 446 ChannelError error_state) { |
| 447 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 447 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 448 | 448 |
| 449 ChannelInfo channel_info; | 449 ChannelInfo channel_info; |
| 450 FillChannelInfo(*socket_, &channel_info); | 450 FillChannelInfo(socket, &channel_info); |
| 451 channel_info.error_state = api::cast_channel::ToChannelError(error_state); | 451 channel_info.error_state = api::cast_channel::ToChannelError(error_state); |
| 452 ErrorInfo error_info; | 452 ErrorInfo error_info; |
| 453 FillErrorInfo(channel_info.error_state, logger_->GetLastError(socket_->id()), | 453 FillErrorInfo(channel_info.error_state, logger_->GetLastError(socket.id()), |
| 454 &error_info); | 454 &error_info); |
| 455 | 455 |
| 456 std::unique_ptr<base::ListValue> results = | 456 std::unique_ptr<base::ListValue> results = |
| 457 OnError::Create(channel_info, error_info); | 457 OnError::Create(channel_info, error_info); |
| 458 std::unique_ptr<Event> event(new Event( | 458 std::unique_ptr<Event> event(new Event( |
| 459 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); | 459 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); |
| 460 BrowserThread::PostTask( | 460 BrowserThread::PostTask( |
| 461 BrowserThread::UI, FROM_HERE, | 461 BrowserThread::UI, FROM_HERE, |
| 462 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 462 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
| 463 } | 463 } |
| 464 | 464 |
| 465 void CastChannelOpenFunction::CastMessageHandler::OnMessage( | 465 void CastChannelOpenFunction::CastMessageHandler::OnMessage( |
| 466 const cast_channel::CastSocket& socket, | |
| 466 const CastMessage& message) { | 467 const CastMessage& message) { |
| 467 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 468 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 468 | 469 |
| 469 MessageInfo message_info; | 470 MessageInfo message_info; |
| 470 CastMessageToMessageInfo(message, &message_info); | 471 CastMessageToMessageInfo(message, &message_info); |
| 471 ChannelInfo channel_info; | 472 ChannelInfo channel_info; |
| 472 FillChannelInfo(*socket_, &channel_info); | 473 FillChannelInfo(socket, &channel_info); |
| 473 VLOG(1) << "Received message " << ParamToString(message_info) | 474 VLOG(1) << "Received message " << ParamToString(message_info) |
| 474 << " on channel " << ParamToString(channel_info); | 475 << " on channel " << ParamToString(channel_info); |
| 475 | 476 |
| 476 std::unique_ptr<base::ListValue> results = | 477 std::unique_ptr<base::ListValue> results = |
| 477 OnMessage::Create(channel_info, message_info); | 478 OnMessage::Create(channel_info, message_info); |
| 478 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, | 479 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, |
| 479 OnMessage::kEventName, | 480 OnMessage::kEventName, |
| 480 std::move(results))); | 481 std::move(results))); |
| 481 BrowserThread::PostTask( | 482 BrowserThread::PostTask( |
| 482 BrowserThread::UI, FROM_HERE, | 483 BrowserThread::UI, FROM_HERE, |
| 483 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); | 484 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event)))); |
| 484 } | 485 } |
| 485 | 486 |
| 486 void CastChannelOpenFunction::CastMessageHandler::Start() { | |
| 487 } | |
| 488 | |
| 489 } // namespace extensions | 487 } // namespace extensions |
| OLD | NEW |