1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ppapi/c/pp_file_info.h" 6 #include "ppapi/c/ppb_file_ref.h" 7 #include "ppapi/c/pp_completion_callback.h" 8 #include "ppapi/c/pp_errors.h" 9 #include "ppapi/c/private/ppb_file_ref_private.h" 10 #include "ppapi/shared_impl/file_ref_create_info.h" 11 #include "ppapi/shared_impl/proxy_lock.h" 12 #include "ppapi/shared_impl/tracked_callback.h" 13 #include "ppapi/thunk/enter.h" 14 #include "ppapi/thunk/thunk.h" 15 #include "ppapi/thunk/ppb_file_ref_api.h" 16 #include "ppapi/thunk/ppb_file_system_api.h" 17 #include "ppapi/thunk/resource_creation_api.h" 18 19 namespace ppapi { 20 namespace thunk { 21 22 namespace { 23 24 typedef EnterResource<PPB_FileRef_API> EnterFileRef; 25 26 PP_Resource Create(PP_Resource file_system, const char* path) { 27 VLOG(4) << "PPB_FileRef::Create()"; 28 ppapi::ProxyAutoLock lock; 29 EnterResourceNoLock<PPB_FileSystem_API> enter_file_system(file_system, true); 30 if (enter_file_system.failed()) 31 return 0; 32 PP_Instance instance = enter_file_system.resource()->pp_instance(); 33 EnterResourceCreationNoLock enter(instance); 34 if (enter.failed()) 35 return 0; 36 FileRefCreateInfo info; 37 info.file_system_type = enter_file_system.object()->GetType(); 38 info.internal_path = std::string(path); 39 info.browser_pending_host_resource_id = 0; 40 info.renderer_pending_host_resource_id = 0; 41 info.file_system_plugin_resource = file_system; 42 return enter.functions()->CreateFileRef(instance, info); 43 } 44 45 PP_Bool IsFileRef(PP_Resource resource) { 46 VLOG(4) << "PPB_FileRef::IsFileRef()"; 47 EnterFileRef enter(resource, false); 48 return PP_FromBool(enter.succeeded()); 49 } 50 51 PP_FileSystemType GetFileSystemType(PP_Resource file_ref) { 52 VLOG(4) << "PPB_FileRef::GetFileSystemType()"; 53 EnterFileRef enter(file_ref, true); 54 if (enter.failed()) 55 return PP_FILESYSTEMTYPE_INVALID; 56 return enter.object()->GetFileSystemType(); 57 } 58 59 PP_Var GetName(PP_Resource file_ref) { 60 VLOG(4) << "PPB_FileRef::GetName()"; 61 EnterFileRef enter(file_ref, true); 62 if (enter.failed()) 63 return PP_MakeUndefined(); 64 return enter.object()->GetName(); 65 } 66 67 PP_Var GetPath(PP_Resource file_ref) { 68 VLOG(4) << "PPB_FileRef::GetPath()"; 69 EnterFileRef enter(file_ref, true); 70 if (enter.failed()) 71 return PP_MakeUndefined(); 72 return enter.object()->GetPath(); 73 } 74 75 PP_Resource GetParent(PP_Resource file_ref) { 76 VLOG(4) << "PPB_FileRef::GetParent()"; 77 EnterFileRef enter(file_ref, true); 78 if (enter.failed()) 79 return 0; 80 return enter.object()->GetParent(); 81 } 82 83 int32_t MakeDirectory(PP_Resource directory_ref, 84 PP_Bool make_ancestors, 85 PP_CompletionCallback callback) { 86 VLOG(4) << "PPB_FileRef::MakeDirectory()"; 87 EnterFileRef enter(directory_ref, callback, true); 88 if (enter.failed()) 89 return enter.retval(); 90 int32_t flag = make_ancestors ? PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS 91 : PP_MAKEDIRECTORYFLAG_NONE; 92 return enter.SetResult(enter.object()->MakeDirectory( 93 flag, enter.callback())); 94 } 95 96 int32_t MakeDirectory_1_2(PP_Resource directory_ref, 97 int32_t make_directory_flags, 98 PP_CompletionCallback callback) { 99 VLOG(4) << "PPB_FileRef::MakeDirectory()"; 100 EnterFileRef enter(directory_ref, callback, true); 101 if (enter.failed()) 102 return enter.retval(); 103 return enter.SetResult(enter.object()->MakeDirectory( 104 make_directory_flags, enter.callback())); 105 } 106 107 int32_t Touch(PP_Resource file_ref, 108 PP_Time last_access_time, 109 PP_Time last_modified_time, 110 PP_CompletionCallback callback) { 111 VLOG(4) << "PPB_FileRef::Touch()"; 112 EnterFileRef enter(file_ref, callback, true); 113 if (enter.failed()) 114 return enter.retval(); 115 return enter.SetResult(enter.object()->Touch( 116 last_access_time, last_modified_time, enter.callback())); 117 } 118 119 int32_t Delete(PP_Resource file_ref, 120 PP_CompletionCallback callback) { 121 VLOG(4) << "PPB_FileRef::Delete()"; 122 EnterFileRef enter(file_ref, callback, true); 123 if (enter.failed()) 124 return enter.retval(); 125 return enter.SetResult(enter.object()->Delete(enter.callback())); 126 } 127 128 int32_t Rename(PP_Resource file_ref, 129 PP_Resource new_file_ref, 130 PP_CompletionCallback callback) { 131 VLOG(4) << "PPB_FileRef::Rename()"; 132 EnterFileRef enter(file_ref, callback, true); 133 if (enter.failed()) 134 return enter.retval(); 135 return enter.SetResult(enter.object()->Rename(new_file_ref, 136 enter.callback())); 137 } 138 139 int32_t Query(PP_Resource file_ref, 140 PP_FileInfo* info, 141 PP_CompletionCallback callback) { 142 VLOG(4) << "PPB_FileRef::Query()"; 143 EnterFileRef enter(file_ref, callback, true); 144 if (enter.failed()) 145 return enter.retval(); 146 return enter.SetResult(enter.object()->Query(info, 147 enter.callback())); 148 } 149 150 int32_t ReadDirectoryEntries(PP_Resource file_ref, 151 PP_ArrayOutput output, 152 PP_CompletionCallback callback) { 153 EnterFileRef enter(file_ref, callback, true); 154 if (enter.failed()) 155 return enter.retval(); 156 return enter.SetResult(enter.object()->ReadDirectoryEntries( 157 output, enter.callback())); 158 } 159 160 PP_Var GetAbsolutePath(PP_Resource file_ref) { 161 VLOG(4) << "PPB_FileRef::GetAbsolutePath"; 162 EnterFileRef enter(file_ref, true); 163 if (enter.failed()) 164 return PP_MakeUndefined(); 165 return enter.object()->GetAbsolutePath(); 166 } 167 168 const PPB_FileRef_1_0 g_ppb_file_ref_thunk_1_0 = { 169 &Create, 170 &IsFileRef, 171 &GetFileSystemType, 172 &GetName, 173 &GetPath, 174 &GetParent, 175 &MakeDirectory, 176 &Touch, 177 &Delete, 178 &Rename 179 }; 180 181 const PPB_FileRef_1_1 g_ppb_file_ref_thunk_1_1 = { 182 &Create, 183 &IsFileRef, 184 &GetFileSystemType, 185 &GetName, 186 &GetPath, 187 &GetParent, 188 &MakeDirectory, 189 &Touch, 190 &Delete, 191 &Rename, 192 &Query, 193 &ReadDirectoryEntries 194 }; 195 196 const PPB_FileRef_1_2 g_ppb_file_ref_thunk_1_2 = { 197 &Create, 198 &IsFileRef, 199 &GetFileSystemType, 200 &GetName, 201 &GetPath, 202 &GetParent, 203 &MakeDirectory_1_2, 204 &Touch, 205 &Delete, 206 &Rename, 207 &Query, 208 &ReadDirectoryEntries 209 }; 210 211 const PPB_FileRefPrivate g_ppb_file_ref_private_thunk = { 212 &GetAbsolutePath 213 }; 214 215 } // namespace 216 217 const PPB_FileRef_1_0* GetPPB_FileRef_1_0_Thunk() { 218 return &g_ppb_file_ref_thunk_1_0; 219 } 220 221 const PPB_FileRef_1_1* GetPPB_FileRef_1_1_Thunk() { 222 return &g_ppb_file_ref_thunk_1_1; 223 } 224 225 const PPB_FileRef_1_2* GetPPB_FileRef_1_2_Thunk() { 226 return &g_ppb_file_ref_thunk_1_2; 227 } 228 229 const PPB_FileRefPrivate_0_1* GetPPB_FileRefPrivate_0_1_Thunk() { 230 return &g_ppb_file_ref_private_thunk; 231 } 232 233 } // namespace thunk 234 } // namespace ppapi 235