⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binfilefactory_text.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -