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 "native_client/src/shared/ppapi_proxy/plugin_ppb_file_ref.h" | 5 #include "native_client/src/shared/ppapi_proxy/plugin_ppb_file_ref.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 bool IsDirectoryTraversal(const std::string& path) { | 24 bool IsDirectoryTraversal(const std::string& path) { |
25 bool is_directory_traversal = true; | 25 bool is_directory_traversal = true; |
26 // TODO(sanga): Do we need to guard against percent encoded strings as well? | 26 // TODO(sanga): Do we need to guard against percent encoded strings as well? |
27 if (path.find("../") == std::string::npos) | 27 if (path.find("../") == std::string::npos) |
28 is_directory_traversal = false; | 28 is_directory_traversal = false; |
29 return is_directory_traversal; | 29 return is_directory_traversal; |
30 } | 30 } |
31 | 31 |
32 PP_Resource Create(PP_Resource file_system, | 32 PP_Resource Create(PP_Resource file_system, |
33 const char* path) { | 33 const char* path) { |
34 DebugPrintf("PPB_FileRef::Create: file_system=%"NACL_PRIu32", path=%s\n", | 34 DebugPrintf("PPB_FileRef::Create: file_system=%"NACL_PRId32", path=%s\n", |
35 file_system, path); | 35 file_system, path); |
36 | 36 |
37 PP_Resource resource = kInvalidResourceId; | 37 PP_Resource resource = kInvalidResourceId; |
38 | 38 |
39 if (IsDirectoryTraversal(path)) | 39 if (IsDirectoryTraversal(path)) |
40 return kInvalidResourceId; | 40 return kInvalidResourceId; |
41 | 41 |
42 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Create( | 42 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Create( |
43 GetMainSrpcChannel(), | 43 GetMainSrpcChannel(), |
44 file_system, | 44 file_system, |
45 strlen(path) + 1, // Add 1 to preserve terminating '\0' | 45 strlen(path) + 1, // Add 1 to preserve terminating '\0' |
46 const_cast<char*>(path), | 46 const_cast<char*>(path), |
47 &resource); | 47 &resource); |
48 DebugPrintf("PPB_FileRef::Create: %s\n", NaClSrpcErrorString(srpc_result)); | 48 DebugPrintf("PPB_FileRef::Create: %s\n", NaClSrpcErrorString(srpc_result)); |
49 | 49 |
50 if (srpc_result == NACL_SRPC_RESULT_OK) | 50 if (srpc_result == NACL_SRPC_RESULT_OK) |
51 return resource; | 51 return resource; |
52 return kInvalidResourceId; | 52 return kInvalidResourceId; |
53 } | 53 } |
54 | 54 |
55 PP_Bool IsFileRef(PP_Resource file_ref) { | 55 PP_Bool IsFileRef(PP_Resource file_ref) { |
56 DebugPrintf("PPB_FileRef::IsFileRef: file_ref=%"NACL_PRIu32"\n", file_ref); | 56 DebugPrintf("PPB_FileRef::IsFileRef: file_ref=%"NACL_PRId32"\n", file_ref); |
57 | 57 |
58 int32_t is_file_ref = 0; | 58 int32_t is_file_ref = 0; |
59 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_IsFileRef( | 59 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_IsFileRef( |
60 GetMainSrpcChannel(), | 60 GetMainSrpcChannel(), |
61 file_ref, | 61 file_ref, |
62 &is_file_ref); | 62 &is_file_ref); |
63 DebugPrintf("PPB_FileRef::IsFileRef: %s\n", NaClSrpcErrorString(srpc_result)); | 63 DebugPrintf("PPB_FileRef::IsFileRef: %s\n", NaClSrpcErrorString(srpc_result)); |
64 | 64 |
65 if ((srpc_result == NACL_SRPC_RESULT_OK) && is_file_ref) | 65 if ((srpc_result == NACL_SRPC_RESULT_OK) && is_file_ref) |
66 return PP_TRUE; | 66 return PP_TRUE; |
67 return PP_FALSE; | 67 return PP_FALSE; |
68 } | 68 } |
69 | 69 |
70 PP_FileSystemType GetFileSystemType(PP_Resource file_ref) { | 70 PP_FileSystemType GetFileSystemType(PP_Resource file_ref) { |
71 DebugPrintf("PPB_FileRef::GetFileSystemType: file_ref=%"NACL_PRIu32"\n", | 71 DebugPrintf("PPB_FileRef::GetFileSystemType: file_ref=%"NACL_PRId32"\n", |
72 file_ref); | 72 file_ref); |
73 | 73 |
74 int32_t file_system_type = PP_FILESYSTEMTYPE_INVALID; | 74 int32_t file_system_type = PP_FILESYSTEMTYPE_INVALID; |
75 NaClSrpcError srpc_result = | 75 NaClSrpcError srpc_result = |
76 PpbFileRefRpcClient::PPB_FileRef_GetFileSystemType( | 76 PpbFileRefRpcClient::PPB_FileRef_GetFileSystemType( |
77 GetMainSrpcChannel(), | 77 GetMainSrpcChannel(), |
78 file_ref, | 78 file_ref, |
79 &file_system_type); | 79 &file_system_type); |
80 DebugPrintf("PPB_FileRef::GetFileSystemType: %s\n", | 80 DebugPrintf("PPB_FileRef::GetFileSystemType: %s\n", |
81 NaClSrpcErrorString(srpc_result)); | 81 NaClSrpcErrorString(srpc_result)); |
82 | 82 |
83 if (srpc_result == NACL_SRPC_RESULT_OK) | 83 if (srpc_result == NACL_SRPC_RESULT_OK) |
84 return static_cast<PP_FileSystemType>(file_system_type); | 84 return static_cast<PP_FileSystemType>(file_system_type); |
85 return PP_FILESYSTEMTYPE_INVALID; | 85 return PP_FILESYSTEMTYPE_INVALID; |
86 } | 86 } |
87 | 87 |
88 PP_Var GetName(PP_Resource file_ref) { | 88 PP_Var GetName(PP_Resource file_ref) { |
89 DebugPrintf("PPB_FileRef::GetName: file_ref=%"NACL_PRIu32"\n", file_ref); | 89 DebugPrintf("PPB_FileRef::GetName: file_ref=%"NACL_PRId32"\n", file_ref); |
90 | 90 |
91 PP_Var name = PP_MakeUndefined(); | 91 PP_Var name = PP_MakeUndefined(); |
92 nacl_abi_size_t length = kMaxReturnVarSize; | 92 nacl_abi_size_t length = kMaxReturnVarSize; |
93 nacl::scoped_array<char> name_bytes(new char[length]); | 93 nacl::scoped_array<char> name_bytes(new char[length]); |
94 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetName( | 94 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetName( |
95 GetMainSrpcChannel(), | 95 GetMainSrpcChannel(), |
96 file_ref, | 96 file_ref, |
97 &length, | 97 &length, |
98 name_bytes.get()); | 98 name_bytes.get()); |
99 DebugPrintf("PPB_FileRef::GetName: %s\n", NaClSrpcErrorString(srpc_result)); | 99 DebugPrintf("PPB_FileRef::GetName: %s\n", NaClSrpcErrorString(srpc_result)); |
100 | 100 |
101 if (srpc_result == NACL_SRPC_RESULT_OK) { | 101 if (srpc_result == NACL_SRPC_RESULT_OK) { |
102 if (DeserializeTo(name_bytes.get(), length, 1 /* argc */, &name)) | 102 if (DeserializeTo(name_bytes.get(), length, 1 /* argc */, &name)) |
103 return name; | 103 return name; |
104 } | 104 } |
105 return PP_MakeUndefined(); | 105 return PP_MakeUndefined(); |
106 } | 106 } |
107 | 107 |
108 PP_Var GetPath(PP_Resource file_ref) { | 108 PP_Var GetPath(PP_Resource file_ref) { |
109 DebugPrintf("PPB_FileRef::GetPath: file_ref=%"NACL_PRIu32"\n", file_ref); | 109 DebugPrintf("PPB_FileRef::GetPath: file_ref=%"NACL_PRId32"\n", file_ref); |
110 | 110 |
111 PP_Var path = PP_MakeUndefined(); | 111 PP_Var path = PP_MakeUndefined(); |
112 nacl_abi_size_t length = kMaxReturnVarSize; | 112 nacl_abi_size_t length = kMaxReturnVarSize; |
113 nacl::scoped_array<char> path_bytes(new char[length]); | 113 nacl::scoped_array<char> path_bytes(new char[length]); |
114 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetPath( | 114 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetPath( |
115 GetMainSrpcChannel(), | 115 GetMainSrpcChannel(), |
116 file_ref, | 116 file_ref, |
117 &length, | 117 &length, |
118 path_bytes.get()); | 118 path_bytes.get()); |
119 DebugPrintf("PPB_FileRef::GetPath: %s\n", | 119 DebugPrintf("PPB_FileRef::GetPath: %s\n", |
120 NaClSrpcErrorString(srpc_result)); | 120 NaClSrpcErrorString(srpc_result)); |
121 | 121 |
122 if (srpc_result == NACL_SRPC_RESULT_OK && | 122 if (srpc_result == NACL_SRPC_RESULT_OK && |
123 DeserializeTo(path_bytes.get(), length, 1 /* argc */, &path)) { | 123 DeserializeTo(path_bytes.get(), length, 1 /* argc */, &path)) { |
124 return path; | 124 return path; |
125 } | 125 } |
126 return PP_MakeUndefined(); | 126 return PP_MakeUndefined(); |
127 } | 127 } |
128 | 128 |
129 PP_Resource GetParent(PP_Resource file_ref) { | 129 PP_Resource GetParent(PP_Resource file_ref) { |
130 DebugPrintf("PPB_FileRef::GetParent: file_ref=%"NACL_PRIu32"\n", file_ref); | 130 DebugPrintf("PPB_FileRef::GetParent: file_ref=%"NACL_PRId32"\n", file_ref); |
131 | 131 |
132 PP_Resource parent = kInvalidResourceId; | 132 PP_Resource parent = kInvalidResourceId; |
133 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetParent( | 133 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_GetParent( |
134 GetMainSrpcChannel(), | 134 GetMainSrpcChannel(), |
135 file_ref, | 135 file_ref, |
136 &parent); | 136 &parent); |
137 DebugPrintf("PPB_FileRef::GetParent: %s\n", | 137 DebugPrintf("PPB_FileRef::GetParent: %s\n", |
138 NaClSrpcErrorString(srpc_result)); | 138 NaClSrpcErrorString(srpc_result)); |
139 | 139 |
140 if (srpc_result == NACL_SRPC_RESULT_OK) | 140 if (srpc_result == NACL_SRPC_RESULT_OK) |
141 return parent; | 141 return parent; |
142 return kInvalidResourceId; | 142 return kInvalidResourceId; |
143 } | 143 } |
144 | 144 |
145 int32_t MakeDirectory(PP_Resource directory_ref, | 145 int32_t MakeDirectory(PP_Resource directory_ref, |
146 PP_Bool make_ancestors, | 146 PP_Bool make_ancestors, |
147 struct PP_CompletionCallback callback) { | 147 struct PP_CompletionCallback callback) { |
148 DebugPrintf("PPB_FileRef::MakeDirectory: directory_ref=%"NACL_PRIu32", " | 148 DebugPrintf("PPB_FileRef::MakeDirectory: directory_ref=%"NACL_PRId32", " |
149 "make_ancestors=%s\n", directory_ref, | 149 "make_ancestors=%s\n", directory_ref, |
150 (make_ancestors ? "true" : "false")); | 150 (make_ancestors ? "true" : "false")); |
151 | 151 |
152 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); | 152 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); |
153 int32_t pp_error = PP_ERROR_FAILED; | 153 int32_t pp_error = PP_ERROR_FAILED; |
154 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_MakeDirectory( | 154 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_MakeDirectory( |
155 GetMainSrpcChannel(), | 155 GetMainSrpcChannel(), |
156 directory_ref, | 156 directory_ref, |
157 make_ancestors, | 157 make_ancestors, |
158 callback_id, | 158 callback_id, |
159 &pp_error); | 159 &pp_error); |
160 DebugPrintf("PPB_FileRef::MakeDirectory: %s\n", | 160 DebugPrintf("PPB_FileRef::MakeDirectory: %s\n", |
161 NaClSrpcErrorString(srpc_result)); | 161 NaClSrpcErrorString(srpc_result)); |
162 | 162 |
163 if (srpc_result == NACL_SRPC_RESULT_OK) | 163 if (srpc_result == NACL_SRPC_RESULT_OK) |
164 return MayForceCallback(callback, pp_error); | 164 return MayForceCallback(callback, pp_error); |
165 return PP_ERROR_FAILED; | 165 return PP_ERROR_FAILED; |
166 } | 166 } |
167 | 167 |
168 int32_t Touch(PP_Resource file_ref, | 168 int32_t Touch(PP_Resource file_ref, |
169 PP_Time last_access_time, | 169 PP_Time last_access_time, |
170 PP_Time last_modified_time, | 170 PP_Time last_modified_time, |
171 struct PP_CompletionCallback callback) { | 171 struct PP_CompletionCallback callback) { |
172 DebugPrintf("PPB_FileRef::Touch: file_ref=%"NACL_PRIu32", " | 172 DebugPrintf("PPB_FileRef::Touch: file_ref=%"NACL_PRId32", " |
173 "last_access_time=%lf, last_modified_time=%lf\n", | 173 "last_access_time=%lf, last_modified_time=%lf\n", |
174 file_ref, last_access_time, last_modified_time); | 174 file_ref, last_access_time, last_modified_time); |
175 | 175 |
176 if (std::isnan(last_access_time) || | 176 if (std::isnan(last_access_time) || |
177 std::isnan(last_modified_time)) { | 177 std::isnan(last_modified_time)) { |
178 return PP_ERROR_FAILED; | 178 return PP_ERROR_FAILED; |
179 } | 179 } |
180 | 180 |
181 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); | 181 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); |
182 int32_t pp_error = PP_ERROR_FAILED; | 182 int32_t pp_error = PP_ERROR_FAILED; |
183 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Touch( | 183 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Touch( |
184 GetMainSrpcChannel(), | 184 GetMainSrpcChannel(), |
185 file_ref, | 185 file_ref, |
186 last_access_time, | 186 last_access_time, |
187 last_modified_time, | 187 last_modified_time, |
188 callback_id, | 188 callback_id, |
189 &pp_error); | 189 &pp_error); |
190 DebugPrintf("PPB_FileRef::Touch: %s\n", NaClSrpcErrorString(srpc_result)); | 190 DebugPrintf("PPB_FileRef::Touch: %s\n", NaClSrpcErrorString(srpc_result)); |
191 | 191 |
192 if (srpc_result == NACL_SRPC_RESULT_OK) | 192 if (srpc_result == NACL_SRPC_RESULT_OK) |
193 return MayForceCallback(callback, pp_error); | 193 return MayForceCallback(callback, pp_error); |
194 return PP_ERROR_FAILED; | 194 return PP_ERROR_FAILED; |
195 } | 195 } |
196 | 196 |
197 int32_t Delete(PP_Resource file_ref, | 197 int32_t Delete(PP_Resource file_ref, |
198 struct PP_CompletionCallback callback) { | 198 struct PP_CompletionCallback callback) { |
199 DebugPrintf("PPB_FileRef::Delete: file_ref=%"NACL_PRIu32"\n", file_ref); | 199 DebugPrintf("PPB_FileRef::Delete: file_ref=%"NACL_PRId32"\n", file_ref); |
200 | 200 |
201 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); | 201 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); |
202 int32_t pp_error = PP_ERROR_FAILED; | 202 int32_t pp_error = PP_ERROR_FAILED; |
203 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Delete( | 203 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Delete( |
204 GetMainSrpcChannel(), | 204 GetMainSrpcChannel(), |
205 file_ref, | 205 file_ref, |
206 callback_id, | 206 callback_id, |
207 &pp_error); | 207 &pp_error); |
208 DebugPrintf("PPB_FileRef::Delete: %s\n", NaClSrpcErrorString(srpc_result)); | 208 DebugPrintf("PPB_FileRef::Delete: %s\n", NaClSrpcErrorString(srpc_result)); |
209 | 209 |
210 if (srpc_result == NACL_SRPC_RESULT_OK) | 210 if (srpc_result == NACL_SRPC_RESULT_OK) |
211 return MayForceCallback(callback, pp_error); | 211 return MayForceCallback(callback, pp_error); |
212 return PP_ERROR_FAILED; | 212 return PP_ERROR_FAILED; |
213 } | 213 } |
214 | 214 |
215 int32_t Rename(PP_Resource file_ref, | 215 int32_t Rename(PP_Resource file_ref, |
216 PP_Resource new_file_ref, | 216 PP_Resource new_file_ref, |
217 struct PP_CompletionCallback callback) { | 217 struct PP_CompletionCallback callback) { |
218 DebugPrintf("PPB_FileRef::Rename: file_ref=%"NACL_PRIu32", " | 218 DebugPrintf("PPB_FileRef::Rename: file_ref=%"NACL_PRId32", " |
219 "new_file_ref=%"NACL_PRIu32"\n", file_ref, new_file_ref); | 219 "new_file_ref=%"NACL_PRId32"\n", file_ref, new_file_ref); |
220 | 220 |
221 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); | 221 int32_t callback_id = CompletionCallbackTable::Get()->AddCallback(callback); |
222 int32_t pp_error = PP_ERROR_FAILED; | 222 int32_t pp_error = PP_ERROR_FAILED; |
223 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Rename( | 223 NaClSrpcError srpc_result = PpbFileRefRpcClient::PPB_FileRef_Rename( |
224 GetMainSrpcChannel(), | 224 GetMainSrpcChannel(), |
225 file_ref, | 225 file_ref, |
226 new_file_ref, | 226 new_file_ref, |
227 callback_id, | 227 callback_id, |
228 &pp_error); | 228 &pp_error); |
229 DebugPrintf("PPB_FileRef::Rename: %s\n", NaClSrpcErrorString(srpc_result)); | 229 DebugPrintf("PPB_FileRef::Rename: %s\n", NaClSrpcErrorString(srpc_result)); |
(...skipping 13 matching lines...) Expand all Loading... |
243 GetPath, | 243 GetPath, |
244 GetParent, | 244 GetParent, |
245 MakeDirectory, | 245 MakeDirectory, |
246 Touch, | 246 Touch, |
247 Delete, | 247 Delete, |
248 Rename | 248 Rename |
249 }; | 249 }; |
250 return &file_ref_interface; | 250 return &file_ref_interface; |
251 } | 251 } |
252 } // namespace ppapi_proxy | 252 } // namespace ppapi_proxy |
OLD | NEW |