| // Copyright 2022 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_ASH_FILE_SYSTEM_PROVIDER_OPERATION_REQUEST_MANAGER_H_ |
| #define CHROME_BROWSER_ASH_FILE_SYSTEM_PROVIDER_OPERATION_REQUEST_MANAGER_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/files/file.h" |
| #include "base/functional/callback.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/observer_list.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| #include "chrome/browser/ash/file_system_provider/notification_manager_interface.h" |
| #include "chrome/browser/ash/file_system_provider/request_manager.h" |
| #include "chrome/browser/ash/file_system_provider/request_value.h" |
| |
| class Profile; |
| |
| namespace ash::file_system_provider { |
| |
| // Manages requests for provided file system operations by assigning them a |
| // request id and timing out slow requests. Note: Those requests are all |
| // requests that have a fileSystemId, which is all requests except |
| // onMountRequested, handled by another instance of RequestManager. |
| class OperationRequestManager : public RequestManager { |
| public: |
| // Creates a request manager for |profile| and |provider_id|. Note, that |
| // there is one instance per provided file system, thus potentially be |
| // multiple instances per provider. |
| OperationRequestManager(Profile* profile, |
| const std::string& provider_id, |
| NotificationManagerInterface* notification_manager, |
| base::TimeDelta timeout); |
| |
| OperationRequestManager(const OperationRequestManager&) = delete; |
| OperationRequestManager& operator=(const OperationRequestManager&) = delete; |
| ~OperationRequestManager() override; |
| |
| // Indicate start/end of an operation that involves user interaction. As long |
| // as least one interaction is active, "unresponsive operation" notifications |
| // won't be shown. Not intended to be called directly, but via |
| // `ProvidedFileSystem::StartUserInteraction` instead. |
| void StartUserInteraction() { current_user_interactions_++; } |
| void EndUserInteraction() { current_user_interactions_--; } |
| |
| private: |
| // Called when a request with |request_id| times out. |
| void OnRequestTimeout(int request_id) override; |
| |
| // Checks whether there is an ongoing interaction between the provider |
| // and user. |
| bool IsInteractingWithUser() const; |
| |
| std::string provider_id_; |
| int current_user_interactions_ = 0; |
| }; |
| |
| } // namespace ash::file_system_provider |
| |
| #endif // CHROME_BROWSER_ASH_FILE_SYSTEM_PROVIDER_OPERATION_REQUEST_MANAGER_H_ |