|  | // 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_ |