gssource.cpp

来自「网络泡泡被.net管理」· C++ 代码 · 共 556 行

CPP
556
字号
// GsSource.cpp: implementation of the CGsSource class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#pragma pack(push, 1)
struct	t_gss_file_head
{
	char	strVersion[16];
	char	strData[PATH_SIZE];
	int		nCount;
	DWORD	posData;
	DWORD	temp_num;

};
#pragma pack(pop)


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGsSource::CGsSource()
{
	m_temp_num	= 0;
	strcpy(m_data, "");
	strcpy(m_data_path, "");
	strcpy(m_gss_file, "");
	m_isModify	= false;
}

CGsSource::~CGsSource()
{
	Cleanup();
}

static	GSFILE_INFO g_temp_fi;

GSFILE_INFO*	CGsSource::FindSource(const char* key)
{
	if(CGsFunc::Path_IsSysPath(key))
	{
		strcpy(g_temp_fi.strFile, key);
		g_temp_fi.fft = CGsFunc::File_GetFFT(key);
		return &g_temp_fi;
	}

	std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.find(key);
	if(it==m_file_map.end())
	{
		return NULL;
	}
	else
	{
		return &it->second;
	}
}

VOID CGsSource::SetFileType(const char *strkey, FFT fft)
{
	std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.find(strkey);
	if(it!=m_file_map.end())
	{
		it->second.fft	= fft;
		if(m_isModify==FALSE)
		{
			m_isModify = TRUE;
			OnSetModify();
		}
		m_isModify	= TRUE;
	}

}



BOOL	CGsSource::AddSource(char* szfile)
{

	return true;
}

const char* CGsSource::AddFile(const char* key, FFT type)
{
	if(CGsFunc::Path_IsSysPath(key))
		return key;

	if(m_gss_file[0]==0 || !IsReady())
		return NULL;

	char	strKey_c[PATH_SIZE];
	CGsFunc::Path_RectifyPath(strKey_c, key);

//	if(m_file_map.end()==m_file_map.find(strKey_c))
//		return NULL;

	GSFILE_INFO* pfi	= FindSource(key);
	if(pfi!=NULL)
	{
		pfi->fft	= type;
	}
	else
	{
		GSFILE_INFO	tf;
		memset(&tf, 0, sizeof(tf));
		if(type==GSF_FOLDER)
		{
			strKey_c[strlen(strKey_c)] = '\\';
			strcpy(tf.strFile, "");
		}
		else
		{
			if(type==GSF_DDS)
			{
				sprintf(tf.strFile, "%s\\%08d.dds", m_data_path, m_temp_num);
			}
			else
			{
				sprintf(tf.strFile, "%s\\%08d.gs_", m_data_path, m_temp_num);
			}
			CGsFunc::Path_RectifyPath(tf.strFile);
			m_temp_num++;
		}
		tf.fft	= type;
		tf.pos_begin = 0;
		tf.file_size = 0;
		m_file_map.insert(std::map<KEY, GSFILE_INFO>::value_type(KEY(strKey_c), tf));
	}

	std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.find(KEY(strKey_c));
	if(it==m_file_map.end())
		return NULL;
	else
	{
		if(m_isModify==false)
		{
			m_isModify = TRUE;
			OnSetModify();
		}
		m_isModify	= TRUE;
//		GSFILE ff = it->second;


		return it->second.strFile;
	}
}


VOID	CGsSource::Cleanup()
{
	
	std::map<KEY, GSFILE_INFO>::iterator	it	= m_file_map.begin();
	while(it!=m_file_map.end())
	{
		if(it->second.fft>=GSF_FNT && it->second.fft<=GSF_FOT)
		{
			CGsFunc::Font_RemoveResource(it->second.strFile);
		}
		it++;
	}


	Save();
	m_file_map.clear();
//	m_file_array.clear();
	m_temp_num	= 0;
	strcpy(m_data, "");
	strcpy(m_data_path, "");
	strcpy(m_gss_file, "");
	OnSetModify();
	m_isModify	= false;
	
}



BOOL CGsSource::Load(const char *strFile)
{ 
//	char temp_path[PATH_SIZE];
//	::GetCurrentDirectory(PATH_SIZE, temp_path);
	char strTemp[PATH_SIZE];
	CGsFunc::Path_MakeFullPath(strTemp, strFile);
	Cleanup();
	fstream		fs;
	fs.open(strTemp, ios::in | ios::out | ios::binary );
	if(!fs)
	{
		return false;
	}

	t_gss_file_head		head;
	fs.read((char*)&head, sizeof(head));

	if(KEY(head.strVersion)!="GSS2003a")
	{
		fs.close();
		return FALSE;
	}

	strcpy(m_data, head.strData);
	m_temp_num	= head.temp_num;

	char	szTemp[PATH_SIZE];

	strcpy(m_gss_file, strTemp);
	CGsFunc::Path_GetParentPath(m_data_path, m_gss_file);
	strcat(m_data_path, "\\");
	strcat(m_data_path, m_data);
	CGsFunc::Path_RectifyPath(m_data_path);

//	strcpy(szTemp, m_gss_file);
//	char*	sz	= strrchr(szTemp, '\\');
//	if(sz)
//		*sz=0;
//	else
//		szTemp[0]	= 0;
//	sprintf(g_szWorkPath, "%s\\%s", szTemp, (LPCSTR)g_szWorkData);


	fs.seekp(head.posData, ios::beg);


	GSFILE_INFO	gsstf;
	for(int i=0; i<head.nCount; i++)
	{
		fs.read(szTemp, PATH_SIZE); 
		fs.read((char*)&gsstf, sizeof(GSFILE_INFO));
		char strTemp[PATH_SIZE];
		strcpy(strTemp, gsstf.strFile);
		sprintf(gsstf.strFile, "%s\\%s", m_data_path, strTemp);
		CGsFunc::Path_RectifyPath(gsstf.strFile);
		char	szt[PATH_SIZE];
		CGsFunc::Path_RectifyPath(szt, szTemp);
		if(gsstf.fft==GSF_FOLDER)
			szt[strlen(szt)] = '\\';
		m_file_map.insert(std::map<KEY, GSFILE_INFO>::value_type(KEY(szt), gsstf));
		if(gsstf.fft>=GSF_FNT && gsstf.fft<=GSF_FOT)
		{
			CGsFunc::Font_AddResource(gsstf.strFile);
		}
	}

	fs.close();	

	
	return TRUE;
}

BOOL CGsSource::Save()
{
	if(!m_isModify || !IsReady())
		return TRUE;
	fstream		fs;
	fs.open(m_gss_file, ios::in | ios::out | ios::binary | ios::trunc);
	if(!fs)
	{
		return false;
	}

	t_gss_file_head		head;
	strcpy(head.strVersion, "GSS2003a");
	strcpy(head.strData, m_data);
	head.nCount		= m_file_map.size();
	head.posData	= 1000;
	head.temp_num	= m_temp_num;

	fs.write((char*)&head, sizeof(head));

	fs.seekp(1000, ios::beg);

	char	szTemp[PATH_SIZE];

	std::map<KEY, GSFILE_INFO>::iterator	it	= m_file_map.begin();
	while(it!=m_file_map.end())
	{
		strcpy(szTemp, it->first.c_str());
		fs.write(szTemp, PATH_SIZE); 
		GSFILE_INFO gsf	= it->second;
		memset(gsf.strFile, 0, PATH_SIZE);
		CGsFunc::Path_GetPathFile(gsf.strFile, it->second.strFile);
		fs.write((char*)&(gsf), sizeof(GSFILE_INFO));
		it++;
	}
	fs.close();

	if(m_isModify==TRUE)
	{
		m_isModify = FALSE;
		OnSetModify();
	}
	m_isModify	= false;
	return TRUE;
}

VOID CGsSource::UpdateToBrower(GS_Src_Browser *pBrowser, BOOL bIncrease, BOOL bExcept, va_list& argptr)
{
	if(pBrowser==NULL)
		return;

	std::set<FFT> type_set;


	BOOL bAllType  = false;

	if(bExcept)
	{
		FFT i;
		for(int j=GSF_UNKNOWN; j<GSF_GSS; j++)
		{
			type_set.insert(FFT(j));
		}
		i=va_arg( argptr, FFT);
			while( i != -1 )
			{
				if(i>GSF_GSS)
					break;
				if(i==GSF_UNKNOWN)
				{
					bAllType = true;
					break;
				}
				std::set<FFT>::iterator it = type_set.find(i);

				if(it!=type_set.end())
				{
					type_set.erase(it);
				}

				i = va_arg( argptr, FFT);
			}

	}
	else
	{

	//	type_set.insert(type);
	//	va_list temp;
	//	va_start( temp, type );     /* Initialize variable arguments. */
		FFT i=va_arg( argptr, FFT);
		if(i<GSF_UNKNOWN || i>GSF_GSS)
		{
			bAllType = true;
		}
		else
		{
			while( i != -1 )
			{
				if(i>GSF_GSS)
					break;
				if(i==GSF_UNKNOWN)
				{
					bAllType = true;
					break;
				}
				type_set.insert(i);
				i = va_arg( argptr, FFT);
			}
		}
	}
//	va_end( temp );              /* Reset variable arguments.      */


	GSFILE ff;

	char	strTemp[PATH_SIZE];
	if(bIncrease)
	{
		std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.begin();
		while(it!=m_file_map.end())
		{
			const char* str = it->first.c_str();
			ff = it->second;
			if(bAllType || type_set.end()!=type_set.find(it->second.fft))
			{
				pBrowser->AddItem(it->first.c_str(), it->second.fft);
			}
			else if(type_set.end()!=type_set.find(GSF_FOLDER))
			{
				CGsFunc::Path_GetParentPath(strTemp, it->first.c_str());
				pBrowser->AddItem(strTemp, GSF_FOLDER);
			}
			it++;
		}
	}
	else
	{
		std::map<KEY, GSFILE_INFO>::reverse_iterator it = m_file_map.rbegin();
		while(it!=m_file_map.rend())
		{
			const char* str = it->first.c_str();
			ff = it->second;
			if(bAllType || type_set.end()!=type_set.find(it->second.fft))
			{
				pBrowser->AddItem(it->first.c_str(), it->second.fft);
			}
			else if(type_set.end()!=type_set.find(GSF_FOLDER))
			{
				CGsFunc::Path_GetParentPath(strTemp, it->first.c_str());
				pBrowser->AddItem(strTemp, GSF_FOLDER);
			}
			it++;
		}
	}
	type_set.clear();
}

VOID CGsSource::SetModify()
{
	if(m_isModify==FALSE)
	{
		m_isModify = TRUE;
		OnSetModify();
	}
	m_isModify	= TRUE;
}

BOOL CGsSource::IsPathExist(const char *strPath)
{
	if(!IsReady())
		return FALSE;
	if(KEY(strPath)=="\\")
		return TRUE;
	std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.lower_bound(KEY(strPath));
	if(it!=m_file_map.end() && 0==it->first.find(strPath, 0))
	{
		return TRUE;
	}
	return FALSE;
}


VOID CGsSource::DeleteFile(const char *key)
{
	if(CGsFunc::Path_IsSysPath(key))
	{
//		CGsFunc::File_Delete(key);
		return;
	}
	if(!IsReady())
		return;
//	if(len==0)
//	{
//		m_file_map.clear();
//		m_isModify
//	}
	char strTemp[PATH_SIZE];
	CGsFunc::Path_GetParentPath(strTemp, key);
	int len = strlen(strTemp);
	strTemp[len]='\\';
	strTemp[len+1]=0;

	std::map<KEY, GSFILE_INFO>::iterator it = m_file_map.lower_bound(KEY(key));
	while(it!=m_file_map.end() && 0==it->first.find(key, 0))
	{
		_DeleteFile(it);
	}
	if(!IsPathExist(strTemp))
	{
		AddFile(strTemp);
	}

}

VOID CGsSource::_DeleteFile(std::map<KEY, GSFILE_INFO>::iterator &it)
{
	KEY key = it->first;
	if(key.at(key.length()-1)=='\\')
	{
		it++;
		while(it!=m_file_map.end() && 0==it->first.find(key, 0))
		{
			_DeleteFile(it);
			it++;
		}
		it = m_file_map.find(key);
		it = m_file_map.erase(it);
		if(m_isModify==FALSE)
		{
			m_isModify = TRUE;
			OnSetModify();
		}
		m_isModify = TRUE;
	}
	else
	{
		if(it->second.fft>=GSF_FNT && it->second.fft<=GSF_FOT)
		{
			CGsFunc::Font_RemoveResource(it->second.strFile);
		}
		CGsFunc::File_Delete(it->second.strFile);
		it = m_file_map.erase(it);
		if(m_isModify==FALSE)
		{
			m_isModify = TRUE;
			OnSetModify();
		}
		m_isModify = TRUE;
	}
}

const char* CGsSource::ImportFile(const char *key, const char *strFile)
{
	if(CGsFunc::Path_IsSysPath(key))
	{
//		if(CGsFunc::File_CopyTo(strFile, key))
//			return strFile;
		return NULL;
	}
	
	if(!IsReady())
		return NULL;
	FFT ft = CGsFunc::File_GetFFT(strFile);
	if(NULL==AddFile(key, ft))
		return NULL;
	GSFILE_INFO* pfi = FindSource(key);
	if(NULL==pfi)
		return NULL;
	if(CGsFunc::File_CopyTo(strFile, pfi->strFile))
	{
		if(m_isModify==FALSE)
		{
			m_isModify = TRUE;
			OnSetModify();
		}
		m_isModify = TRUE;
		CGsFunc::File_UpdateInfo(pfi);
		if(pfi->fft>=GSF_FNT && pfi->fft<=GSF_FOT)
		{
			CGsFunc::Font_AddResource(pfi->strFile);
		}
		return pfi->strFile;
	}
	else
	{
		return NULL;
	}
}

BOOL CGsSource::ExportFile(const char *key, const char *strFile)
{
	if(CGsFunc::Path_IsSysPath(key))
	{
		return CGsFunc::File_CopyTo(key, strFile);
	}
	if(!IsReady())
		return FALSE;
	GSFILE_INFO* pfi = FindSource(key);
	if(NULL==pfi)
		return FALSE;
	return CGsFunc::File_CopyTo(pfi->strFile, strFile);

}


⌨️ 快捷键说明

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