// Copyright (c) 2012 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 REMOTING_BASE_SOCKET_READER_H_
#define REMOTING_BASE_SOCKET_READER_H_

#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"

namespace net {
class IOBuffer;
class Socket;
}  // namespace net

namespace remoting {

// SocketReader reads data from a socket and then calls a callback for each
// completed read. Note that when this object is destroyed it may leave a
// pending read request for the socket, so the calling code should never try
// reading from the same socket again (e.g. it may result in data being lost).
class SocketReader {
 public:
  // Callback that is called for each finished read. |data| may be set to NULL
  // in case of an error (result < 0).
  typedef base::OnceCallback<void(scoped_refptr<net::IOBuffer> data,
                                  int result)>
      ReadResultCallback;

  SocketReader();
  ~SocketReader();

  // Starts reading from |socket|. |read_result_callback| is called for each
  // completed read. Reading stops on the first error. Must not be called more
  // than once.
  void Init(net::Socket* socket, ReadResultCallback read_result_callback);

 private:
  void DoRead();
  void OnRead(int result);
  void HandleReadResult(int result);
  void CallCallback(scoped_refptr<net::IOBuffer> data, int result);

  net::Socket* socket_;
  ReadResultCallback read_result_callback_;
  scoped_refptr<net::IOBuffer> read_buffer_;

  base::WeakPtrFactory<SocketReader> weak_factory_{this};

  DISALLOW_COPY_AND_ASSIGN(SocketReader);
};

}  // namespace remoting

#endif  // REMOTING_BASE_SOCKET_READER_H_
