// Copyright 2013 The Chromium Authors
// 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/functional/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_
