bool CArchiveScanner::ScanArchiveLua(CArchiveBase* ar, const std::string& fileName, ArchiveInfo& ai) { std::vector<boost::uint8_t> buf; if (!ar->GetFile(fileName, buf)) { return false; } const std::string cleanbuf((char*)(&buf[0]), buf.size()); LuaParser p(cleanbuf, SPRING_VFS_MOD); if (!p.Execute()) { logOutput.Print("ERROR in " + fileName + ": " + p.GetErrorLog()); return false; } const LuaTable archiveTable = p.GetRoot(); ai.archiveData = GetArchiveData(archiveTable); return true; }
CArchiveScanner::ArchiveData CArchiveScanner::GetArchiveDataByArchive(const std::string& archive) const { return GetArchiveData(NameFromArchive(archive)); }
void CArchiveScanner::ReadCacheData(const std::string& filename) { LuaParser p(filename, SPRING_VFS_RAW, SPRING_VFS_BASE); if (!p.Execute()) { logOutput.Print("ERROR in " + filename + ": " + p.GetErrorLog()); } const LuaTable archiveCache = p.GetRoot(); const LuaTable archives = archiveCache.SubTable("archives"); // Do not load old version caches const int ver = archiveCache.GetInt("internalVer", (INTERNAL_VER + 1)); if (ver != INTERNAL_VER) { return; } for (int i = 1; archives.KeyExists(i); ++i) { const LuaTable curArchive = archives.SubTable(i); const LuaTable archived = curArchive.SubTable("archivedata"); ArchiveInfo ai; ai.origName = curArchive.GetString("name", ""); ai.path = curArchive.GetString("path", ""); // do not use LuaTable.GetInt() for 32-bit integers, the Spring lua // library uses 32-bit floats to represent numbers, which can only // represent 2^24 consecutive integers ai.modified = strtoul(curArchive.GetString("modified", "0").c_str(), 0, 10); ai.checksum = strtoul(curArchive.GetString("checksum", "0").c_str(), 0, 10); ai.updated = false; ai.archiveData = GetArchiveData(archived); if (ai.archiveData.modType == modtype::map) { AddDependency(ai.archiveData.dependencies, "Map Helper v1"); } else if (ai.archiveData.modType == modtype::primary) { AddDependency(ai.archiveData.dependencies, "Spring content v1"); } std::string lcname = StringToLower(ai.origName); archiveInfo[lcname] = ai; } const LuaTable brokenArchives = archiveCache.SubTable("brokenArchives"); for (int i = 1; brokenArchives.KeyExists(i); ++i) { const LuaTable curArchive = brokenArchives.SubTable(i); BrokenArchive ba; std::string name = curArchive.GetString("name", ""); ba.path = curArchive.GetString("path", ""); ba.modified = strtoul(curArchive.GetString("modified", "0").c_str(), 0, 10); ba.updated = false; std::string lcname = StringToLower(name); this->brokenArchives[lcname] = ba; } isDirty = false; }