FilePtr FileSystem::getFile (const std::string& filename) const { if (!getAbsoluteWritePath().empty()) { const std::string path = getAbsoluteWritePath() + getDataDir() + filename; SDL_RWops *rwopsLocal = createRWops(path); if (rwopsLocal != nullptr) { FilePtr ptr(new File(rwopsLocal, path)); return ptr; } } const std::string path = getDataDir() + filename; SDL_RWops *rwops = createRWops(path); FilePtr ptr(new File(rwops, path)); return ptr; }
long FileSystem::writeSysFile (const std::string& filename, const unsigned char *buf, size_t length, bool overwrite) const { if (filename.empty()) return -1L; const std::string path = getAbsoluteWritePath() + filename; SDL_RWops *rwops = createRWops(path, "wb"); FilePtr file(new File(rwops, path)); if (!overwrite && file->exists()) return -1L; const long ret = file->write(buf, length); if (ret < 0) error(LOG_FILE, "failed to write file " + path); else info(LOG_FILE, "wrote file " + path + " of size " + string::toString(ret)); return ret; }
long FileSystem::writeSysFile (const std::string& filename, const unsigned char *buf, size_t length, bool overwrite) const { if (filename.empty()) return -1L; const std::string path = getAbsoluteWritePath() + filename; SDL_RWops *rwops = createRWops(path, "wb"); FilePtr file(new File(rwops, path)); if (!overwrite && file->exists()) return -1L; const long ret = file->write(buf, length); if (ret < 0) Log::error(LOG_COMMON, "failed to write file %s", path.c_str()); else Log::info(LOG_COMMON, "wrote file %s of size %li", path.c_str(), ret); return ret; }
DirectoryEntries FileSystem::listDirectory (const std::string& basedir, const std::string& subdir) const { #if DIRLIST_NOT_SUPPORTED return Singleton<GameRegistry>::getInstance().getGame()->listDirectory(basedir, subdir); #else DirectoryEntries entriesAll; const std::string sysWritePath = getAbsoluteWritePath() + basedir; if (!sysWritePath.empty()) entriesAll = System.listDirectory(sysWritePath, subdir); const std::string dataDir = getDataDir() + basedir; const DirectoryEntries entries = System.listDirectory(dataDir, subdir); for (const std::string& entry : entries) { entriesAll.push_back(entry); } std::sort(entriesAll.begin(), entriesAll.end()); entriesAll.erase(std::unique(entriesAll.begin(), entriesAll.end()), entriesAll.end()); return entriesAll; #endif }
DirectoryEntries FileSystem::listDirectory (const std::string& basedir, const std::string& subdir) { DirectoryEntries entriesAll; // TODO: register this in the app #if DIRLIST_NOT_SUPPORTED #include "dir.h" #endif const std::string sysWritePath = getAbsoluteWritePath() + basedir; if (!sysWritePath.empty()) entriesAll = System.listDirectory(sysWritePath, subdir); const std::string dataDir = getDataDir() + basedir; const DirectoryEntries entries = System.listDirectory(dataDir, subdir); for (DirectoryEntriesIter i = entries.begin(); i != entries.end(); ++i) { entriesAll.push_back(*i); } std::sort(entriesAll.begin(), entriesAll.end()); entriesAll.erase(std::unique(entriesAll.begin(), entriesAll.end()), entriesAll.end()); return entriesAll; }