// Copyright 2013 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 EXTENSIONS_BROWSER_BLOB_READER_H_
#define EXTENSIONS_BROWSER_BLOB_READER_H_

#include <stdint.h>

#include <memory>
#include <string>

#include "base/callback.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "third_party/blink/public/mojom/blob/blob.mojom.h"
#include "url/gurl.h"

namespace content {
class BrowserContext;
}

// This class may only be used from the UI thread.
class BlobReader : public blink::mojom::BlobReaderClient,
                   public mojo::DataPipeDrainer::Client {
 public:
  // |blob_data| contains the portion of the Blob requested. |blob_total_size|
  // is the total size of the Blob, and may be larger than |blob_data->size()|.
  // |blob_total_size| is -1 if it cannot be determined.
  typedef base::OnceCallback<void(std::unique_ptr<std::string> blob_data,
                                  int64_t blob_total_size)>
      BlobReadCallback;

  static void Read(content::BrowserContext* browser_context,
                   const std::string& blob_uuid,
                   BlobReadCallback callback,
                   int64_t offset,
                   int64_t length);
  static void Read(content::BrowserContext* browser_context,
                   const std::string& blob_uuid,
                   BlobReadCallback callback);

  BlobReader(const BlobReader&) = delete;
  BlobReader& operator=(const BlobReader&) = delete;

  ~BlobReader() override;

 private:
  struct Range {
    uint64_t offset;
    uint64_t length;
  };

  static void Read(content::BrowserContext* browser_context,
                   const std::string& blob_uuid,
                   BlobReadCallback callback,
                   absl::optional<BlobReader::Range> range);

  BlobReader(mojo::PendingRemote<blink::mojom::Blob> blob,
             absl::optional<Range> range);
  void Start(base::OnceClosure callback);

  // blink::mojom::BlobReaderClient:
  void OnCalculatedSize(uint64_t total_size,
                        uint64_t expected_content_size) override;
  void OnComplete(int32_t status, uint64_t data_length) override {}

  // mojo::DataPipeDrainer:
  void OnDataAvailable(const void* data, size_t num_bytes) override;
  void OnDataComplete() override;

  void Failed();
  void Succeeded();

  base::OnceClosure callback_;
  mojo::Remote<blink::mojom::Blob> blob_;
  absl::optional<Range> read_range_;

  mojo::Receiver<blink::mojom::BlobReaderClient> receiver_{this};
  std::unique_ptr<mojo::DataPipeDrainer> data_pipe_drainer_;

  absl::optional<uint64_t> blob_length_;
  std::unique_ptr<std::string> blob_data_;
  bool data_complete_ = false;
};

#endif  // EXTENSIONS_BROWSER_BLOB_READER_H_
