OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/child/fileapi/file_system_dispatcher.h" | 5 #include "content/child/fileapi/file_system_dispatcher.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
10 #include "base/process/process.h" | 10 #include "base/process/process.h" |
11 #include "content/child/child_thread.h" | 11 #include "content/child/child_thread.h" |
12 #include "content/common/fileapi/file_system_messages.h" | 12 #include "content/common/fileapi/file_system_messages.h" |
| 13 #include "webkit/common/fileapi/file_system_info.h" |
13 | 14 |
14 namespace content { | 15 namespace content { |
15 | 16 |
16 class FileSystemDispatcher::CallbackDispatcher { | 17 class FileSystemDispatcher::CallbackDispatcher { |
17 public: | 18 public: |
18 typedef CallbackDispatcher self; | 19 typedef CallbackDispatcher self; |
19 typedef FileSystemDispatcher::StatusCallback StatusCallback; | 20 typedef FileSystemDispatcher::StatusCallback StatusCallback; |
20 typedef FileSystemDispatcher::MetadataCallback MetadataCallback; | 21 typedef FileSystemDispatcher::MetadataCallback MetadataCallback; |
21 typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; | 22 typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; |
22 typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; | 23 typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; |
| 24 typedef FileSystemDispatcher::ResolveURLCallback ResolveURLCallback; |
23 typedef FileSystemDispatcher::WriteCallback WriteCallback; | 25 typedef FileSystemDispatcher::WriteCallback WriteCallback; |
24 typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; | 26 typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; |
25 | 27 |
26 static CallbackDispatcher* Create(const StatusCallback& callback) { | 28 static CallbackDispatcher* Create(const StatusCallback& callback) { |
27 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 29 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
28 dispatcher->status_callback_ = callback; | 30 dispatcher->status_callback_ = callback; |
29 dispatcher->error_callback_ = callback; | 31 dispatcher->error_callback_ = callback; |
30 return dispatcher; | 32 return dispatcher; |
31 } | 33 } |
32 static CallbackDispatcher* Create(const MetadataCallback& callback, | 34 static CallbackDispatcher* Create(const MetadataCallback& callback, |
(...skipping 17 matching lines...) Expand all Loading... |
50 dispatcher->error_callback_ = error_callback; | 52 dispatcher->error_callback_ = error_callback; |
51 return dispatcher; | 53 return dispatcher; |
52 } | 54 } |
53 static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, | 55 static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, |
54 const StatusCallback& error_callback) { | 56 const StatusCallback& error_callback) { |
55 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 57 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
56 dispatcher->filesystem_callback_ = callback; | 58 dispatcher->filesystem_callback_ = callback; |
57 dispatcher->error_callback_ = error_callback; | 59 dispatcher->error_callback_ = error_callback; |
58 return dispatcher; | 60 return dispatcher; |
59 } | 61 } |
| 62 static CallbackDispatcher* Create(const ResolveURLCallback& callback, |
| 63 const StatusCallback& error_callback) { |
| 64 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
| 65 dispatcher->resolve_callback_ = callback; |
| 66 dispatcher->error_callback_ = error_callback; |
| 67 return dispatcher; |
| 68 } |
60 static CallbackDispatcher* Create(const WriteCallback& callback, | 69 static CallbackDispatcher* Create(const WriteCallback& callback, |
61 const StatusCallback& error_callback) { | 70 const StatusCallback& error_callback) { |
62 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 71 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
63 dispatcher->write_callback_ = callback; | 72 dispatcher->write_callback_ = callback; |
64 dispatcher->error_callback_ = error_callback; | 73 dispatcher->error_callback_ = error_callback; |
65 return dispatcher; | 74 return dispatcher; |
66 } | 75 } |
67 static CallbackDispatcher* Create(const OpenFileCallback& callback, | 76 static CallbackDispatcher* Create(const OpenFileCallback& callback, |
68 const StatusCallback& error_callback) { | 77 const StatusCallback& error_callback) { |
69 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 78 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
(...skipping 28 matching lines...) Expand all Loading... |
98 const std::vector<fileapi::DirectoryEntry>& entries, | 107 const std::vector<fileapi::DirectoryEntry>& entries, |
99 bool has_more) { | 108 bool has_more) { |
100 directory_callback_.Run(entries, has_more); | 109 directory_callback_.Run(entries, has_more); |
101 } | 110 } |
102 | 111 |
103 void DidOpenFileSystem(const std::string& name, | 112 void DidOpenFileSystem(const std::string& name, |
104 const GURL& root) { | 113 const GURL& root) { |
105 filesystem_callback_.Run(name, root); | 114 filesystem_callback_.Run(name, root); |
106 } | 115 } |
107 | 116 |
| 117 void DidResolveURL(const fileapi::FileSystemInfo& info, |
| 118 const base::FilePath& file_path, |
| 119 bool is_directory) { |
| 120 resolve_callback_.Run(info, file_path, is_directory); |
| 121 } |
| 122 |
108 void DidWrite(int64 bytes, bool complete) { | 123 void DidWrite(int64 bytes, bool complete) { |
109 write_callback_.Run(bytes, complete); | 124 write_callback_.Run(bytes, complete); |
110 } | 125 } |
111 | 126 |
112 void DidOpenFile(base::PlatformFile file, | 127 void DidOpenFile(base::PlatformFile file, |
113 int file_open_id, | 128 int file_open_id, |
114 quota::QuotaLimitType quota_policy) { | 129 quota::QuotaLimitType quota_policy) { |
115 open_callback_.Run(file, file_open_id, quota_policy); | 130 open_callback_.Run(file, file_open_id, quota_policy); |
116 } | 131 } |
117 | 132 |
118 private: | 133 private: |
119 CallbackDispatcher() {} | 134 CallbackDispatcher() {} |
120 | 135 |
121 StatusCallback status_callback_; | 136 StatusCallback status_callback_; |
122 MetadataCallback metadata_callback_; | 137 MetadataCallback metadata_callback_; |
123 CreateSnapshotFileCallback snapshot_callback_; | 138 CreateSnapshotFileCallback snapshot_callback_; |
124 ReadDirectoryCallback directory_callback_; | 139 ReadDirectoryCallback directory_callback_; |
125 OpenFileSystemCallback filesystem_callback_; | 140 OpenFileSystemCallback filesystem_callback_; |
| 141 ResolveURLCallback resolve_callback_; |
126 WriteCallback write_callback_; | 142 WriteCallback write_callback_; |
127 OpenFileCallback open_callback_; | 143 OpenFileCallback open_callback_; |
128 | 144 |
129 StatusCallback error_callback_; | 145 StatusCallback error_callback_; |
130 | 146 |
131 DISALLOW_COPY_AND_ASSIGN(CallbackDispatcher); | 147 DISALLOW_COPY_AND_ASSIGN(CallbackDispatcher); |
132 }; | 148 }; |
133 | 149 |
134 FileSystemDispatcher::FileSystemDispatcher() { | 150 FileSystemDispatcher::FileSystemDispatcher() { |
135 } | 151 } |
136 | 152 |
137 FileSystemDispatcher::~FileSystemDispatcher() { | 153 FileSystemDispatcher::~FileSystemDispatcher() { |
138 // Make sure we fire all the remaining callbacks. | 154 // Make sure we fire all the remaining callbacks. |
139 for (IDMap<CallbackDispatcher, IDMapOwnPointer>::iterator | 155 for (IDMap<CallbackDispatcher, IDMapOwnPointer>::iterator |
140 iter(&dispatchers_); !iter.IsAtEnd(); iter.Advance()) { | 156 iter(&dispatchers_); !iter.IsAtEnd(); iter.Advance()) { |
141 int request_id = iter.GetCurrentKey(); | 157 int request_id = iter.GetCurrentKey(); |
142 CallbackDispatcher* dispatcher = iter.GetCurrentValue(); | 158 CallbackDispatcher* dispatcher = iter.GetCurrentValue(); |
143 DCHECK(dispatcher); | 159 DCHECK(dispatcher); |
144 dispatcher->DidFail(base::PLATFORM_FILE_ERROR_ABORT); | 160 dispatcher->DidFail(base::PLATFORM_FILE_ERROR_ABORT); |
145 dispatchers_.Remove(request_id); | 161 dispatchers_.Remove(request_id); |
146 } | 162 } |
147 } | 163 } |
148 | 164 |
149 bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) { | 165 bool FileSystemDispatcher::OnMessageReceived(const IPC::Message& msg) { |
150 bool handled = true; | 166 bool handled = true; |
151 IPC_BEGIN_MESSAGE_MAP(FileSystemDispatcher, msg) | 167 IPC_BEGIN_MESSAGE_MAP(FileSystemDispatcher, msg) |
152 IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFileSystem, OnDidOpenFileSystem) | 168 IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFileSystem, OnDidOpenFileSystem) |
| 169 IPC_MESSAGE_HANDLER(FileSystemMsg_DidResolveURL, OnDidResolveURL) |
153 IPC_MESSAGE_HANDLER(FileSystemMsg_DidSucceed, OnDidSucceed) | 170 IPC_MESSAGE_HANDLER(FileSystemMsg_DidSucceed, OnDidSucceed) |
154 IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadDirectory, OnDidReadDirectory) | 171 IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadDirectory, OnDidReadDirectory) |
155 IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadMetadata, OnDidReadMetadata) | 172 IPC_MESSAGE_HANDLER(FileSystemMsg_DidReadMetadata, OnDidReadMetadata) |
156 IPC_MESSAGE_HANDLER(FileSystemMsg_DidCreateSnapshotFile, | 173 IPC_MESSAGE_HANDLER(FileSystemMsg_DidCreateSnapshotFile, |
157 OnDidCreateSnapshotFile) | 174 OnDidCreateSnapshotFile) |
158 IPC_MESSAGE_HANDLER(FileSystemMsg_DidFail, OnDidFail) | 175 IPC_MESSAGE_HANDLER(FileSystemMsg_DidFail, OnDidFail) |
159 IPC_MESSAGE_HANDLER(FileSystemMsg_DidWrite, OnDidWrite) | 176 IPC_MESSAGE_HANDLER(FileSystemMsg_DidWrite, OnDidWrite) |
160 IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFile, OnDidOpenFile) | 177 IPC_MESSAGE_HANDLER(FileSystemMsg_DidOpenFile, OnDidOpenFile) |
161 IPC_MESSAGE_UNHANDLED(handled = false) | 178 IPC_MESSAGE_UNHANDLED(handled = false) |
162 IPC_END_MESSAGE_MAP() | 179 IPC_END_MESSAGE_MAP() |
163 return handled; | 180 return handled; |
164 } | 181 } |
165 | 182 |
166 void FileSystemDispatcher::OpenFileSystem( | 183 void FileSystemDispatcher::OpenFileSystem( |
167 const GURL& origin_url, fileapi::FileSystemType type, | 184 const GURL& origin_url, fileapi::FileSystemType type, |
168 long long size, bool create, | 185 long long size, bool create, |
169 const OpenFileSystemCallback& success_callback, | 186 const OpenFileSystemCallback& success_callback, |
170 const StatusCallback& error_callback) { | 187 const StatusCallback& error_callback) { |
171 int request_id = dispatchers_.Add( | 188 int request_id = dispatchers_.Add( |
172 CallbackDispatcher::Create(success_callback, error_callback)); | 189 CallbackDispatcher::Create(success_callback, error_callback)); |
173 ChildThread::current()->Send(new FileSystemHostMsg_Open( | 190 ChildThread::current()->Send(new FileSystemHostMsg_Open( |
174 request_id, origin_url, type, size, create)); | 191 request_id, origin_url, type, size, create)); |
175 } | 192 } |
176 | 193 |
| 194 void FileSystemDispatcher::ResolveURL( |
| 195 const GURL& filesystem_url, |
| 196 const ResolveURLCallback& success_callback, |
| 197 const StatusCallback& error_callback) { |
| 198 int request_id = dispatchers_.Add( |
| 199 CallbackDispatcher::Create(success_callback, error_callback)); |
| 200 ChildThread::current()->Send(new FileSystemHostMsg_ResolveURL( |
| 201 request_id, filesystem_url)); |
| 202 } |
| 203 |
177 void FileSystemDispatcher::DeleteFileSystem( | 204 void FileSystemDispatcher::DeleteFileSystem( |
178 const GURL& origin_url, | 205 const GURL& origin_url, |
179 fileapi::FileSystemType type, | 206 fileapi::FileSystemType type, |
180 const StatusCallback& callback) { | 207 const StatusCallback& callback) { |
181 int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback)); | 208 int request_id = dispatchers_.Add(CallbackDispatcher::Create(callback)); |
182 ChildThread::current()->Send(new FileSystemHostMsg_DeleteFileSystem( | 209 ChildThread::current()->Send(new FileSystemHostMsg_DeleteFileSystem( |
183 request_id, origin_url, type)); | 210 request_id, origin_url, type)); |
184 } | 211 } |
185 | 212 |
186 void FileSystemDispatcher::Move( | 213 void FileSystemDispatcher::Move( |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, | 382 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, |
356 const std::string& name, | 383 const std::string& name, |
357 const GURL& root) { | 384 const GURL& root) { |
358 DCHECK(root.is_valid()); | 385 DCHECK(root.is_valid()); |
359 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 386 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
360 DCHECK(dispatcher); | 387 DCHECK(dispatcher); |
361 dispatcher->DidOpenFileSystem(name, root); | 388 dispatcher->DidOpenFileSystem(name, root); |
362 dispatchers_.Remove(request_id); | 389 dispatchers_.Remove(request_id); |
363 } | 390 } |
364 | 391 |
| 392 void FileSystemDispatcher::OnDidResolveURL(int request_id, |
| 393 const fileapi::FileSystemInfo& info, |
| 394 const base::FilePath& file_path, |
| 395 bool is_directory) { |
| 396 DCHECK(info.root_url.is_valid()); |
| 397 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
| 398 DCHECK(dispatcher); |
| 399 dispatcher->DidResolveURL(info, file_path, is_directory); |
| 400 dispatchers_.Remove(request_id); |
| 401 } |
| 402 |
365 void FileSystemDispatcher::OnDidSucceed(int request_id) { | 403 void FileSystemDispatcher::OnDidSucceed(int request_id) { |
366 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 404 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
367 DCHECK(dispatcher); | 405 DCHECK(dispatcher); |
368 dispatcher->DidSucceed(); | 406 dispatcher->DidSucceed(); |
369 dispatchers_.Remove(request_id); | 407 dispatchers_.Remove(request_id); |
370 } | 408 } |
371 | 409 |
372 void FileSystemDispatcher::OnDidReadMetadata( | 410 void FileSystemDispatcher::OnDidReadMetadata( |
373 int request_id, const base::PlatformFileInfo& file_info) { | 411 int request_id, const base::PlatformFileInfo& file_info) { |
374 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 412 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 quota::QuotaLimitType quota_policy) { | 458 quota::QuotaLimitType quota_policy) { |
421 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 459 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
422 DCHECK(dispatcher); | 460 DCHECK(dispatcher); |
423 dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), | 461 dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), |
424 file_open_id, | 462 file_open_id, |
425 quota_policy); | 463 quota_policy); |
426 dispatchers_.Remove(request_id); | 464 dispatchers_.Remove(request_id); |
427 } | 465 } |
428 | 466 |
429 } // namespace content | 467 } // namespace content |
OLD | NEW |