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

#ifndef MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_
#define MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_

#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/common/handle_watcher.h"
#include "mojo/services/network/interfaces/tcp_connected_socket.mojom.h"
#include "net/socket/tcp_socket.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"

namespace mojo {

class MojoToNetPendingBuffer;
class NetToMojoPendingBuffer;

class TCPConnectedSocketImpl : public TCPConnectedSocket {
 public:
  TCPConnectedSocketImpl(scoped_ptr<net::TCPSocket> socket,
                         ScopedDataPipeConsumerHandle send_stream,
                         ScopedDataPipeProducerHandle receive_stream,
                         InterfaceRequest<TCPConnectedSocket> request);
  ~TCPConnectedSocketImpl() override;

 private:
  // "Receiving" in this context means reading from TCPSocket and writing to
  // the Mojo receive_stream.
  void ReceiveMore();
  void OnReceiveStreamReady(MojoResult result);
  void DidReceive(bool completed_synchronously, int result);
  void ShutdownReceive();
  void ListenForReceivePeerClosed();
  void OnReceiveDataPipeClosed(MojoResult result);

  // "Writing" is reading from the Mojo send_stream and writing to the
  // TCPSocket.
  void SendMore();
  void SendMoreAsync();
  void OnSendStreamReady(MojoResult result);
  void DidSend(bool completed_asynchronously, int result);
  void ShutdownSend();
  void ListenForSendPeerClosed();
  void OnSendDataPipeClosed(MojoResult result);

  void OnConnectionError();
  void DeleteIfNeeded();

  scoped_ptr<net::TCPSocket> socket_;

  // The *stream handles will be null while there is an in-progress transation
  // between net and mojo. During this time, the handle will be owned by the
  // *PendingBuffer.

  // For reading from the network and writing to Mojo pipe.
  ScopedDataPipeConsumerHandle send_stream_;
  scoped_refptr<NetToMojoPendingBuffer> pending_receive_;
  common::HandleWatcher receive_handle_watcher_;

  // For reading from the Mojo pipe and writing to the network.
  ScopedDataPipeProducerHandle receive_stream_;
  scoped_refptr<MojoToNetPendingBuffer> pending_send_;
  common::HandleWatcher send_handle_watcher_;

  // To bind to the message pipe.
  Binding<TCPConnectedSocket> binding_;

  bool send_more_posted_;

  base::WeakPtrFactory<TCPConnectedSocketImpl> weak_ptr_factory_;
};

}  // namespace mojo

#endif  // MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_
