📄 clientengine.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 + -