普通文本  |  179行  |  5.6 KB

// 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