Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Side by Side Diff: chrome/browser/chromeos/file_system_provider/provided_file_system.cc

Issue 1093383002: [WIP] Provided file system from NACL. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved several modules to chromeos folder. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/provided_file_system.h" 5 #include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/files/file.h" 9 #include "base/files/file.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
11 #include "chrome/browser/chromeos/file_system_provider/file_system_plugin/plugin _operation_router.h"
11 #include "chrome/browser/chromeos/file_system_provider/notification_manager.h" 12 #include "chrome/browser/chromeos/file_system_provider/notification_manager.h"
12 #include "chrome/browser/chromeos/file_system_provider/operations/abort.h" 13 #include "chrome/browser/chromeos/file_system_provider/operations/abort.h"
13 #include "chrome/browser/chromeos/file_system_provider/operations/add_watcher.h" 14 #include "chrome/browser/chromeos/file_system_provider/operations/add_watcher.h"
14 #include "chrome/browser/chromeos/file_system_provider/operations/close_file.h" 15 #include "chrome/browser/chromeos/file_system_provider/operations/close_file.h"
15 #include "chrome/browser/chromeos/file_system_provider/operations/configure.h" 16 #include "chrome/browser/chromeos/file_system_provider/operations/configure.h"
16 #include "chrome/browser/chromeos/file_system_provider/operations/copy_entry.h" 17 #include "chrome/browser/chromeos/file_system_provider/operations/copy_entry.h"
17 #include "chrome/browser/chromeos/file_system_provider/operations/create_directo ry.h" 18 #include "chrome/browser/chromeos/file_system_provider/operations/create_directo ry.h"
18 #include "chrome/browser/chromeos/file_system_provider/operations/create_file.h" 19 #include "chrome/browser/chromeos/file_system_provider/operations/create_file.h"
19 #include "chrome/browser/chromeos/file_system_provider/operations/delete_entry.h " 20 #include "chrome/browser/chromeos/file_system_provider/operations/delete_entry.h "
20 #include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h " 21 #include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h "
21 #include "chrome/browser/chromeos/file_system_provider/operations/move_entry.h" 22 #include "chrome/browser/chromeos/file_system_provider/operations/move_entry.h"
22 #include "chrome/browser/chromeos/file_system_provider/operations/open_file.h" 23 #include "chrome/browser/chromeos/file_system_provider/operations/open_file.h"
23 #include "chrome/browser/chromeos/file_system_provider/operations/read_directory .h" 24 #include "chrome/browser/chromeos/file_system_provider/operations/read_directory .h"
24 #include "chrome/browser/chromeos/file_system_provider/operations/read_file.h" 25 #include "chrome/browser/chromeos/file_system_provider/operations/read_file.h"
25 #include "chrome/browser/chromeos/file_system_provider/operations/remove_watcher .h" 26 #include "chrome/browser/chromeos/file_system_provider/operations/remove_watcher .h"
26 #include "chrome/browser/chromeos/file_system_provider/operations/truncate.h" 27 #include "chrome/browser/chromeos/file_system_provider/operations/truncate.h"
27 #include "chrome/browser/chromeos/file_system_provider/operations/unmount.h" 28 #include "chrome/browser/chromeos/file_system_provider/operations/unmount.h"
28 #include "chrome/browser/chromeos/file_system_provider/operations/write_file.h" 29 #include "chrome/browser/chromeos/file_system_provider/operations/write_file.h"
29 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" 30 #include "chrome/browser/chromeos/file_system_provider/request_manager.h"
30 #include "chrome/browser/profiles/profile.h" 31 #include "chrome/browser/profiles/profile.h"
31 #include "chrome/common/extensions/api/file_system_provider.h" 32 #include "chrome/common/extensions/api/file_system_provider.h"
32 #include "extensions/browser/event_router.h" 33 #include "extensions/browser/event_router.h"
33 34
34 namespace net { 35 namespace net {
35 class IOBuffer; 36 class IOBuffer;
36 } // namespace net 37 } // namespace net
37 38
38 namespace chromeos { 39 namespace chromeos {
39 namespace file_system_provider { 40 namespace file_system_provider {
41
42
43 typename ExtensionDestination::EventRouterType*
44 ExtensionDestination::Get(Profile *profile) {
45 return extensions::EventRouter::Get(profile);
46 }
47
48 PluginDestination::EventRouterType* PluginDestination::Get(Profile *) {
49 return chromeos::file_system_provider::PluginOperationRouter::GetInstance();
50 }
51
40 namespace { 52 namespace {
41 53
42 // Discards the result of Abort() when called from the destructor. 54 // Discards the result of Abort() when called from the destructor.
43 void EmptyStatusCallback(base::File::Error /* result */) { 55 void EmptyStatusCallback(base::File::Error /* result */) {
44 } 56 }
45 57
46 } // namespace 58 } // namespace
47 59
48 AutoUpdater::AutoUpdater(const base::Closure& update_callback) 60 AutoUpdater::AutoUpdater(const base::Closure& update_callback)
49 : update_callback_(update_callback), 61 : update_callback_(update_callback),
(...skipping 14 matching lines...) Expand all
64 } 76 }
65 77
66 AutoUpdater::~AutoUpdater() { 78 AutoUpdater::~AutoUpdater() {
67 // If no callbacks are created, then we need to invoke updating in the 79 // If no callbacks are created, then we need to invoke updating in the
68 // destructor. 80 // destructor.
69 if (!created_callbacks_) 81 if (!created_callbacks_)
70 update_callback_.Run(); 82 update_callback_.Run();
71 else if (pending_callbacks_) 83 else if (pending_callbacks_)
72 LOG(ERROR) << "Not all callbacks called. This may happen on shutdown."; 84 LOG(ERROR) << "Not all callbacks called. This may happen on shutdown.";
73 } 85 }
74 86 template <class DestinationPolicy>
75 struct ProvidedFileSystem::AddWatcherInQueueArgs { 87 struct ProvidedFileSystem<DestinationPolicy>::AddWatcherInQueueArgs {
76 AddWatcherInQueueArgs(size_t token, 88 AddWatcherInQueueArgs(size_t token,
77 const GURL& origin, 89 const GURL& origin,
78 const base::FilePath& entry_path, 90 const base::FilePath& entry_path,
79 bool recursive, 91 bool recursive,
80 bool persistent, 92 bool persistent,
81 const storage::AsyncFileUtil::StatusCallback& callback, 93 const storage::AsyncFileUtil::StatusCallback& callback,
82 const storage::WatcherManager::NotificationCallback& 94 const storage::WatcherManager::NotificationCallback&
83 notification_callback) 95 notification_callback)
84 : token(token), 96 : token(token),
85 origin(origin), 97 origin(origin),
86 entry_path(entry_path), 98 entry_path(entry_path),
87 recursive(recursive), 99 recursive(recursive),
88 persistent(persistent), 100 persistent(persistent),
89 callback(callback), 101 callback(callback),
90 notification_callback(notification_callback) {} 102 notification_callback(notification_callback) {}
91 ~AddWatcherInQueueArgs() {} 103 ~AddWatcherInQueueArgs() {}
92 104
93 const size_t token; 105 const size_t token;
94 const GURL origin; 106 const GURL origin;
95 const base::FilePath entry_path; 107 const base::FilePath entry_path;
96 const bool recursive; 108 const bool recursive;
97 const bool persistent; 109 const bool persistent;
98 const storage::AsyncFileUtil::StatusCallback callback; 110 const storage::AsyncFileUtil::StatusCallback callback;
99 const storage::WatcherManager::NotificationCallback notification_callback; 111 const storage::WatcherManager::NotificationCallback notification_callback;
100 }; 112 };
101 113
102 struct ProvidedFileSystem::NotifyInQueueArgs { 114 template <class DestinationPolicy>
115 struct ProvidedFileSystem<DestinationPolicy>::NotifyInQueueArgs {
103 NotifyInQueueArgs(size_t token, 116 NotifyInQueueArgs(size_t token,
104 const base::FilePath& entry_path, 117 const base::FilePath& entry_path,
105 bool recursive, 118 bool recursive,
106 storage::WatcherManager::ChangeType change_type, 119 storage::WatcherManager::ChangeType change_type,
107 scoped_ptr<ProvidedFileSystemObserver::Changes> changes, 120 scoped_ptr<ProvidedFileSystemObserver::Changes> changes,
108 const std::string& tag, 121 const std::string& tag,
109 const storage::AsyncFileUtil::StatusCallback& callback) 122 const storage::AsyncFileUtil::StatusCallback& callback)
110 : token(token), 123 : token(token),
111 entry_path(entry_path), 124 entry_path(entry_path),
112 recursive(recursive), 125 recursive(recursive),
113 change_type(change_type), 126 change_type(change_type),
114 changes(changes.Pass()), 127 changes(changes.Pass()),
115 tag(tag), 128 tag(tag),
116 callback(callback) {} 129 callback(callback) {}
117 ~NotifyInQueueArgs() {} 130 ~NotifyInQueueArgs() {}
118 131
119 const size_t token; 132 const size_t token;
120 const base::FilePath entry_path; 133 const base::FilePath entry_path;
121 const bool recursive; 134 const bool recursive;
122 const storage::WatcherManager::ChangeType change_type; 135 const storage::WatcherManager::ChangeType change_type;
123 const scoped_ptr<ProvidedFileSystemObserver::Changes> changes; 136 const scoped_ptr<ProvidedFileSystemObserver::Changes> changes;
124 const std::string tag; 137 const std::string tag;
125 const storage::AsyncFileUtil::StatusCallback callback; 138 const storage::AsyncFileUtil::StatusCallback callback;
126 139
127 private: 140 private:
128 DISALLOW_COPY_AND_ASSIGN(NotifyInQueueArgs); 141 DISALLOW_COPY_AND_ASSIGN(NotifyInQueueArgs);
129 }; 142 };
130 143
131 ProvidedFileSystem::ProvidedFileSystem( 144 template <class DestinationPolicy>
145 ProvidedFileSystem<DestinationPolicy>::ProvidedFileSystem(
132 Profile* profile, 146 Profile* profile,
133 const ProvidedFileSystemInfo& file_system_info) 147 const ProvidedFileSystemInfo& file_system_info)
134 : profile_(profile), 148 : profile_(profile),
135 event_router_(extensions::EventRouter::Get(profile)), // May be NULL. 149 event_router_(DestinationPolicy::Get(profile)), // May be NULL.
136 file_system_info_(file_system_info), 150 file_system_info_(file_system_info),
137 notification_manager_( 151 notification_manager_(
138 new NotificationManager(profile_, file_system_info_)), 152 new NotificationManager(profile_, file_system_info_)),
139 request_manager_(new RequestManager(profile, 153 request_manager_(new RequestManager(profile,
140 file_system_info.extension_id(), 154 file_system_info.extension_id(),
141 notification_manager_.get())), 155 notification_manager_.get())),
142 watcher_queue_(1), 156 watcher_queue_(1),
143 weak_ptr_factory_(this) { 157 weak_ptr_factory_(this) {
144 } 158 }
145 159 template <class DestinationPolicy>
146 ProvidedFileSystem::~ProvidedFileSystem() { 160 ProvidedFileSystem<DestinationPolicy>::~ProvidedFileSystem() {
147 const std::vector<int> request_ids = request_manager_->GetActiveRequestIds(); 161 const std::vector<int> request_ids = request_manager_->GetActiveRequestIds();
148 for (size_t i = 0; i < request_ids.size(); ++i) { 162 for (size_t i = 0; i < request_ids.size(); ++i) {
149 Abort(request_ids[i]); 163 Abort(request_ids[i]);
150 } 164 }
151 } 165 }
152 166 template <class DestinationPolicy>
153 void ProvidedFileSystem::SetEventRouterForTesting( 167 void ProvidedFileSystem<DestinationPolicy>::SetEventRouterForTesting(
154 extensions::EventRouter* event_router) { 168 typename DestinationPolicy::EventRouterType* event_router) {
155 event_router_ = event_router; 169 event_router_ = event_router;
156 } 170 }
157 171
158 void ProvidedFileSystem::SetNotificationManagerForTesting( 172 template <class DestinationPolicy>
173 void ProvidedFileSystem<DestinationPolicy>::SetNotificationManagerForTesting(
159 scoped_ptr<NotificationManagerInterface> notification_manager) { 174 scoped_ptr<NotificationManagerInterface> notification_manager) {
160 notification_manager_ = notification_manager.Pass(); 175 notification_manager_ = notification_manager.Pass();
161 request_manager_.reset(new RequestManager( 176 request_manager_.reset(new RequestManager(
162 profile_, file_system_info_.extension_id(), notification_manager_.get())); 177 profile_, file_system_info_.extension_id(), notification_manager_.get()));
163 } 178 }
164 179
165 AbortCallback ProvidedFileSystem::RequestUnmount( 180 template <class DestinationPolicy>
181 AbortCallback ProvidedFileSystem<DestinationPolicy>::RequestUnmount(
166 const storage::AsyncFileUtil::StatusCallback& callback) { 182 const storage::AsyncFileUtil::StatusCallback& callback) {
167 const int request_id = request_manager_->CreateRequest( 183 const int request_id = request_manager_->CreateRequest(
168 REQUEST_UNMOUNT, 184 REQUEST_UNMOUNT, scoped_ptr<RequestManager::HandlerInterface>(
169 scoped_ptr<RequestManager::HandlerInterface>( 185 new operations::Unmount<DestinationPolicy>(
170 new operations::Unmount(event_router_, file_system_info_, callback))); 186 event_router_, file_system_info_, callback)));
171 if (!request_id) { 187 if (!request_id) {
172 callback.Run(base::File::FILE_ERROR_SECURITY); 188 callback.Run(base::File::FILE_ERROR_SECURITY);
173 return AbortCallback(); 189 return AbortCallback();
174 } 190 }
175 191
176 return base::Bind( 192 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
177 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 193 weak_ptr_factory_.GetWeakPtr(), request_id);
178 } 194 }
179 195
180 AbortCallback ProvidedFileSystem::GetMetadata( 196 template <class DestinationPolicy>
197 AbortCallback ProvidedFileSystem<DestinationPolicy>::GetMetadata(
181 const base::FilePath& entry_path, 198 const base::FilePath& entry_path,
182 MetadataFieldMask fields, 199 MetadataFieldMask fields,
183 const GetMetadataCallback& callback) { 200 const GetMetadataCallback& callback) {
184 const int request_id = request_manager_->CreateRequest( 201 const int request_id = request_manager_->CreateRequest(
185 GET_METADATA, 202 GET_METADATA,
186 scoped_ptr<RequestManager::HandlerInterface>(new operations::GetMetadata( 203 scoped_ptr<RequestManager::HandlerInterface>(
187 event_router_, file_system_info_, entry_path, fields, callback))); 204 new operations::GetMetadata<DestinationPolicy>(
205 event_router_, file_system_info_,
206 entry_path, fields, callback)));
188 if (!request_id) { 207 if (!request_id) {
189 callback.Run(make_scoped_ptr<EntryMetadata>(NULL), 208 callback.Run(make_scoped_ptr<EntryMetadata>(NULL),
190 base::File::FILE_ERROR_SECURITY); 209 base::File::FILE_ERROR_SECURITY);
191 return AbortCallback(); 210 return AbortCallback();
192 } 211 }
193 212
194 return base::Bind( 213 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
195 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 214 weak_ptr_factory_.GetWeakPtr(), request_id);
196 } 215 }
197 216
198 AbortCallback ProvidedFileSystem::ReadDirectory( 217 template <class DestinationPolicy>
218 AbortCallback ProvidedFileSystem<DestinationPolicy>::ReadDirectory(
199 const base::FilePath& directory_path, 219 const base::FilePath& directory_path,
200 const storage::AsyncFileUtil::ReadDirectoryCallback& callback) { 220 const storage::AsyncFileUtil::ReadDirectoryCallback& callback) {
201 const int request_id = request_manager_->CreateRequest( 221 const int request_id = request_manager_->CreateRequest(
202 READ_DIRECTORY, 222 READ_DIRECTORY,
203 scoped_ptr<RequestManager::HandlerInterface>( 223 scoped_ptr<RequestManager::HandlerInterface>(
204 new operations::ReadDirectory( 224 new operations::ReadDirectory<DestinationPolicy>(
205 event_router_, file_system_info_, directory_path, callback))); 225 event_router_, file_system_info_, directory_path, callback)));
206 if (!request_id) { 226 if (!request_id) {
207 callback.Run(base::File::FILE_ERROR_SECURITY, 227 callback.Run(base::File::FILE_ERROR_SECURITY,
208 storage::AsyncFileUtil::EntryList(), 228 storage::AsyncFileUtil::EntryList(),
209 false /* has_more */); 229 false /* has_more */);
210 return AbortCallback(); 230 return AbortCallback();
211 } 231 }
212 232
213 return base::Bind( 233 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
214 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 234 weak_ptr_factory_.GetWeakPtr(), request_id);
215 } 235 }
216 236
217 AbortCallback ProvidedFileSystem::ReadFile( 237 template <class DestinationPolicy>
238 AbortCallback ProvidedFileSystem<DestinationPolicy>::ReadFile(
218 int file_handle, 239 int file_handle,
219 net::IOBuffer* buffer, 240 net::IOBuffer* buffer,
220 int64 offset, 241 int64 offset,
221 int length, 242 int length,
222 const ReadChunkReceivedCallback& callback) { 243 const ReadChunkReceivedCallback& callback) {
223 TRACE_EVENT1( 244 TRACE_EVENT1(
224 "file_system_provider", "ProvidedFileSystem::ReadFile", "length", length); 245 "file_system_provider", "ProvidedFileSystem::ReadFile", "length", length);
225 const int request_id = request_manager_->CreateRequest( 246 const int request_id = request_manager_->CreateRequest(
226 READ_FILE, 247 READ_FILE, make_scoped_ptr<RequestManager::HandlerInterface>(
227 make_scoped_ptr<RequestManager::HandlerInterface>( 248 new operations::ReadFile<DestinationPolicy>(
228 new operations::ReadFile(event_router_, 249 event_router_, file_system_info_, file_handle, buffer,
229 file_system_info_, 250 offset, length, callback)));
230 file_handle,
231 buffer,
232 offset,
233 length,
234 callback)));
235 if (!request_id) { 251 if (!request_id) {
236 callback.Run(0 /* chunk_length */, 252 callback.Run(0 /* chunk_length */,
237 false /* has_more */, 253 false /* has_more */,
238 base::File::FILE_ERROR_SECURITY); 254 base::File::FILE_ERROR_SECURITY);
239 return AbortCallback(); 255 return AbortCallback();
240 } 256 }
241 257
242 return base::Bind( 258 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
243 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 259 weak_ptr_factory_.GetWeakPtr(), request_id);
244 } 260 }
245 261
246 AbortCallback ProvidedFileSystem::OpenFile(const base::FilePath& file_path, 262 template <class DestinationPolicy>
247 OpenFileMode mode, 263 AbortCallback ProvidedFileSystem<DestinationPolicy>::OpenFile(
248 const OpenFileCallback& callback) { 264 const base::FilePath& file_path,
265 OpenFileMode mode,
266 const OpenFileCallback& callback) {
249 const int request_id = request_manager_->CreateRequest( 267 const int request_id = request_manager_->CreateRequest(
250 OPEN_FILE, 268 OPEN_FILE, scoped_ptr<RequestManager::HandlerInterface>(
251 scoped_ptr<RequestManager::HandlerInterface>(new operations::OpenFile( 269 new operations::OpenFile<DestinationPolicy>(
252 event_router_, file_system_info_, file_path, mode, 270 event_router_, file_system_info_, file_path, mode,
253 base::Bind(&ProvidedFileSystem::OnOpenFileCompleted, 271 base::Bind(&ProvidedFileSystem::OnOpenFileCompleted,
254 weak_ptr_factory_.GetWeakPtr(), file_path, mode, 272 weak_ptr_factory_.GetWeakPtr(), file_path,
255 callback)))); 273 mode, callback))));
256 if (!request_id) { 274 if (!request_id) {
257 callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY); 275 callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY);
258 return AbortCallback(); 276 return AbortCallback();
259 } 277 }
260 278
261 return base::Bind( 279 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
262 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 280 weak_ptr_factory_.GetWeakPtr(), request_id);
263 } 281 }
264 282
265 AbortCallback ProvidedFileSystem::CloseFile( 283 template <class DestinationPolicy>
284 AbortCallback ProvidedFileSystem<DestinationPolicy>::CloseFile(
266 int file_handle, 285 int file_handle,
267 const storage::AsyncFileUtil::StatusCallback& callback) { 286 const storage::AsyncFileUtil::StatusCallback& callback) {
268 const int request_id = request_manager_->CreateRequest( 287 const int request_id = request_manager_->CreateRequest(
269 CLOSE_FILE, 288 CLOSE_FILE,
270 scoped_ptr<RequestManager::HandlerInterface>(new operations::CloseFile( 289 scoped_ptr<RequestManager::HandlerInterface>(
271 event_router_, file_system_info_, file_handle, 290 new operations::CloseFile<DestinationPolicy>(
272 base::Bind(&ProvidedFileSystem::OnCloseFileCompleted, 291 event_router_, file_system_info_, file_handle,
273 weak_ptr_factory_.GetWeakPtr(), file_handle, callback)))); 292 base::Bind(
293 &ProvidedFileSystem<DestinationPolicy>::OnCloseFileCompleted,
294 weak_ptr_factory_.GetWeakPtr(), file_handle,
295 callback))));
274 if (!request_id) { 296 if (!request_id) {
275 callback.Run(base::File::FILE_ERROR_SECURITY); 297 callback.Run(base::File::FILE_ERROR_SECURITY);
276 return AbortCallback(); 298 return AbortCallback();
277 } 299 }
278 300
279 return base::Bind( 301 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
280 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 302 weak_ptr_factory_.GetWeakPtr(), request_id);
281 } 303 }
282 304
283 AbortCallback ProvidedFileSystem::CreateDirectory( 305 template <class DestinationPolicy>
306 AbortCallback ProvidedFileSystem<DestinationPolicy>::CreateDirectory(
284 const base::FilePath& directory_path, 307 const base::FilePath& directory_path,
285 bool recursive, 308 bool recursive,
286 const storage::AsyncFileUtil::StatusCallback& callback) { 309 const storage::AsyncFileUtil::StatusCallback& callback) {
287 const int request_id = request_manager_->CreateRequest( 310 const int request_id = request_manager_->CreateRequest(
288 CREATE_DIRECTORY, 311 CREATE_DIRECTORY, scoped_ptr<RequestManager::HandlerInterface>(
289 scoped_ptr<RequestManager::HandlerInterface>( 312 new operations::CreateDirectory<DestinationPolicy>(
290 new operations::CreateDirectory(event_router_, 313 event_router_, file_system_info_,
291 file_system_info_, 314 directory_path, recursive, callback)));
292 directory_path,
293 recursive,
294 callback)));
295 if (!request_id) { 315 if (!request_id) {
296 callback.Run(base::File::FILE_ERROR_SECURITY); 316 callback.Run(base::File::FILE_ERROR_SECURITY);
297 return AbortCallback(); 317 return AbortCallback();
298 } 318 }
299 319
300 return base::Bind( 320 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
301 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 321 weak_ptr_factory_.GetWeakPtr(), request_id);
302 } 322 }
303 323
304 AbortCallback ProvidedFileSystem::DeleteEntry( 324 template <class DestinationPolicy>
325 AbortCallback ProvidedFileSystem<DestinationPolicy>::DeleteEntry(
305 const base::FilePath& entry_path, 326 const base::FilePath& entry_path,
306 bool recursive, 327 bool recursive,
307 const storage::AsyncFileUtil::StatusCallback& callback) { 328 const storage::AsyncFileUtil::StatusCallback& callback) {
308 const int request_id = request_manager_->CreateRequest( 329 const int request_id = request_manager_->CreateRequest(
309 DELETE_ENTRY, 330 DELETE_ENTRY, scoped_ptr<RequestManager::HandlerInterface>(
310 scoped_ptr<RequestManager::HandlerInterface>(new operations::DeleteEntry( 331 new operations::DeleteEntry<DestinationPolicy>(
311 event_router_, file_system_info_, entry_path, recursive, callback))); 332 event_router_, file_system_info_, entry_path,
333 recursive, callback)));
312 if (!request_id) { 334 if (!request_id) {
313 callback.Run(base::File::FILE_ERROR_SECURITY); 335 callback.Run(base::File::FILE_ERROR_SECURITY);
314 return AbortCallback(); 336 return AbortCallback();
315 } 337 }
316 338
317 return base::Bind( 339 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
318 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 340 weak_ptr_factory_.GetWeakPtr(), request_id);
319 } 341 }
320 342
321 AbortCallback ProvidedFileSystem::CreateFile( 343 template <class DestinationPolicy>
344 AbortCallback ProvidedFileSystem<DestinationPolicy>::CreateFile(
322 const base::FilePath& file_path, 345 const base::FilePath& file_path,
323 const storage::AsyncFileUtil::StatusCallback& callback) { 346 const storage::AsyncFileUtil::StatusCallback& callback) {
324 const int request_id = request_manager_->CreateRequest( 347 const int request_id = request_manager_->CreateRequest(
325 CREATE_FILE, 348 CREATE_FILE,
326 scoped_ptr<RequestManager::HandlerInterface>(new operations::CreateFile( 349 scoped_ptr<RequestManager::HandlerInterface>(
327 event_router_, file_system_info_, file_path, callback))); 350 new operations::CreateFile<DestinationPolicy>(
351 event_router_, file_system_info_,
352 file_path, callback)));
328 if (!request_id) { 353 if (!request_id) {
329 callback.Run(base::File::FILE_ERROR_SECURITY); 354 callback.Run(base::File::FILE_ERROR_SECURITY);
330 return AbortCallback(); 355 return AbortCallback();
331 } 356 }
332 357
333 return base::Bind( 358 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
334 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 359 weak_ptr_factory_.GetWeakPtr(), request_id);
335 } 360 }
336 361
337 AbortCallback ProvidedFileSystem::CopyEntry( 362 template <class DestinationPolicy>
363 AbortCallback ProvidedFileSystem<DestinationPolicy>::CopyEntry(
338 const base::FilePath& source_path, 364 const base::FilePath& source_path,
339 const base::FilePath& target_path, 365 const base::FilePath& target_path,
340 const storage::AsyncFileUtil::StatusCallback& callback) { 366 const storage::AsyncFileUtil::StatusCallback& callback) {
341 const int request_id = request_manager_->CreateRequest( 367 const int request_id = request_manager_->CreateRequest(
342 COPY_ENTRY, 368 COPY_ENTRY, scoped_ptr<RequestManager::HandlerInterface>(
343 scoped_ptr<RequestManager::HandlerInterface>( 369 new operations::CopyEntry<DestinationPolicy>(
344 new operations::CopyEntry(event_router_, 370 event_router_, file_system_info_, source_path,
345 file_system_info_, 371 target_path, callback)));
346 source_path,
347 target_path,
348 callback)));
349 if (!request_id) { 372 if (!request_id) {
350 callback.Run(base::File::FILE_ERROR_SECURITY); 373 callback.Run(base::File::FILE_ERROR_SECURITY);
351 return AbortCallback(); 374 return AbortCallback();
352 } 375 }
353 376
354 return base::Bind( 377 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
355 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 378 weak_ptr_factory_.GetWeakPtr(), request_id);
356 } 379 }
357 380
358 AbortCallback ProvidedFileSystem::WriteFile( 381 template <class DestinationPolicy>
382 AbortCallback ProvidedFileSystem<DestinationPolicy>::WriteFile(
359 int file_handle, 383 int file_handle,
360 net::IOBuffer* buffer, 384 net::IOBuffer* buffer,
361 int64 offset, 385 int64 offset,
362 int length, 386 int length,
363 const storage::AsyncFileUtil::StatusCallback& callback) { 387 const storage::AsyncFileUtil::StatusCallback& callback) {
364 TRACE_EVENT1("file_system_provider", 388 TRACE_EVENT1("file_system_provider",
365 "ProvidedFileSystem::WriteFile", 389 "ProvidedFileSystem::WriteFile",
366 "length", 390 "length",
367 length); 391 length);
368 const int request_id = request_manager_->CreateRequest( 392 const int request_id = request_manager_->CreateRequest(
369 WRITE_FILE, 393 WRITE_FILE,
370 make_scoped_ptr<RequestManager::HandlerInterface>( 394 make_scoped_ptr<RequestManager::HandlerInterface>(
371 new operations::WriteFile(event_router_, 395 new operations::WriteFile<DestinationPolicy>(
372 file_system_info_, 396 event_router_, file_system_info_, file_handle,
373 file_handle, 397 make_scoped_refptr(buffer), offset, length, callback)));
374 make_scoped_refptr(buffer),
375 offset,
376 length,
377 callback)));
378 if (!request_id) { 398 if (!request_id) {
379 callback.Run(base::File::FILE_ERROR_SECURITY); 399 callback.Run(base::File::FILE_ERROR_SECURITY);
380 return AbortCallback(); 400 return AbortCallback();
381 } 401 }
382 402
383 return base::Bind( 403 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
384 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 404 weak_ptr_factory_.GetWeakPtr(), request_id);
385 } 405 }
386 406
387 AbortCallback ProvidedFileSystem::MoveEntry( 407 template <class DestinationPolicy>
408 AbortCallback ProvidedFileSystem<DestinationPolicy>::MoveEntry(
388 const base::FilePath& source_path, 409 const base::FilePath& source_path,
389 const base::FilePath& target_path, 410 const base::FilePath& target_path,
390 const storage::AsyncFileUtil::StatusCallback& callback) { 411 const storage::AsyncFileUtil::StatusCallback& callback) {
391 const int request_id = request_manager_->CreateRequest( 412 const int request_id = request_manager_->CreateRequest(
392 MOVE_ENTRY, 413 MOVE_ENTRY, scoped_ptr<RequestManager::HandlerInterface>(
393 scoped_ptr<RequestManager::HandlerInterface>( 414 new operations::MoveEntry<DestinationPolicy>(
394 new operations::MoveEntry(event_router_, 415 event_router_, file_system_info_, source_path,
395 file_system_info_, 416 target_path, callback)));
396 source_path,
397 target_path,
398 callback)));
399 if (!request_id) { 417 if (!request_id) {
400 callback.Run(base::File::FILE_ERROR_SECURITY); 418 callback.Run(base::File::FILE_ERROR_SECURITY);
401 return AbortCallback(); 419 return AbortCallback();
402 } 420 }
403 421
404 return base::Bind( 422 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
405 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 423 weak_ptr_factory_.GetWeakPtr(), request_id);
406 } 424 }
407 425
408 AbortCallback ProvidedFileSystem::Truncate( 426 template <class DestinationPolicy>
427 AbortCallback ProvidedFileSystem<DestinationPolicy>::Truncate(
409 const base::FilePath& file_path, 428 const base::FilePath& file_path,
410 int64 length, 429 int64 length,
411 const storage::AsyncFileUtil::StatusCallback& callback) { 430 const storage::AsyncFileUtil::StatusCallback& callback) {
412 const int request_id = request_manager_->CreateRequest( 431 const int request_id = request_manager_->CreateRequest(
413 TRUNCATE, 432 TRUNCATE,
414 scoped_ptr<RequestManager::HandlerInterface>(new operations::Truncate( 433 scoped_ptr<RequestManager::HandlerInterface>(
415 event_router_, file_system_info_, file_path, length, callback))); 434 new operations::Truncate<DestinationPolicy>(
435 event_router_, file_system_info_,
436 file_path, length, callback)));
416 if (!request_id) { 437 if (!request_id) {
417 callback.Run(base::File::FILE_ERROR_SECURITY); 438 callback.Run(base::File::FILE_ERROR_SECURITY);
418 return AbortCallback(); 439 return AbortCallback();
419 } 440 }
420 441
421 return base::Bind( 442 return base::Bind(&ProvidedFileSystem<DestinationPolicy>::Abort,
422 &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id); 443 weak_ptr_factory_.GetWeakPtr(), request_id);
423 } 444 }
424 445
425 AbortCallback ProvidedFileSystem::AddWatcher( 446 template <class DestinationPolicy>
447 AbortCallback ProvidedFileSystem<DestinationPolicy>::AddWatcher(
426 const GURL& origin, 448 const GURL& origin,
427 const base::FilePath& entry_path, 449 const base::FilePath& entry_path,
428 bool recursive, 450 bool recursive,
429 bool persistent, 451 bool persistent,
430 const storage::AsyncFileUtil::StatusCallback& callback, 452 const storage::AsyncFileUtil::StatusCallback& callback,
431 const storage::WatcherManager::NotificationCallback& 453 const storage::WatcherManager::NotificationCallback&
432 notification_callback) { 454 notification_callback) {
433 const size_t token = watcher_queue_.NewToken(); 455 const size_t token = watcher_queue_.NewToken();
434 watcher_queue_.Enqueue( 456 watcher_queue_.Enqueue(
435 token, base::Bind(&ProvidedFileSystem::AddWatcherInQueue, 457 token, base::Bind(
436 base::Unretained(this), // Outlived by the queue. 458 &ProvidedFileSystem<DestinationPolicy>::AddWatcherInQueue,
437 AddWatcherInQueueArgs(token, origin, entry_path, 459 base::Unretained(this), // Outlived by the queue.
438 recursive, persistent, callback, 460 AddWatcherInQueueArgs(token, origin, entry_path,
439 notification_callback))); 461 recursive, persistent, callback,
462 notification_callback)));
440 return AbortCallback(); 463 return AbortCallback();
441 } 464 }
442 465
443 void ProvidedFileSystem::RemoveWatcher( 466 template <class DestinationPolicy>
467 void ProvidedFileSystem<DestinationPolicy>::RemoveWatcher(
444 const GURL& origin, 468 const GURL& origin,
445 const base::FilePath& entry_path, 469 const base::FilePath& entry_path,
446 bool recursive, 470 bool recursive,
447 const storage::AsyncFileUtil::StatusCallback& callback) { 471 const storage::AsyncFileUtil::StatusCallback& callback) {
448 const size_t token = watcher_queue_.NewToken(); 472 const size_t token = watcher_queue_.NewToken();
449 watcher_queue_.Enqueue( 473 watcher_queue_.Enqueue(
450 token, base::Bind(&ProvidedFileSystem::RemoveWatcherInQueue, 474 token, base::Bind(
451 base::Unretained(this), // Outlived by the queue. 475 &ProvidedFileSystem<DestinationPolicy>::RemoveWatcherInQueue,
452 token, origin, entry_path, recursive, callback)); 476 base::Unretained(this), // Outlived by the queue.
477 token, origin, entry_path, recursive, callback));
453 } 478 }
454 479
455 const ProvidedFileSystemInfo& ProvidedFileSystem::GetFileSystemInfo() const { 480 template <class DestinationPolicy>
481 const ProvidedFileSystemInfo&
482 ProvidedFileSystem<DestinationPolicy>::GetFileSystemInfo() const {
456 return file_system_info_; 483 return file_system_info_;
457 } 484 }
458 485
459 RequestManager* ProvidedFileSystem::GetRequestManager() { 486 template <class DestinationPolicy>
487 RequestManager* ProvidedFileSystem<DestinationPolicy>::GetRequestManager() {
460 return request_manager_.get(); 488 return request_manager_.get();
461 } 489 }
462 490
463 Watchers* ProvidedFileSystem::GetWatchers() { 491 template <class DestinationPolicy>
492 Watchers* ProvidedFileSystem<DestinationPolicy>::GetWatchers() {
464 return &watchers_; 493 return &watchers_;
465 } 494 }
466 495
467 const OpenedFiles& ProvidedFileSystem::GetOpenedFiles() const { 496 template <class DestinationPolicy>
497 const OpenedFiles&
498 ProvidedFileSystem<DestinationPolicy>::GetOpenedFiles() const {
468 return opened_files_; 499 return opened_files_;
469 } 500 }
470 501
471 void ProvidedFileSystem::AddObserver(ProvidedFileSystemObserver* observer) { 502 template <class DestinationPolicy>
503 void ProvidedFileSystem<DestinationPolicy>::AddObserver(
504 ProvidedFileSystemObserver* observer) {
472 DCHECK(observer); 505 DCHECK(observer);
473 observers_.AddObserver(observer); 506 observers_.AddObserver(observer);
474 } 507 }
475 508
476 void ProvidedFileSystem::RemoveObserver(ProvidedFileSystemObserver* observer) { 509 template <class DestinationPolicy>
510 void ProvidedFileSystem<DestinationPolicy>::RemoveObserver(
511 ProvidedFileSystemObserver* observer) {
477 DCHECK(observer); 512 DCHECK(observer);
478 observers_.RemoveObserver(observer); 513 observers_.RemoveObserver(observer);
479 } 514 }
480 515
481 void ProvidedFileSystem::Notify( 516 template <class DestinationPolicy>
517 void ProvidedFileSystem<DestinationPolicy>::Notify(
482 const base::FilePath& entry_path, 518 const base::FilePath& entry_path,
483 bool recursive, 519 bool recursive,
484 storage::WatcherManager::ChangeType change_type, 520 storage::WatcherManager::ChangeType change_type,
485 scoped_ptr<ProvidedFileSystemObserver::Changes> changes, 521 scoped_ptr<ProvidedFileSystemObserver::Changes> changes,
486 const std::string& tag, 522 const std::string& tag,
487 const storage::AsyncFileUtil::StatusCallback& callback) { 523 const storage::AsyncFileUtil::StatusCallback& callback) {
488 const size_t token = watcher_queue_.NewToken(); 524 const size_t token = watcher_queue_.NewToken();
489 watcher_queue_.Enqueue( 525 watcher_queue_.Enqueue(
490 token, base::Bind(&ProvidedFileSystem::NotifyInQueue, 526 token, base::Bind(&ProvidedFileSystem<DestinationPolicy>::NotifyInQueue,
491 base::Unretained(this), // Outlived by the queue. 527 base::Unretained(this), // Outlived by the queue.
492 base::Passed(make_scoped_ptr(new NotifyInQueueArgs( 528 base::Passed(make_scoped_ptr(new NotifyInQueueArgs(
493 token, entry_path, recursive, change_type, 529 token, entry_path, recursive, change_type,
494 changes.Pass(), tag, callback))))); 530 changes.Pass(), tag, callback)))));
495 } 531 }
496 532
497 void ProvidedFileSystem::Configure( 533 template <class DestinationPolicy>
534 void ProvidedFileSystem<DestinationPolicy>::Configure(
498 const storage::AsyncFileUtil::StatusCallback& callback) { 535 const storage::AsyncFileUtil::StatusCallback& callback) {
499 const int request_id = request_manager_->CreateRequest( 536 const int request_id = request_manager_->CreateRequest(
500 CONFIGURE, 537 CONFIGURE, scoped_ptr<RequestManager::HandlerInterface>(
501 scoped_ptr<RequestManager::HandlerInterface>(new operations::Configure( 538 new operations::Configure<DestinationPolicy>(
502 event_router_, file_system_info_, callback))); 539 event_router_, file_system_info_, callback)));
503 if (!request_id) 540 if (!request_id)
504 callback.Run(base::File::FILE_ERROR_SECURITY); 541 callback.Run(base::File::FILE_ERROR_SECURITY);
505 } 542 }
506 543
507 void ProvidedFileSystem::Abort(int operation_request_id) { 544 template <class DestinationPolicy>
545 void ProvidedFileSystem<DestinationPolicy>::Abort(int operation_request_id) {
508 request_manager_->RejectRequest(operation_request_id, 546 request_manager_->RejectRequest(operation_request_id,
509 make_scoped_ptr(new RequestValue()), 547 make_scoped_ptr(new RequestValue()),
510 base::File::FILE_ERROR_ABORT); 548 base::File::FILE_ERROR_ABORT);
511 if (!request_manager_->CreateRequest( 549 if (!request_manager_->CreateRequest(
512 ABORT, 550 ABORT, scoped_ptr<RequestManager::HandlerInterface>(
513 scoped_ptr<RequestManager::HandlerInterface>(new operations::Abort( 551 new operations::Abort<DestinationPolicy>(
514 event_router_, file_system_info_, operation_request_id, 552 event_router_, file_system_info_, operation_request_id,
515 base::Bind(&EmptyStatusCallback))))) { 553 base::Bind(&EmptyStatusCallback))))) {
516 LOG(ERROR) << "Failed to create an abort request."; 554 LOG(ERROR) << "Failed to create an abort request.";
517 } 555 }
518 } 556 }
519 557
520 AbortCallback ProvidedFileSystem::AddWatcherInQueue( 558 template <class DestinationPolicy>
559 AbortCallback ProvidedFileSystem<DestinationPolicy>::AddWatcherInQueue(
521 const AddWatcherInQueueArgs& args) { 560 const AddWatcherInQueueArgs& args) {
522 if (args.persistent && (!file_system_info_.supports_notify_tag() || 561 if (args.persistent && (!file_system_info_.supports_notify_tag() ||
523 !args.notification_callback.is_null())) { 562 !args.notification_callback.is_null())) {
524 OnAddWatcherInQueueCompleted(args.token, args.entry_path, args.recursive, 563 OnAddWatcherInQueueCompleted(args.token, args.entry_path, args.recursive,
525 Subscriber(), args.callback, 564 Subscriber(), args.callback,
526 base::File::FILE_ERROR_INVALID_OPERATION); 565 base::File::FILE_ERROR_INVALID_OPERATION);
527 return AbortCallback(); 566 return AbortCallback();
528 } 567 }
529 568
530 // Create a candidate subscriber. This could be done in OnAddWatcherCompleted, 569 // Create a candidate subscriber. This could be done in OnAddWatcherCompleted,
531 // but base::Bind supports only up to 7 arguments. 570 // but base::Bind supports only up to 7 arguments.
532 Subscriber subscriber; 571 Subscriber subscriber;
533 subscriber.origin = args.origin; 572 subscriber.origin = args.origin;
534 subscriber.persistent = args.persistent; 573 subscriber.persistent = args.persistent;
535 subscriber.notification_callback = args.notification_callback; 574 subscriber.notification_callback = args.notification_callback;
536 575
537 const WatcherKey key(args.entry_path, args.recursive); 576 const WatcherKey key(args.entry_path, args.recursive);
538 const Watchers::const_iterator it = watchers_.find(key); 577 const Watchers::const_iterator it = watchers_.find(key);
539 if (it != watchers_.end()) { 578 if (it != watchers_.end()) {
540 const bool exists = it->second.subscribers.find(args.origin) != 579 const bool exists = it->second.subscribers.find(args.origin) !=
541 it->second.subscribers.end(); 580 it->second.subscribers.end();
542 OnAddWatcherInQueueCompleted( 581 OnAddWatcherInQueueCompleted(
543 args.token, args.entry_path, args.recursive, subscriber, args.callback, 582 args.token, args.entry_path, args.recursive, subscriber, args.callback,
544 exists ? base::File::FILE_ERROR_EXISTS : base::File::FILE_OK); 583 exists ? base::File::FILE_ERROR_EXISTS : base::File::FILE_OK);
545 return AbortCallback(); 584 return AbortCallback();
546 } 585 }
547 586
548 const int request_id = request_manager_->CreateRequest( 587 const int request_id = request_manager_->CreateRequest(
549 ADD_WATCHER, 588 ADD_WATCHER,
550 scoped_ptr<RequestManager::HandlerInterface>(new operations::AddWatcher( 589 scoped_ptr<RequestManager::HandlerInterface>(
551 event_router_, file_system_info_, args.entry_path, args.recursive, 590 new operations::AddWatcher<DestinationPolicy>(
552 base::Bind(&ProvidedFileSystem::OnAddWatcherInQueueCompleted, 591 event_router_, file_system_info_, args.entry_path, args.recursive,
553 weak_ptr_factory_.GetWeakPtr(), args.token, 592 base::Bind(
554 args.entry_path, args.recursive, subscriber, 593 &ProvidedFileSystem<DestinationPolicy>::
555 args.callback)))); 594 OnAddWatcherInQueueCompleted,
595 weak_ptr_factory_.GetWeakPtr(), args.token, args.entry_path,
596 args.recursive, subscriber, args.callback))));
556 597
557 if (!request_id) { 598 if (!request_id) {
558 OnAddWatcherInQueueCompleted(args.token, args.entry_path, args.recursive, 599 OnAddWatcherInQueueCompleted(args.token, args.entry_path, args.recursive,
559 subscriber, args.callback, 600 subscriber, args.callback,
560 base::File::FILE_ERROR_SECURITY); 601 base::File::FILE_ERROR_SECURITY);
561 } 602 }
562 603
563 return AbortCallback(); 604 return AbortCallback();
564 } 605 }
565 606
566 AbortCallback ProvidedFileSystem::RemoveWatcherInQueue( 607 template <class DestinationPolicy>
608 AbortCallback ProvidedFileSystem<DestinationPolicy>::RemoveWatcherInQueue(
567 size_t token, 609 size_t token,
568 const GURL& origin, 610 const GURL& origin,
569 const base::FilePath& entry_path, 611 const base::FilePath& entry_path,
570 bool recursive, 612 bool recursive,
571 const storage::AsyncFileUtil::StatusCallback& callback) { 613 const storage::AsyncFileUtil::StatusCallback& callback) {
572 const WatcherKey key(entry_path, recursive); 614 const WatcherKey key(entry_path, recursive);
573 const Watchers::iterator it = watchers_.find(key); 615 const Watchers::iterator it = watchers_.find(key);
574 if (it == watchers_.end() || 616 if (it == watchers_.end() ||
575 it->second.subscribers.find(origin) == it->second.subscribers.end()) { 617 it->second.subscribers.find(origin) == it->second.subscribers.end()) {
576 OnRemoveWatcherInQueueCompleted(token, origin, key, callback, 618 OnRemoveWatcherInQueueCompleted(token, origin, key, callback,
577 false /* extension_response */, 619 false /* extension_response */,
578 base::File::FILE_ERROR_NOT_FOUND); 620 base::File::FILE_ERROR_NOT_FOUND);
579 return AbortCallback(); 621 return AbortCallback();
580 } 622 }
581 623
582 // If there are other subscribers, then do not remove the observer, but simply 624 // If there are other subscribers, then do not remove the observer, but simply
583 // return a success. 625 // return a success.
584 if (it->second.subscribers.size() > 1) { 626 if (it->second.subscribers.size() > 1) {
585 OnRemoveWatcherInQueueCompleted(token, origin, key, callback, 627 OnRemoveWatcherInQueueCompleted(token, origin, key, callback,
586 false /* extension_response */, 628 false /* extension_response */,
587 base::File::FILE_OK); 629 base::File::FILE_OK);
588 return AbortCallback(); 630 return AbortCallback();
589 } 631 }
590 632
591 // Otherwise, emit an event, and remove the watcher. 633 // Otherwise, emit an event, and remove the watcher.
592 request_manager_->CreateRequest( 634 request_manager_->CreateRequest(
593 REMOVE_WATCHER, 635 REMOVE_WATCHER,
594 scoped_ptr<RequestManager::HandlerInterface>( 636 scoped_ptr<RequestManager::HandlerInterface>(
595 new operations::RemoveWatcher( 637 new operations::RemoveWatcher<DestinationPolicy>(
596 event_router_, file_system_info_, entry_path, recursive, 638 event_router_, file_system_info_, entry_path, recursive,
597 base::Bind(&ProvidedFileSystem::OnRemoveWatcherInQueueCompleted, 639 base::Bind(
598 weak_ptr_factory_.GetWeakPtr(), token, origin, key, 640 &ProvidedFileSystem<DestinationPolicy>::
599 callback, true /* extension_response */)))); 641 OnRemoveWatcherInQueueCompleted,
642 weak_ptr_factory_.GetWeakPtr(), token, origin, key, callback,
643 true /* extension_response */))));
600 644
601 return AbortCallback(); 645 return AbortCallback();
602 } 646 }
603 647
604 AbortCallback ProvidedFileSystem::NotifyInQueue( 648 template <class DestinationPolicy>
649 AbortCallback ProvidedFileSystem<DestinationPolicy>::NotifyInQueue(
605 scoped_ptr<NotifyInQueueArgs> args) { 650 scoped_ptr<NotifyInQueueArgs> args) {
606 const WatcherKey key(args->entry_path, args->recursive); 651 const WatcherKey key(args->entry_path, args->recursive);
607 const auto& watcher_it = watchers_.find(key); 652 const auto& watcher_it = watchers_.find(key);
608 if (watcher_it == watchers_.end()) { 653 if (watcher_it == watchers_.end()) {
609 OnNotifyInQueueCompleted(args.Pass(), base::File::FILE_ERROR_NOT_FOUND); 654 OnNotifyInQueueCompleted(args.Pass(), base::File::FILE_ERROR_NOT_FOUND);
610 return AbortCallback(); 655 return AbortCallback();
611 } 656 }
612 657
613 // The tag must be provided if and only if it's explicitly supported. 658 // The tag must be provided if and only if it's explicitly supported.
614 if (file_system_info_.supports_notify_tag() == args->tag.empty()) { 659 if (file_system_info_.supports_notify_tag() == args->tag.empty()) {
615 OnNotifyInQueueCompleted(args.Pass(), 660 OnNotifyInQueueCompleted(args.Pass(),
616 base::File::FILE_ERROR_INVALID_OPERATION); 661 base::File::FILE_ERROR_INVALID_OPERATION);
617 return AbortCallback(); 662 return AbortCallback();
618 } 663 }
619 664
620 // It's illegal to provide a tag which is not unique. 665 // It's illegal to provide a tag which is not unique.
621 if (!args->tag.empty() && args->tag == watcher_it->second.last_tag) { 666 if (!args->tag.empty() && args->tag == watcher_it->second.last_tag) {
622 OnNotifyInQueueCompleted(args.Pass(), 667 OnNotifyInQueueCompleted(args.Pass(),
623 base::File::FILE_ERROR_INVALID_OPERATION); 668 base::File::FILE_ERROR_INVALID_OPERATION);
624 return AbortCallback(); 669 return AbortCallback();
625 } 670 }
626 671
627 // The object is owned by AutoUpdated, so the reference is valid as long as 672 // The object is owned by AutoUpdated, so the reference is valid as long as
628 // callbacks created with AutoUpdater::CreateCallback(). 673 // callbacks created with AutoUpdater::CreateCallback().
629 const ProvidedFileSystemObserver::Changes& changes_ref = *args->changes.get(); 674 const ProvidedFileSystemObserver::Changes& changes_ref = *args->changes.get();
630 const storage::WatcherManager::ChangeType change_type = args->change_type; 675 const storage::WatcherManager::ChangeType change_type = args->change_type;
631 676
632 scoped_refptr<AutoUpdater> auto_updater( 677 scoped_refptr<AutoUpdater> auto_updater(new AutoUpdater(
633 new AutoUpdater(base::Bind(&ProvidedFileSystem::OnNotifyInQueueCompleted, 678 base::Bind(
634 weak_ptr_factory_.GetWeakPtr(), 679 &ProvidedFileSystem<DestinationPolicy>::OnNotifyInQueueCompleted,
635 base::Passed(&args), base::File::FILE_OK))); 680 weak_ptr_factory_.GetWeakPtr(), base::Passed(&args),
681 base::File::FILE_OK)));
636 682
637 // Call all notification callbacks (if any). 683 // Call all notification callbacks (if any).
638 for (const auto& subscriber_it : watcher_it->second.subscribers) { 684 for (const auto& subscriber_it : watcher_it->second.subscribers) {
639 const storage::WatcherManager::NotificationCallback& notification_callback = 685 const storage::WatcherManager::NotificationCallback& notification_callback =
640 subscriber_it.second.notification_callback; 686 subscriber_it.second.notification_callback;
641 if (!notification_callback.is_null()) 687 if (!notification_callback.is_null())
642 notification_callback.Run(change_type); 688 notification_callback.Run(change_type);
643 } 689 }
644 690
645 // Notify all observers. 691 // Notify all observers.
646 FOR_EACH_OBSERVER(ProvidedFileSystemObserver, 692 FOR_EACH_OBSERVER(ProvidedFileSystemObserver,
647 observers_, 693 observers_,
648 OnWatcherChanged(file_system_info_, 694 OnWatcherChanged(file_system_info_,
649 watcher_it->second, 695 watcher_it->second,
650 change_type, 696 change_type,
651 changes_ref, 697 changes_ref,
652 auto_updater->CreateCallback())); 698 auto_updater->CreateCallback()));
653 699
654 return AbortCallback(); 700 return AbortCallback();
655 } 701 }
656 702
657 base::WeakPtr<ProvidedFileSystemInterface> ProvidedFileSystem::GetWeakPtr() { 703 template <class DestinationPolicy>
704 base::WeakPtr<ProvidedFileSystemInterface>
705 ProvidedFileSystem<DestinationPolicy>::GetWeakPtr() {
658 return weak_ptr_factory_.GetWeakPtr(); 706 return weak_ptr_factory_.GetWeakPtr();
659 } 707 }
660 708
661 void ProvidedFileSystem::OnAddWatcherInQueueCompleted( 709 template <class DestinationPolicy>
710 void ProvidedFileSystem<DestinationPolicy>::OnAddWatcherInQueueCompleted(
662 size_t token, 711 size_t token,
663 const base::FilePath& entry_path, 712 const base::FilePath& entry_path,
664 bool recursive, 713 bool recursive,
665 const Subscriber& subscriber, 714 const Subscriber& subscriber,
666 const storage::AsyncFileUtil::StatusCallback& callback, 715 const storage::AsyncFileUtil::StatusCallback& callback,
667 base::File::Error result) { 716 base::File::Error result) {
668 if (result != base::File::FILE_OK) { 717 if (result != base::File::FILE_OK) {
669 callback.Run(result); 718 callback.Run(result);
670 watcher_queue_.Complete(token); 719 watcher_queue_.Complete(token);
671 return; 720 return;
(...skipping 13 matching lines...) Expand all
685 watcher->subscribers[subscriber.origin] = subscriber; 734 watcher->subscribers[subscriber.origin] = subscriber;
686 735
687 FOR_EACH_OBSERVER(ProvidedFileSystemObserver, 736 FOR_EACH_OBSERVER(ProvidedFileSystemObserver,
688 observers_, 737 observers_,
689 OnWatcherListChanged(file_system_info_, watchers_)); 738 OnWatcherListChanged(file_system_info_, watchers_));
690 739
691 callback.Run(base::File::FILE_OK); 740 callback.Run(base::File::FILE_OK);
692 watcher_queue_.Complete(token); 741 watcher_queue_.Complete(token);
693 } 742 }
694 743
695 void ProvidedFileSystem::OnRemoveWatcherInQueueCompleted( 744 template <class DestinationPolicy>
745 void ProvidedFileSystem<DestinationPolicy>::OnRemoveWatcherInQueueCompleted(
696 size_t token, 746 size_t token,
697 const GURL& origin, 747 const GURL& origin,
698 const WatcherKey& key, 748 const WatcherKey& key,
699 const storage::AsyncFileUtil::StatusCallback& callback, 749 const storage::AsyncFileUtil::StatusCallback& callback,
700 bool extension_response, 750 bool extension_response,
701 base::File::Error result) { 751 base::File::Error result) {
702 if (!extension_response && result != base::File::FILE_OK) { 752 if (!extension_response && result != base::File::FILE_OK) {
703 watcher_queue_.Complete(token); 753 watcher_queue_.Complete(token);
704 callback.Run(result); 754 callback.Run(result);
705 return; 755 return;
(...skipping 11 matching lines...) Expand all
717 OnWatcherListChanged(file_system_info_, watchers_)); 767 OnWatcherListChanged(file_system_info_, watchers_));
718 768
719 // If there are no more subscribers, then remove the watcher. 769 // If there are no more subscribers, then remove the watcher.
720 if (!it->second.subscribers.size()) 770 if (!it->second.subscribers.size())
721 watchers_.erase(it); 771 watchers_.erase(it);
722 772
723 callback.Run(base::File::FILE_OK); 773 callback.Run(base::File::FILE_OK);
724 watcher_queue_.Complete(token); 774 watcher_queue_.Complete(token);
725 } 775 }
726 776
727 void ProvidedFileSystem::OnNotifyInQueueCompleted( 777 template <class DestinationPolicy>
778 void ProvidedFileSystem<DestinationPolicy>::OnNotifyInQueueCompleted(
728 scoped_ptr<NotifyInQueueArgs> args, 779 scoped_ptr<NotifyInQueueArgs> args,
729 base::File::Error result) { 780 base::File::Error result) {
730 if (result != base::File::FILE_OK) { 781 if (result != base::File::FILE_OK) {
731 args->callback.Run(result); 782 args->callback.Run(result);
732 watcher_queue_.Complete(args->token); 783 watcher_queue_.Complete(args->token);
733 return; 784 return;
734 } 785 }
735 786
736 // Check if the entry is still watched. 787 // Check if the entry is still watched.
737 const WatcherKey key(args->entry_path, args->recursive); 788 const WatcherKey key(args->entry_path, args->recursive);
(...skipping 18 matching lines...) Expand all
756 for (const auto& subscriber_it : subscribers) { 807 for (const auto& subscriber_it : subscribers) {
757 RemoveWatcher(subscriber_it.second.origin, args->entry_path, 808 RemoveWatcher(subscriber_it.second.origin, args->entry_path,
758 args->recursive, base::Bind(&EmptyStatusCallback)); 809 args->recursive, base::Bind(&EmptyStatusCallback));
759 } 810 }
760 } 811 }
761 812
762 args->callback.Run(base::File::FILE_OK); 813 args->callback.Run(base::File::FILE_OK);
763 watcher_queue_.Complete(args->token); 814 watcher_queue_.Complete(args->token);
764 } 815 }
765 816
766 void ProvidedFileSystem::OnOpenFileCompleted(const base::FilePath& file_path, 817 template <class DestinationPolicy>
767 OpenFileMode mode, 818 void ProvidedFileSystem<DestinationPolicy>::OnOpenFileCompleted(
768 const OpenFileCallback& callback, 819 const base::FilePath& file_path,
769 int file_handle, 820 OpenFileMode mode,
770 base::File::Error result) { 821 const OpenFileCallback& callback,
822 int file_handle,
823 base::File::Error result) {
771 if (result != base::File::FILE_OK) { 824 if (result != base::File::FILE_OK) {
772 callback.Run(file_handle, result); 825 callback.Run(file_handle, result);
773 return; 826 return;
774 } 827 }
775 828
776 opened_files_[file_handle] = OpenedFile(file_path, mode); 829 opened_files_[file_handle] = OpenedFile(file_path, mode);
777 callback.Run(file_handle, base::File::FILE_OK); 830 callback.Run(file_handle, base::File::FILE_OK);
778 } 831 }
779 832
780 void ProvidedFileSystem::OnCloseFileCompleted( 833 template <class DestinationPolicy>
834 void ProvidedFileSystem<DestinationPolicy>::OnCloseFileCompleted(
781 int file_handle, 835 int file_handle,
782 const storage::AsyncFileUtil::StatusCallback& callback, 836 const storage::AsyncFileUtil::StatusCallback& callback,
783 base::File::Error result) { 837 base::File::Error result) {
784 // Closing files is final. Even if an error happened, we remove it from the 838 // Closing files is final. Even if an error happened, we remove it from the
785 // list of opened files. 839 // list of opened files.
786 opened_files_.erase(file_handle); 840 opened_files_.erase(file_handle);
787 callback.Run(result); 841 callback.Run(result);
788 } 842 }
789 843
844 FOR_EACH_DESTINATION_SPECIALIZE(ProvidedFileSystem)
845
790 } // namespace file_system_provider 846 } // namespace file_system_provider
791 } // namespace chromeos 847 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698