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

📄 binfilefactory_text.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if( pAddr == NULL )
        return FALSE;
    
    READ_FILE(pAddr, sizeof(char *) * nCount * nLangNum, 1, pFile);   //?TT_MAX_NUM
    if( bBigEdn )
    {
        for( i = 0; i < nCount * nLangNum; ++i )   //?TT_MAX_NUM
            pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
    }
    
    PTEXTINFOEX pTxtInfoEx = NULL;
	int nStrSize = 0;
	int nNewStrSize = 0;
	int nMaxBuf = (MAX_TEXT_LEN + 8)/2;
	_TCHAR *pszTemp = new _TCHAR[nMaxBuf];
	memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
	//读第一种语言
    for( i = 0; i < nCount; ++i )
    {
        pTxtInfoEx = new TEXT_INFO_T_EX;
        if( NULL == pTxtInfoEx )
            return FALSE;
		memset(pTxtInfoEx,0,sizeof(TEXT_INFO_T_EX));
        
        READ_FILE( pTxtInfoEx->szLanguage[0], pAddr[i+1] - pAddr[i], 1, pFile );
		//@hongliang.xin 2006-12-22
		//已存为Big Endian,都需要转换
		if((UCHAR)pTxtInfoEx->szLanguage[0][0]>=0x80 /*&& bBigEdn*/) //Unicode
		{			
			LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[0]+1);
			WORD wStrSize = *lpwStrSize;
			wStrSize = conv.BigEdnToLitEdn(wStrSize);
			nStrSize = wStrSize;
			conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[0]+1),nStrSize/2+1);

		    memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
			memcpy(pszTemp,pTxtInfoEx->szLanguage[0]+3,nStrSize);
			if(1 == g_theApp.m_nPrecomposed) //紧缩格式
			{
				nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
				memset(pTxtInfoEx->szLanguage[0]+3,0,MAX_TEXT_LEN + 8-3);
				FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[0]+3),nStrSize);
				LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[0]+1);
				*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
				
			}
			else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
			{
				nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
				memset(pTxtInfoEx->szLanguage[0]+3,0,MAX_TEXT_LEN + 8-3);
				FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[0]+3),nStrSize);
				LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[0]+1);
				*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
			}
		}	

        if( bBuildInfo )
        {
            CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
            CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
            if( NULL == pNode )
            {
                delete pTxtInfoEx;
				if(pszTemp != NULL)
					delete pszTemp;
                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 );
        }       
    }
    //读其他语言
	int j = 1;
	for(j = 1; j < nLangNum ; j++)
	{
		for( i = nCount*j; i < nCount * (j+1)-1; ++i )
		{
			VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );
        
			READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i+1] - pAddr[i], 1, pFile );
			//@hongliang.xin 2006-12-22
			//已存为Big Endian,都需要转换
			if((UCHAR)pTxtInfoEx->szLanguage[j][0]>=0x80 /*&& bBigEdn*/) //Unicode
			{			
				LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
				WORD wStrSize = *lpwStrSize;
				wStrSize = conv.BigEdnToLitEdn(wStrSize);
				nStrSize = wStrSize;
				conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
				
				memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
				memcpy(pszTemp,pTxtInfoEx->szLanguage[j]+3,nStrSize);
				if(1 == g_theApp.m_nPrecomposed) //紧缩格式
				{
					nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
					memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
					FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
					LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
					*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
					
				}
				else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
				{
					nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
					memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
					FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
					LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
					*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
				}
			}
		}
  
		// 读最后一个
		VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
		READ_FILE( pTxtInfoEx->szLanguage[j], 1, 1, pFile );
		if((UCHAR)pTxtInfoEx->szLanguage[j][0] < 0x80)
		{
			for( int k=1;k<MAX_TEXT_LEN;k++ )
			{
				READ_FILE( pTxtInfoEx->szLanguage[j]+k, 1, 1, pFile );
				if( pTxtInfoEx->szLanguage[j][k] == 0 )
				{
					break;
				}
			}
			k++;
			int k1 = Addr4ByteAlign(k);
			if( k1 != k )
			{
				fseek(pFile, k1 - k, SEEK_CUR);
			}
		}
		else
		{
			READ_FILE( pTxtInfoEx->szLanguage[j] + 1, sizeof(char)*2, 1, pFile );

			LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
			WORD wStrSize = *lpwStrSize;

			if(bBigEdn) 
			{
				wStrSize = conv.BigEdnToLitEdn(wStrSize);
			}
            nStrSize = wStrSize;

			READ_FILE( pTxtInfoEx->szLanguage[j] + 3, nStrSize, 1, pFile );
			//@hongliang.xin 2006-12-22
			//已存为Big Endian,都需要转换
			//if(bBigEdn)
			    conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
				
            memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
			memcpy(pszTemp,pTxtInfoEx->szLanguage[j]+3,nStrSize);
			if(1 == g_theApp.m_nPrecomposed) //紧缩格式
			{
				nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
				memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
				FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
				LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
				*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
				
			}
			else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
			{
				nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
				memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
				FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
				LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
				*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
			}

			int nAlign = Addr4ByteAlign( nStrSize + 3);
			// 已经读取3个(类型1byte和长度2bytes),需要-3
			fseek(pFile, nAlign - nStrSize - 3, SEEK_CUR);
		}
	}
	if(pszTemp != NULL)
		delete pszTemp;
    return TRUE;
}
//读Prj版本3
BOOL CBinFileFactory::ReadTextInfo3( 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();
    if( pAddr == NULL )
        return FALSE;
    
    READ_FILE(pAddr, sizeof(char *) * nCount * nLangNum, 1, pFile);   //?TT_MAX_NUM
    if( bBigEdn )
    {
        for( i = 0; i < nCount * nLangNum; ++i )   //?TT_MAX_NUM
            pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
    }
    
    PTEXTINFOEX pTxtInfoEx = NULL;
	char szTemp[MAX_TEXT_LEN+8] = {0};
	char szDest[MAX_TEXT_LEN+8] = {0};
    //读第一种语言
    for( i = 0; i < nCount; ++i )
    {
        pTxtInfoEx = new TEXT_INFO_T_EX;
        if( NULL == pTxtInfoEx )
            return FALSE;
		memset(pTxtInfoEx,0,sizeof(TEXT_INFO_T_EX));
        
//        READ_FILE( pTxtInfoEx->szLanguage[0], pAddr[i+1] - pAddr[i], 1, pFile );//en
		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);
			int nStrSize = MultiByteToWideChar(CP_ACP,0,(LPCSTR)(szTemp),-1,NULL,0);
			MultiByteToWideChar(CP_ACP,0,(LPCSTR)(szTemp),-1,(LPTSTR)szDest,nStrSize);
			if(!HasUcs2Char((LPCTSTR)(szDest),nStrSize*2))//skip len
			{				
				strcpy(pTxtInfoEx->szLanguage[0], szTemp);						
			}
			else
			{
				pTxtInfoEx->szLanguage[0][0] = (UCHAR)0x80;
				LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[0]+1);
				*lpwSize = (nStrSize-1)*2;
				memcpy(pTxtInfoEx->szLanguage[0]+3,szDest,*lpwSize);
				
			}
		}

        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 );
        }       
    }

	int j = 1;

	for(j = 1; j < nLangNum ; j++)
	{		
		if(g_theApp.m_nArrLangCBN[j]!=1)
		{
			for( i = nCount*j; i < nCount * (j+1) - 1; ++i )
			{
				memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
				memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
				VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );				
				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[j], szDest);						
					}
					else
					{
						pTxtInfoEx->szLanguage[j][0] = (UCHAR)0x80;
						LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[j]+1);
						*lpwSize = (UCHAR)szTemp[0];
						memcpy(pTxtInfoEx->szLanguage[j]+3,szTemp+1,*lpwSize);
						
					}
				}
			}
            // 读最后一个
			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 );//read len
			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[j], szDest);	
				}
				else
				{
					pTxtInfoEx->szLanguage[j][0] = (UCHAR)0x80;
					LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[j]+1);
					*lpwSize = (UCHAR)szTemp[0];
					memcpy(pTxtInfoEx->szLanguage[j]+3,szTemp+1,*lpwSize);

				}
			
			}
            
			int nAlign = Addr4ByteAlign( (UCHAR)szTemp[0] + 1 );
			// 已经读取一个(长度),需要-1
			fseek(pFile, nAlign - (UCHAR)szTemp[0] - 1, SEEK_CUR);

		}
		else
		{
			for( i = nCount*j; i < nCount * (j+1) - 1; ++i )
			{
				VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );
				
				READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i+1] - pAddr[i], 1, pFile );
				
			}
            // 读最后一个
			VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
     		READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i] - pAddr[i-1], 1, pFile );
		

		}
	}
	return TRUE;
}

BOOL CBinFileFactory::HasUcs2Char(LPCTSTR lpsz,int nSize)
{
	_ASSERTE( lpsz != NULL );
	//判断是否为ASCII的0扩展的Unicode码
	char *p = (LPSTR)lpsz;
	int nIndex=0;
	for(nIndex= 0;nIndex<nSize;nIndex += 2)
	{
		if(!((UCHAR)*(p+nIndex) < (UCHAR)0x80 && (UCHAR)*(p+nIndex+1) == (UCHAR)0))
			break;
	}
	if(nIndex>=nSize)//ASCII
	{
		return FALSE;
	}
	else //Unicode
	{
		return TRUE;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -