📄 binfilefactory.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 + -