// 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_EDK_JS_DRAIN_DATA_H_
#define MOJO_EDK_JS_DRAIN_DATA_H_

#include <memory>
#include <vector>

#include "gin/runner.h"
#include "mojo/public/cpp/system/core.h"
#include "mojo/public/cpp/system/simple_watcher.h"
#include "v8/include/v8.h"

namespace mojo {
namespace edk {
namespace js {

// This class is the implementation of the Mojo JavaScript core module's
// drainData() method. It is not intended to be used directly. The caller
// allocates a DrainData on the heap and returns GetPromise() to JS. The
// implementation deletes itself after reading as much data as possible
// and rejecting or resolving the Promise.

class DrainData {
 public:
  // Starts waiting for data on the specified data pipe consumer handle.
  // See WaitForData(). The constructor does not block.
  DrainData(v8::Isolate* isolate, mojo::Handle handle);

  // Returns a Promise that will be settled when no more data can be read.
  // Should be called just once on a newly allocated DrainData object.
  v8::Handle<v8::Value> GetPromise();

 private:
  ~DrainData();

  // Waits for data to be available. DataReady() will be notified.
  void WaitForData();

  // Use ReadData() to read whatever is availble now on handle_ and save
  // it in data_buffers_.
  void DataReady(MojoResult result);
  MojoResult ReadData();

  // When the remote data pipe handle is closed, or an error occurs, deliver
  // all of the buffered data to the JS Promise and then delete this.
  void DeliverData(MojoResult result);

  using DataBuffer = std::vector<char>;

  v8::Isolate* isolate_;
  ScopedDataPipeConsumerHandle handle_;
  SimpleWatcher handle_watcher_;
  base::WeakPtr<gin::Runner> runner_;
  v8::UniquePersistent<v8::Promise::Resolver> resolver_;
  std::vector<std::unique_ptr<DataBuffer>> data_buffers_;
};

}  // namespace js
}  // namespace edk
}  // namespace mojo

#endif  // MOJO_EDK_JS_DRAIN_DATA_H_
