Index: mojo/services/network/tcp_connected_socket_impl.cc |
diff --git a/mojo/services/network/tcp_connected_socket_impl.cc b/mojo/services/network/tcp_connected_socket_impl.cc |
deleted file mode 100644 |
index 8da9484429d2624fde63f8895dd420c7c0e9c296..0000000000000000000000000000000000000000 |
--- a/mojo/services/network/tcp_connected_socket_impl.cc |
+++ /dev/null |
@@ -1,260 +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 "mojo/services/network/tcp_connected_socket_impl.h" |
- |
-#include <stdint.h> |
- |
-#include <utility> |
- |
-#include "base/message_loop/message_loop.h" |
-#include "mojo/services/network/net_adapters.h" |
-#include "net/base/net_errors.h" |
- |
-namespace mojo { |
- |
-TCPConnectedSocketImpl::TCPConnectedSocketImpl( |
- scoped_ptr<net::TCPSocket> socket, |
- ScopedDataPipeConsumerHandle send_stream, |
- ScopedDataPipeProducerHandle receive_stream, |
- InterfaceRequest<TCPConnectedSocket> request, |
- scoped_ptr<mojo::MessageLoopRef> app_refcount) |
- : socket_(std::move(socket)), |
- send_stream_(std::move(send_stream)), |
- receive_stream_(std::move(receive_stream)), |
- binding_(this, std::move(request)), |
- app_refcount_(std::move(app_refcount)), |
- weak_ptr_factory_(this) { |
- // Queue up async communication. |
- binding_.set_connection_error_handler([this]() { OnConnectionError(); }); |
- ListenForReceivePeerClosed(); |
- ListenForSendPeerClosed(); |
- ReceiveMore(); |
- SendMore(); |
-} |
- |
-TCPConnectedSocketImpl::~TCPConnectedSocketImpl() { |
-} |
- |
-void TCPConnectedSocketImpl::OnConnectionError() { |
- binding_.Close(); |
- DeleteIfNeeded(); |
-} |
- |
-void TCPConnectedSocketImpl::ReceiveMore() { |
- DCHECK(!pending_receive_.get()); |
- |
- uint32_t num_bytes; |
- MojoResult result = NetToMojoPendingBuffer::BeginWrite( |
- &receive_stream_, &pending_receive_, &num_bytes); |
- if (result == MOJO_RESULT_SHOULD_WAIT) { |
- // The pipe is full. We need to wait for it to have more space. |
- receive_handle_watcher_.Start( |
- receive_stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, |
- MOJO_DEADLINE_INDEFINITE, |
- base::Bind(&TCPConnectedSocketImpl::OnReceiveStreamReady, |
- weak_ptr_factory_.GetWeakPtr())); |
- return; |
- } |
- |
- if (result == MOJO_RESULT_FAILED_PRECONDITION) { |
- // It's valid that the user of this class consumed the data they care about |
- // and closed their data pipe handles after writing data. This class should |
- // still write out all the data. |
- ShutdownReceive(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- |
- if (result != MOJO_RESULT_OK) { |
- // The receive stream is in a bad state. |
- ShutdownReceive(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- |
- // Mojo is ready for the receive. |
- CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); |
- scoped_refptr<net::IOBuffer> buf( |
- new NetToMojoIOBuffer(pending_receive_.get())); |
- int read_result = |
- socket_->Read(buf.get(), static_cast<int>(num_bytes), |
- base::Bind(&TCPConnectedSocketImpl::DidReceive, |
- weak_ptr_factory_.GetWeakPtr(), false)); |
- if (read_result == net::ERR_IO_PENDING) { |
- // Pending I/O, wait for result in DidReceive(). |
- } else if (read_result > 0) { |
- // Synchronous data ready. |
- DidReceive(true, read_result); |
- } else { |
- // read_result == 0 indicates EOF. |
- // read_result < 0 indicates error. |
- ShutdownReceive(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- } |
-} |
- |
-void TCPConnectedSocketImpl::OnReceiveStreamReady(MojoResult result) { |
- if (result != MOJO_RESULT_OK) { |
- ShutdownReceive(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- ListenForReceivePeerClosed(); |
- ReceiveMore(); |
-} |
- |
-void TCPConnectedSocketImpl::DidReceive(bool completed_synchronously, |
- int result) { |
- if (!pending_receive_) |
- return; |
- |
- if (result < 0) { |
- // Error. |
- ShutdownReceive(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- |
- receive_stream_ = pending_receive_->Complete(result); |
- pending_receive_ = nullptr; |
- |
- // Schedule more reading. |
- if (completed_synchronously) { |
- // Don't recursively call ReceiveMore if this is a sync read. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::Bind(&TCPConnectedSocketImpl::ReceiveMore, |
- weak_ptr_factory_.GetWeakPtr())); |
- } else { |
- ReceiveMore(); |
- } |
-} |
- |
-void TCPConnectedSocketImpl::ShutdownReceive() { |
- receive_handle_watcher_.Stop(); |
- pending_receive_ = nullptr; |
- receive_stream_.reset(); |
- DeleteIfNeeded(); |
-} |
- |
-void TCPConnectedSocketImpl::ListenForReceivePeerClosed() { |
- receive_handle_watcher_.Start( |
- receive_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
- MOJO_DEADLINE_INDEFINITE, |
- base::Bind(&TCPConnectedSocketImpl::OnReceiveDataPipeClosed, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void TCPConnectedSocketImpl::OnReceiveDataPipeClosed(MojoResult result) { |
- ShutdownReceive(); |
-} |
- |
-void TCPConnectedSocketImpl::SendMore() { |
- uint32_t num_bytes = 0; |
- MojoResult result = MojoToNetPendingBuffer::BeginRead( |
- &send_stream_, &pending_send_, &num_bytes); |
- if (result == MOJO_RESULT_SHOULD_WAIT) { |
- // Data not ready, wait for it. |
- send_handle_watcher_.Start( |
- send_stream_.get(), MOJO_HANDLE_SIGNAL_READABLE, |
- MOJO_DEADLINE_INDEFINITE, |
- base::Bind(&TCPConnectedSocketImpl::OnSendStreamReady, |
- weak_ptr_factory_.GetWeakPtr())); |
- return; |
- } else if (result != MOJO_RESULT_OK) { |
- ShutdownSend(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- |
- // Got a buffer from Mojo, give it to the socket. Note that the sockets may |
- // do partial writes. |
- scoped_refptr<net::IOBuffer> buf(new MojoToNetIOBuffer(pending_send_.get())); |
- int write_result = |
- socket_->Write(buf.get(), static_cast<int>(num_bytes), |
- base::Bind(&TCPConnectedSocketImpl::DidSend, |
- weak_ptr_factory_.GetWeakPtr(), false)); |
- if (write_result == net::ERR_IO_PENDING) { |
- // Pending I/O, wait for result in DidSend(). |
- } else if (write_result >= 0) { |
- // Synchronous data consumed. |
- DidSend(true, write_result); |
- } else { |
- // write_result < 0 indicates error. |
- ShutdownSend(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- } |
-} |
- |
-void TCPConnectedSocketImpl::OnSendStreamReady(MojoResult result) { |
- if (result != MOJO_RESULT_OK) { |
- ShutdownSend(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- ListenForSendPeerClosed(); |
- SendMore(); |
-} |
- |
-void TCPConnectedSocketImpl::DidSend(bool completed_synchronously, int result) { |
- if (!pending_send_) |
- return; |
- |
- if (result < 0) { |
- ShutdownSend(); |
- // TODO(johnmccutchan): Notify socket direction is closed along with |
- // net_result and mojo_result. |
- return; |
- } |
- |
- // Take back ownership of the stream and free the IOBuffer. |
- send_stream_ = pending_send_->Complete(result); |
- pending_send_ = nullptr; |
- |
- // Schedule more writing. |
- if (completed_synchronously) { |
- // Don't recursively call SendMore if this is a sync read. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::Bind(&TCPConnectedSocketImpl::SendMore, |
- weak_ptr_factory_.GetWeakPtr())); |
- } else { |
- SendMore(); |
- } |
-} |
- |
-void TCPConnectedSocketImpl::ShutdownSend() { |
- send_handle_watcher_.Stop(); |
- pending_send_ = nullptr; |
- send_stream_.reset(); |
- DeleteIfNeeded(); |
-} |
- |
-void TCPConnectedSocketImpl::ListenForSendPeerClosed() { |
- send_handle_watcher_.Start( |
- send_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
- MOJO_DEADLINE_INDEFINITE, |
- base::Bind(&TCPConnectedSocketImpl::OnSendDataPipeClosed, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void TCPConnectedSocketImpl::OnSendDataPipeClosed(MojoResult result) { |
- ShutdownSend(); |
-} |
- |
-void TCPConnectedSocketImpl::DeleteIfNeeded() { |
- bool has_send = pending_send_ || send_stream_.is_valid(); |
- bool has_receive = pending_receive_ || receive_stream_.is_valid(); |
- if (!binding_.is_bound() && !has_send && !has_receive) |
- delete this; |
-} |
- |
-} // namespace mojo |