Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_file_system.h" | 5 #include "webkit/glue/plugins/pepper_file_system.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | |
| 8 #include "base/ref_counted.h" | |
| 9 #include "base/weak_ptr.h" | |
| 7 #include "third_party/ppapi/c/dev/ppb_file_system_dev.h" | 10 #include "third_party/ppapi/c/dev/ppb_file_system_dev.h" |
| 8 #include "third_party/ppapi/c/pp_completion_callback.h" | 11 #include "third_party/ppapi/c/pp_completion_callback.h" |
| 9 #include "third_party/ppapi/c/pp_errors.h" | 12 #include "third_party/ppapi/c/pp_time.h" |
| 13 #include "webkit/fileapi/file_system_callback_dispatcher.h" | |
| 14 #include "webkit/glue/plugins/pepper_resource.h" | |
| 15 #include "webkit/glue/plugins/pepper_error_util.h" | |
| 16 #include "webkit/glue/plugins/pepper_file_ref.h" | |
| 17 #include "webkit/glue/plugins/pepper_plugin_delegate.h" | |
| 18 #include "webkit/glue/plugins/pepper_plugin_instance.h" | |
| 19 #include "webkit/glue/plugins/pepper_plugin_module.h" | |
| 20 #include "webkit/glue/plugins/pepper_resource.h" | |
| 10 | 21 |
| 11 namespace pepper { | 22 namespace pepper { |
| 12 | 23 |
| 13 namespace { | 24 namespace { |
| 14 | 25 |
| 15 int32_t MakeDirectory(PP_Resource directory_ref, | 26 // Instances of this class are deleted when RunCallback() is called. |
| 27 class StatusCallback : public fileapi::FileSystemCallbackDispatcher { | |
| 28 public: | |
| 29 StatusCallback(base::WeakPtr<pepper::PluginModule> module, | |
| 30 PP_CompletionCallback callback) | |
| 31 : module_(module), | |
| 32 callback_(callback) { | |
| 33 } | |
| 34 | |
| 35 // FileSystemCallbackDispatcher implementation. | |
| 36 virtual void DidSucceed() { | |
| 37 RunCallback(base::PLATFORM_FILE_OK); | |
| 38 } | |
| 39 | |
| 40 virtual void DidReadMetadata(const base::PlatformFileInfo&) { | |
| 41 NOTREACHED(); | |
| 42 } | |
| 43 | |
| 44 virtual void DidReadDirectory( | |
| 45 const std::vector<base::file_util_proxy::Entry>&, bool) { | |
| 46 NOTREACHED(); | |
| 47 } | |
| 48 | |
| 49 virtual void DidOpenFileSystem(const string16&, const FilePath&) { | |
| 50 NOTREACHED(); | |
| 51 } | |
| 52 | |
| 53 virtual void DidFail(base::PlatformFileError error_code) { | |
| 54 RunCallback(error_code); | |
| 55 } | |
| 56 | |
| 57 private: | |
| 58 void RunCallback(base::PlatformFileError error_code) { | |
| 59 PP_CompletionCallback callback = {0}; | |
| 60 std::swap(callback, callback_); | |
|
brettw
2010/09/23 19:35:56
I don't think this swap is necessary in your case.
dumi
2010/09/23 22:31:40
done.
| |
| 61 | |
| 62 if (!module_.get() || !callback.func) | |
| 63 return; | |
| 64 | |
| 65 PP_RunCompletionCallback( | |
| 66 &callback, pepper::PlatformFileErrorToPepperError(error_code)); | |
| 67 | |
| 68 delete this; | |
| 69 } | |
| 70 | |
| 71 base::WeakPtr<pepper::PluginModule> module_; | |
| 72 PP_CompletionCallback callback_; | |
| 73 }; | |
| 74 | |
| 75 // Instances of this class are deleted when RunCallback() is called. | |
| 76 class QueryInfoCallback : public fileapi::FileSystemCallbackDispatcher { | |
| 77 public: | |
| 78 QueryInfoCallback(base::WeakPtr<pepper::PluginModule> module, | |
| 79 PP_CompletionCallback callback, | |
| 80 PP_FileInfo_Dev* info, | |
| 81 PP_FileSystemType_Dev file_system_type) | |
| 82 : module_(module), | |
| 83 callback_(callback), | |
| 84 info_(info), | |
| 85 file_system_type_(file_system_type) { | |
| 86 DCHECK(info_); | |
| 87 } | |
| 88 | |
| 89 // FileSystemCallbackDispatcher implementation. | |
| 90 virtual void DidSucceed() { | |
| 91 NOTREACHED(); | |
| 92 } | |
| 93 | |
| 94 virtual void DidReadMetadata(const base::PlatformFileInfo& file_info) { | |
| 95 RunCallback(base::PLATFORM_FILE_OK, file_info); | |
| 96 } | |
| 97 | |
| 98 virtual void DidReadDirectory( | |
| 99 const std::vector<base::file_util_proxy::Entry>&, bool) { | |
| 100 NOTREACHED(); | |
| 101 } | |
| 102 | |
| 103 virtual void DidOpenFileSystem(const string16&, const FilePath&) { | |
| 104 NOTREACHED(); | |
| 105 } | |
| 106 | |
| 107 virtual void DidFail(base::PlatformFileError error_code) { | |
| 108 RunCallback(error_code, base::PlatformFileInfo()); | |
| 109 } | |
| 110 | |
| 111 private: | |
| 112 void RunCallback(base::PlatformFileError error_code, | |
| 113 const base::PlatformFileInfo& file_info) { | |
| 114 PP_CompletionCallback callback = {0}; | |
| 115 std::swap(callback, callback_); | |
|
brettw
2010/09/23 19:35:56
Same swap comment as above.
dumi
2010/09/23 22:31:40
done.
| |
| 116 | |
| 117 if (!module_.get() || !callback.func) | |
| 118 return; | |
| 119 | |
| 120 if (error_code == base::PLATFORM_FILE_OK) { | |
| 121 info_->size = file_info.size; | |
| 122 info_->creation_time = file_info.creation_time.ToDoubleT(); | |
| 123 info_->last_access_time = file_info.last_accessed.ToDoubleT(); | |
| 124 info_->last_modified_time = file_info.last_modified.ToDoubleT(); | |
| 125 info_->system_type = file_system_type_; | |
| 126 if (file_info.is_directory) | |
| 127 info_->type = PP_FILETYPE_DIRECTORY; | |
| 128 else | |
| 129 info_->type = PP_FILETYPE_REGULAR; | |
| 130 } | |
| 131 PP_RunCompletionCallback( | |
| 132 &callback, pepper::PlatformFileErrorToPepperError(error_code)); | |
| 133 | |
| 134 delete this; | |
| 135 } | |
| 136 | |
| 137 base::WeakPtr<pepper::PluginModule> module_; | |
| 138 PP_CompletionCallback callback_; | |
| 139 PP_FileInfo_Dev* info_; | |
| 140 PP_FileSystemType_Dev file_system_type_; | |
| 141 }; | |
| 142 | |
| 143 int32_t MakeDirectory(PP_Resource directory_ref_id, | |
| 16 bool make_ancestors, | 144 bool make_ancestors, |
| 17 PP_CompletionCallback callback) { | 145 PP_CompletionCallback callback) { |
| 18 return PP_ERROR_FAILED; // TODO(darin): Implement me! | 146 scoped_refptr<FileRef> directory_ref( |
| 19 } | 147 Resource::GetAs<FileRef>(directory_ref_id)); |
| 20 | 148 if (!directory_ref) |
| 21 int32_t Query(PP_Resource file_ref, | 149 return PP_ERROR_BADRESOURCE; |
| 150 | |
| 151 if (directory_ref->file_system_type() == PP_FILESYSTEMTYPE_EXTERNAL) | |
| 152 return PP_ERROR_FAILED; | |
| 153 | |
| 154 PluginModule* module = directory_ref->module(); | |
| 155 if (!module->GetSomeInstance()->delegate()->MakeDirectory( | |
| 156 directory_ref->system_path(), make_ancestors, | |
| 157 new StatusCallback(module->AsWeakPtr(), callback))) | |
| 158 return PP_ERROR_FAILED; | |
| 159 | |
| 160 return PP_ERROR_WOULDBLOCK; | |
| 161 } | |
| 162 | |
| 163 int32_t Query(PP_Resource file_ref_id, | |
| 22 PP_FileInfo_Dev* info, | 164 PP_FileInfo_Dev* info, |
| 23 PP_CompletionCallback callback) { | 165 PP_CompletionCallback callback) { |
| 24 return PP_ERROR_FAILED; // TODO(darin): Implement me! | 166 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
| 25 } | 167 if (!file_ref) |
| 26 | 168 return PP_ERROR_BADRESOURCE; |
| 27 int32_t Touch(PP_Resource file_ref, | 169 |
| 170 PluginModule* module = file_ref->module(); | |
| 171 if (!module->GetSomeInstance()->delegate()->Query( | |
| 172 file_ref->system_path(), | |
| 173 new QueryInfoCallback(module->AsWeakPtr(), callback, | |
| 174 info, file_ref->file_system_type()))) | |
| 175 return PP_ERROR_FAILED; | |
| 176 | |
| 177 return PP_ERROR_WOULDBLOCK; | |
| 178 } | |
| 179 | |
| 180 int32_t Touch(PP_Resource file_ref_id, | |
| 28 PP_Time last_access_time, | 181 PP_Time last_access_time, |
| 29 PP_Time last_modified_time, | 182 PP_Time last_modified_time, |
| 30 PP_CompletionCallback callback) { | 183 PP_CompletionCallback callback) { |
| 31 return PP_ERROR_FAILED; // TODO(darin): Implement me! | 184 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
| 32 } | 185 if (!file_ref) |
| 33 | 186 return PP_ERROR_BADRESOURCE; |
| 34 int32_t Delete(PP_Resource file_ref, | 187 |
| 188 PluginModule* module = file_ref->module(); | |
| 189 if (!module->GetSomeInstance()->delegate()->Touch( | |
| 190 file_ref->system_path(), base::Time::FromDoubleT(last_access_time), | |
| 191 base::Time::FromDoubleT(last_modified_time), | |
| 192 new StatusCallback(module->AsWeakPtr(), callback))) | |
| 193 return PP_ERROR_FAILED; | |
| 194 | |
| 195 return PP_ERROR_WOULDBLOCK; | |
| 196 } | |
| 197 | |
| 198 int32_t Delete(PP_Resource file_ref_id, | |
| 35 PP_CompletionCallback callback) { | 199 PP_CompletionCallback callback) { |
| 36 return PP_ERROR_FAILED; // TODO(darin): Implement me! | 200 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
| 37 } | 201 if (!file_ref) |
| 38 | 202 return PP_ERROR_BADRESOURCE; |
| 39 int32_t Rename(PP_Resource file_ref, | 203 |
| 40 PP_Resource new_file_ref, | 204 if (file_ref->file_system_type() == PP_FILESYSTEMTYPE_EXTERNAL) |
| 205 return PP_ERROR_FAILED; | |
| 206 | |
| 207 PluginModule* module = file_ref->module(); | |
| 208 if (!module->GetSomeInstance()->delegate()->Delete( | |
| 209 file_ref->system_path(), | |
| 210 new StatusCallback(module->AsWeakPtr(), callback))) | |
| 211 return PP_ERROR_FAILED; | |
| 212 | |
| 213 return PP_ERROR_WOULDBLOCK; | |
| 214 } | |
| 215 | |
| 216 int32_t Rename(PP_Resource file_ref_id, | |
| 217 PP_Resource new_file_ref_id, | |
| 41 PP_CompletionCallback callback) { | 218 PP_CompletionCallback callback) { |
| 42 return PP_ERROR_FAILED; // TODO(darin): Implement me! | 219 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
| 220 if (!file_ref) | |
| 221 return PP_ERROR_BADRESOURCE; | |
| 222 | |
| 223 scoped_refptr<FileRef> new_file_ref( | |
| 224 Resource::GetAs<FileRef>(new_file_ref_id)); | |
| 225 if (!new_file_ref) | |
| 226 return PP_ERROR_BADRESOURCE; | |
| 227 | |
| 228 | |
| 229 if ((file_ref->file_system_type() == PP_FILESYSTEMTYPE_EXTERNAL) || | |
|
brettw
2010/09/23 19:35:56
Remove extra blank line above here.
dumi
2010/09/23 22:31:40
removed.
| |
| 230 (file_ref->file_system_type() != new_file_ref->file_system_type())) | |
| 231 return PP_ERROR_FAILED; | |
| 232 | |
| 233 PluginModule* module = file_ref->module(); | |
| 234 if (!module->GetSomeInstance()->delegate()->Rename( | |
| 235 file_ref->system_path(), new_file_ref->system_path(), | |
| 236 new StatusCallback(module->AsWeakPtr(), callback))) | |
| 237 return PP_ERROR_FAILED; | |
| 238 | |
| 239 return PP_ERROR_WOULDBLOCK; | |
| 43 } | 240 } |
| 44 | 241 |
| 45 const PPB_FileSystem_Dev ppb_filesystem = { | 242 const PPB_FileSystem_Dev ppb_filesystem = { |
| 46 &MakeDirectory, | 243 &MakeDirectory, |
| 47 &Query, | 244 &Query, |
| 48 &Touch, | 245 &Touch, |
| 49 &Delete, | 246 &Delete, |
| 50 &Rename | 247 &Rename |
| 51 }; | 248 }; |
| 52 | 249 |
| 53 } // namespace | 250 } // namespace |
| 54 | 251 |
| 55 const PPB_FileSystem_Dev* FileSystem::GetInterface() { | 252 const PPB_FileSystem_Dev* FileSystem::GetInterface() { |
| 56 return &ppb_filesystem; | 253 return &ppb_filesystem; |
| 57 } | 254 } |
| 58 | 255 |
| 59 } // namespace pepper | 256 } // namespace pepper |
| OLD | NEW |