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

📄 clientcommand.h

📁 带文件传输功能的聊天室,可多人聊天,也可私聊,任意用户间可互传文件
💻 H
字号:
// ClientCommand.h: interface for the CClientCommand class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CLIENTCOMMAND_H__874C0FF7_3574_442D_AE84_075B56E420E7__INCLUDED_)
#define AFX_CLIENTCOMMAND_H__874C0FF7_3574_442D_AE84_075B56E420E7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "XMLCommand.h"

template<class Type>
class CClientCommand : public CXMLCommand<Type>  
{
	typedef void (Type::*PLOGOUTFUNC)(USERINFO &user);
	typedef void (Type::*PNEWUSERFUNC)(USERINFO &user);
	typedef void (Type::*PUSERMESSAGEFUNC)(USERINFO &userSrc,USERINFO &userDest, CString strSpeak);
	typedef void (Type::*PLOGINSUCCESSFUNC)(USERINFO &user, MAPUSER *lpMapUser );
	
private:
	PLOGOUTFUNC			m_pLogoutFunc;
	PNEWUSERFUNC		m_pNewUserFunc;
	PUSERMESSAGEFUNC	m_pUserMessageFunc;
	PLOGINSUCCESSFUNC	m_pLoginSuccessFunc;	
public:
	//处理信息
	virtual BOOL DoProcessNetPacket(LONG userID, CString &strXML);
	//构建XML格式
	CString CreateUserSpeak(USERINFO &userSrc,USERINFO &userDest, CString strSpeak);
	CString CreateUserLogin(USERINFO &user);
	CString	CreateRequsetSF(USERINFO &user);	

	//设置callback函数
	void SetNewUserFunc(PNEWUSERFUNC pNewUserFunc){m_pNewUserFunc = pNewUserFunc;}
	void SetUserMessageFunc(PUSERMESSAGEFUNC pUserMessageFunc){m_pUserMessageFunc = pUserMessageFunc;}
	void SetLogoutFunc(PLOGOUTFUNC pLogoutFunc){m_pLogoutFunc = pLogoutFunc;}
	void SetLoginSuccessFunc(PLOGINSUCCESSFUNC pLoginSuccessFunc){m_pLoginSuccessFunc = pLoginSuccessFunc;}
	
	CClientCommand()
	{
		m_pLogoutFunc = NULL;
		m_pNewUserFunc = NULL;
		m_pUserMessageFunc = NULL;
		m_pLoginSuccessFunc = NULL;	
	}
	virtual ~CClientCommand(){}

};

//<REQUESTSF ID="发送者ID" NAME="发送者名称"/>
template<class Type>
CString	CClientCommand<Type>::CreateRequsetSF(USERINFO &user)
{
	IXMLDOMDocumentPtr docPtr = CreateUserInfoTag(_bstr_t(REQUESTSF), user);
	return CreateNetPacket(docPtr);
}
/*
<NET>
<USERSPEAK ID="发言者id" NAME="用户名">
<USER ID="接收者id" NAME="用户名">发内容</USER>
</USERSPEAK>
</NET>
接收者id=0表示发给所有用户
*/
template<class Type>
CString CClientCommand<Type>::CreateUserSpeak(USERINFO &userSrc,USERINFO &userDest, CString strSpeak)
{
	IXMLDOMDocumentPtr docPtr = CreateUserInfoTag(_bstr_t(USERSPEAK), userSrc);
	IXMLDOMDocumentPtr userPtr = CreateUserInfoTag(_bstr_t(USER), userDest);
	userPtr->documentElement->text=_bstr_t(strSpeak);
	docPtr->documentElement->appendChild(userPtr->documentElement);
	return CreateNetPacket(docPtr);
}

//<NET><USERLOGIN  ID="0" NAME="用户名"/></NET>
template<class Type>
CString CClientCommand<Type>::CreateUserLogin(USERINFO &user)
{	
	user.m_id = 0;
	return CreateNetPacket(CreateUserInfoTag(_bstr_t(USERLOGIN), user, TRUE));

}

//处理信息
template<class Type>
BOOL CClientCommand<Type>::DoProcessNetPacket(LONG userID, CString &strXML)
{
	IXMLDOMDocumentPtr docPtr;
	
	//生成文档	
	docPtr.CreateInstance(MSXML::CLSID_DOMDocument);
	
	//格式不对
	if(!docPtr->loadXML(_bstr_t(strXML)))	return FALSE;
	
	IXMLDOMNodePtr nodePtr = docPtr->documentElement->firstChild;
	
	if(nodePtr->GetnodeName() == _bstr_t(USERLOGOUT))
	{
		if(m_pLogoutFunc == NULL) return FALSE;
		
		USERINFO user;
		if(!GetUserInfoFromNode(nodePtr, user))
			return FALSE;

		//call back
		(m_pType->*m_pLogoutFunc)(user);
	}
	else if(nodePtr->GetnodeName() == _bstr_t(NEWUSER))
	{
		if(m_pNewUserFunc == NULL) return FALSE;
		
		LPUSERINFO lpUser = new USERINFO;
		if(!GetUserInfoFromNode(nodePtr, *lpUser, TRUE))
			return FALSE;

		//call back
		(m_pType->*m_pNewUserFunc)(*lpUser);
	}
	else if(nodePtr->GetnodeName() == _bstr_t(USERMESSAGE))
	{
		if(m_pUserMessageFunc == NULL) return FALSE;
		
		//发言人信息
		USERINFO userSrc;
		if(!GetUserInfoFromNode(nodePtr, userSrc)) 
			return FALSE;

		//收信息人信息
		IXMLDOMNodePtr nodePtr1 = docPtr->selectSingleNode(_bstr_t("//"USERMESSAGE"//"USER));
		USERINFO userDest;
		if(!GetUserInfoFromNode(nodePtr1, userDest)) 
			return FALSE;		
		
		//call back
		(m_pType->*m_pUserMessageFunc)(userSrc, userDest, (char*)(nodePtr1->text));
	}
	else if(nodePtr->GetnodeName() == _bstr_t(LOGINSUCCESS))
	{
		if(m_pLoginSuccessFunc == NULL) return FALSE;
		
		//从服务器返回登陆用户的信息
		LPUSERINFO lpUser = new USERINFO;
		if(!GetUserInfoFromNode(nodePtr, *lpUser, TRUE)) 
			return FALSE;
		
		//其他用户的信息,在客户端自己释放
		MAPUSER *lpMapUsers = new MAPUSER;
		IXMLDOMNodeListPtr nodeListPtr = docPtr->selectNodes(_bstr_t("//"LOGINSUCCESS"//"USERS"//"USER));
		for(int i=0;i<nodeListPtr->Getlength();i++)
		{
			IXMLDOMNodePtr nodePtr = nodeListPtr->Getitem(i);
			
			LPUSERINFO pUser = new USERINFO; 
			
			if(!GetUserInfoFromNode(nodePtr, *pUser, TRUE))
			{
				delete pUser;
				return FALSE;
			}
			
			(*lpMapUsers)[pUser->m_id] = pUser;
		}
		
		//call back
		(m_pType->*m_pLoginSuccessFunc)(*lpUser, lpMapUsers);		
		
	}
	
	return TRUE;
}




#endif // !defined(AFX_CLIENTCOMMAND_H__874C0FF7_3574_442D_AE84_075B56E420E7__INCLUDED_)

⌨️ 快捷键说明

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