www.pudn.com > Chat_IO.rar > ServerCommand.h


// ServerCommand.h: interface for the CServerCommand class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_SERVERCOMMAND_H__C2AA9EFC_E662_4141_AEFC_791A9E36DCBA__INCLUDED_) 
#define AFX_SERVERCOMMAND_H__C2AA9EFC_E662_4141_AEFC_791A9E36DCBA__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include "XMLCommand.h" 
using namespace std; 
 
template 
class CServerCommand : public CXMLCommand 
{ 
	//定义call back 函数 
	typedef void (Type::*PLOGINFUNC)(USERINFO &user); 
	typedef void (Type::*PUSERMESSAGEFUNC)(USERINFO &userSrc,USERINFO &userDest, CString strSpeak); 
private: 
	PLOGINFUNC			m_pLoginFunc; 
	PUSERMESSAGEFUNC	m_pUserMessageFunc; 
protected: 
	IXMLDOMDocumentPtr CreateUser(USERINFO &user); 
public: 
	//处理net packet 
	virtual BOOL DoProcessNetPacket(LONG userID, CString &strXML); 
	 
	//构建XML格式 
	CString CreateNewUser(USERINFO &user); 
	CString CreateLoginSuccess(USERINFO &user, MAPUSER* lpMapUsers); 
	CString CreateUserLogout(USERINFO &user); 
	CString CreateUserMessage(USERINFO &userSrc,USERINFO &userDest, CString strSpeak); 
	 
	//设置callback函数 
	void SetLoginFunc(PLOGINFUNC pLoginFunc){m_pLoginFunc = pLoginFunc;} 
	void SetUserMessageFunc(PUSERMESSAGEFUNC pUserMessageFunc){m_pUserMessageFunc = pUserMessageFunc;} 
 
	CServerCommand(); 
	~CServerCommand(); 
}; 
template 
CServerCommand::CServerCommand() 
{ 
	m_pLoginFunc = NULL; 
	m_pUserMessageFunc = NULL; 
} 
template 
CServerCommand::~CServerCommand() 
{ 
 
} 
 
// 
//当有用户登陆时,服务器将该登陆用户属性发送给所有用户 
template 
CString CServerCommand::CreateNewUser(USERINFO &user) 
{ 
	return CreateNetPacket(CreateUserInfoTag(_bstr_t(NEWUSER), user, TRUE)); 
} 
 
// 
template 
CString CServerCommand::CreateUserLogout(USERINFO &user) 
{ 
	return CreateNetPacket(CreateUserInfoTag(_bstr_t(USERLOGOUT), user));	 
} 
 
/* 
 
 
 
 
 
... 
 
 
 
*/ 
template 
CString CServerCommand::CreateLoginSuccess(USERINFO &user, MAPUSER* lpMapUsers) 
{ 
	IXMLDOMDocumentPtr docPtr = CreateUserInfoTag(_bstr_t(LOGINSUCCESS), user, TRUE); 
 
	//设置子节点 
	IXMLDOMElementPtr usersPtr = docPtr->createElement(_bstr_t(USERS)); 
	IXMLDOMNodePtr usePtr = docPtr->GetdocumentElement()->appendChild(usersPtr); 
 
	POSITION pos = lpMapUsers->GetStartPosition(); 
	for(;pos!=NULL;) 
	{ 
		LONG id; 
		LPUSERINFO pUser; 
		lpMapUsers->GetNextAssoc(pos, id, pUser); 
		 
		//添加用户列表 
		usePtr->appendChild(CreateUserInfoTag(_bstr_t(USER), *pUser, TRUE)->documentElement); 
	} 
 
	return CreateNetPacket(docPtr); 
} 
/* 
 
 
发言内容 
 
 
*/ 
template 
CString CServerCommand::CreateUserMessage(USERINFO &userSrc,USERINFO &userDest, CString strSpeak) 
{ 
	IXMLDOMDocumentPtr docPtr = CreateUserInfoTag(_bstr_t(USERMESSAGE), userSrc); 
	IXMLDOMDocumentPtr userPtr = CreateUserInfoTag(_bstr_t(USER), userDest); 
	userPtr->documentElement->text=_bstr_t(strSpeak); 
	docPtr->documentElement->appendChild(userPtr->documentElement); 
	return CreateNetPacket(docPtr); 
} 
 
template 
BOOL CServerCommand::DoProcessNetPacket(LONG userID, CString &strXML) 
{ 
	IXMLDOMDocumentPtr docPtr; 
	 
	//生成文档	 
	docPtr.CreateInstance(MSXML::CLSID_DOMDocument); 
	 
	//命令格式出错 
	if(!docPtr->loadXML(_bstr_t(strXML)))	return FALSE; 
	 
	//取得NET后第一个节点数据 
	IXMLDOMNodePtr nodePtr = docPtr->documentElement->firstChild; 
	 
	if(nodePtr->GetnodeName() == _bstr_t(USERLOGIN)) 
	{ 
		if(m_pLoginFunc == NULL) return FALSE; 
		 
		LPUSERINFO lpUser = new USERINFO; 
		if(!GetUserInfoFromNode(nodePtr, *lpUser, TRUE)) 
			return FALSE; 
		//设置用户id 
		lpUser->m_id = userID; 
		//call back 
		(m_pType->*m_pLoginFunc)(*lpUser); 
	} 
	else if(nodePtr->GetnodeName() == _bstr_t(USERSPEAK)) 
	{ 
		if(m_pUserMessageFunc == NULL) return FALSE; 
		 
		//发言人信息 
		USERINFO userSrc; 
		if(!GetUserInfoFromNode(nodePtr, userSrc))  
			return FALSE; 
		 
		//接受者信息 
		IXMLDOMNodePtr nodePtr = docPtr->selectSingleNode(_bstr_t("//"USERSPEAK"//")+_bstr_t(USER)); 
		USERINFO userDest; 
		if(!GetUserInfoFromNode(nodePtr, userDest))  
			return FALSE;		 
 
		//call back 
		(m_pType->*m_pUserMessageFunc)(userSrc,userDest, (char*)(nodePtr->text)); 
	} 
	return TRUE; 
} 
#endif // !defined(AFX_SERVERCOMMAND_H__C2AA9EFC_E662_4141_AEFC_791A9E36DCBA__INCLUDED_)