// Copyright 2018 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 STORAGE_BROWSER_FILEAPI_FILE_WRITER_IMPL_H_
#define STORAGE_BROWSER_FILEAPI_FILE_WRITER_IMPL_H_

#include "base/component_export.h"
#include "base/memory/weak_ptr.h"
#include "storage/browser/fileapi/file_system_operation_runner.h"
#include "storage/browser/fileapi/file_system_url.h"
#include "third_party/blink/public/mojom/filesystem/file_writer.mojom.h"

namespace storage {

// This class itself is stateless, but it uses the passed in
// FileSystemOperationRunner and BlobStorageContext so all methods should be
// called on the sequence those instances live on. In chromium that means all
// usage has to be on the IO thread.
class COMPONENT_EXPORT(STORAGE_BROWSER) FileWriterImpl
    : public blink::mojom::FileWriter {
 public:
  FileWriterImpl(FileSystemURL url,
                 std::unique_ptr<FileSystemOperationRunner> operation_runner,
                 base::WeakPtr<BlobStorageContext> blob_context);
  ~FileWriterImpl() override;

  void Write(uint64_t position,
             blink::mojom::BlobPtr blob,
             WriteCallback callback) override;
  void WriteStream(uint64_t position,
                   mojo::ScopedDataPipeConsumerHandle stream,
                   WriteStreamCallback callback) override;
  void Truncate(uint64_t length, TruncateCallback callback) override;

 private:
  void DoWrite(WriteCallback callback,
               uint64_t position,
               std::unique_ptr<BlobDataHandle> blob);
  void DoWriteWithFileInfo(WriteCallback callback,
                           uint64_t position,
                           std::unique_ptr<BlobDataHandle> blob,
                           base::File::Error result,
                           const base::File::Info& file_info);
  void DoWriteStreamWithFileInfo(WriteCallback callback,
                                 uint64_t position,
                                 mojo::ScopedDataPipeConsumerHandle data_pipe,
                                 base::File::Error result,
                                 const base::File::Info& file_info);

  struct WriteState {
    uint64_t bytes_written = 0;
  };
  void DidWrite(WriteCallback callback,
                WriteState* state,
                base::File::Error result,
                int64_t bytes,
                bool complete);
  void DidTruncate(TruncateCallback callback, base::File::Error result);

  const std::unique_ptr<FileSystemOperationRunner> operation_runner_;
  const base::WeakPtr<BlobStorageContext> blob_context_;
  const FileSystemURL url_;

  base::WeakPtrFactory<FileWriterImpl> weak_ptr_factory_;
};

}  // namespace storage

#endif  // STORAGE_BROWSER_FILEAPI_FILE_WRITER_IMPL_H_
