Chromium Code Reviews| 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 |