request_manager.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_REQUEST_MANAGER_H_ 6#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_REQUEST_MANAGER_H_ 7 8#include <map> 9#include <string> 10 11#include "base/callback.h" 12#include "base/files/file.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/memory/weak_ptr.h" 15#include "base/observer_list.h" 16#include "base/time/time.h" 17#include "base/timer/timer.h" 18#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h" 19#include "chrome/browser/chromeos/file_system_provider/request_value.h" 20 21namespace chromeos { 22namespace file_system_provider { 23 24// Request type, passed to RequestManager::CreateRequest. For logging purposes. 25enum RequestType { 26 REQUEST_UNMOUNT, 27 GET_METADATA, 28 READ_DIRECTORY, 29 OPEN_FILE, 30 CLOSE_FILE, 31 READ_FILE, 32 TESTING 33}; 34 35// Converts a request type to human-readable format. 36std::string RequestTypeToString(RequestType type); 37 38// Manages requests between the service, async utils and the providing 39// extensions. 40class RequestManager { 41 public: 42 // Handles requests. Each request implementation must implement 43 // this interface. 44 class HandlerInterface { 45 public: 46 virtual ~HandlerInterface() {} 47 48 // Called when the request is created. Executes the request implementation. 49 // Returns false in case of a execution failure. 50 virtual bool Execute(int request_id) = 0; 51 52 // Success callback invoked by the providing extension in response to 53 // Execute(). It may be called more than once, until |has_more| is set to 54 // false. 55 virtual void OnSuccess(int request_id, 56 scoped_ptr<RequestValue> result, 57 bool has_more) = 0; 58 59 // Error callback invoked by the providing extension in response to 60 // Execute(). It can be called at most once. It can be also called if the 61 // request is aborted due to a timeout. 62 virtual void OnError(int request_id, base::File::Error error) = 0; 63 }; 64 65 // Observes activities in the request manager. 66 class Observer { 67 public: 68 virtual ~Observer() {} 69 70 // Called when the request is created. 71 virtual void OnRequestCreated(int request_id, RequestType type) = 0; 72 73 // Called when the request is destroyed. 74 virtual void OnRequestDestroyed(int request_id) = 0; 75 76 // Called when the request is executed. 77 virtual void OnRequestExecuted(int request_id) = 0; 78 79 // Called when the request is fulfilled with a success. 80 virtual void OnRequestFulfilled(int request_id, bool has_more) = 0; 81 82 // Called when the request is rejected with an error. 83 virtual void OnRequestRejected(int request_id, base::File::Error error) = 0; 84 85 // Called when the request is timeouted. 86 virtual void OnRequestTimeouted(int request_id) = 0; 87 }; 88 89 RequestManager(); 90 virtual ~RequestManager(); 91 92 // Creates a request and returns its request id (greater than 0). Returns 0 in 93 // case of an error (eg. too many requests). The |type| argument indicates 94 // what kind of request it is. 95 int CreateRequest(RequestType type, scoped_ptr<HandlerInterface> handler); 96 97 // Handles successful response for the |request_id|. If |has_more| is false, 98 // then the request is disposed, after handling the |response|. On error, 99 // returns false, and the request is disposed. 100 bool FulfillRequest(int request_id, 101 scoped_ptr<RequestValue> response, 102 bool has_more); 103 104 // Handles error response for the |request_id|. If handling the error fails, 105 // returns false. Always disposes the request. 106 bool RejectRequest(int request_id, base::File::Error error); 107 108 // Sets a custom timeout for tests. The new timeout value will be applied to 109 // new requests 110 void SetTimeoutForTesting(const base::TimeDelta& timeout); 111 112 // Gets number of active requests for logging purposes. 113 // TODO(mtomasz): Introduce a logger class to gather more information 114 size_t GetActiveRequestsForLogging() const; 115 116 // Adds and removes observers. 117 void AddObserver(Observer* observer); 118 void RemoveObserver(Observer* observer); 119 120 private: 121 struct Request { 122 Request(); 123 ~Request(); 124 125 // Timer for discarding the request during a timeout. 126 base::OneShotTimer<RequestManager> timeout_timer; 127 128 // Handler tied to this request. 129 scoped_ptr<HandlerInterface> handler; 130 131 private: 132 DISALLOW_COPY_AND_ASSIGN(Request); 133 }; 134 135 typedef std::map<int, Request*> RequestMap; 136 137 // Destroys the request with the passed |request_id|. 138 void DestroyRequest(int request_id); 139 140 // Called when a request with |request_id| timeouts. 141 void OnRequestTimeout(int request_id); 142 143 RequestMap requests_; 144 int next_id_; 145 base::TimeDelta timeout_; 146 base::WeakPtrFactory<RequestManager> weak_ptr_factory_; 147 ObserverList<Observer> observers_; 148 149 DISALLOW_COPY_AND_ASSIGN(RequestManager); 150}; 151 152} // namespace file_system_provider 153} // namespace chromeos 154 155#endif // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_REQUEST_MANAGER_H_ 156