?? binfilefactory_text.cpp
字號:
// BinFileFactory_Ring.cpp: implementation of the CBinFileFactory class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ResourceEditor.h"
#include "BinFileFactory.h"
#include "MMIRes.h"
#include "DirFileInfo.h"
#include "Converter.h"
#include "mmi_text_def.h"
#include <memory>
void CBinFileFactory::CalcTextInfo()
{
_ASSERTE( m_dwTextOffset > 0 );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TextData = res.mmi_data_table[MMI_RT_TEXT];
TEXT_MAP &txtMap = mmires.m_mapText;
DWORD dwBase = res.ToolUsedInfo.nStartAddress;
BOOL bIsOffset = res.ToolUsedInfo.bAddrIsOffset;
TextData.pData = (void *)CalcAddr(dwBase, m_dwTextOffset, bIsOffset);
// 保持4字節對齊
_ASSERTE((uint32)TextData.pData % sizeof(uint32) == 0);
TextData.uCount = txtMap.GetCount();
TextData.uSize = 0;
PTEXTINFO pTextInfo = NULL;
CString strID;
POSITION pos = mmires.m_mapText.GetStartPosition();
while( pos != NULL )
{
txtMap.GetNextAssoc( pos, strID, pTextInfo );
TextData.uSize += sizeof(char *) + sizeof(uint8 *) + sizeof(char *);
// 注意:需要包含結尾符0
TextData.uSize += Addr4ByteAlign(strlen(pTextInfo->szEnglish) + 1);
TextData.uSize += Addr4ByteAlign((UCHAR)(pTextInfo->szSimpleChinese[0]) + 1);
TextData.uSize += Addr4ByteAlign((UCHAR)(pTextInfo->szTraditionalChinese[0]) + 1);
}
if( TextData.uCount > 0 )
{
TextData.uSize += sizeof(KSP_TEXT_T) * TT_MAX_NUM;
}
m_dwFontOffset = m_dwTextOffset + TextData.uSize;
m_dwFontOffset = Addr4ByteAlign(m_dwFontOffset);
}
//xb
void CBinFileFactory::CalcTextInfoEx()
{
_ASSERTE( m_dwTextOffset > 0 );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TextData = res.mmi_data_table[MMI_RT_TEXT];
TEXTEX_MAP &txtExMap = mmires.m_mapTextEx;
int &nLangNum = g_theApp.m_nUsedLangNum;
DWORD dwBase = res.ToolUsedInfo.nStartAddress;
BOOL bIsOffset = res.ToolUsedInfo.bAddrIsOffset;
TextData.pData = (void *)CalcAddr(dwBase, m_dwTextOffset, bIsOffset);
// 保持4字節對齊
_ASSERTE((uint32)TextData.pData % sizeof(uint32) == 0);
TextData.uCount = txtExMap.GetCount();
TextData.uSize = 0;
PTEXTINFOEX pTextInfoEx = NULL;
CString strID;
POSITION pos = mmires.m_mapTextEx.GetStartPosition();
int nStrSize = 0;
while( pos != NULL )
{
txtExMap.GetNextAssoc( pos, strID, pTextInfoEx );
for(int i = 0; i < g_theApp.m_nUsedLangNum; i++)
{
//語言的指針所占的字節數
TextData.uSize += sizeof(char *);
if((UCHAR)pTextInfoEx->szLanguage[i][0]<0x80) //ASCII
{
// 注意:需要包含結尾符0
TextData.uSize += Addr4ByteAlign(strlen(pTextInfoEx->szLanguage[i]) + 1 );
}
else //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTextInfoEx->szLanguage[i]+1);
nStrSize = *lpwStrSize;
TextData.uSize += Addr4ByteAlign(nStrSize + 3);
}
}
}
if( TextData.uCount > 0 )
{
TextData.uSize += sizeof(KSP_TEXT_T) * nLangNum;
}
m_dwFontOffset = m_dwTextOffset + TextData.uSize;
m_dwFontOffset = Addr4ByteAlign(m_dwFontOffset);
}
//xe*/
BOOL CBinFileFactory::WriteTextInfo( FILE * pFile )
{
_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;
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
_ASSERTE(( (uint32)ftell(pFile) == ((uint32)TxtData.pData +g_theApp.prj_arm_addr))||
( (uint32)ftell(pFile) == ((uint32)TxtData.pData +g_theApp.prj_win_addr)));
///////////////////////////////////////////////////////////////////////////////
#define WRITE_FILE(des, st, num, file) \
if( fwrite(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Write file error!")); \
return FALSE; \
}
///////////////////////////////////////////////////////////////////////////////
KSP_TEXT_T kspTxt[TT_MAX_NUM];
kspTxt[TT_ENGLISH].pTxtTable = (char *)TxtData.pData + sizeof(kspTxt);
kspTxt[TT_CHINESESIMPLE].pTxtTable = kspTxt[TT_ENGLISH].pTxtTable + sizeof(char *) * nCount;
kspTxt[TT_CHINESETRADITIONAL].pTxtTable = kspTxt[TT_CHINESESIMPLE].pTxtTable + sizeof(uint8 *) * nCount;
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
kspTxt[TT_ENGLISH].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_ENGLISH].pTxtTable);
kspTxt[TT_CHINESESIMPLE].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_CHINESESIMPLE].pTxtTable);
kspTxt[TT_CHINESETRADITIONAL].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_CHINESETRADITIONAL].pTxtTable);
}
WRITE_FILE(kspTxt, sizeof(kspTxt), 1, pFile);
if( bBigEdn )
{
kspTxt[TT_ENGLISH].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_ENGLISH].pTxtTable);
kspTxt[TT_CHINESESIMPLE].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_CHINESESIMPLE].pTxtTable);
kspTxt[TT_CHINESETRADITIONAL].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)kspTxt[TT_CHINESETRADITIONAL].pTxtTable);
}
CStringArray arrID;
pInfo->CalcAllLeafID(arrID);
_ASSERTE( nCount == arrID.GetSize() );
_ASSERTE( nCount == txtMap.GetCount() );
uint32 nAddr =(uint32)kspTxt[TT_CHINESETRADITIONAL].pTxtTable + sizeof(char *) * nCount;
nAddr = Addr4ByteAlign(nAddr);
int i = 0;
PTEXTINFO pTxtInfo = NULL;
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
WRITE_FILE(&nAddr, sizeof(nAddr), 1, pFile);
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
nAddr += (strlen(pTxtInfo->szEnglish) + 1);
nAddr = Addr4ByteAlign(nAddr);
}
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
WRITE_FILE(&nAddr, sizeof(nAddr), 1, pFile);
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
nAddr += (UCHAR)(pTxtInfo->szSimpleChinese[0]) + 1;
nAddr = Addr4ByteAlign(nAddr);
}
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
WRITE_FILE(&nAddr, sizeof(nAddr), 1, pFile);
if( bBigEdn ) nAddr = conv.ConvEdn_INT(nAddr);
if( pTxtInfo->szTraditionalChinese[0] == 0 )
pTxtInfo->szTraditionalChinese[0] = 1;
nAddr += (UCHAR)(pTxtInfo->szTraditionalChinese[0]) + 1;
nAddr = Addr4ByteAlign(nAddr);
}
BYTE arrAlign[] = { 0x00, 0x00, 0x00, 0x00 };
int nSize = 0;
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
nSize = strlen(pTxtInfo->szEnglish) + 1;
WRITE_FILE(pTxtInfo->szEnglish, nSize, 1, pFile);
nAddr = Addr4ByteAlign(nSize);
fwrite(arrAlign, nAddr - nSize, 1, pFile);
}
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
nSize = (UCHAR)(pTxtInfo->szSimpleChinese[0]) + 1;
WRITE_FILE(pTxtInfo->szSimpleChinese, nSize, 1, pFile);
nAddr = Addr4ByteAlign(nSize);
fwrite(arrAlign, nAddr - nSize, 1, pFile);
}
for( i = 0; i < nCount; ++i )
{
VERIFY( txtMap.Lookup(arrID[i], pTxtInfo) );
nSize = (UCHAR)(pTxtInfo->szTraditionalChinese[0]) + 1;
WRITE_FILE(pTxtInfo->szTraditionalChinese, nSize, 1, pFile);
nAddr = Addr4ByteAlign(nSize);
fwrite(arrAlign, nAddr - nSize, 1, pFile);
}
return TRUE;
}
//ex
BOOL CBinFileFactory::WriteTextInfoEx( FILE * pFile )
{
_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_nUsedLangNum;
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
_ASSERTE(( (uint32)ftell(pFile) == ((uint32)TxtData.pData +g_theApp.prj_arm_addr))||
( (uint32)ftell(pFile) == ((uint32)TxtData.pData +g_theApp.prj_win_addr)));
///////////////////////////////////////////////////////////////////////////////
#define WRITE_FILE_EX(des, st, num, file) \
if( fwrite(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Write file error!")); \
return FALSE; \
}
///////////////////////////////////////////////////////////////////////////////
PKSP_TEXT_T pKspText = (PKSP_TEXT_T)new KSP_TEXT_T[nLangNum];
if(NULL== pKspText)
return FALSE;
pKspText[0].pTxtTable = (char *)TxtData.pData + sizeof(KSP_TEXT_T)*nLangNum;
pKspText[0].nbText = nLangNum;
int i = 0,j=0;
for(i = 1; i < nLangNum; i++)
{
pKspText[i].pTxtTable = pKspText[i-1].pTxtTable + sizeof(char *) * nCount;
pKspText[i].nbText = nLangNum;
}
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
for(i=0;i<nLangNum;i++)
{
pKspText[i].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)pKspText[i].pTxtTable);
}
}
WRITE_FILE_EX(pKspText, sizeof(KSP_TEXT_T)*nLangNum, 1, pFile);
if( bBigEdn )
{
for(i=0;i<nLangNum;i++)
{
pKspText[i].pTxtTable = (char *)conv.ConvEdn_INT((DWORD)pKspText[i].pTxtTable);
}
}
CStringArray arrID;
pInfo->CalcAllLeafID(arrID);
_ASSERTE( nCount == arrID.GetSize() );
_ASSERTE( nCount == txtExMap.GetCount() );
uint32 nAddr =(uint32)pKspText[nLangNum-1].pTxtTable + sizeof(char *) * nCount;
nAddr = Addr4ByteAlign(nAddr);
PTEXTINFOEX pTxtInfoEx = NULL;
int nStrSize = 0;
for(j=0; j < nLangNum; j++)
{
for( i = 0; i < nCount; ++i )
{
VERIFY( txtExMap.Lookup(arrID[i], pTxtInfoEx) );
if( bBigEdn )
nAddr = conv.ConvEdn_INT(nAddr);
WRITE_FILE_EX(&nAddr, sizeof(nAddr), 1, pFile);
if( bBigEdn )
nAddr = conv.ConvEdn_INT(nAddr);
//@hongliang.xin 2006-11-23
if((UCHAR)(pTxtInfoEx->szLanguage[j][0])<(UCHAR)0x80) //ASCII
{
nAddr += (strlen(pTxtInfoEx->szLanguage[j]) + 1 );
}
else //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
nStrSize = (int)*lpwStrSize;
nAddr += (nStrSize + 3);
}
/* if(g_theApp.m_nArrLangCBN[j]==1)
nAddr += (strlen(pTxtInfoEx->szLanguage[j]) + 1);
else
{
if( pTxtInfoEx->szLanguage[j][0] == 1 )
pTxtInfoEx->szLanguage[j][0] = 0;
nAddr += ((UCHAR)(pTxtInfoEx->szLanguage[j][0]) + 1);
}
*/
nAddr = Addr4ByteAlign(nAddr);
}
}
BYTE arrAlign[] = { 0x00, 0x00, 0x00, 0x00 };
int nSize = 0;
for( j = 0; j < nLangNum; j++ )
{
for( i = 0; i < nCount; ++i )
{
VERIFY( txtExMap.Lookup(arrID[i], pTxtInfoEx) );
//@hongliang.xin 2006-11-23
if((UCHAR)(pTxtInfoEx->szLanguage[j][0])<(UCHAR)0x80) //ASCII
{
nSize = strlen(pTxtInfoEx->szLanguage[j]) + 1;
WRITE_FILE_EX(pTxtInfoEx->szLanguage[j], nSize, 1, pFile);
}
else //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
WORD wStrSize = *lpwStrSize;
nStrSize = wStrSize;
nSize = nStrSize + 3;
//@hongliang.xin 2006-12-22
//都要存為Big Endian,都需要轉換
//if(bBigEdn) //轉換
conv.LitEdnToBigEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
WRITE_FILE_EX(pTxtInfoEx->szLanguage[j], nSize, 1, pFile);
//if(bBigEdn)//轉換回來
conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
}
/* if(g_theApp.m_nArrLangCBN[j]==1)
nSize = strlen(pTxtInfoEx->szLanguage[j]) + 1;
else
nSize = (UCHAR)(pTxtInfoEx->szLanguage[j][0]) + 1;
WRITE_FILE_EX(pTxtInfoEx->szLanguage[j], nSize, 1, pFile);
*/
nAddr = Addr4ByteAlign(nSize);
fwrite(arrAlign, nAddr - nSize, 1, pFile);
}
}
return TRUE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -