inline void LoadDBC(uint32& availableDbcLocales, BarGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename) { // compatibility format and C++ structure sizes MANGOS_ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); std::string dbc_filename = dbc_path + filename; if (storage.Load(dbc_filename.c_str())) { bar.step(); for (uint8 i = 0; fullLocaleNameList[i].name; ++i) { if (!(availableDbcLocales & (1 << i))) continue; std::string dbc_filename_loc = dbc_path + fullLocaleNameList[i].name + "/" + filename; if (!storage.LoadStringsFrom(dbc_filename_loc.c_str())) availableDbcLocales &= ~(1 << i); // mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) nonexistent FILE* f = fopen(dbc_filename.c_str(), "rb"); if (f) { char buf[100]; snprintf(buf, 100, " (exist, but have %u fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else errlist.push_back(dbc_filename); } }
inline void LoadDBC(LocalData& localeData, BarGoLink& bar, StoreProblemList& errlist, DBCStorage<T>& storage, const std::string& dbc_path, const std::string& filename) { // compatibility format and C++ structure sizes MANGOS_ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename)); std::string dbc_filename = dbc_path + filename; if (storage.Load(dbc_filename.c_str())) { bar.step(); for (uint8 i = 0; fullLocaleNameList[i].name; ++i) { if (!(localeData.availableDbcLocales & (1 << i))) continue; LocaleNameStr const* localStr = &fullLocaleNameList[i]; std::string dbc_dir_loc = dbc_path + localStr->name + "/"; if (!(localeData.checkedDbcLocaleBuilds & (1 << i))) { localeData.checkedDbcLocaleBuilds |= (1 << i); // mark as checked for speedup next checks uint32 build_loc = ReadDBCBuild(dbc_dir_loc, localStr); if (localeData.main_build != build_loc) { localeData.availableDbcLocales &= ~(1 << i); // mark as not available for speedup next checks // exist but wrong build if (build_loc) { std::string dbc_filename_loc = dbc_path + localStr->name + "/" + filename; char buf[200]; snprintf(buf, 200, " (exist, but DBC locale subdir %s have DBCs for build %u instead expected build %u, it and other DBC from subdir skipped)", localStr->name, build_loc, localeData.main_build); errlist.push_back(dbc_filename_loc + buf); } continue; } } std::string dbc_filename_loc = dbc_path + localStr->name + "/" + filename; if (!storage.LoadStringsFrom(dbc_filename_loc.c_str())) localeData.availableDbcLocales &= ~(1 << i);// mark as not available for speedup next checks } } else { // sort problematic dbc to (1) non compatible and (2) nonexistent FILE* f = fopen(dbc_filename.c_str(), "rb"); if (f) { char buf[100]; snprintf(buf, 100, " (exist, but have %u fields instead " SIZEFMTD ") Wrong client version DBC file?", storage.GetFieldCount(), strlen(storage.GetFormat())); errlist.push_back(dbc_filename + buf); fclose(f); } else errlist.push_back(dbc_filename); } }