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

📄 prjfactory.cpp

📁 Resource editor base speadrum Chinese mobile
💻 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(&lti,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(&lti,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(&lti,0,sizeof(LANG_TOTAL_INFO_T));
		if( fread(&lti, 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 + -