Files
MinecraftConsoles/Minecraft.Client/StringTable.cpp
void_17 d63f79325f Get rid of MSVC's __int64
Use either int64_t, uint64_t or long long and unsigned long long, defined as per C++11 standard
2026-03-02 15:53:32 +07:00

173 lines
3.1 KiB
C++

#include "StdAfx.h"
#include "StringTable.h"
StringTable::StringTable(void)
{
}
// Load string table from a binary blob, filling out with the current localisation data only
StringTable::StringTable(PBYTE pbData, DWORD dwSize)
{
src = byteArray(pbData, dwSize);
ByteArrayInputStream bais(src);
DataInputStream dis(&bais);
int versionNumber = dis.readInt();
int languagesCount = dis.readInt();
vector< pair<wstring, int> > langSizeMap;
for(int i = 0; i < languagesCount; ++i)
{
wstring langId = dis.readUTF();
int langSize = dis.readInt();
langSizeMap.push_back( vector< pair<wstring, int> >::value_type(langId, langSize));
}
vector<wstring> locales;
app.getLocale(locales);
bool foundLang = false;
int64_t bytesToSkip = 0;
int dataSize = 0;
//
for( AUTO_VAR(it_locales, locales.begin());
it_locales!=locales.end() && (!foundLang);
it_locales++
)
{
bytesToSkip = 0;
for(AUTO_VAR(it, langSizeMap.begin()); it != langSizeMap.end(); ++it)
{
if(it->first.compare(*it_locales) == 0)
{
app.DebugPrintf("StringTable:: Found language '%ls'.\n", it_locales->c_str());
dataSize = it->second;
foundLang = true;
break;
}
bytesToSkip += it->second;
}
if (!foundLang)
app.DebugPrintf("StringTable:: Can't find language '%ls'.\n", it_locales->c_str());
}
if(foundLang)
{
dis.skip(bytesToSkip);
byteArray langData(dataSize);
dis.read(langData);
dis.close();
ByteArrayInputStream bais2(langData);
DataInputStream dis2(&bais2);
// Read the language file for the selected language
int langVersion = dis2.readInt();
isStatic = false; // 4J-JEV: Versions 1 and up could use
if (langVersion > 0) // integers rather than wstrings as keys.
isStatic = dis2.readBoolean();
wstring langId = dis2.readUTF();
int totalStrings = dis2.readInt();
if (!isStatic)
{
for(int i = 0; i < totalStrings; ++i)
{
wstring stringId = dis2.readUTF();
wstring stringValue = dis2.readUTF();
m_stringsMap.insert( unordered_map<wstring, wstring>::value_type(stringId, stringValue) );
}
}
else
{
for(int i = 0; i < totalStrings; ++i)
m_stringsVec.push_back( dis2.readUTF() );
}
dis2.close();
// We can't delete this data in the dtor, so clear the reference
bais2.reset();
}
else
{
app.DebugPrintf("Failed to get language\n");
#ifdef _DEBUG
__debugbreak();
#endif
isStatic = false;
}
// We can't delete this data in the dtor, so clear the reference
bais.reset();
}
StringTable::~StringTable(void)
{
// delete src.data; TODO 4J-JEV: ?
}
void StringTable::getData(PBYTE *ppData, UINT *pSize)
{
*ppData = src.data;
*pSize = src.length;
}
LPCWSTR StringTable::getString(const wstring &id)
{
#ifndef _CONTENT_PACKAGE
if (isStatic)
{
__debugbreak();
return L"";
}
#endif
AUTO_VAR(it, m_stringsMap.find(id) );
if(it != m_stringsMap.end())
{
return it->second.c_str();
}
else
{
return L"";
}
}
LPCWSTR StringTable::getString(int id)
{
#ifndef _CONTENT_PACKAGE
if (!isStatic)
{
__debugbreak();
return L"";
}
#endif
if (id < m_stringsVec.size())
{
LPCWSTR pwchString=m_stringsVec.at(id).c_str();
return pwchString;
}
else
return L"";
}