OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/cpp/file_ref.h" | 5 #include "ppapi/cpp/file_ref.h" |
6 | 6 |
7 #include "ppapi/c/pp_errors.h" | 7 #include "ppapi/c/pp_errors.h" |
8 #include "ppapi/cpp/completion_callback.h" | 8 #include "ppapi/cpp/completion_callback.h" |
9 #include "ppapi/cpp/directory_entry.h" | 9 #include "ppapi/cpp/directory_entry.h" |
10 #include "ppapi/cpp/file_system.h" | 10 #include "ppapi/cpp/file_system.h" |
11 #include "ppapi/cpp/module_impl.h" | 11 #include "ppapi/cpp/module_impl.h" |
12 | 12 |
13 namespace pp { | 13 namespace pp { |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 template <> const char* interface_name<PPB_FileRef_1_0>() { | 17 template <> const char* interface_name<PPB_FileRef_1_0>() { |
18 return PPB_FILEREF_INTERFACE_1_0; | 18 return PPB_FILEREF_INTERFACE_1_0; |
19 } | 19 } |
20 | 20 |
21 template <> const char* interface_name<PPB_FileRef_1_1>() { | 21 template <> const char* interface_name<PPB_FileRef_1_1>() { |
22 return PPB_FILEREF_INTERFACE_1_1; | 22 return PPB_FILEREF_INTERFACE_1_1; |
23 } | 23 } |
24 | 24 |
| 25 template <> const char* interface_name<PPB_FileRef_1_2>() { |
| 26 return PPB_FILEREF_INTERFACE_1_2; |
| 27 } |
| 28 |
25 } // namespace | 29 } // namespace |
26 | 30 |
27 FileRef::FileRef(PP_Resource resource) : Resource(resource) { | 31 FileRef::FileRef(PP_Resource resource) : Resource(resource) { |
28 } | 32 } |
29 | 33 |
30 FileRef::FileRef(PassRef, PP_Resource resource) : Resource(PASS_REF, resource) { | 34 FileRef::FileRef(PassRef, PP_Resource resource) : Resource(PASS_REF, resource) { |
31 } | 35 } |
32 | 36 |
33 FileRef::FileRef(const FileSystem& file_system, | 37 FileRef::FileRef(const FileSystem& file_system, |
34 const char* path) { | 38 const char* path) { |
35 if (has_interface<PPB_FileRef_1_1>()) { | 39 if (has_interface<PPB_FileRef_1_1>()) { |
36 PassRefFromConstructor(get_interface<PPB_FileRef_1_1>()->Create( | 40 PassRefFromConstructor(get_interface<PPB_FileRef_1_1>()->Create( |
37 file_system.pp_resource(), path)); | 41 file_system.pp_resource(), path)); |
38 } else if (has_interface<PPB_FileRef_1_0>()) { | 42 } else if (has_interface<PPB_FileRef_1_0>()) { |
39 PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create( | 43 PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create( |
40 file_system.pp_resource(), path)); | 44 file_system.pp_resource(), path)); |
41 } | 45 } |
42 } | 46 } |
43 | 47 |
44 FileRef::FileRef(const FileRef& other) | 48 FileRef::FileRef(const FileRef& other) |
45 : Resource(other) { | 49 : Resource(other) { |
46 } | 50 } |
47 | 51 |
48 PP_FileSystemType FileRef::GetFileSystemType() const { | 52 PP_FileSystemType FileRef::GetFileSystemType() const { |
| 53 if (has_interface<PPB_FileRef_1_2>()) |
| 54 return get_interface<PPB_FileRef_1_2>()->GetFileSystemType(pp_resource()); |
49 if (has_interface<PPB_FileRef_1_1>()) | 55 if (has_interface<PPB_FileRef_1_1>()) |
50 return get_interface<PPB_FileRef_1_1>()->GetFileSystemType(pp_resource()); | 56 return get_interface<PPB_FileRef_1_1>()->GetFileSystemType(pp_resource()); |
51 if (has_interface<PPB_FileRef_1_0>()) | 57 if (has_interface<PPB_FileRef_1_0>()) |
52 return get_interface<PPB_FileRef_1_0>()->GetFileSystemType(pp_resource()); | 58 return get_interface<PPB_FileRef_1_0>()->GetFileSystemType(pp_resource()); |
53 return PP_FILESYSTEMTYPE_EXTERNAL; | 59 return PP_FILESYSTEMTYPE_EXTERNAL; |
54 } | 60 } |
55 | 61 |
56 Var FileRef::GetName() const { | 62 Var FileRef::GetName() const { |
| 63 if (has_interface<PPB_FileRef_1_2>()) { |
| 64 return Var(PASS_REF, |
| 65 get_interface<PPB_FileRef_1_2>()->GetName(pp_resource())); |
| 66 } |
57 if (has_interface<PPB_FileRef_1_1>()) { | 67 if (has_interface<PPB_FileRef_1_1>()) { |
58 return Var(PASS_REF, | 68 return Var(PASS_REF, |
59 get_interface<PPB_FileRef_1_1>()->GetName(pp_resource())); | 69 get_interface<PPB_FileRef_1_1>()->GetName(pp_resource())); |
60 } | 70 } |
61 if (has_interface<PPB_FileRef_1_0>()) { | 71 if (has_interface<PPB_FileRef_1_0>()) { |
62 return Var(PASS_REF, | 72 return Var(PASS_REF, |
63 get_interface<PPB_FileRef_1_0>()->GetName(pp_resource())); | 73 get_interface<PPB_FileRef_1_0>()->GetName(pp_resource())); |
64 } | 74 } |
65 return Var(); | 75 return Var(); |
66 } | 76 } |
67 | 77 |
68 Var FileRef::GetPath() const { | 78 Var FileRef::GetPath() const { |
| 79 if (has_interface<PPB_FileRef_1_2>()) { |
| 80 return Var(PASS_REF, |
| 81 get_interface<PPB_FileRef_1_2>()->GetPath(pp_resource())); |
| 82 } |
69 if (has_interface<PPB_FileRef_1_1>()) { | 83 if (has_interface<PPB_FileRef_1_1>()) { |
70 return Var(PASS_REF, | 84 return Var(PASS_REF, |
71 get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource())); | 85 get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource())); |
72 } | 86 } |
73 if (has_interface<PPB_FileRef_1_0>()) { | 87 if (has_interface<PPB_FileRef_1_0>()) { |
74 return Var(PASS_REF, | 88 return Var(PASS_REF, |
75 get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource())); | 89 get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource())); |
76 } | 90 } |
77 return Var(); | 91 return Var(); |
78 } | 92 } |
79 | 93 |
80 FileRef FileRef::GetParent() const { | 94 FileRef FileRef::GetParent() const { |
| 95 if (has_interface<PPB_FileRef_1_2>()) { |
| 96 return FileRef(PASS_REF, |
| 97 get_interface<PPB_FileRef_1_2>()->GetParent(pp_resource())); |
| 98 } |
81 if (has_interface<PPB_FileRef_1_1>()) { | 99 if (has_interface<PPB_FileRef_1_1>()) { |
82 return FileRef(PASS_REF, | 100 return FileRef(PASS_REF, |
83 get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource())); | 101 get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource())); |
84 } | 102 } |
85 if (has_interface<PPB_FileRef_1_0>()) { | 103 if (has_interface<PPB_FileRef_1_0>()) { |
86 return FileRef(PASS_REF, | 104 return FileRef(PASS_REF, |
87 get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource())); | 105 get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource())); |
88 } | 106 } |
89 return FileRef(); | 107 return FileRef(); |
90 } | 108 } |
91 | 109 |
92 int32_t FileRef::MakeDirectory(const CompletionCallback& cc) { | 110 int32_t FileRef::MakeDirectory(const CompletionCallback& cc) { |
| 111 if (has_interface<PPB_FileRef_1_2>()) { |
| 112 return get_interface<PPB_FileRef_1_2>()->MakeDirectory( |
| 113 pp_resource(), |
| 114 PP_FALSE, // make_ancestors |
| 115 cc.pp_completion_callback()); |
| 116 } |
93 if (has_interface<PPB_FileRef_1_1>()) { | 117 if (has_interface<PPB_FileRef_1_1>()) { |
94 return get_interface<PPB_FileRef_1_1>()->MakeDirectory( | 118 return get_interface<PPB_FileRef_1_1>()->MakeDirectory( |
95 pp_resource(), | 119 pp_resource(), |
96 PP_FALSE, // make_ancestors | 120 PP_FALSE, // make_ancestors |
97 cc.pp_completion_callback()); | 121 cc.pp_completion_callback()); |
98 } | 122 } |
99 if (has_interface<PPB_FileRef_1_0>()) { | 123 if (has_interface<PPB_FileRef_1_0>()) { |
100 return get_interface<PPB_FileRef_1_0>()->MakeDirectory( | 124 return get_interface<PPB_FileRef_1_0>()->MakeDirectory( |
101 pp_resource(), | 125 pp_resource(), |
102 PP_FALSE, // make_ancestors | 126 PP_FALSE, // make_ancestors |
103 cc.pp_completion_callback()); | 127 cc.pp_completion_callback()); |
104 } | 128 } |
105 return cc.MayForce(PP_ERROR_NOINTERFACE); | 129 return cc.MayForce(PP_ERROR_NOINTERFACE); |
106 } | 130 } |
107 | 131 |
108 int32_t FileRef::MakeDirectoryIncludingAncestors( | 132 int32_t FileRef::MakeDirectoryIncludingAncestors( |
109 const CompletionCallback& cc) { | 133 const CompletionCallback& cc) { |
| 134 if (has_interface<PPB_FileRef_1_2>()) { |
| 135 return get_interface<PPB_FileRef_1_2>()->MakeDirectory( |
| 136 pp_resource(), |
| 137 PP_TRUE, // make_ancestors |
| 138 cc.pp_completion_callback()); |
| 139 } |
110 if (has_interface<PPB_FileRef_1_1>()) { | 140 if (has_interface<PPB_FileRef_1_1>()) { |
111 return get_interface<PPB_FileRef_1_1>()->MakeDirectory( | 141 return get_interface<PPB_FileRef_1_1>()->MakeDirectory( |
112 pp_resource(), | 142 pp_resource(), |
113 PP_TRUE, // make_ancestors | 143 PP_TRUE, // make_ancestors |
114 cc.pp_completion_callback()); | 144 cc.pp_completion_callback()); |
115 } | 145 } |
116 if (has_interface<PPB_FileRef_1_0>()) { | 146 if (has_interface<PPB_FileRef_1_0>()) { |
117 return get_interface<PPB_FileRef_1_0>()->MakeDirectory( | 147 return get_interface<PPB_FileRef_1_0>()->MakeDirectory( |
118 pp_resource(), | 148 pp_resource(), |
119 PP_TRUE, // make_ancestors | 149 PP_TRUE, // make_ancestors |
120 cc.pp_completion_callback()); | 150 cc.pp_completion_callback()); |
121 } | 151 } |
122 return cc.MayForce(PP_ERROR_NOINTERFACE); | 152 return cc.MayForce(PP_ERROR_NOINTERFACE); |
123 } | 153 } |
124 | 154 |
| 155 int32_t FileRef::MakeDirectoryExclusive( |
| 156 PP_Bool make_ancestors, |
| 157 const CompletionCallback& cc) { |
| 158 if (has_interface<PPB_FileRef_1_2>()) { |
| 159 return get_interface<PPB_FileRef_1_2>()->MakeDirectoryExclusive( |
| 160 pp_resource(), |
| 161 make_ancestors, |
| 162 cc.pp_completion_callback()); |
| 163 } |
| 164 return cc.MayForce(PP_ERROR_NOINTERFACE); |
| 165 } |
| 166 |
125 int32_t FileRef::Touch(PP_Time last_access_time, | 167 int32_t FileRef::Touch(PP_Time last_access_time, |
126 PP_Time last_modified_time, | 168 PP_Time last_modified_time, |
127 const CompletionCallback& cc) { | 169 const CompletionCallback& cc) { |
| 170 if (has_interface<PPB_FileRef_1_2>()) { |
| 171 return get_interface<PPB_FileRef_1_2>()->Touch( |
| 172 pp_resource(), last_access_time, last_modified_time, |
| 173 cc.pp_completion_callback()); |
| 174 } |
128 if (has_interface<PPB_FileRef_1_1>()) { | 175 if (has_interface<PPB_FileRef_1_1>()) { |
129 return get_interface<PPB_FileRef_1_1>()->Touch( | 176 return get_interface<PPB_FileRef_1_1>()->Touch( |
130 pp_resource(), last_access_time, last_modified_time, | 177 pp_resource(), last_access_time, last_modified_time, |
131 cc.pp_completion_callback()); | 178 cc.pp_completion_callback()); |
132 } | 179 } |
133 if (has_interface<PPB_FileRef_1_0>()) { | 180 if (has_interface<PPB_FileRef_1_0>()) { |
134 return get_interface<PPB_FileRef_1_0>()->Touch( | 181 return get_interface<PPB_FileRef_1_0>()->Touch( |
135 pp_resource(), last_access_time, last_modified_time, | 182 pp_resource(), last_access_time, last_modified_time, |
136 cc.pp_completion_callback()); | 183 cc.pp_completion_callback()); |
137 } | 184 } |
138 return cc.MayForce(PP_ERROR_NOINTERFACE); | 185 return cc.MayForce(PP_ERROR_NOINTERFACE); |
139 } | 186 } |
140 | 187 |
141 int32_t FileRef::Delete(const CompletionCallback& cc) { | 188 int32_t FileRef::Delete(const CompletionCallback& cc) { |
| 189 if (has_interface<PPB_FileRef_1_2>()) { |
| 190 return get_interface<PPB_FileRef_1_2>()->Delete( |
| 191 pp_resource(), cc.pp_completion_callback()); |
| 192 } |
142 if (has_interface<PPB_FileRef_1_1>()) { | 193 if (has_interface<PPB_FileRef_1_1>()) { |
143 return get_interface<PPB_FileRef_1_1>()->Delete( | 194 return get_interface<PPB_FileRef_1_1>()->Delete( |
144 pp_resource(), cc.pp_completion_callback()); | 195 pp_resource(), cc.pp_completion_callback()); |
145 } | 196 } |
146 if (has_interface<PPB_FileRef_1_0>()) { | 197 if (has_interface<PPB_FileRef_1_0>()) { |
147 return get_interface<PPB_FileRef_1_0>()->Delete( | 198 return get_interface<PPB_FileRef_1_0>()->Delete( |
148 pp_resource(), cc.pp_completion_callback()); | 199 pp_resource(), cc.pp_completion_callback()); |
149 } | 200 } |
150 return cc.MayForce(PP_ERROR_NOINTERFACE); | 201 return cc.MayForce(PP_ERROR_NOINTERFACE); |
151 } | 202 } |
152 | 203 |
153 int32_t FileRef::Rename(const FileRef& new_file_ref, | 204 int32_t FileRef::Rename(const FileRef& new_file_ref, |
154 const CompletionCallback& cc) { | 205 const CompletionCallback& cc) { |
| 206 if (has_interface<PPB_FileRef_1_2>()) { |
| 207 return get_interface<PPB_FileRef_1_2>()->Rename( |
| 208 pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); |
| 209 } |
155 if (has_interface<PPB_FileRef_1_1>()) { | 210 if (has_interface<PPB_FileRef_1_1>()) { |
156 return get_interface<PPB_FileRef_1_1>()->Rename( | 211 return get_interface<PPB_FileRef_1_1>()->Rename( |
157 pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); | 212 pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); |
158 } | 213 } |
159 if (has_interface<PPB_FileRef_1_0>()) { | 214 if (has_interface<PPB_FileRef_1_0>()) { |
160 return get_interface<PPB_FileRef_1_0>()->Rename( | 215 return get_interface<PPB_FileRef_1_0>()->Rename( |
161 pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); | 216 pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); |
162 } | 217 } |
163 return cc.MayForce(PP_ERROR_NOINTERFACE); | 218 return cc.MayForce(PP_ERROR_NOINTERFACE); |
164 } | 219 } |
165 | 220 |
166 int32_t FileRef::Query(const CompletionCallbackWithOutput<PP_FileInfo>& cc) { | 221 int32_t FileRef::Query(const CompletionCallbackWithOutput<PP_FileInfo>& cc) { |
167 if (!has_interface<PPB_FileRef_1_1>()) | 222 if (has_interface<PPB_FileRef_1_2>()) { |
168 return cc.MayForce(PP_ERROR_NOINTERFACE); | 223 return get_interface<PPB_FileRef_1_2>()->Query( |
169 return get_interface<PPB_FileRef_1_1>()->Query( | 224 pp_resource(), cc.output(), cc.pp_completion_callback()); |
170 pp_resource(), cc.output(), cc.pp_completion_callback()); | 225 } |
| 226 if (has_interface<PPB_FileRef_1_1>()) { |
| 227 return get_interface<PPB_FileRef_1_1>()->Query( |
| 228 pp_resource(), cc.output(), cc.pp_completion_callback()); |
| 229 } |
| 230 return cc.MayForce(PP_ERROR_NOINTERFACE); |
171 } | 231 } |
172 | 232 |
173 int32_t FileRef::ReadDirectoryEntries( | 233 int32_t FileRef::ReadDirectoryEntries( |
174 const CompletionCallbackWithOutput<std::vector<DirectoryEntry> >& | 234 const CompletionCallbackWithOutput<std::vector<DirectoryEntry> >& |
175 callback) { | 235 callback) { |
176 if (!has_interface<PPB_FileRef_1_1>()) | 236 if (has_interface<PPB_FileRef_1_2>()) { |
177 return callback.MayForce(PP_ERROR_NOINTERFACE); | 237 return get_interface<PPB_FileRef_1_2>()->ReadDirectoryEntries( |
178 return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries( | 238 pp_resource(), callback.output(), callback.pp_completion_callback()); |
179 pp_resource(), callback.output(), callback.pp_completion_callback()); | 239 } |
| 240 if (has_interface<PPB_FileRef_1_1>()) { |
| 241 return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries( |
| 242 pp_resource(), callback.output(), callback.pp_completion_callback()); |
| 243 } |
| 244 return callback.MayForce(PP_ERROR_NOINTERFACE); |
180 } | 245 } |
181 | 246 |
182 } // namespace pp | 247 } // namespace pp |
OLD | NEW |