OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2017 eyeo GmbH | 3 * Copyright (C) 2006-2017 eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 if (err == ERROR_FILE_NOT_FOUND || | 117 if (err == ERROR_FILE_NOT_FOUND || |
118 err == ERROR_PATH_NOT_FOUND || | 118 err == ERROR_PATH_NOT_FOUND || |
119 err == ERROR_INVALID_DRIVE) | 119 err == ERROR_INVALID_DRIVE) |
120 { | 120 { |
121 return result; | 121 return result; |
122 } | 122 } |
123 throw RuntimeErrorWithErrno("Unable to stat " + path); | 123 throw RuntimeErrorWithErrno("Unable to stat " + path); |
124 } | 124 } |
125 | 125 |
126 result.exists = true; | 126 result.exists = true; |
127 if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) | |
128 { | |
129 result.isFile = false; | |
130 result.isDirectory = true; | |
131 } | |
132 else | |
133 { | |
134 result.isFile = true; | |
135 result.isDirectory = false; | |
136 } | |
137 | 127 |
138 // See http://support.microsoft.com/kb/167296 on this conversion | 128 // See http://support.microsoft.com/kb/167296 on this conversion |
139 #define FILE_TIME_TO_UNIX_EPOCH_OFFSET 116444736000000000LL | 129 #define FILE_TIME_TO_UNIX_EPOCH_OFFSET 116444736000000000LL |
140 #define FILE_TIME_TO_MILLISECONDS_FACTOR 10000 | 130 #define FILE_TIME_TO_MILLISECONDS_FACTOR 10000 |
141 ULARGE_INTEGER time; | 131 ULARGE_INTEGER time; |
142 time.LowPart = data.ftLastWriteTime.dwLowDateTime; | 132 time.LowPart = data.ftLastWriteTime.dwLowDateTime; |
143 time.HighPart = data.ftLastWriteTime.dwHighDateTime; | 133 time.HighPart = data.ftLastWriteTime.dwHighDateTime; |
144 result.lastModified = (time.QuadPart - FILE_TIME_TO_UNIX_EPOCH_OFFSET) / | 134 result.lastModified = (time.QuadPart - FILE_TIME_TO_UNIX_EPOCH_OFFSET) / |
145 FILE_TIME_TO_MILLISECONDS_FACTOR; | 135 FILE_TIME_TO_MILLISECONDS_FACTOR; |
146 return result; | 136 return result; |
147 #else | 137 #else |
148 struct stat nativeStat; | 138 struct stat nativeStat; |
149 const int failure = stat(NormalizePath(path).c_str(), &nativeStat); | 139 const int failure = stat(NormalizePath(path).c_str(), &nativeStat); |
150 if (failure) | 140 if (failure) |
151 { | 141 { |
152 if (errno == ENOENT) | 142 if (errno == ENOENT) |
153 return result; | 143 return result; |
154 throw RuntimeErrorWithErrno("Unable to stat " + path); | 144 throw RuntimeErrorWithErrno("Unable to stat " + path); |
155 } | 145 } |
156 result.exists = true; | 146 result.exists = true; |
157 result.isFile = S_ISREG(nativeStat.st_mode); | |
158 result.isDirectory = S_ISDIR(nativeStat.st_mode); | |
159 | 147 |
160 #define MSEC_IN_SEC 1000 | 148 #define MSEC_IN_SEC 1000 |
161 #define NSEC_IN_MSEC 1000000 | 149 #define NSEC_IN_MSEC 1000000 |
162 // Note: _POSIX_C_SOURCE macro is defined automatically on Linux due to g++ | 150 // Note: _POSIX_C_SOURCE macro is defined automatically on Linux due to g++ |
163 // defining _GNU_SOURCE macro. On OS X we still fall back to the "no | 151 // defining _GNU_SOURCE macro. On OS X we still fall back to the "no |
164 // milliseconds" branch, it has st_mtimespec instead of st_mtim. | 152 // milliseconds" branch, it has st_mtimespec instead of st_mtim. |
165 #if _POSIX_C_SOURCE >= 200809L | 153 #if _POSIX_C_SOURCE >= 200809L |
166 result.lastModified = static_cast<int64_t>(nativeStat.st_mtim.tv_sec) * MSEC_I
N_SEC | 154 result.lastModified = static_cast<int64_t>(nativeStat.st_mtim.tv_sec) * MSEC_I
N_SEC |
167 + static_cast<int64_t>(nativeStat.st_mtim.tv_nsec) / NSEC
_IN_MSEC; | 155 + static_cast<int64_t>(nativeStat.st_mtim.tv_nsec) / NSEC
_IN_MSEC; |
168 #else | 156 #else |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 { | 191 { |
204 basePath.resize(basePath.size() - 1); | 192 basePath.resize(basePath.size() - 1); |
205 } | 193 } |
206 } | 194 } |
207 | 195 |
208 DefaultFileSystem::DefaultFileSystem(const Scheduler& scheduler, std::unique_ptr
<DefaultFileSystemSync> syncImpl) | 196 DefaultFileSystem::DefaultFileSystem(const Scheduler& scheduler, std::unique_ptr
<DefaultFileSystemSync> syncImpl) |
209 : scheduler(scheduler), syncImpl(std::move(syncImpl)) | 197 : scheduler(scheduler), syncImpl(std::move(syncImpl)) |
210 { | 198 { |
211 } | 199 } |
212 | 200 |
213 void DefaultFileSystem::Read(const std::string& path, | 201 void DefaultFileSystem::Read(const std::string& fileName, |
214 const ReadCallback& callback) const | 202 const ReadCallback& callback) const |
215 { | 203 { |
216 scheduler([this, path, callback] | 204 scheduler([this, fileName, callback] |
217 { | 205 { |
218 std::string error; | 206 std::string error; |
219 try | 207 try |
220 { | 208 { |
221 auto data = syncImpl->Read(path); | 209 auto data = syncImpl->Read(Resolve(fileName)); |
222 callback(std::move(data), error); | 210 callback(std::move(data), error); |
223 return; | 211 return; |
224 } | 212 } |
225 catch (std::exception& e) | 213 catch (std::exception& e) |
226 { | 214 { |
227 error = e.what(); | 215 error = e.what(); |
228 } | 216 } |
229 catch (...) | 217 catch (...) |
230 { | 218 { |
231 error = "Unknown error while reading from " + path; | 219 error = "Unknown error while reading from " + fileName + " as " + Resolve
(fileName); |
232 } | 220 } |
233 callback(IOBuffer(), error); | 221 callback(IOBuffer(), error); |
234 }); | 222 }); |
235 } | 223 } |
236 | 224 |
237 void DefaultFileSystem::Write(const std::string& path, | 225 void DefaultFileSystem::Write(const std::string& fileName, |
238 const IOBuffer& data, | 226 const IOBuffer& data, |
239 const Callback& callback) | 227 const Callback& callback) |
240 { | 228 { |
241 scheduler([this, path, data, callback] | 229 scheduler([this, fileName, data, callback] |
242 { | 230 { |
243 std::string error; | 231 std::string error; |
244 try | 232 try |
245 { | 233 { |
246 syncImpl->Write(path, data); | 234 syncImpl->Write(Resolve(fileName), data); |
247 } | 235 } |
248 catch (std::exception& e) | 236 catch (std::exception& e) |
249 { | 237 { |
250 error = e.what(); | 238 error = e.what(); |
251 } | 239 } |
252 catch (...) | 240 catch (...) |
253 { | 241 { |
254 error = "Unknown error while writing to " + path; | 242 error = "Unknown error while writing to " + fileName + " as " + Resolve(fi
leName); |
255 } | 243 } |
256 callback(error); | 244 callback(error); |
257 }); | 245 }); |
258 } | 246 } |
259 | 247 |
260 void DefaultFileSystem::Move(const std::string& fromPath, | 248 void DefaultFileSystem::Move(const std::string& fromFileName, |
261 const std::string& toPath, | 249 const std::string& toFileName, |
262 const Callback& callback) | 250 const Callback& callback) |
263 { | 251 { |
264 scheduler([this, fromPath, toPath, callback] | 252 scheduler([this, fromFileName, toFileName, callback] |
265 { | 253 { |
266 std::string error; | 254 std::string error; |
267 try | 255 try |
268 { | 256 { |
269 syncImpl->Move(fromPath, toPath); | 257 syncImpl->Move(Resolve(fromFileName), Resolve(toFileName)); |
270 } | 258 } |
271 catch (std::exception& e) | 259 catch (std::exception& e) |
272 { | 260 { |
273 error = e.what(); | 261 error = e.what(); |
274 } | 262 } |
275 catch (...) | 263 catch (...) |
276 { | 264 { |
277 error = "Unknown error while moving " + fromPath + " to " + toPath; | 265 error = "Unknown error while moving " + fromFileName + " to " + toFileName
; |
278 } | 266 } |
279 callback(error); | 267 callback(error); |
280 }); | 268 }); |
281 } | 269 } |
282 | 270 |
283 void DefaultFileSystem::Remove(const std::string& path, | 271 void DefaultFileSystem::Remove(const std::string& fileName, |
284 const Callback& callback) | 272 const Callback& callback) |
285 { | 273 { |
286 scheduler([this, path, callback] | 274 scheduler([this, fileName, callback] |
287 { | 275 { |
288 std::string error; | 276 std::string error; |
289 try | 277 try |
290 { | 278 { |
291 syncImpl->Remove(path); | 279 syncImpl->Remove(Resolve(fileName)); |
292 } | 280 } |
293 catch (std::exception& e) | 281 catch (std::exception& e) |
294 { | 282 { |
295 error = e.what(); | 283 error = e.what(); |
296 } | 284 } |
297 catch (...) | 285 catch (...) |
298 { | 286 { |
299 error = "Unknown error while removing " + path; | 287 error = "Unknown error while removing " + fileName + " as " + Resolve(file
Name); |
300 } | 288 } |
301 callback(error); | 289 callback(error); |
302 }); | 290 }); |
303 } | 291 } |
304 | 292 |
305 void DefaultFileSystem::Stat(const std::string& path, | 293 void DefaultFileSystem::Stat(const std::string& fileName, |
306 const StatCallback& callback) const | 294 const StatCallback& callback) const |
307 { | 295 { |
308 scheduler([this, path, callback] | 296 scheduler([this, fileName, callback] |
309 { | 297 { |
310 std::string error; | 298 std::string error; |
311 try | 299 try |
312 { | 300 { |
313 auto result = syncImpl->Stat(path); | 301 auto result = syncImpl->Stat(Resolve(fileName)); |
314 callback(result, error); | 302 callback(result, error); |
315 return; | 303 return; |
316 } | 304 } |
317 catch (std::exception& e) | 305 catch (std::exception& e) |
318 { | 306 { |
319 error = e.what(); | 307 error = e.what(); |
320 } | 308 } |
321 catch (...) | 309 catch (...) |
322 { | 310 { |
323 error = "Unknown error while calling stat on " + path; | 311 error = "Unknown error while calling stat on " + fileName + " as " + Resol
ve(fileName); |
324 } | 312 } |
325 callback(StatResult(), error); | 313 callback(StatResult(), error); |
326 }); | 314 }); |
327 } | 315 } |
328 | 316 |
329 std::string DefaultFileSystem::Resolve(const std::string& path) const | 317 std::string DefaultFileSystem::Resolve(const std::string& fileName) const |
330 { | 318 { |
331 return syncImpl->Resolve(path); | 319 return syncImpl->Resolve(fileName); |
332 } | 320 } |
OLD | NEW |