// 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 CHROMEOS_DBUS_PIPE_READER_H_
#define CHROMEOS_DBUS_PIPE_READER_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/files/scoped_file.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "chromeos/chromeos_export.h"

namespace base {
class TaskRunner;
}

namespace net {
class FileStream;
class IOBufferWithSize;
}

namespace chromeos {

// Simple class to encapsulate collecting data from a pipe into a
// string.  To use:
//   - Instantiate the appropriate subclass of PipeReader
//   - Call StartIO() which will create the appropriate FDs.
//   - As data is received, the PipeReader will collect this data
//     as appropriate to the subclass.
//   - When the there is no more data to read, the PipeReader calls
//     |callback|.
class CHROMEOS_EXPORT PipeReader {
 public:
  using CompletionCallback =
      base::OnceCallback<void(base::Optional<std::string> data)>;

  explicit PipeReader(const scoped_refptr<base::TaskRunner>& task_runner);
  ~PipeReader();

  // Starts data collection.
  // Returns the write end of the pipe if stream was setup correctly.
  // On completion, |callback| will be called with the read |data| in
  // case of success, or with nullopt in case of an error.
  // To shut down the collection delete the instance.
  base::ScopedFD StartIO(CompletionCallback callback);

 private:
  // Posts a task to read the data from the pipe. Returns
  // net::FileStream::Read()'s result.
  int RequestRead();

  // Called when |io_buffer_| is filled via |data_stream_.Read()|.
  void OnRead(int byte_count);

  scoped_refptr<net::IOBufferWithSize> io_buffer_;
  scoped_refptr<base::TaskRunner> task_runner_;

  CompletionCallback callback_;
  std::unique_ptr<net::FileStream> data_stream_;
  std::string data_;

  // Note: This should remain the last member so it'll be destroyed and
  // invalidate its weak pointers before any other members are destroyed.
  base::WeakPtrFactory<PipeReader> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(PipeReader);
};

}  // namespace chromeos

#endif  // CHROMEOS_DBUS_PIPE_READER_H_
