// 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/c/pp_file_info.h" #include "ppapi/c/ppb_file_ref.h" #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/private/ppb_file_ref_private.h" #include "ppapi/shared_impl/file_ref_create_info.h" #include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/tracked_callback.h" #include "ppapi/thunk/enter.h" #include "ppapi/thunk/thunk.h" #include "ppapi/thunk/ppb_file_ref_api.h" #include "ppapi/thunk/ppb_file_system_api.h" #include "ppapi/thunk/resource_creation_api.h" namespace ppapi { namespace thunk { namespace { typedef EnterResource<PPB_FileRef_API> EnterFileRef; PP_Resource Create(PP_Resource file_system, const char* path) { VLOG(4) << "PPB_FileRef::Create()"; ppapi::ProxyAutoLock lock; EnterResourceNoLock<PPB_FileSystem_API> enter_file_system(file_system, true); if (enter_file_system.failed()) return 0; PP_Instance instance = enter_file_system.resource()->pp_instance(); EnterResourceCreationNoLock enter(instance); if (enter.failed()) return 0; FileRefCreateInfo info; info.file_system_type = enter_file_system.object()->GetType(); info.internal_path = std::string(path); info.browser_pending_host_resource_id = 0; info.renderer_pending_host_resource_id = 0; info.file_system_plugin_resource = file_system; return enter.functions()->CreateFileRef(instance, info); } PP_Bool IsFileRef(PP_Resource resource) { VLOG(4) << "PPB_FileRef::IsFileRef()"; EnterFileRef enter(resource, false); return PP_FromBool(enter.succeeded()); } PP_FileSystemType GetFileSystemType(PP_Resource file_ref) { VLOG(4) << "PPB_FileRef::GetFileSystemType()"; EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_FILESYSTEMTYPE_INVALID; return enter.object()->GetFileSystemType(); } PP_Var GetName(PP_Resource file_ref) { VLOG(4) << "PPB_FileRef::GetName()"; EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetName(); } PP_Var GetPath(PP_Resource file_ref) { VLOG(4) << "PPB_FileRef::GetPath()"; EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetPath(); } PP_Resource GetParent(PP_Resource file_ref) { VLOG(4) << "PPB_FileRef::GetParent()"; EnterFileRef enter(file_ref, true); if (enter.failed()) return 0; return enter.object()->GetParent(); } int32_t MakeDirectory(PP_Resource directory_ref, PP_Bool make_ancestors, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::MakeDirectory()"; EnterFileRef enter(directory_ref, callback, true); if (enter.failed()) return enter.retval(); int32_t flag = make_ancestors ? PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS : PP_MAKEDIRECTORYFLAG_NONE; return enter.SetResult(enter.object()->MakeDirectory( flag, enter.callback())); } int32_t MakeDirectory_1_2(PP_Resource directory_ref, int32_t make_directory_flags, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::MakeDirectory()"; EnterFileRef enter(directory_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->MakeDirectory( make_directory_flags, enter.callback())); } int32_t Touch(PP_Resource file_ref, PP_Time last_access_time, PP_Time last_modified_time, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::Touch()"; EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->Touch( last_access_time, last_modified_time, enter.callback())); } int32_t Delete(PP_Resource file_ref, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::Delete()"; EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->Delete(enter.callback())); } int32_t Rename(PP_Resource file_ref, PP_Resource new_file_ref, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::Rename()"; EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->Rename(new_file_ref, enter.callback())); } int32_t Query(PP_Resource file_ref, PP_FileInfo* info, PP_CompletionCallback callback) { VLOG(4) << "PPB_FileRef::Query()"; EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->Query(info, enter.callback())); } int32_t ReadDirectoryEntries(PP_Resource file_ref, PP_ArrayOutput output, PP_CompletionCallback callback) { EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->ReadDirectoryEntries( output, enter.callback())); } PP_Var GetAbsolutePath(PP_Resource file_ref) { VLOG(4) << "PPB_FileRef::GetAbsolutePath"; EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetAbsolutePath(); } const PPB_FileRef_1_0 g_ppb_file_ref_thunk_1_0 = { &Create, &IsFileRef, &GetFileSystemType, &GetName, &GetPath, &GetParent, &MakeDirectory, &Touch, &Delete, &Rename }; const PPB_FileRef_1_1 g_ppb_file_ref_thunk_1_1 = { &Create, &IsFileRef, &GetFileSystemType, &GetName, &GetPath, &GetParent, &MakeDirectory, &Touch, &Delete, &Rename, &Query, &ReadDirectoryEntries }; const PPB_FileRef_1_2 g_ppb_file_ref_thunk_1_2 = { &Create, &IsFileRef, &GetFileSystemType, &GetName, &GetPath, &GetParent, &MakeDirectory_1_2, &Touch, &Delete, &Rename, &Query, &ReadDirectoryEntries }; const PPB_FileRefPrivate g_ppb_file_ref_private_thunk = { &GetAbsolutePath }; } // namespace const PPB_FileRef_1_0* GetPPB_FileRef_1_0_Thunk() { return &g_ppb_file_ref_thunk_1_0; } const PPB_FileRef_1_1* GetPPB_FileRef_1_1_Thunk() { return &g_ppb_file_ref_thunk_1_1; } const PPB_FileRef_1_2* GetPPB_FileRef_1_2_Thunk() { return &g_ppb_file_ref_thunk_1_2; } const PPB_FileRefPrivate_0_1* GetPPB_FileRefPrivate_0_1_Thunk() { return &g_ppb_file_ref_private_thunk; } } // namespace thunk } // namespace ppapi