| // Copyright 2016 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 CHROME_BROWSER_CHROMEOS_BASE_FILE_FLUSHER_H_ |
| #define CHROME_BROWSER_CHROMEOS_BASE_FILE_FLUSHER_H_ |
| |
| #include <vector> |
| |
| #include "base/callback.h" |
| #include "base/files/file_path.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| |
| namespace chromeos { |
| |
| // Flushes files under the requested directories in the blocking pool. If the |
| // same directory is requested more than once, the last request cancels all |
| // previous ones and start a new flushing process. |
| class FileFlusher { |
| public: |
| FileFlusher(); |
| ~FileFlusher(); |
| |
| // Flush everything under |path| except the directories/files in |excludes|. |
| // |excluedes| can hold both absolute or relative paths, where absolute paths |
| // are used as-is and relative paths are appended to |path| to make it |
| // absolute. |callback| is invoked when the request is finished or canceled. |
| void RequestFlush(const base::FilePath& path, |
| const std::vector<base::FilePath>& excludes, |
| const base::Closure& callback); |
| |
| // Set a callback for every file flush for test. Note the callback is |
| // called on a blocking pool thread. |
| using OnFlushCallback = base::Callback<void(const base::FilePath&)>; |
| void set_on_flush_callback_for_test( |
| const OnFlushCallback& on_flush_callback) { |
| on_flush_callback_for_test_ = on_flush_callback; |
| } |
| |
| void PauseForTest(); |
| void ResumeForTest(); |
| |
| private: |
| // Job for the flushing requests. |
| class Job; |
| |
| // Starts the first job in |jobs_|. |
| void ScheduleJob(); |
| |
| // Invoked by a Job when it finishes. |
| void OnJobDone(Job* job); |
| |
| // Not owned. Job manages its own life time. |
| std::vector<Job*> jobs_; |
| |
| // A callback for testing to be invoked when a file is flushed. |
| OnFlushCallback on_flush_callback_for_test_; |
| |
| bool paused_for_test_ = false; |
| |
| base::WeakPtrFactory<FileFlusher> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FileFlusher); |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // CHROME_BROWSER_CHROMEOS_BASE_FILE_FLUSHER_H_ |