OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" | 5 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 return "CLOSE_FILE"; | 32 return "CLOSE_FILE"; |
33 case READ_FILE: | 33 case READ_FILE: |
34 return "READ_FILE"; | 34 return "READ_FILE"; |
35 case TESTING: | 35 case TESTING: |
36 return "TESTING"; | 36 return "TESTING"; |
37 } | 37 } |
38 NOTREACHED(); | 38 NOTREACHED(); |
39 return ""; | 39 return ""; |
40 } | 40 } |
41 | 41 |
42 RequestManager::RequestManager() | 42 RequestManager::RequestManager( |
43 : next_id_(1), | 43 NotificationManagerInterface* notification_manager) |
| 44 : notification_manager_(notification_manager), |
| 45 next_id_(1), |
44 timeout_(base::TimeDelta::FromSeconds(kDefaultTimeout)), | 46 timeout_(base::TimeDelta::FromSeconds(kDefaultTimeout)), |
45 weak_ptr_factory_(this) {} | 47 weak_ptr_factory_(this) { |
| 48 } |
46 | 49 |
47 RequestManager::~RequestManager() { | 50 RequestManager::~RequestManager() { |
48 // Abort all of the active requests. | 51 // Abort all of the active requests. |
49 RequestMap::iterator it = requests_.begin(); | 52 RequestMap::iterator it = requests_.begin(); |
50 while (it != requests_.end()) { | 53 while (it != requests_.end()) { |
51 const int request_id = it->first; | 54 const int request_id = it->first; |
52 ++it; | 55 ++it; |
53 RejectRequest(request_id, | 56 RejectRequest(request_id, |
54 scoped_ptr<RequestValue>(new RequestValue()), | 57 scoped_ptr<RequestValue>(new RequestValue()), |
55 base::File::FILE_ERROR_ABORT); | 58 base::File::FILE_ERROR_ABORT); |
(...skipping 14 matching lines...) Expand all Loading... |
70 return 0; | 73 return 0; |
71 | 74 |
72 TRACE_EVENT_ASYNC_BEGIN1("file_system_provider", | 75 TRACE_EVENT_ASYNC_BEGIN1("file_system_provider", |
73 "RequestManager::Request", | 76 "RequestManager::Request", |
74 request_id, | 77 request_id, |
75 "type", | 78 "type", |
76 type); | 79 type); |
77 | 80 |
78 Request* request = new Request; | 81 Request* request = new Request; |
79 request->handler = handler.Pass(); | 82 request->handler = handler.Pass(); |
80 request->timeout_timer.Start(FROM_HERE, | |
81 timeout_, | |
82 base::Bind(&RequestManager::OnRequestTimeout, | |
83 weak_ptr_factory_.GetWeakPtr(), | |
84 request_id)); | |
85 requests_[request_id] = request; | 83 requests_[request_id] = request; |
| 84 ResetTimer(request_id); |
86 | 85 |
87 FOR_EACH_OBSERVER(Observer, observers_, OnRequestCreated(request_id, type)); | 86 FOR_EACH_OBSERVER(Observer, observers_, OnRequestCreated(request_id, type)); |
88 | 87 |
89 // Execute the request implementation. In case of an execution failure, | 88 // Execute the request implementation. In case of an execution failure, |
90 // unregister and return 0. This may often happen, eg. if the providing | 89 // unregister and return 0. This may often happen, eg. if the providing |
91 // extension is not listening for the request event being sent. | 90 // extension is not listening for the request event being sent. |
92 // In such case, we should abort as soon as possible. | 91 // In such case, we should abort as soon as possible. |
93 if (!request->handler->Execute(request_id)) { | 92 if (!request->handler->Execute(request_id)) { |
94 DestroyRequest(request_id); | 93 DestroyRequest(request_id); |
95 return 0; | 94 return 0; |
96 } | 95 } |
97 | 96 |
98 FOR_EACH_OBSERVER(Observer, observers_, OnRequestExecuted(request_id)); | 97 FOR_EACH_OBSERVER(Observer, observers_, OnRequestExecuted(request_id)); |
99 | 98 |
100 return request_id; | 99 return request_id; |
101 } | 100 } |
102 | 101 |
103 bool RequestManager::FulfillRequest(int request_id, | 102 bool RequestManager::FulfillRequest(int request_id, |
104 scoped_ptr<RequestValue> response, | 103 scoped_ptr<RequestValue> response, |
105 bool has_more) { | 104 bool has_more) { |
106 RequestMap::iterator request_it = requests_.find(request_id); | 105 RequestMap::iterator request_it = requests_.find(request_id); |
107 if (request_it == requests_.end()) | 106 if (request_it == requests_.end()) |
108 return false; | 107 return false; |
109 | 108 |
110 request_it->second->handler->OnSuccess(request_id, response.Pass(), has_more); | 109 request_it->second->handler->OnSuccess(request_id, response.Pass(), has_more); |
111 | 110 |
112 FOR_EACH_OBSERVER( | 111 FOR_EACH_OBSERVER( |
113 Observer, observers_, OnRequestFulfilled(request_id, has_more)); | 112 Observer, observers_, OnRequestFulfilled(request_id, has_more)); |
114 | 113 |
115 if (!has_more) | 114 if (!has_more) { |
116 DestroyRequest(request_id); | 115 DestroyRequest(request_id); |
117 else | 116 } else { |
118 request_it->second->timeout_timer.Reset(); | 117 if (notification_manager_) |
| 118 notification_manager_->HideUnresponsiveNotification(request_id); |
| 119 ResetTimer(request_id); |
| 120 } |
119 | 121 |
120 return true; | 122 return true; |
121 } | 123 } |
122 | 124 |
123 bool RequestManager::RejectRequest(int request_id, | 125 bool RequestManager::RejectRequest(int request_id, |
124 scoped_ptr<RequestValue> response, | 126 scoped_ptr<RequestValue> response, |
125 base::File::Error error) { | 127 base::File::Error error) { |
126 RequestMap::iterator request_it = requests_.find(request_id); | 128 RequestMap::iterator request_it = requests_.find(request_id); |
127 if (request_it == requests_.end()) | 129 if (request_it == requests_.end()) |
128 return false; | 130 return false; |
(...skipping 23 matching lines...) Expand all Loading... |
152 observers_.RemoveObserver(observer); | 154 observers_.RemoveObserver(observer); |
153 } | 155 } |
154 | 156 |
155 RequestManager::Request::Request() {} | 157 RequestManager::Request::Request() {} |
156 | 158 |
157 RequestManager::Request::~Request() {} | 159 RequestManager::Request::~Request() {} |
158 | 160 |
159 void RequestManager::OnRequestTimeout(int request_id) { | 161 void RequestManager::OnRequestTimeout(int request_id) { |
160 FOR_EACH_OBSERVER(Observer, observers_, OnRequestTimeouted(request_id)); | 162 FOR_EACH_OBSERVER(Observer, observers_, OnRequestTimeouted(request_id)); |
161 | 163 |
| 164 if (!notification_manager_) { |
| 165 RejectRequest(request_id, |
| 166 scoped_ptr<RequestValue>(new RequestValue()), |
| 167 base::File::FILE_ERROR_ABORT); |
| 168 return; |
| 169 } |
| 170 |
| 171 notification_manager_->ShowUnresponsiveNotification( |
| 172 request_id, |
| 173 base::Bind(&RequestManager::OnUnresponsiveNotificationResult, |
| 174 weak_ptr_factory_.GetWeakPtr(), |
| 175 request_id)); |
| 176 } |
| 177 |
| 178 void RequestManager::OnUnresponsiveNotificationResult( |
| 179 int request_id, |
| 180 NotificationManagerInterface::NotificationResult result) { |
| 181 RequestMap::iterator request_it = requests_.find(request_id); |
| 182 if (request_it == requests_.end()) |
| 183 return; |
| 184 |
| 185 if (result == NotificationManagerInterface::CONTINUE) { |
| 186 ResetTimer(request_id); |
| 187 return; |
| 188 } |
| 189 |
162 RejectRequest(request_id, | 190 RejectRequest(request_id, |
163 scoped_ptr<RequestValue>(new RequestValue()), | 191 scoped_ptr<RequestValue>(new RequestValue()), |
164 base::File::FILE_ERROR_ABORT); | 192 base::File::FILE_ERROR_ABORT); |
165 } | 193 } |
166 | 194 |
| 195 void RequestManager::ResetTimer(int request_id) { |
| 196 RequestMap::iterator request_it = requests_.find(request_id); |
| 197 if (request_it == requests_.end()) |
| 198 return; |
| 199 |
| 200 request_it->second->timeout_timer.Start( |
| 201 FROM_HERE, |
| 202 timeout_, |
| 203 base::Bind(&RequestManager::OnRequestTimeout, |
| 204 weak_ptr_factory_.GetWeakPtr(), |
| 205 request_id)); |
| 206 } |
| 207 |
167 void RequestManager::DestroyRequest(int request_id) { | 208 void RequestManager::DestroyRequest(int request_id) { |
168 RequestMap::iterator request_it = requests_.find(request_id); | 209 RequestMap::iterator request_it = requests_.find(request_id); |
169 if (request_it == requests_.end()) | 210 if (request_it == requests_.end()) |
170 return; | 211 return; |
171 | 212 |
172 delete request_it->second; | 213 delete request_it->second; |
173 requests_.erase(request_it); | 214 requests_.erase(request_it); |
174 | 215 |
| 216 if (notification_manager_) |
| 217 notification_manager_->HideUnresponsiveNotification(request_id); |
| 218 |
175 FOR_EACH_OBSERVER(Observer, observers_, OnRequestDestroyed(request_id)); | 219 FOR_EACH_OBSERVER(Observer, observers_, OnRequestDestroyed(request_id)); |
176 | 220 |
177 TRACE_EVENT_ASYNC_END0( | 221 TRACE_EVENT_ASYNC_END0( |
178 "file_system_provider", "RequestManager::Request", request_id); | 222 "file_system_provider", "RequestManager::Request", request_id); |
179 } | 223 } |
180 | 224 |
181 } // namespace file_system_provider | 225 } // namespace file_system_provider |
182 } // namespace chromeos | 226 } // namespace chromeos |
OLD | NEW |