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

📄 clientengine.cpp

📁 本代码是基于LINUX系统下的
💻 CPP
字号:
// ClientAngine.cpp: implementation of the CClientAngine class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Client.h"
#include "ClientEngine.h"
#include "ClientTool.h"
#include "Chat.h"
#include "ClientDlg.h"

#include "AnEn.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CClientEngine* CClientEngine::m_instance = 0;
static	CString msg;
CClientEngine* CClientEngine::getInstance()
{
	if(m_instance == 0){
		m_instance = new CClientEngine;
	}
	return m_instance;
}

CClientEngine::CClientEngine()
{
	m_tool = new CClientTool();
	m_chatWindows.InitHashTable(257);
	m_myid = 0;
	m_sessionManager = new CSessionManager;

}

CClientEngine::~CClientEngine()
{
	delete m_tool;
	delete m_sessionManager;
}

bool CClientEngine::userLogin(CString id, CString pswd)
{
	m_tool->Connect();

	int idnum = atoi(id);
	m_myid = idnum;

	CEncapsulation* loginMessage = new CEncapsulation(1, idnum, (char*)(LPCSTR)(pswd));
	m_tool->Send(loginMessage);
	delete loginMessage;

	return true;
}


int CClientEngine::sendMessage(CUser& u, CString message)
{
	CEncapsulation* msg = new CEncapsulation(7, u.getIDFormatOfInt(), message.GetLength(), 
		(char*)(LPCSTR)message);
	m_tool->Send(msg);
	delete msg;
	return 1;
}

bool CClientEngine::userlogout()
{
	m_sessionManager->closeAllSessions();

	//////////////////////////////////////////////////////////////////////
	CEncapsulation* msg = new CEncapsulation(3);
	m_tool->Send(msg);
	delete msg;
	m_contactors.RemoveAll();
	m_chatWindows.RemoveAll();
	return m_tool->closeConnect();
}

void CClientEngine::receiveMessage(int &flag)
{
    CMessage* message = NULL; 
	m_tool->Recv(message);

	int i = message->GetType();

	int j = 0;
	int id;
	int sid;
	CUser* user = NULL;
	char* pch;

	CDialog* chatDialog = NULL;
	
	CString ip,filename;
	switch (i)
	{
	//Error occurs
	case 21:
		AfxMessageBox("Errors Occur, Redo it.");
		break;
	//remove a friend successfully
	case 16:
		flag = 66;
		id = message->GetUID();
		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];
			if(user->getIDFormatOfInt() == id)
			{
				m_contactors.RemoveAt(j);
				break;
			}
		}
		m_sessionManager->updateAll();
		break;
	//add a friend successfully.
	case 22:
		flag = 66;
		for(j=0; j<1; j++)
		{
			CUser user;
			user.name = message->GetName();
			msg = user.name;
			char pid[5];
			itoa(message->GetUID(), pid, 10);
			user.id = pid;
			user.online = 1;
			m_contactors.Add(user);
		}
		m_sessionManager->updateAll();
		AfxMessageBox("Add friend " + msg + " successfully!");
		break;
	case 23:
		flag = 66;
		for(j=0; j<1; j++)
		{
			CUser user;
			user.name = message->GetName();
			msg = user.name;
			char pid[5];
			itoa(message->GetUID(), pid, 10);
			user.id = pid;
			user.online = 0;
			m_contactors.Add(user);
		}
		AfxMessageBox("Add friend " + msg + " successfully!");
		break;

	//when a friend of mine is login
	case 2:
		flag = 66;
		id = message->GetUID();
		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];
			if(user->getIDFormatOfInt() == id)
			{
				user->online = 1;
				break;
			}
		}

		m_sessionManager->updateAll();
		break;

	//when a friend of mine is logoff
	case 3:
		flag = 66;
		id = message->GetUID();
		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];

			if(user->getIDFormatOfInt() == id)
			{
				user->online = 0;
				break;
			}
		}
		m_sessionManager->updateAll();
		break;

	//when login successfully
	case 6:
		flag = 6;
		pch = message->GetList();
		for(j=0; j<message->GetLMCount()/31; j++)
		{
			CUser user;
			user.name = pch + 31*j;
			user.id = pch + 15 + 31*j;
			user.id = user.id.Left(15);
			user.online = atoi(&(*(pch+30+31*j)));

			m_contactors.Add(user);
		}
		break;

	//when a person was invited to a meeting
	case 8:
		id = message->GetUID();
		sid = message->GetSID();
		user = getUserByID(id);
		m_sessionManager->Update(sid, user);
		break;

	//when receive a normal message
	case 13:
		id = message->GetSID();
		msg = message->GetMessage();
		m_sessionManager->receiveMessage(id, msg);
		break;
	
	//when a person is leaving a meeting
	case 9:
		id = message->GetUID();
		sid = message->GetSID();
		user = getUserByID(id);
		m_sessionManager->removeAContactor(sid, user);
		break;

	//when be invited into a meeting
	case 5:
		m_sessionManager->AddSessionWin(message, m_contactors);
		break;

	//chat with something not meeting
	case 7:
		id = message->GetSID();
		msg = message->GetMessage();

		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];
			if( user->getIDFormatOfInt()== id)
			{
				chatWithFriend(user);
				if(m_chatWindows.Lookup(id, chatDialog))
					((CChat*)chatDialog)->displayReveMessage(msg);
				break;
			}
		}
		break;

	//something wrong happens when login
	case 11:
		flag = 11;
		break;
	case 25:
		id = message->GetSID();
		msg = message->GetMessage();
		
		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];
			if( user->getIDFormatOfInt()== id)
			{
				if(IDYES==MessageBox(NULL,"file come from "+user->name+" !\n accept?" ,"file transport",MB_YESNO|MB_ICONQUESTION ))
				{
					//m_tool->ReceiveFile(msg);
					AfxBeginThread(ThreadFunc,NULL);
				}
				else
				{
					CString msg="";
						CClientEngine* engine = CClientEngine::getInstance();
						engine->refuse(*user,msg);
						

					
				}

			}
		}
		break;
	case 26:

		id = message->GetSID();
		msg = message->GetMessage();
		for(j=0; j<m_contactors.GetSize(); j++)
		{
			user = &m_contactors[j];
			if( user->getIDFormatOfInt()== id)
			{
			
				
					MessageBox(NULL,user->name+" refuse file!" ,NULL,MB_OK|MB_ICONQUESTION );
					TerminateThread(psendfileThread,0   );
				
			}
		}
		break;

	default:
		;
	}

	message = NULL;
}

bool CClientEngine::updateList(CListBox* listBox)
{
	listBox->ResetContent();
	int j = 0;
	CString temp;

	for(int i=0; i<m_contactors.GetSize(); i++)
	{	
		if(m_contactors[i].online == 1)
		{
			temp=m_contactors[i].name;
			temp+="                    ";
			temp.Insert(19,"★" );
			j = listBox->AddString(temp);
         	listBox->SetItemData(j,(DWORD)&m_contactors[i]);
		}
	}
	for(int k=0; k<m_contactors.GetSize(); k++)
	{	
		if(m_contactors[k].online != 1)
		{
			temp=m_contactors[k].name;
			temp+="                    ";
			temp.Insert(19,"☆" );
			j = listBox->AddString(temp);
		    listBox->SetItemData(j,(DWORD)&m_contactors[k]);
		}
	}

	return true;
}

void CClientEngine::chatWithFriend(CUser* user)
{
	CDialog* chatDialog;
	if(m_chatWindows.Lookup(user->getIDFormatOfInt(), chatDialog))
	{
		((CChat*)chatDialog)->ShowWindow(SW_SHOW);
		((CChat*)chatDialog)->BringWindowToTop();
	}
	else
	{
		CChat* Dialog = new CChat;
		Dialog->Create(IDD_CHAT_DIALOG, NULL);
		Dialog->SetWindowText("Chat with "+ user->name);
		Dialog->m_contactor = user;
		((CChat*)Dialog)->ShowWindow(SW_SHOW);

		m_chatWindows.SetAt(user->getIDFormatOfInt(), Dialog);
	}
}

CUser* CClientEngine::getUserByID(int id)
{
	for(int i=0; i<m_contactors.GetSize(); i++)
	{
		if(m_contactors[i].getIDFormatOfInt() == id)
		{
			return &m_contactors[i];
			break;
		}
	}

	return NULL;
}


int CClientEngine::engineSelect(HWND hWnd, unsigned int wMsg, long lEvent)
{
	return WSAAsyncSelect(m_tool->socket, hWnd, wMsg, lEvent);
}

void CClientEngine::CreateSession()
{
	CUser* me = getMyseft();	
	CEncapsulation *msg=new CEncapsulation(4, me->getIDFormatOfInt(),
		(char*)(LPCSTR)(me->name), 0);

	m_tool->Send(msg);
	delete msg;
}

CUser* CClientEngine::getMyseft()
{
	CUser* user = getUserByID(m_myid);
	return user;
}

void CClientEngine::addToMeeting(int sid, CUser *user)
{
	CEncapsulation *msg = new CEncapsulation(10, user->getIDFormatOfInt(),
		(char*)(LPCSTR)(user->name), sid);
	m_tool->Send(msg);
	delete msg;
}

void CClientEngine::closeSession(int sid)
{
	//send type 9 message
	m_sessionManager->closeSession(sid);
	CUser* user = getMyseft();
	CEncapsulation* msg = new CEncapsulation(9, user->getIDFormatOfInt(),
		(char*)(LPCSTR)(user->name), sid);
	m_tool->Send(msg);
	delete msg;
}



void CClientEngine::sendSessionMessage(int sid, CString message)
{
	CUser* user = getMyseft();
	message = user->name + " : " + message;
	CEncapsulation* msg = new CEncapsulation(13, sid, message.GetLength(), 
		(char*)(LPCSTR)(message));
	m_tool->Send(msg);
	delete msg;
}

void CClientEngine::addFriends(int id)
{
	CEncapsulation* msg = new CEncapsulation(15, id);
	m_tool->Send(msg);
	delete msg;
}

void CClientEngine::removeFriends(int id)
{
	CEncapsulation* msg = new CEncapsulation(16, id);
	m_tool->Send(msg);
	delete msg;
}

bool CClientEngine::transportfile(CUser &u, CString message)
{
	CEncapsulation* msg = new CEncapsulation(25, u.getIDFormatOfInt(), message.GetLength(), 
		(char*)(LPCSTR)message);
	m_tool->Send(msg);
	delete msg;
	return true;
}


bool CClientEngine::refuse(CUser &u, CString message)
{

	CEncapsulation* msg = new CEncapsulation(26, u.getIDFormatOfInt(), message.GetLength(), 
	(char*)(LPCSTR)message);
	m_tool->Send(msg);
	delete msg;
	return true;
}

UINT CClientEngine::ThreadFunc(LPVOID pParam)
{
	CClientTool* m_tool=new CClientTool;
	m_tool->ReceiveFile(msg);
	delete m_tool;
	return 0;
}

⌨️ 快捷键说明

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