www.pudn.com > manypeopleallchat.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; templateclass 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_)