Index: webkit/plugins/ppapi/ppb_flash_file_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_flash_file_impl.cc b/webkit/plugins/ppapi/ppb_flash_file_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c71a8d1354783a9bc0cdf84d8746dbec01738de7 |
--- /dev/null |
+++ b/webkit/plugins/ppapi/ppb_flash_file_impl.cc |
@@ -0,0 +1,205 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "webkit/plugins/ppapi/ppb_flash_file_impl.h" |
+ |
+#include <string.h> |
+ |
+#include <string> |
+ |
+#include "base/file_path.h" |
+#include "base/utf_string_conversions.h" |
+#include "ppapi/c/dev/pp_file_info_dev.h" |
+#include "ppapi/c/dev/ppb_file_io_dev.h" |
+#include "ppapi/c/private/ppb_flash_file.h" |
+#include "webkit/plugins/ppapi/common.h" |
+#include "webkit/plugins/ppapi/error_util.h" |
+#include "webkit/plugins/ppapi/plugin_delegate.h" |
+#include "webkit/plugins/ppapi/plugin_module.h" |
+#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
+#include "webkit/plugins/ppapi/resource_tracker.h" |
+ |
+namespace webkit { |
+namespace ppapi { |
+ |
+namespace { |
+ |
+FilePath GetFilePathFromUTF8(const char* path) { |
+#if defined(OS_WIN) |
+ return FilePath(UTF8ToUTF16(path)); |
+#else |
+ return FilePath(path); |
+#endif |
+} |
+ |
+int32_t OpenModuleLocalFile(PP_Instance pp_instance, |
+ const char* path, |
+ int32_t mode, |
+ PP_FileHandle* file) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ int flags = 0; |
+ if (mode & PP_FILEOPENFLAG_READ) |
+ flags |= base::PLATFORM_FILE_READ; |
+ if (mode & PP_FILEOPENFLAG_WRITE) { |
+ flags |= base::PLATFORM_FILE_WRITE; |
+ flags |= base::PLATFORM_FILE_WRITE_ATTRIBUTES; |
+ } |
+ if (mode & PP_FILEOPENFLAG_TRUNCATE) { |
+ DCHECK(mode & PP_FILEOPENFLAG_WRITE); |
+ flags |= base::PLATFORM_FILE_TRUNCATE; |
+ } |
+ |
+ if (mode & PP_FILEOPENFLAG_CREATE) { |
+ if (mode & PP_FILEOPENFLAG_EXCLUSIVE) |
+ flags |= base::PLATFORM_FILE_CREATE; |
+ else |
+ flags |= base::PLATFORM_FILE_OPEN_ALWAYS; |
+ } else { |
+ flags |= base::PLATFORM_FILE_OPEN; |
+ } |
+ |
+ base::PlatformFile base_file; |
+ base::PlatformFileError result = instance->delegate()->OpenModuleLocalFile( |
+ instance->module()->name(), |
+ GetFilePathFromUTF8(path), |
+ flags, |
+ &base_file); |
+ *file = base_file; |
+ return PlatformFileErrorToPepperError(result); |
+} |
+ |
+ |
+int32_t RenameModuleLocalFile(PP_Instance pp_instance, |
+ const char* path_from, |
+ const char* path_to) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ base::PlatformFileError result = instance->delegate()->RenameModuleLocalFile( |
+ instance->module()->name(), |
+ GetFilePathFromUTF8(path_from), |
+ GetFilePathFromUTF8(path_to)); |
+ return PlatformFileErrorToPepperError(result); |
+} |
+ |
+int32_t DeleteModuleLocalFileOrDir(PP_Instance pp_instance, |
+ const char* path, |
+ PP_Bool recursive) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ base::PlatformFileError result = |
+ instance->delegate()->DeleteModuleLocalFileOrDir( |
+ instance->module()->name(), GetFilePathFromUTF8(path), |
+ PPBoolToBool(recursive)); |
+ return PlatformFileErrorToPepperError(result); |
+} |
+ |
+int32_t CreateModuleLocalDir(PP_Instance pp_instance, const char* path) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ base::PlatformFileError result = instance->delegate()->CreateModuleLocalDir( |
+ instance->module()->name(), GetFilePathFromUTF8(path)); |
+ return PlatformFileErrorToPepperError(result); |
+} |
+ |
+int32_t QueryModuleLocalFile(PP_Instance pp_instance, |
+ const char* path, |
+ PP_FileInfo_Dev* info) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ base::PlatformFileInfo file_info; |
+ base::PlatformFileError result = instance->delegate()->QueryModuleLocalFile( |
+ instance->module()->name(), GetFilePathFromUTF8(path), &file_info); |
+ if (result == base::PLATFORM_FILE_OK) { |
+ info->size = file_info.size; |
+ info->creation_time = file_info.creation_time.ToDoubleT(); |
+ info->last_access_time = file_info.last_accessed.ToDoubleT(); |
+ info->last_modified_time = file_info.last_modified.ToDoubleT(); |
+ info->system_type = PP_FILESYSTEMTYPE_EXTERNAL; |
+ if (file_info.is_directory) |
+ info->type = PP_FILETYPE_DIRECTORY; |
+ else |
+ info->type = PP_FILETYPE_REGULAR; |
+ } |
+ return PlatformFileErrorToPepperError(result); |
+} |
+ |
+int32_t GetModuleLocalDirContents(PP_Instance pp_instance, |
+ const char* path, |
+ PP_DirContents_Dev** contents) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return PP_ERROR_FAILED; |
+ |
+ *contents = NULL; |
+ DirContents pepper_contents; |
+ base::PlatformFileError result = |
+ instance->delegate()->GetModuleLocalDirContents( |
+ instance->module()->name(), |
+ GetFilePathFromUTF8(path), |
+ &pepper_contents); |
+ |
+ if (result != base::PLATFORM_FILE_OK) |
+ return PlatformFileErrorToPepperError(result); |
+ |
+ *contents = new PP_DirContents_Dev; |
+ size_t count = pepper_contents.size(); |
+ (*contents)->count = count; |
+ (*contents)->entries = new PP_DirEntry_Dev[count]; |
+ for (size_t i = 0; i < count; ++i) { |
+ PP_DirEntry_Dev& entry = (*contents)->entries[i]; |
+#if defined(OS_WIN) |
+ const std::string& name = UTF16ToUTF8(pepper_contents[i].name.value()); |
+#else |
+ const std::string& name = pepper_contents[i].name.value(); |
+#endif |
+ size_t size = name.size() + 1; |
+ char* name_copy = new char[size]; |
+ memcpy(name_copy, name.c_str(), size); |
+ entry.name = name_copy; |
+ entry.is_dir = BoolToPPBool(pepper_contents[i].is_dir); |
+ } |
+ return PP_OK; |
+} |
+ |
+void FreeModuleLocalDirContents(PP_Instance instance, |
+ PP_DirContents_Dev* contents) { |
+ DCHECK(contents); |
+ for (int32_t i = 0; i < contents->count; ++i) { |
+ delete [] contents->entries[i].name; |
+ } |
+ delete [] contents->entries; |
+ delete contents; |
+} |
+ |
+const PPB_Flash_File_ModuleLocal ppb_flash_file_module_local = { |
+ &OpenModuleLocalFile, |
+ &RenameModuleLocalFile, |
+ &DeleteModuleLocalFileOrDir, |
+ &CreateModuleLocalDir, |
+ &QueryModuleLocalFile, |
+ &GetModuleLocalDirContents, |
+ &FreeModuleLocalDirContents, |
+}; |
+ |
+} // namespace |
+ |
+// static |
+const PPB_Flash_File_ModuleLocal* |
+ PPB_Flash_File_ModuleLocal_Impl::GetInterface() { |
+ return &ppb_flash_file_module_local; |
+} |
+ |
+} // namespace ppapi |
+} // namespace webkit |