// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEBSHARE_STORE_FILE_TASK_H_
#define CHROME_BROWSER_WEBSHARE_STORE_FILE_TASK_H_
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/simple_watcher.h"
#include "third_party/blink/public/mojom/blob/blob.mojom.h"
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
namespace webshare {
// Stores shared |file| using the specified |filename|.
class StoreFileTask : public blink::mojom::BlobReaderClient {
public:
// |available_space| will be decreased by the size of the file.
StoreFileTask(base::FilePath filename,
blink::mojom::SharedFilePtr file,
uint64_t& available_space,
blink::mojom::ShareService::ShareCallback callback);
StoreFileTask(const StoreFileTask&) = delete;
StoreFileTask& operator=(const StoreFileTask&) = delete;
~StoreFileTask() override;
// Must be called on a thread that allows blocking IO.
void Start();
// Create empty files instead of copying from the SharedFilePtr.
static void SkipCopyingForTesting();
private:
void StartRead();
void OnDataPipeReadable(MojoResult result);
void OnSuccess();
// mojom::blink::BlobReaderClient:
void OnCalculatedSize(uint64_t total_size,
uint64_t expected_content_size) override;
void OnComplete(int32_t status, uint64_t data_length) override;
base::FilePath filename_;
blink::mojom::SharedFilePtr file_;
const raw_ref<uint64_t> available_space_;
blink::mojom::ShareService::ShareCallback callback_;
base::File output_file_;
uint64_t total_bytes_ = 0;
uint64_t bytes_received_ = 0;
bool received_all_data_ = false;
bool received_on_complete_ = false;
mojo::ScopedDataPipeConsumerHandle consumer_handle_;
mojo::SimpleWatcher read_pipe_watcher_;
mojo::Receiver<blink::mojom::BlobReaderClient> receiver_{this};
base::WeakPtrFactory<StoreFileTask> weak_ptr_factory_{this};
};
} // namespace webshare
#endif // CHROME_BROWSER_WEBSHARE_STORE_FILE_TASK_H_