OLD | NEW |
---|---|
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 LIVENESS_INTERVAL, it is considered gone. | |
mark a. foltz
2017/06/21 17:41:42
Where is LIVENESS_INTERVAL defined? Or should it
zhaobin
2017/06/21 21:58:25
Done.
| |
23 const int kConnectLivenessTimeoutSecs = kPingIntervalInSecs * 2; | |
24 } // namespace | |
25 | |
12 namespace cast_channel { | 26 namespace cast_channel { |
13 | 27 |
14 int CastSocketService::last_channel_id_ = 0; | 28 int CastSocketService::last_channel_id_ = 0; |
15 | 29 |
16 CastSocketService::CastSocketService() | 30 CastSocketService::CastSocketService() |
17 : RefcountedKeyedService( | 31 : RefcountedKeyedService( |
18 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)) { | 32 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)), |
33 logger_(new Logger()) { | |
19 DETACH_FROM_THREAD(thread_checker_); | 34 DETACH_FROM_THREAD(thread_checker_); |
20 } | 35 } |
21 | 36 |
22 CastSocketService::~CastSocketService() { | 37 CastSocketService::~CastSocketService() { |
23 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 38 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
24 } | 39 } |
25 | 40 |
26 int CastSocketService::AddSocket(std::unique_ptr<CastSocket> socket) { | 41 int CastSocketService::AddSocket(std::unique_ptr<CastSocket> socket) { |
27 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 42 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
28 DCHECK(socket); | 43 DCHECK(socket); |
(...skipping 16 matching lines...) Expand all Loading... | |
45 return socket; | 60 return socket; |
46 } | 61 } |
47 | 62 |
48 CastSocket* CastSocketService::GetSocket(int channel_id) const { | 63 CastSocket* CastSocketService::GetSocket(int channel_id) const { |
49 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 64 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
50 DCHECK(channel_id > 0); | 65 DCHECK(channel_id > 0); |
51 const auto& socket_it = sockets_.find(channel_id); | 66 const auto& socket_it = sockets_.find(channel_id); |
52 return socket_it == sockets_.end() ? nullptr : socket_it->second.get(); | 67 return socket_it == sockets_.end() ? nullptr : socket_it->second.get(); |
53 } | 68 } |
54 | 69 |
70 CastSocket* CastSocketService::GetSocket( | |
71 const net::IPEndPoint& ip_endpoint) const { | |
72 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | |
73 auto it = std::find_if( | |
74 sockets_.begin(), sockets_.end(), | |
75 [&ip_endpoint]( | |
76 const std::pair<const int, std::unique_ptr<CastSocket>>& pair) { | |
77 return pair.second->ip_endpoint() == ip_endpoint; | |
78 }); | |
79 return it == sockets_.end() ? nullptr : it->second.get(); | |
80 } | |
81 | |
82 int CastSocketService::OpenSocket(const net::IPEndPoint& ip_endpoint, | |
83 net::NetLog* net_log, | |
84 const base::TimeDelta& connect_timeout, | |
85 const base::TimeDelta& liveness_timeout, | |
86 const base::TimeDelta& ping_interval, | |
87 const scoped_refptr<Logger>& logger, | |
88 uint64_t device_capabilities, | |
89 const CastSocket::OnOpenCallback& open_cb, | |
90 CastSocket::Observer* observer) { | |
91 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | |
92 DCHECK(observer); | |
93 auto* socket = GetSocket(ip_endpoint); | |
94 | |
95 if (!socket) { | |
96 // If cast socket does not exist. | |
97 if (socket_for_test_) { | |
98 socket = socket_for_test_.release(); | |
mark a. foltz
2017/06/21 17:41:42
Nit: Slightly prefer to call AddSocket(std::move(s
zhaobin
2017/06/21 21:58:25
Done.
| |
99 } else { | |
100 socket = new CastSocketImpl(ip_endpoint, net_log, connect_timeout, | |
101 liveness_timeout, ping_interval, logger, | |
102 device_capabilities); | |
103 } | |
104 AddSocket(base::WrapUnique(socket)); | |
105 socket->AddObserver(observer); | |
106 } | |
107 | |
108 socket->Connect(open_cb); | |
109 return socket->id(); | |
110 } | |
111 | |
112 int CastSocketService::OpenSocket(const net::IPEndPoint& ip_endpoint, | |
113 net::NetLog* net_log, | |
114 const CastSocket::OnOpenCallback& open_cb, | |
115 CastSocket::Observer* observer) { | |
116 auto connect_timeout = base::TimeDelta::FromSeconds(kConnectTimeoutSecs); | |
117 auto ping_interval = base::TimeDelta::FromSeconds(kPingIntervalInSecs); | |
118 auto liveness_timeout = | |
119 base::TimeDelta::FromSeconds(kConnectLivenessTimeoutSecs); | |
120 return OpenSocket(ip_endpoint, net_log, connect_timeout, liveness_timeout, | |
121 ping_interval, logger_, CastDeviceCapability::NONE, open_cb, | |
122 observer); | |
123 } | |
124 | |
55 CastSocket::Observer* CastSocketService::GetObserver(const std::string& id) { | 125 CastSocket::Observer* CastSocketService::GetObserver(const std::string& id) { |
56 auto it = std::find_if( | 126 auto it = std::find_if( |
57 socket_observer_map_.begin(), socket_observer_map_.end(), | 127 socket_observer_map_.begin(), socket_observer_map_.end(), |
58 [id](const std::pair<const std::string, | 128 [id](const std::pair<const std::string, |
59 std::unique_ptr<CastSocket::Observer>>& entry) { | 129 std::unique_ptr<CastSocket::Observer>>& entry) { |
60 return entry.first == id; | 130 return entry.first == id; |
61 }); | 131 }); |
62 return it == socket_observer_map_.end() ? nullptr : it->second.get(); | 132 return it == socket_observer_map_.end() ? nullptr : it->second.get(); |
63 } | 133 } |
64 | 134 |
65 void CastSocketService::AddObserver( | 135 void CastSocketService::AddObserver( |
66 const std::string& id, | 136 const std::string& id, |
67 std::unique_ptr<CastSocket::Observer> observer) { | 137 std::unique_ptr<CastSocket::Observer> observer) { |
68 socket_observer_map_.insert(std::make_pair(id, std::move(observer))); | 138 socket_observer_map_.insert(std::make_pair(id, std::move(observer))); |
69 } | 139 } |
70 | 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 | |
71 void CastSocketService::ShutdownOnUIThread() {} | 146 void CastSocketService::ShutdownOnUIThread() {} |
72 | 147 |
73 } // namespace cast_channel | 148 } // namespace cast_channel |
OLD | NEW |