Pepper_47_C++_interfaces
file_ref.cc
Go to the documentation of this file.
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/cpp/file_ref.h"
6 
7 #include "ppapi/c/pp_bool.h"
8 #include "ppapi/c/pp_errors.h"
11 #include "ppapi/cpp/file_system.h"
12 #include "ppapi/cpp/module_impl.h"
13 
14 namespace pp {
15 
16 namespace {
17 
18 template <> const char* interface_name<PPB_FileRef_1_0>() {
19  return PPB_FILEREF_INTERFACE_1_0;
20 }
21 
22 template <> const char* interface_name<PPB_FileRef_1_1>() {
23  return PPB_FILEREF_INTERFACE_1_1;
24 }
25 
26 template <> const char* interface_name<PPB_FileRef_1_2>() {
27  return PPB_FILEREF_INTERFACE_1_2;
28 }
29 
30 } // namespace
31 
32 FileRef::FileRef(PP_Resource resource) : Resource(resource) {
33 }
34 
36 }
37 
38 FileRef::FileRef(const FileSystem& file_system,
39  const char* path) {
40  if (has_interface<PPB_FileRef_1_2>()) {
41  PassRefFromConstructor(get_interface<PPB_FileRef_1_2>()->Create(
42  file_system.pp_resource(), path));
43  } else if (has_interface<PPB_FileRef_1_1>()) {
44  PassRefFromConstructor(get_interface<PPB_FileRef_1_1>()->Create(
45  file_system.pp_resource(), path));
46  } else if (has_interface<PPB_FileRef_1_0>()) {
47  PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create(
48  file_system.pp_resource(), path));
49  }
50 }
51 
53  : Resource(other) {
54 }
55 
56 PP_FileSystemType FileRef::GetFileSystemType() const {
57  if (has_interface<PPB_FileRef_1_2>())
58  return get_interface<PPB_FileRef_1_2>()->GetFileSystemType(pp_resource());
59  if (has_interface<PPB_FileRef_1_1>())
60  return get_interface<PPB_FileRef_1_1>()->GetFileSystemType(pp_resource());
61  if (has_interface<PPB_FileRef_1_0>())
62  return get_interface<PPB_FileRef_1_0>()->GetFileSystemType(pp_resource());
63  return PP_FILESYSTEMTYPE_EXTERNAL;
64 }
65 
67  if (has_interface<PPB_FileRef_1_2>()) {
68  return Var(PASS_REF,
69  get_interface<PPB_FileRef_1_2>()->GetName(pp_resource()));
70  }
71  if (has_interface<PPB_FileRef_1_1>()) {
72  return Var(PASS_REF,
73  get_interface<PPB_FileRef_1_1>()->GetName(pp_resource()));
74  }
75  if (has_interface<PPB_FileRef_1_0>()) {
76  return Var(PASS_REF,
77  get_interface<PPB_FileRef_1_0>()->GetName(pp_resource()));
78  }
79  return Var();
80 }
81 
83  if (has_interface<PPB_FileRef_1_2>()) {
84  return Var(PASS_REF,
85  get_interface<PPB_FileRef_1_2>()->GetPath(pp_resource()));
86  }
87  if (has_interface<PPB_FileRef_1_1>()) {
88  return Var(PASS_REF,
89  get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource()));
90  }
91  if (has_interface<PPB_FileRef_1_0>()) {
92  return Var(PASS_REF,
93  get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource()));
94  }
95  return Var();
96 }
97 
99  if (has_interface<PPB_FileRef_1_2>()) {
100  return FileRef(PASS_REF,
101  get_interface<PPB_FileRef_1_2>()->GetParent(pp_resource()));
102  }
103  if (has_interface<PPB_FileRef_1_1>()) {
104  return FileRef(PASS_REF,
105  get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource()));
106  }
107  if (has_interface<PPB_FileRef_1_0>()) {
108  return FileRef(PASS_REF,
109  get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource()));
110  }
111  return FileRef();
112 }
113 
115  const CompletionCallback& cc) {
116  if (has_interface<PPB_FileRef_1_2>()) {
117  return get_interface<PPB_FileRef_1_2>()->MakeDirectory(
118  pp_resource(),
119  make_directory_flags,
121  }
122  if (has_interface<PPB_FileRef_1_1>()) {
123  if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS)
124  return cc.MayForce(PP_ERROR_NOTSUPPORTED);
125  return get_interface<PPB_FileRef_1_1>()->MakeDirectory(
126  pp_resource(),
127  PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS),
129  }
130  if (has_interface<PPB_FileRef_1_0>()) {
131  if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS)
132  return cc.MayForce(PP_ERROR_NOTSUPPORTED);
133  return get_interface<PPB_FileRef_1_0>()->MakeDirectory(
134  pp_resource(),
135  PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS),
137  }
138  return cc.MayForce(PP_ERROR_NOINTERFACE);
139 }
140 
141 int32_t FileRef::Touch(PP_Time last_access_time,
142  PP_Time last_modified_time,
143  const CompletionCallback& cc) {
144  if (has_interface<PPB_FileRef_1_2>()) {
145  return get_interface<PPB_FileRef_1_2>()->Touch(
146  pp_resource(), last_access_time, last_modified_time,
148  }
149  if (has_interface<PPB_FileRef_1_1>()) {
150  return get_interface<PPB_FileRef_1_1>()->Touch(
151  pp_resource(), last_access_time, last_modified_time,
153  }
154  if (has_interface<PPB_FileRef_1_0>()) {
155  return get_interface<PPB_FileRef_1_0>()->Touch(
156  pp_resource(), last_access_time, last_modified_time,
158  }
159  return cc.MayForce(PP_ERROR_NOINTERFACE);
160 }
161 
163  if (has_interface<PPB_FileRef_1_2>()) {
164  return get_interface<PPB_FileRef_1_2>()->Delete(
166  }
167  if (has_interface<PPB_FileRef_1_1>()) {
168  return get_interface<PPB_FileRef_1_1>()->Delete(
170  }
171  if (has_interface<PPB_FileRef_1_0>()) {
172  return get_interface<PPB_FileRef_1_0>()->Delete(
174  }
175  return cc.MayForce(PP_ERROR_NOINTERFACE);
176 }
177 
178 int32_t FileRef::Rename(const FileRef& new_file_ref,
179  const CompletionCallback& cc) {
180  if (has_interface<PPB_FileRef_1_2>()) {
181  return get_interface<PPB_FileRef_1_2>()->Rename(
182  pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
183  }
184  if (has_interface<PPB_FileRef_1_1>()) {
185  return get_interface<PPB_FileRef_1_1>()->Rename(
186  pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
187  }
188  if (has_interface<PPB_FileRef_1_0>()) {
189  return get_interface<PPB_FileRef_1_0>()->Rename(
190  pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
191  }
192  return cc.MayForce(PP_ERROR_NOINTERFACE);
193 }
194 
196  if (has_interface<PPB_FileRef_1_2>()) {
197  return get_interface<PPB_FileRef_1_2>()->Query(
199  }
200  if (has_interface<PPB_FileRef_1_1>()) {
201  return get_interface<PPB_FileRef_1_1>()->Query(
203  }
204  return cc.MayForce(PP_ERROR_NOINTERFACE);
205 }
206 
208  const CompletionCallbackWithOutput<std::vector<DirectoryEntry> >&
209  callback) {
210  if (has_interface<PPB_FileRef_1_2>()) {
211  return get_interface<PPB_FileRef_1_2>()->ReadDirectoryEntries(
212  pp_resource(), callback.output(), callback.pp_completion_callback());
213  }
214  if (has_interface<PPB_FileRef_1_1>()) {
215  return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries(
216  pp_resource(), callback.output(), callback.pp_completion_callback());
217  }
218  return callback.MayForce(PP_ERROR_NOINTERFACE);
219 }
220 
221 } // namespace pp
PP_FileSystemType GetFileSystemType() const
Definition: file_ref.cc:56
int32_t Delete(const CompletionCallback &cc)
Definition: file_ref.cc:162
FileRef GetParent() const
Definition: file_ref.cc:98
void PassRefFromConstructor(PP_Resource resource)
Definition: resource.cc:50
int32_t Touch(PP_Time last_access_time, PP_Time last_modified_time, const CompletionCallback &cc)
Definition: file_ref.cc:141
int32_t MayForce(int32_t result) const
const PP_CompletionCallback & pp_completion_callback() const
int32_t MakeDirectory(int32_t make_directory_flags, const CompletionCallback &cc)
Definition: file_ref.cc:114
int32_t ReadDirectoryEntries(const CompletionCallbackWithOutput< std::vector< DirectoryEntry > > &callback)
Definition: file_ref.cc:207
PassRef
Definition: pass_ref.h:17
Var GetPath() const
Definition: file_ref.cc:82
Var GetName() const
Definition: file_ref.cc:66
int32_t Rename(const FileRef &new_file_ref, const CompletionCallback &cc)
Definition: file_ref.cc:178
friend class Var
Definition: resource.h:90
PP_Resource pp_resource() const
Definition: resource.h:47
int32_t Query(const CompletionCallbackWithOutput< PP_FileInfo > &callback)
Definition: file_ref.cc:195
A generic type used for passing data types between the module and the page.
Definition: var.h:21
A reference counted module resource.
Definition: resource.h:20