Files
mir_server/server/robot/config/LanguageTextProvider.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

139 lines
3.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "LanguageTextProvider.h"
using namespace wylib::stream;
CLanguageTextProvider::CLanguageTextProvider()
:Inherited2(),Inherited(),m_TextAllocator(_T("LangDataAlloc"))
{
m_pAllocator = &m_TextAllocator;
}
CLanguageTextProvider::~CLanguageTextProvider()
{
CLangTextSection::clear();
}
bool CLanguageTextProvider::LoadFromFile(LPCTSTR sFileName)
{
bool boResult = false;
try
{
CMemoryStream ms;
if (ms.loadFromFile(sFileName) <= 0)
{
showErrorFormat(_T("unable to load file %s error code %d"), sFileName, GetLastError());
return false;
}
CCustomLuaPreProcessor pp;
GetRobotMgr()->GetVSPDefine().RegisteToPreprocessor(pp);
//预处理器定义为了加快脚本读取,会注册语言包已加载的宏,此处应当去掉,否则无法读取语言包
pp.removeMacro("_LANGUAGE_INCLUDED_");
LPCSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFileName);
if (!sText)
{
showErrorFormat(_T("unable to pre-precess Language config"));
return false;
}
if (!setScript(sText))
{
showErrorFormat(_T("unable to set Language code-text"));
return false;
}
if (openGlobalTable("Lang"))
{
clear();
boResult = readLanguagePacket(*this);
if(boResult)
{
m_LogicDataAllocator.~CObjectAllocator(); //将申请的内容释放掉
}
closeTable();
if (boResult)
{
OutputMsg(rmTip, _T("[LANGUAGE]Luaguage Load Complete!"));
}
}
}
catch (RefString &s)
{
OutputMsg(rmError, _T("load Language config error: %s"), s.rawStr());
}
catch (...)
{
OutputMsg(rmError, _T("unexpected error on load Language config"));
}
//销毁脚本虚拟机
setScript(NULL);
return boResult;
}
void CLanguageTextProvider::showError(LPCTSTR sError)
{
m_sLastErrDesc = sError;
RefString s = _T("[Language Config Error]");
s += sError;
throw s;
}
bool CLanguageTextProvider::readLanguagePacket(CLangTextSection &Section)
{
//这里无法通过lua_objlen取得表内容数量因为表可能只有None-Array value。所以可能取不到应当遍历统计
int nlen = 0;
lua_pushnil(m_pLua);
while (lua_next(m_pLua, -2))
{
nlen++;
lua_pop(m_pLua, 1);//remove value
}
if (nlen <= 0)
return true;
bool result = true;
Section.setPacket(nlen);
if (enumTableFirst())
{
char sNumKey[64];
const char* pKey;
int nKeyType, nValType;
CLangTextSection *pNewSection;
do
{
nKeyType = lua_type(m_pLua, -2);
nValType = lua_type(m_pLua, -1);
//确定key
if (nKeyType == LUA_TNUMBER)
{
sprintf(sNumKey, "%d", lua_tointeger(m_pLua, -2));
pKey = sNumKey;
}
else pKey = lua_tostring(m_pLua, -2);
//读取和设置值
if (nValType == LUA_TSTRING || nValType == LUA_TNUMBER)
{
pNewSection = Section.addSection(pKey);
pNewSection->setText(lua_tostring(m_pLua, -1));
}
else if (nValType == LUA_TTABLE)
{
pNewSection = Section.addSection(pKey);
result = readLanguagePacket(*pNewSection);
if (!result)
{
endTableEnum();
break;
}
}
}
while (enumTableNext());
}
return result;
}