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

Side by Side Diff: extensions/browser/api/cast_channel/cast_channel_api.cc

Issue 2891023002: [cast_channel] Make CastSocket not inherit from ApiResource (Closed)
Patch Set: resolve code review comments from Derek Created 3 years, 6 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
OLDNEW
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>
11 #include <memory> 11 #include <memory>
12 #include <string> 12 #include <string>
13 #include <utility> 13 #include <utility>
14 #include <vector> 14 #include <vector>
15 15
16 #include "base/json/json_writer.h" 16 #include "base/json/json_writer.h"
17 #include "base/lazy_instance.h" 17 #include "base/lazy_instance.h"
18 #include "base/memory/ptr_util.h" 18 #include "base/memory/ptr_util.h"
19 #include "base/strings/string_number_conversions.h" 19 #include "base/strings/string_number_conversions.h"
20 #include "base/values.h" 20 #include "base/values.h"
21 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
22 #include "extensions/browser/api/cast_channel/cast_message_util.h" 22 #include "extensions/browser/api/cast_channel/cast_message_util.h"
23 #include "extensions/browser/api/cast_channel/cast_socket.h" 23 #include "extensions/browser/api/cast_channel/cast_socket.h"
24 #include "extensions/browser/api/cast_channel/cast_socket_service.h"
25 #include "extensions/browser/api/cast_channel/cast_socket_service_factory.h"
24 #include "extensions/browser/api/cast_channel/keep_alive_delegate.h" 26 #include "extensions/browser/api/cast_channel/keep_alive_delegate.h"
25 #include "extensions/browser/api/cast_channel/logger.h" 27 #include "extensions/browser/api/cast_channel/logger.h"
26 #include "extensions/browser/event_router.h" 28 #include "extensions/browser/event_router.h"
27 #include "extensions/common/api/cast_channel/cast_channel.pb.h" 29 #include "extensions/common/api/cast_channel/cast_channel.pb.h"
28 #include "extensions/common/api/cast_channel/logging.pb.h" 30 #include "extensions/common/api/cast_channel/logging.pb.h"
29 #include "net/base/ip_address.h" 31 #include "net/base/ip_address.h"
30 #include "net/base/ip_endpoint.h" 32 #include "net/base/ip_endpoint.h"
31 #include "net/base/net_errors.h" 33 #include "net/base/net_errors.h"
32 34
33 // Default timeout interval for connection setup. 35 // Default timeout interval for connection setup.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 std::unique_ptr<base::Timer> timer) { 160 std::unique_ptr<base::Timer> timer) {
159 injected_timeout_timer_ = std::move(timer); 161 injected_timeout_timer_ = std::move(timer);
160 } 162 }
161 163
162 std::unique_ptr<base::Timer> CastChannelAPI::GetInjectedTimeoutTimerForTest() { 164 std::unique_ptr<base::Timer> CastChannelAPI::GetInjectedTimeoutTimerForTest() {
163 return std::move(injected_timeout_timer_); 165 return std::move(injected_timeout_timer_);
164 } 166 }
165 167
166 CastChannelAPI::~CastChannelAPI() {} 168 CastChannelAPI::~CastChannelAPI() {}
167 169
168 CastChannelAsyncApiFunction::CastChannelAsyncApiFunction() { 170 CastChannelAsyncApiFunction::CastChannelAsyncApiFunction()
169 } 171 : cast_socket_service_(nullptr) {}
170 172
171 CastChannelAsyncApiFunction::~CastChannelAsyncApiFunction() { } 173 CastChannelAsyncApiFunction::~CastChannelAsyncApiFunction() { }
172 174
173 bool CastChannelAsyncApiFunction::PrePrepare() { 175 bool CastChannelAsyncApiFunction::PrePrepare() {
174 DCHECK(ApiResourceManager<CastSocket>::Get(browser_context())); 176 cast_socket_service_ =
175 sockets_ = ApiResourceManager<CastSocket>::Get(browser_context())->data_; 177 api::cast_channel::CastSocketServiceFactory::GetInstance()
176 DCHECK(sockets_); 178 ->GetForBrowserContext(browser_context());
179 DCHECK(cast_socket_service_);
177 return true; 180 return true;
178 } 181 }
179 182
180 bool CastChannelAsyncApiFunction::Respond() { 183 bool CastChannelAsyncApiFunction::Respond() {
181 return GetError().empty(); 184 return GetError().empty();
182 } 185 }
183 186
184 CastSocket* CastChannelAsyncApiFunction::GetSocketOrCompleteWithError( 187 CastSocket* CastChannelAsyncApiFunction::GetSocketOrCompleteWithError(
185 int channel_id) { 188 int channel_id) {
186 CastSocket* socket = GetSocket(channel_id); 189 CastSocket* socket = GetSocket(channel_id);
187 if (!socket) { 190 if (!socket) {
188 SetResultFromError(channel_id, 191 SetResultFromError(channel_id,
189 cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID); 192 cast_channel::CHANNEL_ERROR_INVALID_CHANNEL_ID);
190 AsyncWorkCompleted(); 193 AsyncWorkCompleted();
191 } 194 }
192 return socket; 195 return socket;
193 } 196 }
194 197
195 int CastChannelAsyncApiFunction::AddSocket(CastSocket* socket) { 198 int CastChannelAsyncApiFunction::AddSocket(std::unique_ptr<CastSocket> socket) {
196 DCHECK_CURRENTLY_ON(BrowserThread::IO); 199 auto* sockets = cast_socket_service_->GetOrCreateSocketRegistry();
197 DCHECK(socket); 200 return sockets->AddSocket(std::move(socket));
198 const int id = sockets_->Add(socket);
199 socket->set_id(id);
200 return id;
201 } 201 }
202 202
203 void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) { 203 void CastChannelAsyncApiFunction::RemoveSocket(int channel_id) {
204 DCHECK_CURRENTLY_ON(BrowserThread::IO); 204 auto* sockets = cast_socket_service_->GetOrCreateSocketRegistry();
205 sockets_->Remove(extension_->id(), channel_id); 205 sockets->RemoveSocket(channel_id);
206 } 206 }
207 207
208 void CastChannelAsyncApiFunction::SetResultFromSocket( 208 void CastChannelAsyncApiFunction::SetResultFromSocket(
209 const CastSocket& socket) { 209 const CastSocket& socket) {
210 ChannelInfo channel_info; 210 ChannelInfo channel_info;
211 FillChannelInfo(socket, &channel_info); 211 FillChannelInfo(socket, &channel_info);
212 ChannelError error = socket.error_state(); 212 ChannelError error = socket.error_state();
213 if (error != cast_channel::CHANNEL_ERROR_NONE) { 213 if (error != cast_channel::CHANNEL_ERROR_NONE) {
214 SetError("Channel socket error = " + base::IntToString(error)); 214 SetError("Channel socket error = " + base::IntToString(error));
215 } 215 }
216 SetResultFromChannelInfo(channel_info); 216 SetResultFromChannelInfo(channel_info);
217 } 217 }
218 218
219 void CastChannelAsyncApiFunction::SetResultFromError(int channel_id, 219 void CastChannelAsyncApiFunction::SetResultFromError(int channel_id,
220 ChannelError error) { 220 ChannelError error) {
221 ChannelInfo channel_info; 221 ChannelInfo channel_info;
222 channel_info.channel_id = channel_id; 222 channel_info.channel_id = channel_id;
223 channel_info.ready_state = cast_channel::READY_STATE_CLOSED; 223 channel_info.ready_state = cast_channel::READY_STATE_CLOSED;
224 channel_info.error_state = error; 224 channel_info.error_state = error;
225 channel_info.connect_info.ip_address = ""; 225 channel_info.connect_info.ip_address = "";
226 channel_info.connect_info.port = 0; 226 channel_info.connect_info.port = 0;
227 channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL_VERIFIED; 227 channel_info.connect_info.auth = cast_channel::CHANNEL_AUTH_TYPE_SSL_VERIFIED;
228 SetResultFromChannelInfo(channel_info); 228 SetResultFromChannelInfo(channel_info);
229 SetError("Channel error = " + base::IntToString(error)); 229 SetError("Channel error = " + base::IntToString(error));
230 } 230 }
231 231
232 CastSocket* CastChannelAsyncApiFunction::GetSocket(int channel_id) const { 232 CastSocket* CastChannelAsyncApiFunction::GetSocket(int channel_id) const {
233 DCHECK_CURRENTLY_ON(BrowserThread::IO); 233 auto* sockets = cast_socket_service_->GetOrCreateSocketRegistry();
234 return sockets_->Get(extension_->id(), channel_id); 234 return sockets->GetSocket(channel_id);
235 } 235 }
236 236
237 void CastChannelAsyncApiFunction::SetResultFromChannelInfo( 237 void CastChannelAsyncApiFunction::SetResultFromChannelInfo(
238 const ChannelInfo& channel_info) { 238 const ChannelInfo& channel_info) {
239 DCHECK_CURRENTLY_ON(BrowserThread::IO); 239 DCHECK_CURRENTLY_ON(BrowserThread::IO);
240 SetResult(channel_info.ToValue()); 240 SetResult(channel_info.ToValue());
241 } 241 }
242 242
243 CastChannelOpenFunction::CastChannelOpenFunction() 243 CastChannelOpenFunction::CastChannelOpenFunction()
244 : new_channel_id_(0) { 244 : new_channel_id_(0) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 socket = new cast_channel::CastSocketImpl( 311 socket = new cast_channel::CastSocketImpl(
312 extension_->id(), *ip_endpoint_, channel_auth_, 312 extension_->id(), *ip_endpoint_, channel_auth_,
313 ExtensionsBrowserClient::Get()->GetNetLog(), 313 ExtensionsBrowserClient::Get()->GetNetLog(),
314 base::TimeDelta::FromMilliseconds(connect_info.timeout.get() 314 base::TimeDelta::FromMilliseconds(connect_info.timeout.get()
315 ? *connect_info.timeout 315 ? *connect_info.timeout
316 : kDefaultConnectTimeoutMillis), 316 : kDefaultConnectTimeoutMillis),
317 liveness_timeout_ > base::TimeDelta(), api_->GetLogger(), 317 liveness_timeout_ > base::TimeDelta(), api_->GetLogger(),
318 connect_info.capabilities.get() ? *connect_info.capabilities 318 connect_info.capabilities.get() ? *connect_info.capabilities
319 : CastDeviceCapability::NONE); 319 : CastDeviceCapability::NONE);
320 } 320 }
321 new_channel_id_ = AddSocket(socket); 321 new_channel_id_ = AddSocket(base::WrapUnique(socket));
322 322
323 // Construct read delegates. 323 // Construct read delegates.
324 std::unique_ptr<api::cast_channel::CastTransport::Delegate> delegate( 324 std::unique_ptr<api::cast_channel::CastTransport::Delegate> delegate(
325 base::MakeUnique<CastMessageHandler>( 325 base::MakeUnique<CastMessageHandler>(
326 base::Bind(&CastChannelAPI::SendEvent, api_->AsWeakPtr()), socket, 326 base::Bind(&CastChannelAPI::SendEvent, api_->AsWeakPtr(),
327 api_->GetLogger())); 327 extension_->id()),
328 socket, api_->GetLogger()));
328 if (socket->keep_alive()) { 329 if (socket->keep_alive()) {
329 // Wrap read delegate in a KeepAliveDelegate for timeout handling. 330 // Wrap read delegate in a KeepAliveDelegate for timeout handling.
330 api::cast_channel::KeepAliveDelegate* keep_alive = 331 api::cast_channel::KeepAliveDelegate* keep_alive =
331 new api::cast_channel::KeepAliveDelegate( 332 new api::cast_channel::KeepAliveDelegate(
332 socket, api_->GetLogger(), std::move(delegate), ping_interval_, 333 socket, api_->GetLogger(), std::move(delegate), ping_interval_,
333 liveness_timeout_); 334 liveness_timeout_);
334 std::unique_ptr<base::Timer> injected_timer = 335 std::unique_ptr<base::Timer> injected_timer =
335 api_->GetInjectedTimeoutTimerForTest(); 336 api_->GetInjectedTimeoutTimerForTest();
336 if (injected_timer) { 337 if (injected_timer) {
337 keep_alive->SetTimersForTest(base::MakeUnique<base::Timer>(false, false), 338 keep_alive->SetTimersForTest(base::MakeUnique<base::Timer>(false, false),
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 ErrorInfo error_info; 490 ErrorInfo error_info;
490 FillErrorInfo(error_state, logger_->GetLastErrors(socket_->id()), 491 FillErrorInfo(error_state, logger_->GetLastErrors(socket_->id()),
491 &error_info); 492 &error_info);
492 493
493 std::unique_ptr<base::ListValue> results = 494 std::unique_ptr<base::ListValue> results =
494 OnError::Create(channel_info, error_info); 495 OnError::Create(channel_info, error_info);
495 std::unique_ptr<Event> event(new Event( 496 std::unique_ptr<Event> event(new Event(
496 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results))); 497 events::CAST_CHANNEL_ON_ERROR, OnError::kEventName, std::move(results)));
497 BrowserThread::PostTask( 498 BrowserThread::PostTask(
498 BrowserThread::UI, FROM_HERE, 499 BrowserThread::UI, FROM_HERE,
499 base::Bind(ui_dispatch_cb_, socket_->owner_extension_id(), 500 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event))));
500 base::Passed(std::move(event))));
501 } 501 }
502 502
503 void CastChannelOpenFunction::CastMessageHandler::OnMessage( 503 void CastChannelOpenFunction::CastMessageHandler::OnMessage(
504 const CastMessage& message) { 504 const CastMessage& message) {
505 DCHECK_CURRENTLY_ON(BrowserThread::IO); 505 DCHECK_CURRENTLY_ON(BrowserThread::IO);
506 506
507 MessageInfo message_info; 507 MessageInfo message_info;
508 cast_channel::CastMessageToMessageInfo(message, &message_info); 508 cast_channel::CastMessageToMessageInfo(message, &message_info);
509 ChannelInfo channel_info; 509 ChannelInfo channel_info;
510 FillChannelInfo(*socket_, &channel_info); 510 FillChannelInfo(*socket_, &channel_info);
511 VLOG(1) << "Received message " << ParamToString(message_info) 511 VLOG(1) << "Received message " << ParamToString(message_info)
512 << " on channel " << ParamToString(channel_info); 512 << " on channel " << ParamToString(channel_info);
513 513
514 std::unique_ptr<base::ListValue> results = 514 std::unique_ptr<base::ListValue> results =
515 OnMessage::Create(channel_info, message_info); 515 OnMessage::Create(channel_info, message_info);
516 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE, 516 std::unique_ptr<Event> event(new Event(events::CAST_CHANNEL_ON_MESSAGE,
517 OnMessage::kEventName, 517 OnMessage::kEventName,
518 std::move(results))); 518 std::move(results)));
519 BrowserThread::PostTask( 519 BrowserThread::PostTask(
520 BrowserThread::UI, FROM_HERE, 520 BrowserThread::UI, FROM_HERE,
521 base::Bind(ui_dispatch_cb_, socket_->owner_extension_id(), 521 base::Bind(ui_dispatch_cb_, base::Passed(std::move(event))));
522 base::Passed(std::move(event))));
523 } 522 }
524 523
525 void CastChannelOpenFunction::CastMessageHandler::Start() { 524 void CastChannelOpenFunction::CastMessageHandler::Start() {
526 } 525 }
527 526
528 } // namespace extensions 527 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/cast_channel/cast_channel_api.h ('k') | extensions/browser/api/cast_channel/cast_socket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698