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

📄 serverlistmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// ServerListManager.cpp: implementation of the CServerListManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ServerListManager.h"
#include <stdio.h>

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

GLOBALTON(CServerListManager)

CSimpleCodec::CSimpleCodec(char* filename,BOOL bEncoding,char* CodecKey)
{
	m_fp = fopen(filename,bEncoding ? "wb" : "rb");
	m_CurCodecKeyPos = 0;
	m_CodecKeyLen = strlen(CodecKey);
	m_CodecKeybuf = new char[m_CodecKeyLen+1];
	strcpy(m_CodecKeybuf,CodecKey);
}
CSimpleCodec::~CSimpleCodec()
{
	fclose(m_fp);
	delete [] m_CodecKeybuf;
}
BOOL CSimpleCodec::Encode(void* pBufIn,int length)
{
#define MAX_ENCODEBUF_LENGTH	1024
	char tempBuf[MAX_ENCODEBUF_LENGTH];
	ASSERT(length<=MAX_ENCODEBUF_LENGTH);

	memcpy(tempBuf,pBufIn,length);
	for(int n=0;n<length;++n,++m_CurCodecKeyPos)
	{
		if(m_CurCodecKeyPos==m_CodecKeyLen)
			m_CurCodecKeyPos = 0;
		tempBuf[n] += m_CodecKeybuf[m_CurCodecKeyPos];
	}

	int wrotelen = fwrite(tempBuf,length,1,m_fp);
	ASSERT(wrotelen == 1)
	return (wrotelen == 1);
}
BOOL CSimpleCodec::Decode(void* pBufOut,int length)
{
	int readlen = fread(pBufOut,length,1,m_fp);
	if(readlen != 1)
		return FALSE;
	
	char* pchBufOut = (char*)pBufOut;
	for(int n=0;n<length;++n,++m_CurCodecKeyPos)
	{
		if(m_CurCodecKeyPos==m_CodecKeyLen)
			m_CurCodecKeyPos = 0;
		pchBufOut[n] -= m_CodecKeybuf[m_CurCodecKeyPos];
	}

	return TRUE;
}

CServerListManager::CServerListManager()
{

}

CServerListManager::~CServerListManager()
{
	Clear();
}

void CServerListManager::Clear()
{
	PTRLISTSEARCHSTART(m_ServerInfoList,SERVERINFO*,pInfo)
		delete pInfo;
	PTRLISTSEARCHEND

	m_ServerInfoList.RemoveAll();
}

BOOL CServerListManager::Add(SERVERINFO* pInfo)
{
	SERVERINFO* pNewServerInfo = new SERVERINFO;
	memcpy(pNewServerInfo,pInfo,sizeof(SERVERINFO));
	m_ServerInfoList.AddTail(pNewServerInfo);

	return TRUE;
}

BOOL CServerListManager::Save(char* pFileName)
{
	BOOL rt;
	CSimpleCodec codec(pFileName,TRUE,"yunhozzang!#&");
	codec.Encode(&m_ServerSetNum,sizeof(m_ServerSetNum));
	PTRLISTSEARCHSTART(m_ServerInfoList,SERVERINFO*,pInfo)
		rt = codec.Encode(pInfo,sizeof(SERVERINFO));
		ASSERT(rt);
	PTRLISTSEARCHEND

	return TRUE;
}

BOOL CServerListManager::Load(char* pFileName)
{
	Clear();
	CSimpleCodec codec(pFileName,FALSE,"yunhozzang!#&");
	codec.Decode(&m_ServerSetNum,sizeof(m_ServerSetNum));
	SERVERINFO info;
	while(codec.Decode(&info,sizeof(SERVERINFO)))
	{
		if(info.wServerKind >= MAX_SERVER_KIND)
		{
			MessageBox(NULL,"",NULL,NULL);
		}
		
		Add(&info);
	}

	return TRUE;
}

SERVERINFO* CServerListManager::GetServerInfoByNum(DWORD ServerKind,WORD ServerNum)
{
	PTRLISTSEARCHSTART(m_ServerInfoList,SERVERINFO*,pInfo)
		if(pInfo->wServerKind != ServerKind)
			continue;
		if(pInfo->wServerNum == ServerNum)
			return pInfo;
	PTRLISTSEARCHEND

	return NULL;
}
SERVERINFO* CServerListManager::GetServerInfoByPort(DWORD ServerKind,WORD Port)
{
	PTRLISTSEARCHSTART(m_ServerInfoList,SERVERINFO*,pInfo)
		if(pInfo->wServerKind != ServerKind)
			continue;
		if(pInfo->wPortForServer == Port)
			return pInfo;
	PTRLISTSEARCHEND

	return NULL;
}
SERVERINFO* CServerListManager::GetServerInfoByIp(DWORD ServerKind,char* ip)
{
	PTRLISTSEARCHSTART(m_ServerInfoList,SERVERINFO*,pInfo)
		if(pInfo->wServerKind != ServerKind)
			continue;
		if(strcmp(pInfo->szIPForServer,ip) == 0)
			return pInfo;
	PTRLISTSEARCHEND

	return NULL;
}

void CServerListManager::SetPositionHead()
{
	m_Pos = m_ServerInfoList.GetHeadPosition();
}

SERVERINFO* CServerListManager::GetNextServerInfo()
{
	if(m_Pos == NULL)
		return NULL;
	
	return (SERVERINFO*)m_ServerInfoList.GetNext(m_Pos);
}

⌨️ 快捷键说明

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