Index: components/devtools_bridge/socket_tunnel_server.cc |
diff --git a/components/devtools_bridge/socket_tunnel_server.cc b/components/devtools_bridge/socket_tunnel_server.cc |
deleted file mode 100644 |
index afa07a25cdaec4ce471013b0ea292d3e999edc1f..0000000000000000000000000000000000000000 |
--- a/components/devtools_bridge/socket_tunnel_server.cc |
+++ /dev/null |
@@ -1,266 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/devtools_bridge/socket_tunnel_server.h" |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "components/devtools_bridge/abstract_data_channel.h" |
-#include "components/devtools_bridge/session_dependency_factory.h" |
-#include "components/devtools_bridge/socket_tunnel_connection.h" |
-#include "components/devtools_bridge/socket_tunnel_packet_handler.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/socket/unix_domain_client_socket_posix.h" |
- |
-namespace devtools_bridge { |
- |
-class SocketTunnelServer::Connection : public SocketTunnelConnection { |
- public: |
- class Delegate { |
- public: |
- virtual void RemoveConnection(int index) = 0; |
- virtual void SendPacket( |
- const void* data, size_t length) = 0; |
- }; |
- |
- Connection(Delegate* delegate, int index, const std::string& socket_name) |
- : SocketTunnelConnection(index), |
- delegate_(delegate), |
- socket_(socket_name, true) { |
- } |
- |
- void Connect() { |
- int result = socket()->Connect(base::Bind( |
- &Connection::OnConnectionComplete, base::Unretained(this))); |
- if (result != net::ERR_IO_PENDING) |
- OnConnectionComplete(result); |
- } |
- |
- void ClosedByClient() { |
- if (socket()->IsConnected()) { |
- socket()->Disconnect(); |
- SendControlPacket(SERVER_CLOSE); |
- } |
- delegate_->RemoveConnection(index_); |
- } |
- |
- protected: |
- net::StreamSocket* socket() override { |
- return &socket_; |
- } |
- |
- void OnDataPacketRead(const void* data, size_t length) override { |
- delegate_->SendPacket(data, length); |
- ReadNextChunk(); |
- } |
- |
- void OnReadError(int error) override { |
- socket()->Disconnect(); |
- SendControlPacket(SERVER_CLOSE); |
- delegate_->RemoveConnection(index_); |
- delegate_ = NULL; |
- } |
- |
- private: |
- void OnConnectionComplete(int result) { |
- if (result == net::OK) { |
- SendControlPacket(SERVER_OPEN_ACK); |
- ReadNextChunk(); |
- } else { |
- SendControlPacket(SERVER_CLOSE); |
- delegate_->RemoveConnection(index_); |
- delegate_ = NULL; |
- } |
- } |
- |
- void SendControlPacket(ServerOpCode op_code) { |
- char buffer[kControlPacketSizeBytes]; |
- BuildControlPacket(buffer, op_code); |
- delegate_->SendPacket(buffer, kControlPacketSizeBytes); |
- } |
- |
- Delegate* delegate_; |
- net::UnixDomainClientSocket socket_; |
-}; |
- |
-/** |
- * Lives on the IO thread. |
- */ |
-class SocketTunnelServer::ConnectionController |
- : private Connection::Delegate { |
- public: |
- ConnectionController( |
- scoped_refptr<base::TaskRunner> io_task_runner, |
- scoped_refptr<AbstractDataChannel::Proxy> data_channel, |
- const std::string& socket_name) |
- : io_task_runner_(io_task_runner), |
- data_channel_(data_channel), |
- socket_name_(socket_name) { |
- DCHECK(data_channel_.get()); |
- } |
- |
- void HandleControlPacket(int connection_index, int op_code) { |
- DCHECK(connection_index < kMaxConnectionCount); |
- switch (op_code) { |
- case SocketTunnelConnection::CLIENT_OPEN: |
- if (connections_[connection_index].get() != NULL) { |
- DLOG(ERROR) << "Opening connection which already open: " |
- << connection_index; |
- HandleProtocolError(); |
- return; |
- } |
- connections_[connection_index].reset( |
- new Connection(this, connection_index, socket_name_)); |
- connections_[connection_index]->Connect(); |
- break; |
- |
- case SocketTunnelConnection::CLIENT_CLOSE: |
- if (connections_[connection_index].get() == NULL) { |
- // Ignore. Client may close the connection before received |
- // notification from the server. |
- return; |
- } |
- connections_[connection_index]->ClosedByClient(); |
- break; |
- |
- default: |
- DLOG(ERROR) << "Invalid op_code: " << op_code; |
- HandleProtocolError(); |
- return; |
- } |
- } |
- |
- void HandleDataPacket(int connection_index, |
- scoped_refptr<net::IOBufferWithSize> packet) { |
- Connection* connection = connections_[connection_index].get(); |
- if (connection != NULL) |
- connection->Write(packet); |
- } |
- |
- void HandleProtocolError() { |
- data_channel_->Close(); |
- } |
- |
- void CloseAllConnections() { |
- for (int i = 0; i < kMaxConnectionCount; i++) { |
- connections_[i].reset(); |
- } |
- } |
- |
- private: |
- static void DeleteConnectionImpl(Connection*) {} |
- |
- // Connection::Delegate implementation |
- void RemoveConnection(int connection_index) override { |
- // Remove immediately, delete later to preserve this of the caller. |
- Connection* connection = connections_[connection_index].release(); |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&ConnectionController::DeleteConnectionImpl, |
- base::Owned(connection))); |
- } |
- |
- void SendPacket(const void* data, size_t length) override { |
- data_channel_->SendBinaryMessage(data, length); |
- } |
- |
- static const int kMaxConnectionCount = |
- SocketTunnelConnection::kMaxConnectionCount; |
- |
- scoped_refptr<base::TaskRunner> io_task_runner_; |
- scoped_refptr<AbstractDataChannel::Proxy> data_channel_; |
- scoped_ptr<Connection> connections_[kMaxConnectionCount]; |
- const std::string socket_name_; |
-}; |
- |
-class SocketTunnelServer::DataChannelObserver |
- : public AbstractDataChannel::Observer, |
- private SocketTunnelPacketHandler { |
- public: |
- DataChannelObserver(scoped_refptr<base::TaskRunner> io_task_runner, |
- scoped_ptr<ConnectionController> controller) |
- : io_task_runner_(io_task_runner), |
- controller_(controller.Pass()) { |
- } |
- |
- ~DataChannelObserver() override { |
- // Deleting on IO thread allows post tasks with base::Unretained |
- // because all of them will be processed before deletion. |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&DataChannelObserver::DeleteControllerOnIOThread, |
- base::Passed(&controller_))); |
- } |
- |
- void OnOpen() override { |
- // Nothing to do. Activity could only be initiated by a control packet. |
- } |
- |
- void OnClose() override { |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &ConnectionController::CloseAllConnections, |
- base::Unretained(controller_.get()))); |
- } |
- |
- void OnMessage(const void* data, size_t length) override { |
- DecodePacket(data, length); |
- } |
- |
- private: |
- static void DeleteControllerOnIOThread( |
- scoped_ptr<ConnectionController> controller) {} |
- |
- // SocketTunnelPacketHandler implementation. |
- |
- void HandleControlPacket(int connection_index, int op_code) override { |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &ConnectionController::HandleControlPacket, |
- base::Unretained(controller_.get()), |
- connection_index, |
- op_code)); |
- } |
- |
- void HandleDataPacket(int connection_index, |
- scoped_refptr<net::IOBufferWithSize> data) override { |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &ConnectionController::HandleDataPacket, |
- base::Unretained(controller_.get()), |
- connection_index, |
- data)); |
- } |
- |
- void HandleProtocolError() override { |
- io_task_runner_->PostTask( |
- FROM_HERE, base::Bind( |
- &ConnectionController::HandleProtocolError, |
- base::Unretained(controller_.get()))); |
- } |
- |
- const scoped_refptr<base::TaskRunner> io_task_runner_; |
- scoped_ptr<ConnectionController> controller_; |
-}; |
- |
-SocketTunnelServer::SocketTunnelServer(SessionDependencyFactory* factory, |
- AbstractDataChannel* data_channel, |
- const std::string& socket_name) |
- : data_channel_(data_channel) { |
- scoped_ptr<ConnectionController> controller( |
- new ConnectionController(factory->io_thread_task_runner(), |
- data_channel->proxy(), |
- socket_name)); |
- |
- scoped_ptr<DataChannelObserver> data_channel_observer( |
- new DataChannelObserver(factory->io_thread_task_runner(), |
- controller.Pass())); |
- |
- data_channel_->RegisterObserver(data_channel_observer.Pass()); |
-} |
- |
-SocketTunnelServer::~SocketTunnelServer() { |
- data_channel_->UnregisterObserver(); |
-} |
- |
-} // namespace devtools_bridge |