📄 prjfactory.cpp
字号:
// PrjFactory.cpp: implementation of the CPrjFactory class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resourceeditor.h"
#include "PrjFactory.h"
#include "FileDlg.h"
#include "DirFileInfo.h"
const _TCHAR CPrjFactory::SZ_FILE_EXT[] = _T(".prj");
const _TCHAR CPrjFactory::SZ_FILTER[] = _T("project files (*.prj)|*.prj|All Files (*.*)|*.*||");
//before unicode version
//const _TCHAR CPrjFactory::SZ_FLAG[] = _T("sci_mmires_prj:1.0.4.0");
//inner version, the length must be same
const char CPrjFactory::SZ_FLAG[] = "sci_mmires_prj:unicode";
const char CPrjFactory::SZ_FLAG_1[] = "sci_mmires_prj:u000001";
const char CPrjFactory::SZ_FLAG_2[] = "sci_mmires_prj:u000002";
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPrjFactory::CPrjFactory()
{
m_pImgInfo = NULL;
m_pAnimInfo = NULL;
m_pRingInfo = NULL;
m_pTextInfoOne = NULL;
m_pFontInfo = NULL;
m_pTextInfo = NULL;
}
CPrjFactory::~CPrjFactory()
{
}
CString CPrjFactory::GetPrjFileName( BOOL bOpen /* = TRUE */ )
{
CFileDlg fileDlg(bOpen);
fileDlg.SetFileExt(SZ_FILE_EXT);
fileDlg.SetFileFilter(SZ_FILTER);
return fileDlg.GetPathName();
}
BOOL CPrjFactory::SaveFile( LPCTSTR pszFileName )
{
_ASSERTE( pszFileName != NULL );
if( !FileIsWritable(pszFileName) )
return FALSE;
FILE * pFile = _tfopen(pszFileName, _T("wb"));
if( pFile == NULL )
{
_tcscpy(m_szErrMsg, _T("Create the project file fail!"));
return FALSE;
}
PRJ_BIN_ADDR_DATA prj_info;
if (fwrite(&prj_info,sizeof(PRJ_BIN_ADDR_DATA),1,pFile)!=1)
{
_tcscpy(m_szErrMsg, _T("write the project and bin info file fail!"));
fclose(pFile);
return FALSE;
}
if( fwrite(SZ_FLAG_2, sizeof(SZ_FLAG_2), 1, pFile) != 1 )
{
_tcscpy(m_szErrMsg, _T("write the project file fail!"));
fclose(pFile);
return FALSE;
}
TOOL_USED_INFO_T &tui = g_theApp.m_MMIRes.m_Resource.ToolUsedInfo;
//Unicode version
//"char szOtherInfo[24]",the former 20 chars is SZ_FILE_FLAG(10 char) and GetTickCount() (10 chars)
//the last 4 chars reserve the prj version.
sprintf( tui.szOtherInfo, "%s%.10d", SZ_FILE_FLAG, GetTickCount() );
if( fwrite(&tui, sizeof(TOOL_USED_INFO_T), 1, pFile) != 1 )
{
_ASSERTE( 0 );
_tcscpy(m_szErrMsg, _T("write the project file fail!"));
fclose(pFile);
return FALSE;
}
LANG_TOTAL_INFO_T lti;
memset(<i,0,sizeof(LANG_TOTAL_INFO_T));
lti.nUsedLang = g_theApp.m_nUsedLangNum;
for(int k =0;k<g_theApp.m_nUsedLangNum; k++)
{
lti.arrLangInfo[k].nLangProperty = g_theApp.m_nArrLangCBN[k];
_tcscpy(lti.arrLangInfo[k].szLangName,g_theApp.m_arrUsedLangNames[k]);
}
if (fwrite(<i,sizeof(LANG_TOTAL_INFO_T),1,pFile)!=1)
{
_tcscpy(m_szErrMsg, _T("write the language infomation fail!"));
fclose(pFile);
return FALSE;
}
CDirFileInfo * pArrInfo[] = { m_pImgInfo, m_pAnimInfo, m_pRingInfo, m_pTextInfo, m_pFontInfo };
int nNum = sizeof(pArrInfo) / sizeof(pArrInfo[0]);
for( int i = 0; i < nNum; ++i )
{
if( !pArrInfo[i]->SaveToFile( (CDirFileNode *)pArrInfo[i]->GetRoot(), pFile) )
{
_tcscpy(m_szErrMsg, _T("write the project file fail!"));
fclose(pFile);
return FALSE;
}
}
uint32 naddr=0;
naddr=ftell(pFile);
prj_info.prj_addr=sizeof(PRJ_BIN_ADDR_DATA);
g_theApp.prj_arm_addr=prj_info.arm_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 CPrjFactory::OpenFile( LPCTSTR pszFileName, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pszFileName != NULL );
FILE * pFile = _tfopen(pszFileName, _T("rb"));
if( pFile == NULL )
{
_tcscpy(m_szErrMsg, _T("open the project file fail!"));
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 project file addr info fail!"));
fclose(pFile);
return FALSE;
}
char szFlag[256] = { 0 };
if( fread(szFlag, sizeof(SZ_FLAG_2), 1, pFile) != 1 )
{
_tcscpy(m_szErrMsg, _T("read the project file header info fail!"));
fclose(pFile);
return FALSE;
}
//@Hongliang Xin 2006-8-11
g_theApp.m_MMIRes.m_iVersion = 2;
if( strcmp(szFlag, "sci_mmires_prj:weianli") == 0 )
g_theApp.m_MMIRes.m_iVersion = 1;
else
{
if( strcmp(szFlag, SZ_FLAG) != 0 && strcmp(szFlag, SZ_FLAG_1) != 0 &&
strcmp(szFlag, SZ_FLAG_2) != 0 &&strcmp(szFlag,"sci_mmires_prj:1.0.4.0")!=0)
{
_tcscpy(m_szErrMsg, _T("The project's version is incorrect!"));
fclose(pFile);
return FALSE;
}
}
// if(strcmp(szFlag, SZ_FLAG_2) != 0)
// {
// _tcscpy(m_szErrMsg, _T("The project's version is incorrect!"));
// fclose(pFile);
// return FALSE;
// }
TOOL_USED_INFO_T &tui = g_theApp.m_MMIRes.m_Resource.ToolUsedInfo;
if( fread(&tui, sizeof(TOOL_USED_INFO_T), 1, pFile) != 1 )
{
_ASSERTE( 0 );
fclose(pFile);
_tcscpy(m_szErrMsg, _T("read the project file fail!"));
return FALSE;
}
//xb
uint16 nLangNum=0;
char *pn = (char *)&nLangNum;
pn[0] = tui.szOtherInfo[0];
pn[1] = tui.szOtherInfo[1];
if( nLangNum <= MAX_LANG_NUM && nLangNum>0 )
g_theApp.m_nOldUsedLangNum = nLangNum;
//xe*/
if( g_theApp.m_MMIRes.m_iVersion == 1)
NULL;
else
{
if( strstr((char *)&(tui.szOtherInfo[3]), (char *)&(SZ_FILE_FLAG[3])) == NULL )
{
_tcscpy(m_szErrMsg, _T("read the project file fail!"));
fclose(pFile);
return FALSE;
}
}
/****************************************************************
*工程文件的头PRJ_BIN_ADDR_DATA结构后的SZ_FLAG
*若为"sci_mmires_prj:weianli", 则版本为1
*否则根据TOOL_USED_INFO_T结构中的szOtherInfo 来识别版本
*若szOtherInfo的第一个字节不是's'且第三个字节不为'3',则版本为2
* 前两个字节存放语言种类数
*若szOtherInfo的第一个字节不是's'且第三个字节为'3', 则版本为3
* 前两个字节存放语言种类数,第三个字节为版本号
*
****************************************************************/
if(tui.szOtherInfo[0] != 's')
g_theApp.m_MMIRes.m_iVersion = 2;
if(tui.szOtherInfo[0] != 's' && tui.szOtherInfo[2] == '3')
g_theApp.m_MMIRes.m_iVersion = 3;
if(strcmp(szFlag, SZ_FLAG) == 0)
g_theApp.m_MMIRes.m_iVersion = 4; //unicode version
// if(g_theApp.m_MMIRes.m_iVersion < 4)
// {
// fclose(pFile);
// _tcscpy(m_szErrMsg, _T("read the project file fail!"));
// return FALSE;
// }
if(strcmp(szFlag, SZ_FLAG_1) == 0)
g_theApp.m_MMIRes.m_iVersion = 5; //unicode_1 version
if(strcmp(szFlag, SZ_FLAG_2) == 0)
g_theApp.m_MMIRes.m_iVersion = 6; //unicode_2 version
if(g_theApp.m_MMIRes.m_iVersion>=4)
{
LANG_TOTAL_INFO_T lti;
memset(<i,0,sizeof(LANG_TOTAL_INFO_T));
if( fread(<i, sizeof(LANG_TOTAL_INFO_T), 1, pFile) != 1 )
{
_ASSERTE( 0 );
fclose(pFile);
_tcscpy(m_szErrMsg, _T("read the project file fail!"));
return FALSE;
}
g_theApp.m_nOldUsedLangNum = lti.nUsedLang;
//暂时先不读Prj中语言名字,以配置文件中的为准
//以后在界面上加语言,就可以删除配置文件
//g_theApp.m_arrUsedLangNames.RemoveAll();
//for(uint k =0 ; k<lti.nUsedLang; k++)
//{
// g_theApp.m_nArrLangCBN[k] = lti.arrLangInfo[k].nLangProperty;
// g_theApp.m_arrUsedLangNames.Add(lti.arrLangInfo[k].szLangName);
//}
}
CDirFileInfo * pArrInfo[] = { m_pImgInfo, m_pAnimInfo, m_pRingInfo, m_pTextInfo, m_pFontInfo };
int nNum = sizeof(pArrInfo) / sizeof(pArrInfo[0]);
if(g_theApp.m_MMIRes.m_iVersion >= 4)
{
for( int i = 0; i < nNum; ++i )
{
if( !pArrInfo[i]->ReadFromFileEx( pFile, (CDirFileNode *)pArrInfo[i]->GetRoot()) )
{
_tcscpy(m_szErrMsg, _T("read the project file fail!"));
fclose(pFile);
return FALSE;
}
}
}
else
{
for( int i = 0; i < nNum; ++i )
{
if( !pArrInfo[i]->ReadFromFile( pFile, (CDirFileNode *)pArrInfo[i]->GetRoot()) )
{
_tcscpy(m_szErrMsg, _T("read the project file fail!"));
fclose(pFile);
return FALSE;
}
}
}
g_theApp.m_strArrFontType.RemoveAll();
m_pFontInfo->CalcAllLeafID(g_theApp.m_strArrFontType);
fclose(pFile);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -