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