📄 binfilefactory_text.cpp
字号:
}
BOOL CBinFileFactory::ReadTextInfo( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TxtData = res.mmi_data_table[MMI_RT_TEXT];
TEXT_MAP &txtMap = mmires.m_mapText;
CDirFileInfo * pInfo = g_theApp.m_pTextInfo;
//xb
TEXTEX_MAP &txtExMap= mmires.m_mapTextEx;
//xe*/
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
TxtData.uCount = conv.ConvEdn_INT(TxtData.uCount);
TxtData.uSize = conv.ConvEdn_INT(TxtData.uSize);
}
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(text info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == txtMap.GetCount() );
SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * TT_MAX_NUM );
std::auto_ptr<DWORD>Addr(new DWORD[nCount * TT_MAX_NUM]);
LPDWORD pAddr = (LPDWORD)Addr.get();
if( pAddr == NULL )
return FALSE;
READ_FILE(pAddr, sizeof(char *) * nCount * TT_MAX_NUM, 1, pFile);
if( bBigEdn )
{
for( i = 0; i < nCount * TT_MAX_NUM; ++i )
pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
}
PTEXTINFO pTxtInfo = NULL;
//xb
std::auto_ptr<DWORD>AddrEx(new DWORD[nCount * TT_MAX_NUM]);
LPDWORD pAddrEx = (LPDWORD)AddrEx.get();
if( pAddrEx == NULL )
return FALSE;
memcpy(pAddrEx,pAddr,sizeof(char *) * nCount * TT_MAX_NUM);
if( bBigEdn )
{
for( i = 0; i < nCount * TT_MAX_NUM; ++i )
pAddrEx[i] = conv.ConvEdn_INT(pAddrEx[i]);
}
PTEXTINFOEX pTxtInfoEx = NULL;
//xe*/
for( i = 0; i < nCount; ++i )
{
pTxtInfo = new TEXT_INFO_T;
if( NULL == pTxtInfo )
return FALSE;
//xb
pTxtInfoEx = new TEXT_INFO_T_EX;
if( NULL == pTxtInfoEx )
return FALSE;
//xe*/
READ_FILE( pTxtInfo->szEnglish, pAddr[i+1] - pAddr[i], 1, pFile );
//xb
memcpy(pTxtInfoEx->szLanguage[0],pTxtInfo->szEnglish,pAddr[i+1] - pAddr[i]);
//xe*/
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
{
delete pTxtInfo;
return FALSE;
}
_stprintf(pNode->szID, _T("TXT_%03d"), i);
_tcscpy(pNode->szName, pNode->szID);
pInfo->AddChild(pRoot, pNode);
txtMap.SetAt(pNode->szID, pTxtInfo );
//xb
txtExMap.SetAt(pNode->szID, pTxtInfoEx );
//xe*/
arrID.Add( pNode->szID );
}
else
{
txtMap.SetAt(arrID[i], pTxtInfo );
//xb
txtExMap.SetAt(arrID[i], pTxtInfoEx );
//xe*/
}
}
for( i = nCount; i < nCount * 2 - 1; ++i )
{
VERIFY( txtMap.Lookup(arrID[i-nCount], pTxtInfo) );
READ_FILE( pTxtInfo->szSimpleChinese, pAddr[i+1] - pAddr[i], 1, pFile );
//xb
VERIFY( txtExMap.Lookup(arrID[i-nCount], pTxtInfoEx) );
memcpy(pTxtInfoEx->szLanguage[1],pTxtInfo->szSimpleChinese,pAddr[i+1] - pAddr[i]);
//xe*/
}
// 读最后一个
VERIFY( txtMap.Lookup(arrID[nCount - 1], pTxtInfo) );
READ_FILE( pTxtInfo->szSimpleChinese, 1, 1, pFile );
READ_FILE( pTxtInfo->szSimpleChinese + 1, (UCHAR)pTxtInfo->szSimpleChinese[0], 1, pFile );
//xb
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
memcpy(pTxtInfoEx->szLanguage[1],pTxtInfo->szSimpleChinese,(UCHAR)pTxtInfo->szSimpleChinese[0]+1);
//xe*/
int nAlign = Addr4ByteAlign( (UCHAR)pTxtInfo->szSimpleChinese[0] + 1 );
//xb
Addr4ByteAlign( (UCHAR)pTxtInfoEx->szLanguage[1][0] + 1 );
//xe*/
// 已经读取一个(长度),需要-1
fseek(pFile, nAlign - (UCHAR)pTxtInfo->szSimpleChinese[0] - 1, SEEK_CUR);
for( i = nCount * 2; i < nCount * 3 - 1; ++i )
{
VERIFY( txtMap.Lookup(arrID[i-nCount * 2], pTxtInfo) );
READ_FILE( pTxtInfo->szTraditionalChinese, pAddr[i+1] - pAddr[i], 1, pFile );
//xb
VERIFY( txtExMap.Lookup(arrID[i-nCount * 2], pTxtInfoEx) );
memcpy(pTxtInfoEx->szLanguage[2],pTxtInfo->szTraditionalChinese,pAddr[i+1] - pAddr[i]);
//xe*/
}
// 读TraditionalChinese
VERIFY( txtMap.Lookup(arrID[nCount - 1], pTxtInfo) );
READ_FILE( pTxtInfo->szTraditionalChinese, 1, 1, pFile );
READ_FILE( pTxtInfo->szTraditionalChinese + 1, (UCHAR)pTxtInfo->szTraditionalChinese[0], 1, pFile );
//xb
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
memcpy(pTxtInfoEx->szLanguage[2],pTxtInfo->szTraditionalChinese,(UCHAR)pTxtInfo->szTraditionalChinese[0]+1);
//xe*/
nAlign = Addr4ByteAlign( (UCHAR)pTxtInfo->szTraditionalChinese[0] + 1 );
//xb
Addr4ByteAlign( (UCHAR)pTxtInfoEx->szLanguage[2][0] + 1 );
//xe*/
// 已经读取一个(长度),需要-1
fseek(pFile, nAlign - (UCHAR)pTxtInfo->szTraditionalChinese[0] - 1, SEEK_CUR);
return TRUE;
}
BOOL CBinFileFactory::ReadTextInfoOne( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TxtData = res.mmi_data_table[MMI_RT_TEXT];
TEXTONE_MAP &txtMapOne = mmires.m_mapTextOne;
CDirFileInfo * pInfo = g_theApp.m_pTextInfo;
TEXT_MAP &txtMap = mmires.m_mapText;
g_theApp.m_MMIRes.m_iReset = 0;
//xb
TEXTEX_MAP &txtExMap= mmires.m_mapTextEx;
//xe*/
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
TxtData.uCount = conv.ConvEdn_INT(TxtData.uCount);
TxtData.uSize = conv.ConvEdn_INT(TxtData.uSize);
}
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(text info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == txtMap.GetCount() );
SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * TT_MAX_NUM_ONE );
std::auto_ptr<DWORD>Addr(new DWORD[nCount * TT_MAX_NUM_ONE]);
LPDWORD pAddr = (LPDWORD)Addr.get();
if( pAddr == NULL )
return FALSE;
READ_FILE(pAddr, sizeof(char *) * nCount * TT_MAX_NUM_ONE, 1, pFile);
if( bBigEdn )
{
for( i = 0; i < nCount * TT_MAX_NUM_ONE; ++i )
pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
}
//PTEXTINFO pTxtInfo = NULL;
PTEXTINFOEX pTxtInfoEx = NULL;
TEXT_INFO_T_ONE *ptiOld = new TEXT_INFO_T_ONE;
for( i = 0; i < nCount; ++i )
{
pTxtInfoEx = new TEXT_INFO_T_EX;
if( NULL == pTxtInfoEx )
return FALSE;
READ_FILE( ptiOld->szEnglish, pAddr[i+1] - pAddr[i], 1, pFile );
strncpy( pTxtInfoEx->szLanguage[0], ptiOld->szEnglish, sizeof(ptiOld->szEnglish) );
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
{
delete pTxtInfoEx;
return FALSE;
}
_stprintf(pNode->szID, _T("TXT_%03d"), i);
_tcscpy(pNode->szName, pNode->szID);
pInfo->AddChild(pRoot, pNode);
txtExMap.SetAt(pNode->szID, pTxtInfoEx );
arrID.Add( pNode->szID );
}
else
{
txtExMap.SetAt(arrID[i], pTxtInfoEx );
}
}
char szTemp[MAX_TEXT_LEN+8] = {0};
char szDest[MAX_TEXT_LEN+8] = {0};
for( i = nCount; i < nCount * 2 - 1; ++i )
{
VERIFY( txtExMap.Lookup(arrID[i-nCount], pTxtInfoEx) );
memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
READ_FILE( szTemp, pAddr[i+1] - pAddr[i], 1, pFile );
if((UCHAR)szTemp[0]>0)
{
conv.BigEdnToLitEdn((LPWORD)(szTemp + 1),(UCHAR)szTemp[0] / 2);
if(!HasUcs2Char((LPCTSTR)(szTemp+1),(UCHAR)szTemp[0]))//skip len
{
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)(szTemp+1),-1,szDest,MAX_TEXT_LEN+8,NULL,NULL);
strcpy(pTxtInfoEx->szLanguage[1], szDest);
}
else
{
pTxtInfoEx->szLanguage[1][0] = (UCHAR)0x80;
LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[1]+1);
*lpwSize = (UCHAR)szTemp[0];
memcpy(pTxtInfoEx->szLanguage[1]+3,szTemp+1,*lpwSize);
}
}
for(int n = 2; n<g_theApp.m_nUsedLangNum; n++)
strncpy( pTxtInfoEx->szLanguage[n], "", sizeof(_T("")));
}
// 读最后一个
memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
READ_FILE( szTemp, 1, 1, pFile );
if((UCHAR)szTemp[0]>0)
{
READ_FILE( szTemp+1, (UCHAR)szTemp[0], 1, pFile );
conv.BigEdnToLitEdn((LPWORD)(szTemp + 1),((UCHAR)szTemp[0]) / 2);
if(!HasUcs2Char((LPCTSTR)(szTemp+1),(UCHAR)szTemp[0]))//skip len
{
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)(szTemp+1),-1,szDest,MAX_TEXT_LEN+8,NULL,NULL);
strcpy(pTxtInfoEx->szLanguage[1], szDest);
}
else
{
pTxtInfoEx->szLanguage[1][0] = (UCHAR)0x80;
LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[1]+1);
*lpwSize = (UCHAR)szTemp[0];
memcpy(pTxtInfoEx->szLanguage[1]+3,szTemp+1,*lpwSize);
}
}
for(int n = 2; n<g_theApp.m_nUsedLangNum; n++)
strncpy( pTxtInfoEx->szLanguage[n], "", sizeof(""));
int nAlign = Addr4ByteAlign( (UCHAR)szTemp[0] + 1 );
// 已经读取一个(长度),需要-1
fseek(pFile, nAlign - (UCHAR)szTemp[0]- 1, SEEK_CUR);
delete ptiOld;
return TRUE;
}
BOOL CBinFileFactory::ReadTextInfoEx( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TxtData = res.mmi_data_table[MMI_RT_TEXT];
TEXTEX_MAP &txtExMap = mmires.m_mapTextEx;
CDirFileInfo * pInfo = g_theApp.m_pTextInfo;
int &nLangNum = g_theApp.m_nOldUsedLangNum;
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
TxtData.uCount = conv.ConvEdn_INT(TxtData.uCount);
TxtData.uSize = conv.ConvEdn_INT(TxtData.uSize);
}
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(text info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == txtExMap.GetCount() );//xe*/
//SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * MAX_LANG_NUM );
SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * nLangNum );
std::auto_ptr<DWORD>Addr(new DWORD[nCount * nLangNum]);
LPDWORD pAddr = (LPDWORD)Addr.get();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -