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

📄 binfilefactory.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
字号:
// BinFileFactory.cpp: implementation of the CBinFileFactory class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ResourceEditor.h"
#include "BinFileFactory.h"
#include "MMIRes.h"
#include "Converter.h"

#include "FileDlg.h"

const _TCHAR CBinFileFactory::SZ_FILE_EXT[] = _T(".bin");
const _TCHAR CBinFileFactory::SZ_FILTER[]   = _T("resource files (*.bin)|*.bin|All Files (*.*)|*.*||");
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBinFileFactory::CBinFileFactory()
{
    m_dwAnimOffset = 0;
    m_dwRingOffset = 0;
    m_dwTextOffset = 0;
    m_dwFontOffset = 0;
}

CBinFileFactory::~CBinFileFactory()
{

}

CString CBinFileFactory::GetBinFileName( BOOL bOpen /* = TRUE */ )
{
    CFileDlg fileDlg(bOpen);

    fileDlg.SetFileExt(SZ_FILE_EXT);
    fileDlg.SetFileFilter(SZ_FILTER);
	/*@Hongliang Xin 2006-5-30*/
	//Check the length of file name no more than 128 chars
	//Begin
	static CString strPathName = _T("");
	strPathName=fileDlg.GetPathName();
	int nNameLenght = strPathName.GetLength()-strPathName.ReverseFind('\\')-1-4; //4 is the length of extend name
	if(nNameLenght>128)
	{
		AfxMessageBox(_T("The length of file name is not more than 128 chars"));
		strPathName = _T("");
		GetBinFileName(bOpen);
	}

	return strPathName;
	//End*/
	//return fileDlg.GetPathName();
}

CString CBinFileFactory::MakeBinFileName( LPCTSTR pszFileName )
{
    _ASSERTE( pszFileName != NULL );

    CString strFileName = pszFileName;
    int nFind = strFileName.ReverseFind(_T('.'));
    _ASSERTE( nFind > 3 ); // 文件名的最小长度,如c:\a.txt

    strFileName = strFileName.Left(nFind);

    strFileName += SZ_FILE_EXT;

    return strFileName;
}

BOOL CBinFileFactory::SaveFile( LPCTSTR pszFileName )
{
    _ASSERTE( pszFileName != NULL );

    if( !FileIsWritable(pszFileName) )
        return FALSE;

    m_dwAnimOffset = 0;
    m_dwRingOffset = 0;
    m_dwTextOffset = 0;
    m_dwFontOffset = 0;

    // 计算信息的偏移
    CalcImgInfo();
    CalcAnimInfo();
    CalcRingInfo();
	CalcTextInfoEx();
	CalcFontInfoEx();


    FILE * pFile = _tfopen(pszFileName, _T("r+b"));
    if( pFile == NULL )
    {
        _stprintf(m_szErrMsg, _T("open prj&bin file \"%s\" fail!"), pszFileName);

        return FALSE;
    }
	PRJ_BIN_ADDR_DATA prj_info;
	if (fread(&prj_info,sizeof(PRJ_BIN_ADDR_DATA),1,pFile)!=1)
	{
		 _stprintf(m_szErrMsg, _T("read file \"%s\" prj&bin info fail!"), pszFileName);
		fclose(pFile);
        return FALSE;
	}
    //MMI_RESOURCE_T res;
    memcpy(&res, &g_theApp.m_MMIRes.m_Resource, sizeof(res));
    if( res.ToolUsedInfo.bBigEndian )
    {
        CConverter conv;
        for( int i = MMI_RT_IMAGE; i < MMI_RT_MAX_NUM; ++i )
        {
            res.mmi_data_table[i].pData  = (LPVOID)conv.ConvEdn_INT((DWORD)res.mmi_data_table[i].pData);
            res.mmi_data_table[i].uCount = conv.ConvEdn_INT((DWORD)res.mmi_data_table[i].uCount);
            res.mmi_data_table[i].uSize  = conv.ConvEdn_INT((DWORD)res.mmi_data_table[i].uSize);
        }
		fseek(pFile,prj_info.arm_addr,SEEK_SET);
    }
	else
	{
		fseek(pFile,prj_info.win_addr,SEEK_SET);
	}

    if( fwrite(&res, sizeof(res), 1, pFile) != 1 )
    {
        _ASSERTE( 0 );
        _tcscpy(m_szErrMsg, _T("The file size is incorrect!"));
        fclose(pFile);
        return FALSE;
    }

    typedef BOOL(CBinFileFactory::*PFUN)(FILE * pFile);

    PFUN pFun [] = { WriteImgInfo,  WriteAnimInfo, WriteRingInfo, 
                     WriteTextInfoEx, WriteFontInfoEx }; //xe*/

    int nCount = sizeof(pFun) / sizeof(pFun[0]);
    for( int i = 0; i < nCount; ++i )
    {
        if( !(this->*pFun[i])(pFile) )
        {
            fclose(pFile);
            return FALSE;
        }
    }
	if( res.ToolUsedInfo.bBigEndian )
	{
		uint32 naddr=0;
		naddr=ftell(pFile);
		g_theApp.prj_win_addr=prj_info.win_addr=Addr4ByteAlign(naddr);
		fseek(pFile,0,SEEK_SET);
		if (fwrite(&prj_info,sizeof(PRJ_BIN_ADDR_DATA),1,pFile)!=1)
		{
			_tcscpy(m_szErrMsg, _T("write the project addr fail!"));
			fclose(pFile);
			return FALSE;
		}
	}
	fclose(pFile);

    return TRUE;
}

BOOL CBinFileFactory::OpenFile( LPCTSTR pszFileName, BOOL bBuildInfo /* = FALSE*/ )
{
    _ASSERTE( pszFileName != NULL );

    FILE * pFile = _tfopen(pszFileName, _T("rb"));
    if( NULL == pFile )
    {
        _stprintf(m_szErrMsg, _T("The file \"%s\" not exist or can't opened!"), pszFileName);
        return FALSE;
    }
    PRJ_BIN_ADDR_DATA prj_info;
	if (fread(&prj_info,sizeof(PRJ_BIN_ADDR_DATA),1,pFile)!=1)
	{
		 _tcscpy(m_szErrMsg, _T("read the bin file addr info fail!"));
        fclose(pFile);
        return FALSE;
	}
	if(0!=fseek(pFile,prj_info.arm_addr,SEEK_SET))
	{
		_tcscpy(m_szErrMsg, _T("read the arm bin file addr info fail!"));
        fclose(pFile);
        return FALSE;
	}
    MMI_RESOURCE_T resTemp = { 0 };
    MMI_RESOURCE_T &res = g_theApp.m_MMIRes.m_Resource;
    if( fread(&resTemp, sizeof(resTemp), 1, pFile) != 1 )
    {
        _stprintf(m_szErrMsg, _T("read file \"%s\" fail!"), pszFileName);
        fclose(pFile);
        return FALSE;
    }

    BOOL bMatch = TRUE;
	if (g_theApp.m_isclickopen)
	{
		g_theApp.m_isclickopen=FALSE;
	}
	else
	{
		if( bBuildInfo )
		{
			 //if( _tcsstr(resTemp.ToolUsedInfo.szOtherInfo, SZ_FILE_FLAG) == NULL )
			 //xb
			 //if( _tcsstr((char *)&(resTemp.ToolUsedInfo.szOtherInfo[3]), (char *)&(SZ_FILE_FLAG[3])) == NULL )
			 if( strstr((char *)(resTemp.ToolUsedInfo.szOtherInfo+3), (char *)(SZ_FILE_FLAG+3)) == NULL )
			 //xe*/
				bMatch = FALSE;
		}
		else 
		{
			if( g_theApp.m_MMIRes.m_iVersion == 1)
				NULL;
			else if(g_theApp.m_MMIRes.m_iVersion == 2)
				NULL;
			else if(g_theApp.m_MMIRes.m_iVersion == 3)
				NULL;
			else if(g_theApp.m_MMIRes.m_iVersion == 4)
				NULL;
			else if(g_theApp.m_MMIRes.m_iVersion == 5)
				NULL;
			else if(g_theApp.m_MMIRes.m_iVersion == 6)
				NULL;
			else
			{        
				if( memcmp(&resTemp.ToolUsedInfo, &res.ToolUsedInfo, sizeof(res.ToolUsedInfo)) != 0  )
				bMatch = FALSE;
			}
		}
	}
    if( !bMatch )
    {
        fclose(pFile);
        if( bBuildInfo )
            _tcscpy(m_szErrMsg, _T("The file's type is incorrect!"));
        else
            _tcscpy(m_szErrMsg, _T("The project file not match the resource file!"));

        return FALSE;
    }

    memcpy(&res, &resTemp, sizeof(res));
	/*//xb
    uint16 nLangNum;
	char *pszOtherInfo = res.ToolUsedInfo.szOtherInfo;
	char *p = (char *)&nLangNum;
    memcpy(p,pszOtherInfo,sizeof(uint16));
	g_theApp.m_nUsedLangNum = nLangNum;
	//xe*/
    
    typedef BOOL(CBinFileFactory::*PFUN)(FILE * pFile, BOOL bBuildInfo );
    
    PFUN pFun [] = { ReadImgInfo,  ReadAnimInfo, ReadRingInfo, 
                         ReadTextInfo, ReadFontInfo }; 
    
//对最初的版本不兼容
//    if( g_theApp.m_MMIRes.m_iVersion == 1)
//    { 
        pFun [3] = ReadTextInfoOne;
//    }  
    
	if(g_theApp.m_MMIRes.m_iVersion == 2 || g_theApp.m_MMIRes.m_iVersion == 3 )
	{ 
        pFun [3] = ReadTextInfo3;
	}
	
	if(g_theApp.m_MMIRes.m_iVersion >= 4)
	{
		pFun [3] = ReadTextInfoEx;
	}

	if(g_theApp.m_MMIRes.m_iVersion >= 3)
	{
        pFun [4] = ReadFontInfoEx;
	}

	if(g_theApp.m_MMIRes.m_iVersion ==5 ||g_theApp.m_MMIRes.m_iVersion ==6  )
	{
        pFun[0] = ReadImgInfo_v5;
		pFun[1] = ReadAnimInfo_v5;
	}


    int nCount = sizeof(pFun) / sizeof(pFun[0]);
    for( int i = 0; i < nCount; ++i )
    {
        if( !(this->*pFun[i])(pFile, bBuildInfo) )
        {
            fclose(pFile);
            return FALSE;
        }
    }

    fclose(pFile);

    return TRUE;
}

⌨️ 快捷键说明

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