// 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/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/resource_creation_api.h" namespace ppapi { namespace thunk { namespace { typedef EnterResource EnterFileRef; PP_Resource Create(PP_Resource file_system, const char* path) { ppapi::ProxyAutoLock lock; Resource* object = PpapiGlobals::Get()->GetResourceTracker()->GetResource(file_system); if (!object) return 0; EnterResourceCreationNoLock enter(object->pp_instance()); if (enter.failed()) return 0; return enter.functions()->CreateFileRef(file_system, path); } PP_Bool IsFileRef(PP_Resource resource) { EnterFileRef enter(resource, false); return PP_FromBool(enter.succeeded()); } PP_FileSystemType GetFileSystemType(PP_Resource file_ref) { EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_FILESYSTEMTYPE_INVALID; return enter.object()->GetFileSystemType(); } PP_Var GetName(PP_Resource file_ref) { EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetName(); } PP_Var GetPath(PP_Resource file_ref) { EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetPath(); } PP_Resource GetParent(PP_Resource file_ref) { 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) { EnterFileRef enter(directory_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->MakeDirectory(make_ancestors, enter.callback())); } int32_t Touch(PP_Resource file_ref, PP_Time last_access_time, PP_Time last_modified_time, PP_CompletionCallback callback) { 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) { 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) { EnterFileRef enter(file_ref, callback, true); if (enter.failed()) return enter.retval(); return enter.SetResult(enter.object()->Rename(new_file_ref, enter.callback())); } PP_Var GetAbsolutePath(PP_Resource file_ref) { EnterFileRef enter(file_ref, true); if (enter.failed()) return PP_MakeUndefined(); return enter.object()->GetAbsolutePath(); } const PPB_FileRef g_ppb_file_ref_thunk = { &Create, &IsFileRef, &GetFileSystemType, &GetName, &GetPath, &GetParent, &MakeDirectory, &Touch, &Delete, &Rename }; 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; } const PPB_FileRefPrivate_0_1* GetPPB_FileRefPrivate_0_1_Thunk() { return &g_ppb_file_ref_private_thunk; } } // namespace thunk } // namespace ppapi