| 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
|
|
|