From 83bd85403032091b2de8dbdec13d83e516f1b7ae Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Wed, 13 Jan 2010 11:33:22 +0300 Subject: [PATCH] [9170] Impleament DBCs build check at server startup. * Extractor now include in extarcted DBC dir data file with build info. * Mangosd use this data for check at startup for main DBC dir and DBC local subdirs intergrity. * Also updates DBC checks for raw data. NOTE: You need reextract DBC data by _new_ extractor for correct work mangosd. --- contrib/extractor/System.cpp | 50 +++++++++++++++ contrib/extractor/ad.exe | Bin 162816 -> 165888 bytes src/game/DBCStores.cpp | 120 +++++++++++++++++++++++++++++++---- src/shared/revision_nr.h | 2 +- 4 files changed, 158 insertions(+), 14 deletions(-) diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 1aa1145d4..11a47baa2 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -166,6 +166,43 @@ void HandleArgs(int argc, char * arg[]) } } +uint32 ReadBuild(int locale) +{ + // include build info file also + std::string filename = std::string("component.wow-")+langs[locale]+".txt"; + //printf("Read %s file... ", filename.c_str()); + + MPQFile m(filename.c_str()); + if(m.isEof()) + { + printf("Fatal error: Not found %s file!\n", filename.c_str()); + exit(1); + } + + std::string text = m.getPointer(); + m.close(); + + size_t pos = text.find("version=\""); + size_t pos1 = pos + strlen("version=\""); + size_t pos2 = text.find("\"",pos1); + if (pos == text.npos || pos2 == text.npos || pos1 >= pos2) + { + printf("Fatal error: Invalid %s file format!\n", filename.c_str()); + exit(1); + } + + std::string build_str = text.substr(pos1,pos2-pos1); + + int build = atoi(build_str.c_str()); + if (build <= 0) + { + printf("Fatal error: Invalid %s file format!\n", filename.c_str()); + exit(1); + } + + return build; +} + uint32 ReadMapDBC() { printf("Read Map.dbc file... "); @@ -920,6 +957,14 @@ void ExtractDBCFiles(int locale, bool basicLocale) CreateDir(path); } + // extract Build info file + { + string mpq_name = std::string("component.wow-") + langs[locale] + ".txt"; + string filename = path + mpq_name; + + ExtractFile(mpq_name.c_str(), filename); + } + // extract DBCs int count = 0; for (set::iterator iter = dbcfiles.begin(); iter != dbcfiles.end(); ++iter) @@ -978,6 +1023,7 @@ int main(int argc, char * arg[]) HandleArgs(argc, arg); int FirstLocale = -1; + uint32 build = 0; for (int i = 0; i < LANG_COUNT; i++) { @@ -993,6 +1039,8 @@ int main(int argc, char * arg[]) if((CONF_extract & EXTRACT_DBC) == 0) { FirstLocale = i; + build = ReadBuild(FirstLocale); + printf("Detected client build: %u\n", build); break; } @@ -1000,6 +1048,8 @@ int main(int argc, char * arg[]) if(FirstLocale < 0) { FirstLocale = i; + build = ReadBuild(FirstLocale); + printf("Detected client build: %u\n", build); ExtractDBCFiles(i, true); } else diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe index 97a8fde49fa614af6656aaae2a3b8311b68c29e6..105f3819beab287eb2bceab8888bad5c1b9fad70 100755 GIT binary patch delta 40549 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

|D5L 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 diff --git a/src/game/DBCStores.cpp b/src/game/DBCStores.cpp index 36f0efe2b..ce4d88c3c 100644 --- a/src/game/DBCStores.cpp +++ b/src/game/DBCStores.cpp @@ -178,6 +178,55 @@ std::string AcceptableClientBuildsListStr() return data.str(); } +static bool ReadDBCBuildFileText(const std::string& dbc_path, char const* localeName, std::string& text) +{ + std::string filename = dbc_path + "component.wow-" + localeName + ".txt"; + + if(FILE* file = fopen(filename.c_str(),"rb")) + { + char buf[100]; + fread(buf,1,100-1,file); + fclose(file); + + text = &buf[0]; + fclose(file); + return true; + } + else + return false; +} + +static uint32 ReadDBCBuild(const std::string& dbc_path, char const* localeName = NULL) +{ + std::string text; + + if (!localeName) + { + for(LocaleNameStr* itr = &fullLocaleNameList[0]; itr->name; ++itr) + if (ReadDBCBuildFileText(dbc_path,itr->name,text)) + break; + } + else + ReadDBCBuildFileText(dbc_path,localeName,text); + + if (text.empty()) + return 0; + + size_t pos = text.find("version=\""); + size_t pos1 = pos + strlen("version=\""); + size_t pos2 = text.find("\"",pos1); + if (pos == text.npos || pos2 == text.npos || pos1 >= pos2) + return 0; + + std::string build_str = text.substr(pos1,pos2-pos1); + + int build = atoi(build_str.c_str()); + if (build <= 0) + return 0; + + return build; +} + static bool LoadDBC_assert_print(uint32 fsize,uint32 rsize, const std::string& filename) { sLog.outError("ERROR: Size of '%s' setted by format string (%u) not equal size of C++ structure (%u).",filename.c_str(),fsize,rsize); @@ -186,8 +235,18 @@ static bool LoadDBC_assert_print(uint32 fsize,uint32 rsize, const std::string& f return false; } +struct LocalData +{ + explicit LocalData(uint32 build) : main_build(build), availableDbcLocales(0xFFFFFFFF),checkedDbcLocaleBuilds(0) {} + uint32 main_build; + + // bitmasks for index of fullLocaleNameList + uint32 availableDbcLocales; + uint32 checkedDbcLocaleBuilds; +}; + template -inline void LoadDBC(uint32& availableDbcLocales,barGoLink& bar, StoreProblemList& errlist, DBCStorage& storage, const std::string& dbc_path, const std::string& filename) +inline void LoadDBC(LocalData& localeData,barGoLink& bar, StoreProblemList& errlist, DBCStorage& storage, const std::string& dbc_path, const std::string& filename) { // compatibility format and C++ structure sizes assert(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()),sizeof(T),filename)); @@ -198,12 +257,36 @@ inline void LoadDBC(uint32& availableDbcLocales,barGoLink& bar, StoreProblemList bar.step(); for(uint8 i = 0; fullLocaleNameList[i].name; ++i) { - if(!(availableDbcLocales & (1 << i))) + if (!(localeData.availableDbcLocales & (1 << i))) continue; + std::string dbc_dir_loc = dbc_path + fullLocaleNameList[i].name + "/"; + + if (!(localeData.checkedDbcLocaleBuilds & (1 << i))) + { + localeData.checkedDbcLocaleBuilds |= (1<