| Index: src/DefaultFileSystem.cpp |
| =================================================================== |
| --- a/src/DefaultFileSystem.cpp |
| +++ b/src/DefaultFileSystem.cpp |
| @@ -70,36 +70,84 @@ |
| DefaultFileSystem::Read(const std::string& path) const |
| { |
| std::shared_ptr<std::istream> result(new std::ifstream(NormalizePath(path).c_str())); |
| if (result->fail()) |
| throw RuntimeErrorWithErrno("Failed to open " + path); |
| return result; |
| } |
| +void DefaultFileSystem::Read(const std::string& path, |
| + const ReadCallback& callback) const |
| +{ |
| + try |
| + { |
| + auto result = Read(path); |
| + callback(result); |
| + } |
| + catch (...) |
| + { |
| + } |
| +} |
| + |
| void DefaultFileSystem::Write(const std::string& path, |
| std::istream& data) |
| { |
| std::ofstream file(NormalizePath(path).c_str(), std::ios_base::out | std::ios_base::binary); |
| file << Utils::Slurp(data); |
| } |
| +void DefaultFileSystem::Write(const std::string& path, |
| + std::istream& data, |
| + const Callback& callback) |
| +{ |
| + Write(path, data); |
| + callback(); |
| +} |
| + |
| void DefaultFileSystem::Move(const std::string& fromPath, |
| const std::string& toPath) |
| { |
| if (rename(NormalizePath(fromPath).c_str(), NormalizePath(toPath).c_str())) |
| throw RuntimeErrorWithErrno("Failed to move " + fromPath + " to " + toPath); |
| } |
| +void DefaultFileSystem::Move(const std::string& fromPath, |
| + const std::string& toPath, |
| + const Callback& callback) |
| +{ |
| + try |
| + { |
| + Move(fromPath, toPath); |
| + callback(); |
| + } |
| + catch (...) |
| + { |
| + } |
| +} |
| + |
| void DefaultFileSystem::Remove(const std::string& path) |
| { |
| if (remove(NormalizePath(path).c_str())) |
| throw RuntimeErrorWithErrno("Failed to remove " + path); |
| } |
| +void DefaultFileSystem::Remove(const std::string& path, |
| + const Callback& callback) |
| +{ |
| + try |
| + { |
| + Remove(path); |
| + callback(); |
| + } |
| + catch (...) |
| + { |
| + } |
| +} |
| + |
| FileSystem::StatResult DefaultFileSystem::Stat(const std::string& path) const |
| { |
| FileSystem::StatResult result; |
| #ifdef WIN32 |
| WIN32_FILE_ATTRIBUTE_DATA data; |
| if (!GetFileAttributesExW(NormalizePath(path).c_str(), GetFileExInfoStandard, &data)) |
| { |
| DWORD err = GetLastError(); |
| @@ -156,16 +204,29 @@ |
| + static_cast<int64_t>(nativeStat.st_mtim.tv_nsec) / NSEC_IN_MSEC; |
| #else |
| result.lastModified = static_cast<int64_t>(nativeStat.st_mtime) * MSEC_IN_SEC; |
| #endif |
| return result; |
| #endif |
| } |
| +void DefaultFileSystem::Stat(const std::string& path, |
| + const StatCallback& callback) const |
| +{ |
| + try |
| + { |
| + auto stats = Stat(path); |
| + callback(stats); |
| + } |
| + catch (...) |
| + { |
| + } |
| +} |
| + |
| std::string DefaultFileSystem::Resolve(const std::string& path) const |
| { |
| if (basePath == "") |
| { |
| return path; |
| } |
| else |
| { |
| @@ -178,16 +239,21 @@ |
| return basePath + PATH_SEPARATOR + path; |
| } |
| else |
| { |
| return path; |
| } |
| } |
| } |
| +void DefaultFileSystem::Resolve(const std::string& path, |
| + const ResolveCallback& callback) const |
| +{ |
| + callback(Resolve(path)); |
| +} |
| void DefaultFileSystem::SetBasePath(const std::string& path) |
| { |
| basePath = path; |
| if (*basePath.rbegin() == PATH_SEPARATOR) |
| { |
| basePath.resize(basePath.size() - 1); |