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

📄 binfilefactory_text.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}


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 + -