Index: webkit/glue/plugins/pepper_file_io.cc |
=================================================================== |
--- webkit/glue/plugins/pepper_file_io.cc (revision 69381) |
+++ webkit/glue/plugins/pepper_file_io.cc (working copy) |
@@ -1,437 +0,0 @@ |
-// Copyright (c) 2010 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/glue/plugins/pepper_file_io.h" |
- |
-#include "base/callback.h" |
-#include "base/file_util.h" |
-#include "base/file_util_proxy.h" |
-#include "base/message_loop_proxy.h" |
-#include "base/platform_file.h" |
-#include "base/logging.h" |
-#include "base/time.h" |
-#include "ppapi/c/dev/ppb_file_io_dev.h" |
-#include "ppapi/c/dev/ppb_file_io_trusted_dev.h" |
-#include "ppapi/c/pp_completion_callback.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "webkit/glue/plugins/pepper_common.h" |
-#include "webkit/glue/plugins/pepper_file_ref.h" |
-#include "webkit/glue/plugins/pepper_plugin_instance.h" |
-#include "webkit/glue/plugins/pepper_plugin_module.h" |
-#include "webkit/glue/plugins/pepper_resource_tracker.h" |
- |
-namespace pepper { |
- |
-namespace { |
- |
-PP_Resource Create(PP_Module module_id) { |
- PluginModule* module = ResourceTracker::Get()->GetModule(module_id); |
- if (!module) |
- return 0; |
- |
- FileIO* file_io = new FileIO(module); |
- return file_io->GetReference(); |
-} |
- |
-PP_Bool IsFileIO(PP_Resource resource) { |
- return BoolToPPBool(!!Resource::GetAs<FileIO>(resource)); |
-} |
- |
-int32_t Open(PP_Resource file_io_id, |
- PP_Resource file_ref_id, |
- int32_t open_flags, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- return file_io->Open(file_ref, open_flags, callback); |
-} |
- |
-int32_t Query(PP_Resource file_io_id, |
- PP_FileInfo_Dev* info, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->Query(info, callback); |
-} |
- |
-int32_t Touch(PP_Resource file_io_id, |
- PP_Time last_access_time, |
- PP_Time last_modified_time, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->Touch(last_access_time, last_modified_time, callback); |
-} |
- |
-int32_t Read(PP_Resource file_io_id, |
- int64_t offset, |
- char* buffer, |
- int32_t bytes_to_read, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->Read(offset, buffer, bytes_to_read, callback); |
-} |
- |
-int32_t Write(PP_Resource file_io_id, |
- int64_t offset, |
- const char* buffer, |
- int32_t bytes_to_write, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->Write(offset, buffer, bytes_to_write, callback); |
-} |
- |
-int32_t SetLength(PP_Resource file_io_id, |
- int64_t length, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->SetLength(length, callback); |
-} |
- |
-int32_t Flush(PP_Resource file_io_id, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->Flush(callback); |
-} |
- |
-void Close(PP_Resource file_io_id) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return; |
- file_io->Close(); |
-} |
- |
-const PPB_FileIO_Dev ppb_fileio = { |
- &Create, |
- &IsFileIO, |
- &Open, |
- &Query, |
- &Touch, |
- &Read, |
- &Write, |
- &SetLength, |
- &Flush, |
- &Close |
-}; |
- |
-int32_t GetOSFileDescriptor(PP_Resource file_io_id) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->GetOSFileDescriptor(); |
-} |
- |
-int32_t WillWrite(PP_Resource file_io_id, |
- int64_t offset, |
- int32_t bytes_to_write, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->WillWrite(offset, bytes_to_write, callback); |
-} |
- |
-int32_t WillSetLength(PP_Resource file_io_id, |
- int64_t length, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileIO> file_io(Resource::GetAs<FileIO>(file_io_id)); |
- if (!file_io) |
- return PP_ERROR_BADRESOURCE; |
- return file_io->WillSetLength(length, callback); |
-} |
- |
-const PPB_FileIOTrusted_Dev ppb_fileiotrusted = { |
- &GetOSFileDescriptor, |
- &WillWrite, |
- &WillSetLength |
-}; |
- |
-int PlatformFileErrorToPepperError(base::PlatformFileError error_code) { |
- switch (error_code) { |
- case base::PLATFORM_FILE_OK: |
- return PP_OK; |
- case base::PLATFORM_FILE_ERROR_EXISTS: |
- return PP_ERROR_FILEEXISTS; |
- case base::PLATFORM_FILE_ERROR_NOT_FOUND: |
- return PP_ERROR_FILENOTFOUND; |
- case base::PLATFORM_FILE_ERROR_ACCESS_DENIED: |
- return PP_ERROR_NOACCESS; |
- case base::PLATFORM_FILE_ERROR_NO_MEMORY: |
- return PP_ERROR_NOMEMORY; |
- case base::PLATFORM_FILE_ERROR_NO_SPACE: |
- return PP_ERROR_NOSPACE; |
- case base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY: |
- NOTREACHED(); |
- return PP_ERROR_FAILED; |
- default: |
- return PP_ERROR_FAILED; |
- } |
-} |
- |
-} // namespace |
- |
-FileIO::FileIO(PluginModule* module) |
- : Resource(module), |
- delegate_(module->GetSomeInstance()->delegate()), |
- ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)), |
- file_(base::kInvalidPlatformFileValue), |
- callback_(), |
- info_(NULL) { |
-} |
- |
-FileIO::~FileIO() { |
- Close(); |
-} |
- |
-// static |
-const PPB_FileIO_Dev* FileIO::GetInterface() { |
- return &ppb_fileio; |
-} |
- |
-// static |
-const PPB_FileIOTrusted_Dev* FileIO::GetTrustedInterface() { |
- return &ppb_fileiotrusted; |
-} |
- |
-FileIO* FileIO::AsFileIO() { |
- return this; |
-} |
- |
-int32_t FileIO::Open(FileRef* file_ref, |
- int32_t open_flags, |
- PP_CompletionCallback callback) { |
- if (file_ != base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- int flags = 0; |
- if (open_flags & PP_FILEOPENFLAG_READ) |
- flags |= base::PLATFORM_FILE_READ; |
- if (open_flags & PP_FILEOPENFLAG_WRITE) { |
- flags |= base::PLATFORM_FILE_WRITE; |
- flags |= base::PLATFORM_FILE_WRITE_ATTRIBUTES; |
- } |
- |
- if (open_flags & PP_FILEOPENFLAG_TRUNCATE) { |
- DCHECK(open_flags & PP_FILEOPENFLAG_WRITE); |
- flags |= base::PLATFORM_FILE_TRUNCATE; |
- } else if (open_flags & PP_FILEOPENFLAG_CREATE) { |
- if (open_flags & PP_FILEOPENFLAG_EXCLUSIVE) |
- flags |= base::PLATFORM_FILE_CREATE; |
- else |
- flags |= base::PLATFORM_FILE_OPEN_ALWAYS; |
- } else |
- flags |= base::PLATFORM_FILE_OPEN; |
- |
- file_system_type_ = file_ref->GetFileSystemType(); |
- if (!delegate_->AsyncOpenFile( |
- file_ref->GetSystemPath(), flags, |
- callback_factory_.NewCallback(&FileIO::AsyncOpenFileCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::Query(PP_FileInfo_Dev* info, |
- PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- DCHECK(!info_); |
- DCHECK(info); |
- info_ = info; |
- |
- if (!base::FileUtilProxy::GetFileInfoFromPlatformFile( |
- delegate_->GetFileThreadMessageLoopProxy(), file_, |
- callback_factory_.NewCallback(&FileIO::QueryInfoCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::Touch(PP_Time last_access_time, |
- PP_Time last_modified_time, |
- PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- if (!base::FileUtilProxy::Touch( |
- delegate_->GetFileThreadMessageLoopProxy(), |
- file_, base::Time::FromDoubleT(last_access_time), |
- base::Time::FromDoubleT(last_modified_time), |
- callback_factory_.NewCallback(&FileIO::StatusCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::Read(int64_t offset, |
- char* buffer, |
- int32_t bytes_to_read, |
- PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- if (!base::FileUtilProxy::Read( |
- delegate_->GetFileThreadMessageLoopProxy(), |
- file_, offset, buffer, bytes_to_read, |
- callback_factory_.NewCallback(&FileIO::ReadWriteCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::Write(int64_t offset, |
- const char* buffer, |
- int32_t bytes_to_write, |
- PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- if (!base::FileUtilProxy::Write( |
- delegate_->GetFileThreadMessageLoopProxy(), |
- file_, offset, buffer, bytes_to_write, |
- callback_factory_.NewCallback(&FileIO::ReadWriteCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::SetLength(int64_t length, |
- PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- if (!base::FileUtilProxy::Truncate( |
- delegate_->GetFileThreadMessageLoopProxy(), |
- file_, length, |
- callback_factory_.NewCallback(&FileIO::StatusCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t FileIO::Flush(PP_CompletionCallback callback) { |
- if (file_ == base::kInvalidPlatformFileValue) |
- return PP_ERROR_FAILED; |
- |
- DCHECK(!callback_.func); |
- callback_ = callback; |
- |
- if (!base::FileUtilProxy::Flush( |
- delegate_->GetFileThreadMessageLoopProxy(), file_, |
- callback_factory_.NewCallback(&FileIO::StatusCallback))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-void FileIO::Close() { |
- if (file_ != base::kInvalidPlatformFileValue) |
- base::FileUtilProxy::Close( |
- delegate_->GetFileThreadMessageLoopProxy(), file_, NULL); |
-} |
- |
-int32_t FileIO::GetOSFileDescriptor() { |
-#if defined(OS_POSIX) |
- return file_; |
-#elif defined(OS_WIN) |
- return reinterpret_cast<uintptr_t>(file_); |
-#else |
-#error "Platform not supported." |
-#endif |
-} |
- |
-int32_t FileIO::WillWrite(int64_t offset, |
- int32_t bytes_to_write, |
- PP_CompletionCallback callback) { |
- // TODO(dumi): implement me |
- return PP_OK; |
-} |
- |
-int32_t FileIO::WillSetLength(int64_t length, |
- PP_CompletionCallback callback) { |
- // TODO(dumi): implement me |
- return PP_OK; |
-} |
- |
-void FileIO::RunPendingCallback(int result) { |
- if (!callback_.func) |
- return; |
- |
- PP_CompletionCallback callback = {0}; |
- std::swap(callback, callback_); |
- PP_RunCompletionCallback(&callback, result); |
-} |
- |
-void FileIO::StatusCallback(base::PlatformFileError error_code) { |
- RunPendingCallback(PlatformFileErrorToPepperError(error_code)); |
-} |
- |
-void FileIO::AsyncOpenFileCallback(base::PlatformFileError error_code, |
- base::PlatformFile file) { |
- DCHECK(file_ == base::kInvalidPlatformFileValue); |
- file_ = file; |
- RunPendingCallback(PlatformFileErrorToPepperError(error_code)); |
-} |
- |
-void FileIO::QueryInfoCallback(base::PlatformFileError error_code, |
- const base::PlatformFileInfo& file_info) { |
- DCHECK(info_); |
- if (error_code == 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 = file_system_type_; |
- if (file_info.is_directory) |
- info_->type = PP_FILETYPE_DIRECTORY; |
- else |
- info_->type = PP_FILETYPE_REGULAR; |
- } |
- RunPendingCallback(PlatformFileErrorToPepperError(error_code)); |
-} |
- |
-void FileIO::ReadWriteCallback(base::PlatformFileError error_code, |
- int bytes_read_or_written) { |
- if (error_code != base::PLATFORM_FILE_OK) |
- RunPendingCallback(PlatformFileErrorToPepperError(error_code)); |
- else |
- RunPendingCallback(bytes_read_or_written); |
-} |
- |
-} // namespace pepper |