• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Create(PP_Resource file_system,const char * path)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 
IsFileRef(PP_Resource resource)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 
GetFileSystemType(PP_Resource file_ref)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 
GetName(PP_Resource file_ref)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 
GetPath(PP_Resource file_ref)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 
GetParent(PP_Resource file_ref)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 
MakeDirectory(PP_Resource directory_ref,PP_Bool make_ancestors,PP_CompletionCallback callback)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 
MakeDirectory_1_2(PP_Resource directory_ref,int32_t make_directory_flags,PP_CompletionCallback callback)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 
Touch(PP_Resource file_ref,PP_Time last_access_time,PP_Time last_modified_time,PP_CompletionCallback callback)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 
Delete(PP_Resource file_ref,PP_CompletionCallback callback)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 
Rename(PP_Resource file_ref,PP_Resource new_file_ref,PP_CompletionCallback callback)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 
Query(PP_Resource file_ref,PP_FileInfo * info,PP_CompletionCallback callback)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 
ReadDirectoryEntries(PP_Resource file_ref,PP_ArrayOutput output,PP_CompletionCallback callback)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 
GetAbsolutePath(PP_Resource file_ref)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 
GetPPB_FileRef_1_0_Thunk()217 const PPB_FileRef_1_0* GetPPB_FileRef_1_0_Thunk() {
218   return &g_ppb_file_ref_thunk_1_0;
219 }
220 
GetPPB_FileRef_1_1_Thunk()221 const PPB_FileRef_1_1* GetPPB_FileRef_1_1_Thunk() {
222   return &g_ppb_file_ref_thunk_1_1;
223 }
224 
GetPPB_FileRef_1_2_Thunk()225 const PPB_FileRef_1_2* GetPPB_FileRef_1_2_Thunk() {
226   return &g_ppb_file_ref_thunk_1_2;
227 }
228 
GetPPB_FileRefPrivate_0_1_Thunk()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