// Copyright (c) 2012 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 "ppapi/cpp/private/flash_file.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/cpp/file_ref.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/module_impl.h"
namespace pp {
// FileModuleLocal -------------------------------------------------------------
namespace {
template <> const char* interface_name<PPB_Flash_File_ModuleLocal_3_0>() {
return PPB_FLASH_FILE_MODULELOCAL_INTERFACE_3_0;
}
} // namespace
namespace flash {
static FileModuleLocal::DirEntry ConvertDirEntry(const PP_DirEntry_Dev& entry) {
FileModuleLocal::DirEntry rv = { entry.name, PP_ToBool(entry.is_dir) };
return rv;
}
// static
bool FileModuleLocal::IsAvailable() {
return has_interface<PPB_Flash_File_ModuleLocal_3_0>();
}
// static
PP_FileHandle FileModuleLocal::OpenFile(const InstanceHandle& instance,
const std::string& path,
int32_t mode) {
PP_FileHandle file_handle = PP_kInvalidFileHandle;
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
OpenFile(instance.pp_instance(), path.c_str(), mode, &file_handle);
}
return (result == PP_OK) ? file_handle : PP_kInvalidFileHandle;
}
// static
bool FileModuleLocal::RenameFile(const InstanceHandle& instance,
const std::string& path_from,
const std::string& path_to) {
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
RenameFile(instance.pp_instance(), path_from.c_str(), path_to.c_str());
}
return result == PP_OK;
}
// static
bool FileModuleLocal::DeleteFileOrDir(const InstanceHandle& instance,
const std::string& path,
bool recursive) {
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
DeleteFileOrDir(instance.pp_instance(), path.c_str(),
PP_FromBool(recursive));
}
return result == PP_OK;
}
// static
bool FileModuleLocal::CreateDir(const InstanceHandle& instance,
const std::string& path) {
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
CreateDir(instance.pp_instance(), path.c_str());
}
return result == PP_OK;
}
// static
bool FileModuleLocal::QueryFile(const InstanceHandle& instance,
const std::string& path,
PP_FileInfo* info) {
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
QueryFile(instance.pp_instance(), path.c_str(), info);
}
return result == PP_OK;
}
// static
bool FileModuleLocal::GetDirContents(
const InstanceHandle& instance,
const std::string& path,
std::vector<DirEntry>* dir_contents) {
dir_contents->clear();
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
PP_DirContents_Dev* contents = NULL;
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
GetDirContents(instance.pp_instance(), path.c_str(), &contents);
if (result == PP_OK && contents) {
for (int32_t i = 0; i < contents->count; i++)
dir_contents->push_back(ConvertDirEntry(contents->entries[i]));
}
if (contents) {
get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
FreeDirContents(instance.pp_instance(), contents);
}
}
return result == PP_OK;
}
// static
PP_FileHandle FileModuleLocal::CreateTemporaryFile(
const InstanceHandle& instance) {
PP_FileHandle file_handle = PP_kInvalidFileHandle;
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_ModuleLocal_3_0>()) {
result = get_interface<PPB_Flash_File_ModuleLocal_3_0>()->
CreateTemporaryFile(instance.pp_instance(), &file_handle);
}
return (result == PP_OK) ? file_handle : PP_kInvalidFileHandle;
}
} // namespace flash
// FileFileRef -----------------------------------------------------------------
namespace {
template <> const char* interface_name<PPB_Flash_File_FileRef>() {
return PPB_FLASH_FILE_FILEREF_INTERFACE;
}
} // namespace
namespace flash {
// static
bool FileFileRef::IsAvailable() {
return has_interface<PPB_Flash_File_FileRef>();
}
// static
PP_FileHandle FileFileRef::OpenFile(const pp::FileRef& resource,
int32_t mode) {
PP_FileHandle file_handle = PP_kInvalidFileHandle;
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_FileRef>()) {
result = get_interface<PPB_Flash_File_FileRef>()->
OpenFile(resource.pp_resource(), mode, &file_handle);
}
return (result == PP_OK) ? file_handle : PP_kInvalidFileHandle;
}
// static
bool FileFileRef::QueryFile(const pp::FileRef& resource,
PP_FileInfo* info) {
int32_t result = PP_ERROR_FAILED;
if (has_interface<PPB_Flash_File_FileRef>()) {
result = get_interface<PPB_Flash_File_FileRef>()->
QueryFile(resource.pp_resource(), info);
}
return result == PP_OK;
}
} // namespace flash
} // namespace pp