www.pudn.com > manypeopleallchat.rar > ClientCommand.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" templateclass CClientCommand : public CXMLCommand { 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(){} }; // template CString CClientCommand ::CreateRequsetSF(USERINFO &user) { IXMLDOMDocumentPtr docPtr = CreateUserInfoTag(_bstr_t(REQUESTSF), user); return CreateNetPacket(docPtr); } /* 接收者id=0表示发给所有用户 */ template 发内容 CString CClientCommand ::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); } // template CString CClientCommand ::CreateUserLogin(USERINFO &user) { user.m_id = 0; return CreateNetPacket(CreateUserInfoTag(_bstr_t(USERLOGIN), user, TRUE)); } //处理信息 template BOOL CClientCommand ::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 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_)