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

Side by Side Diff: components/cast_channel/cast_socket_service.cc

Issue 2925053005: [cast_channel] Implement CastSocketService::OpenSocket() (Closed)
Patch Set: resolve code review comments from Mark 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "components/cast_channel/cast_socket_service.h" 5 #include "components/cast_channel/cast_socket_service.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "components/cast_channel/cast_socket.h"
9 #include "components/cast_channel/logger.h"
8 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
9 11
10 using content::BrowserThread; 12 using content::BrowserThread;
11 13
14 namespace {
15 // Connect timeout for connect calls.
16 const int kConnectTimeoutSecs = 10;
17
18 // Ping interval
19 const int kPingIntervalInSecs = 5;
20
21 // Liveness timeout for connect calls, in milliseconds. If no message is
22 // received from the receiver during kConnectLivenessTimeoutSecs, it is
23 // considered gone.
24 const int kConnectLivenessTimeoutSecs = kPingIntervalInSecs * 2;
25 } // namespace
26
12 namespace cast_channel { 27 namespace cast_channel {
13 28
14 int CastSocketService::last_channel_id_ = 0; 29 int CastSocketService::last_channel_id_ = 0;
15 30
16 CastSocketService::CastSocketService() 31 CastSocketService::CastSocketService()
17 : RefcountedKeyedService( 32 : RefcountedKeyedService(
18 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)) { 33 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)),
34 logger_(new Logger()) {
19 DETACH_FROM_THREAD(thread_checker_); 35 DETACH_FROM_THREAD(thread_checker_);
20 } 36 }
21 37
22 CastSocketService::~CastSocketService() { 38 CastSocketService::~CastSocketService() {
23 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); 39 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
24 } 40 }
25 41
26 int CastSocketService::AddSocket(std::unique_ptr<CastSocket> socket) { 42 CastSocket* CastSocketService::AddSocket(std::unique_ptr<CastSocket> socket) {
27 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); 43 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
28 DCHECK(socket); 44 DCHECK(socket);
29 int id = ++last_channel_id_; 45 int id = ++last_channel_id_;
30 socket->set_id(id); 46 socket->set_id(id);
47
48 auto* socket_ptr = socket.get();
31 sockets_.insert(std::make_pair(id, std::move(socket))); 49 sockets_.insert(std::make_pair(id, std::move(socket)));
32 return id; 50 return socket_ptr;
33 } 51 }
34 52
35 std::unique_ptr<CastSocket> CastSocketService::RemoveSocket(int channel_id) { 53 std::unique_ptr<CastSocket> CastSocketService::RemoveSocket(int channel_id) {
36 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); 54 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
37 DCHECK(channel_id > 0); 55 DCHECK(channel_id > 0);
38 auto socket_it = sockets_.find(channel_id); 56 auto socket_it = sockets_.find(channel_id);
39 57
40 std::unique_ptr<CastSocket> socket; 58 std::unique_ptr<CastSocket> socket;
41 if (socket_it != sockets_.end()) { 59 if (socket_it != sockets_.end()) {
42 socket = std::move(socket_it->second); 60 socket = std::move(socket_it->second);
43 sockets_.erase(socket_it); 61 sockets_.erase(socket_it);
44 } 62 }
45 return socket; 63 return socket;
46 } 64 }
47 65
48 CastSocket* CastSocketService::GetSocket(int channel_id) const { 66 CastSocket* CastSocketService::GetSocket(int channel_id) const {
49 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); 67 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
50 DCHECK(channel_id > 0); 68 DCHECK(channel_id > 0);
51 const auto& socket_it = sockets_.find(channel_id); 69 const auto& socket_it = sockets_.find(channel_id);
52 return socket_it == sockets_.end() ? nullptr : socket_it->second.get(); 70 return socket_it == sockets_.end() ? nullptr : socket_it->second.get();
53 } 71 }
54 72
73 CastSocket* CastSocketService::GetSocket(
74 const net::IPEndPoint& ip_endpoint) const {
75 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
76 auto it = std::find_if(
77 sockets_.begin(), sockets_.end(),
78 [&ip_endpoint](
79 const std::pair<const int, std::unique_ptr<CastSocket>>& pair) {
80 return pair.second->ip_endpoint() == ip_endpoint;
81 });
82 return it == sockets_.end() ? nullptr : it->second.get();
83 }
84
85 int CastSocketService::OpenSocket(const net::IPEndPoint& ip_endpoint,
86 net::NetLog* net_log,
87 const base::TimeDelta& connect_timeout,
88 const base::TimeDelta& liveness_timeout,
89 const base::TimeDelta& ping_interval,
90 const scoped_refptr<Logger>& logger,
91 uint64_t device_capabilities,
92 const CastSocket::OnOpenCallback& open_cb,
93 CastSocket::Observer* observer) {
94 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
95 DCHECK(observer);
96 auto* socket = GetSocket(ip_endpoint);
97
98 if (!socket) {
99 // If cast socket does not exist.
100 if (socket_for_test_) {
101 socket = AddSocket(std::move(socket_for_test_));
102 } else {
103 socket = new CastSocketImpl(ip_endpoint, net_log, connect_timeout,
104 liveness_timeout, ping_interval, logger,
105 device_capabilities);
106 AddSocket(base::WrapUnique(socket));
107 }
108 socket->AddObserver(observer);
109 }
110
111 socket->Connect(open_cb);
112 return socket->id();
113 }
114
115 int CastSocketService::OpenSocket(const net::IPEndPoint& ip_endpoint,
116 net::NetLog* net_log,
117 const CastSocket::OnOpenCallback& open_cb,
118 CastSocket::Observer* observer) {
119 auto connect_timeout = base::TimeDelta::FromSeconds(kConnectTimeoutSecs);
120 auto ping_interval = base::TimeDelta::FromSeconds(kPingIntervalInSecs);
121 auto liveness_timeout =
122 base::TimeDelta::FromSeconds(kConnectLivenessTimeoutSecs);
123 return OpenSocket(ip_endpoint, net_log, connect_timeout, liveness_timeout,
124 ping_interval, logger_, CastDeviceCapability::NONE, open_cb,
125 observer);
126 }
127
55 CastSocket::Observer* CastSocketService::GetObserver(const std::string& id) { 128 CastSocket::Observer* CastSocketService::GetObserver(const std::string& id) {
56 auto it = socket_observer_map_.find(id); 129 auto it = socket_observer_map_.find(id);
57 return it == socket_observer_map_.end() ? nullptr : it->second.get(); 130 return it == socket_observer_map_.end() ? nullptr : it->second.get();
58 } 131 }
59 132
60 CastSocket::Observer* CastSocketService::AddObserver( 133 CastSocket::Observer* CastSocketService::AddObserver(
61 const std::string& id, 134 const std::string& id,
62 std::unique_ptr<CastSocket::Observer> observer) { 135 std::unique_ptr<CastSocket::Observer> observer) {
63 CastSocket::Observer* observer_ptr = observer.get(); 136 CastSocket::Observer* observer_ptr = observer.get();
64 socket_observer_map_.insert(std::make_pair(id, std::move(observer))); 137 socket_observer_map_.insert(std::make_pair(id, std::move(observer)));
65 return observer_ptr; 138 return observer_ptr;
66 } 139 }
67 140
141 void CastSocketService::SetSocketForTest(
142 std::unique_ptr<cast_channel::CastSocket> socket_for_test) {
143 socket_for_test_ = std::move(socket_for_test);
144 }
145
68 void CastSocketService::ShutdownOnUIThread() {} 146 void CastSocketService::ShutdownOnUIThread() {}
69 147
70 } // namespace cast_channel 148 } // namespace cast_channel
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698