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 | 13 |
14 namespace content { | 14 namespace content { |
15 | 15 |
16 class FileSystemDispatcher::CallbackDispatcher { | 16 class FileSystemDispatcher::CallbackDispatcher { |
17 public: | 17 public: |
18 typedef CallbackDispatcher self; | 18 typedef CallbackDispatcher self; |
19 typedef FileSystemDispatcher::StatusCallback StatusCallback; | 19 typedef FileSystemDispatcher::StatusCallback StatusCallback; |
20 typedef FileSystemDispatcher::MetadataCallback MetadataCallback; | 20 typedef FileSystemDispatcher::MetadataCallback MetadataCallback; |
21 typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; | 21 typedef FileSystemDispatcher::ReadDirectoryCallback ReadDirectoryCallback; |
22 typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; | 22 typedef FileSystemDispatcher::OpenFileSystemCallback OpenFileSystemCallback; |
| 23 typedef FileSystemDispatcher::ResolveURLCallback ResolveURLCallback; |
23 typedef FileSystemDispatcher::WriteCallback WriteCallback; | 24 typedef FileSystemDispatcher::WriteCallback WriteCallback; |
24 typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; | 25 typedef FileSystemDispatcher::OpenFileCallback OpenFileCallback; |
25 | 26 |
26 static CallbackDispatcher* Create(const StatusCallback& callback) { | 27 static CallbackDispatcher* Create(const StatusCallback& callback) { |
27 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 28 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
28 dispatcher->status_callback_ = callback; | 29 dispatcher->status_callback_ = callback; |
29 dispatcher->error_callback_ = callback; | 30 dispatcher->error_callback_ = callback; |
30 return dispatcher; | 31 return dispatcher; |
31 } | 32 } |
32 static CallbackDispatcher* Create(const MetadataCallback& callback, | 33 static CallbackDispatcher* Create(const MetadataCallback& callback, |
(...skipping 17 matching lines...) Expand all Loading... |
50 dispatcher->error_callback_ = error_callback; | 51 dispatcher->error_callback_ = error_callback; |
51 return dispatcher; | 52 return dispatcher; |
52 } | 53 } |
53 static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, | 54 static CallbackDispatcher* Create(const OpenFileSystemCallback& callback, |
54 const StatusCallback& error_callback) { | 55 const StatusCallback& error_callback) { |
55 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 56 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
56 dispatcher->filesystem_callback_ = callback; | 57 dispatcher->filesystem_callback_ = callback; |
57 dispatcher->error_callback_ = error_callback; | 58 dispatcher->error_callback_ = error_callback; |
58 return dispatcher; | 59 return dispatcher; |
59 } | 60 } |
| 61 static CallbackDispatcher* Create(const ResolveURLCallback& callback, |
| 62 const StatusCallback& error_callback) { |
| 63 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
| 64 dispatcher->resolve_callback_ = callback; |
| 65 dispatcher->error_callback_ = error_callback; |
| 66 return dispatcher; |
| 67 } |
60 static CallbackDispatcher* Create(const WriteCallback& callback, | 68 static CallbackDispatcher* Create(const WriteCallback& callback, |
61 const StatusCallback& error_callback) { | 69 const StatusCallback& error_callback) { |
62 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 70 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
63 dispatcher->write_callback_ = callback; | 71 dispatcher->write_callback_ = callback; |
64 dispatcher->error_callback_ = error_callback; | 72 dispatcher->error_callback_ = error_callback; |
65 return dispatcher; | 73 return dispatcher; |
66 } | 74 } |
67 static CallbackDispatcher* Create(const OpenFileCallback& callback, | 75 static CallbackDispatcher* Create(const OpenFileCallback& callback, |
68 const StatusCallback& error_callback) { | 76 const StatusCallback& error_callback) { |
69 CallbackDispatcher* dispatcher = new CallbackDispatcher; | 77 CallbackDispatcher* dispatcher = new CallbackDispatcher; |
(...skipping 28 matching lines...) Expand all Loading... |
98 const std::vector<fileapi::DirectoryEntry>& entries, | 106 const std::vector<fileapi::DirectoryEntry>& entries, |
99 bool has_more) { | 107 bool has_more) { |
100 directory_callback_.Run(entries, has_more); | 108 directory_callback_.Run(entries, has_more); |
101 } | 109 } |
102 | 110 |
103 void DidOpenFileSystem(const std::string& name, | 111 void DidOpenFileSystem(const std::string& name, |
104 const GURL& root) { | 112 const GURL& root) { |
105 filesystem_callback_.Run(name, root); | 113 filesystem_callback_.Run(name, root); |
106 } | 114 } |
107 | 115 |
| 116 void DidResolveURL(const std::string& name, |
| 117 const GURL& root, |
| 118 const base::FilePath& file_path, |
| 119 bool is_directory) { |
| 120 resolve_callback_.Run(name, root, 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, | 365 void FileSystemDispatcher::OnDidOpenFileSystem(int request_id, |
339 const std::string& name, | 366 const std::string& name, |
340 const GURL& root) { | 367 const GURL& root) { |
341 DCHECK(root.is_valid()); | 368 DCHECK(root.is_valid()); |
342 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 369 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
343 DCHECK(dispatcher); | 370 DCHECK(dispatcher); |
344 dispatcher->DidOpenFileSystem(name, root); | 371 dispatcher->DidOpenFileSystem(name, root); |
345 dispatchers_.Remove(request_id); | 372 dispatchers_.Remove(request_id); |
346 } | 373 } |
347 | 374 |
| 375 void FileSystemDispatcher::OnDidResolveURL(int request_id, |
| 376 const std::string& name, |
| 377 const GURL& root, |
| 378 const base::FilePath& file_path, |
| 379 bool is_directory) { |
| 380 DCHECK(root.is_valid()); |
| 381 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
| 382 DCHECK(dispatcher); |
| 383 dispatcher->DidResolveURL(name, root, file_path, is_directory); |
| 384 dispatchers_.Remove(request_id); |
| 385 } |
| 386 |
348 void FileSystemDispatcher::OnDidSucceed(int request_id) { | 387 void FileSystemDispatcher::OnDidSucceed(int request_id) { |
349 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 388 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
350 DCHECK(dispatcher); | 389 DCHECK(dispatcher); |
351 dispatcher->DidSucceed(); | 390 dispatcher->DidSucceed(); |
352 dispatchers_.Remove(request_id); | 391 dispatchers_.Remove(request_id); |
353 } | 392 } |
354 | 393 |
355 void FileSystemDispatcher::OnDidReadMetadata( | 394 void FileSystemDispatcher::OnDidReadMetadata( |
356 int request_id, const base::PlatformFileInfo& file_info) { | 395 int request_id, const base::PlatformFileInfo& file_info) { |
357 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 396 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 quota::QuotaLimitType quota_policy) { | 442 quota::QuotaLimitType quota_policy) { |
404 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); | 443 CallbackDispatcher* dispatcher = dispatchers_.Lookup(request_id); |
405 DCHECK(dispatcher); | 444 DCHECK(dispatcher); |
406 dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), | 445 dispatcher->DidOpenFile(IPC::PlatformFileForTransitToPlatformFile(file), |
407 file_open_id, | 446 file_open_id, |
408 quota_policy); | 447 quota_policy); |
409 dispatchers_.Remove(request_id); | 448 dispatchers_.Remove(request_id); |
410 } | 449 } |
411 | 450 |
412 } // namespace content | 451 } // namespace content |
OLD | NEW |