#include "stdafx.h" #include "SendManagePacket.h" #include #include #include #include #include #include #include #include #include #include /*! \brief °ü¸® ÆÐŶ Àü¼Û \param Session ¼¼¼Ç \param cCmd Ä¿¸Çµå \param nMessage À©µµ¿ì ¸Þ½ÃÁö ¹øÈ£ \param wParam WPARAM \param lParam LPARAM \param dwRunID RunID \param usDataLen µ¥ÀÌÅÍ ±æÀÌ \param usFlags Ãß°¡ µ¥ÀÌÅÍ Ç÷¡±× \param lpData º¸³¾ µ¥ÀÌÅÍ \param cError ¿¡·¯ Ä¿¸Çµå \return ÆÐŶ Àü¼Û ¼º°ø ¿©ºÎ */ bool ServerManage::SendManagePacket(CSession& Session, unsigned char cCmd, unsigned int nMessage, WPARAM wParam, LPARAM lParam, unsigned long dwRunID, unsigned short usDataLen, unsigned short usFlags, const void* lpData, unsigned char cError) { CBuffer* lpBuffer = CREATE_BUFFER(Session.GetPolicy().GetBufferFactory(), (sizeof(ManageCommand) + usDataLen)); if(0 != lpBuffer) { ManageCommand* lpManageCommand = reinterpret_cast(lpBuffer->wr_ptr()); lpManageCommand->nMessage = nMessage; // ¸Þ½ÃÁö ¹øÈ£ lpManageCommand->wParam = wParam; // ÆÄ¶ó¹ÌÅÍ1 lpManageCommand->lParam = lParam; // ÆÄ¶ó¹ÌÅÍ2 lpManageCommand->dwRunID = dwRunID; // ¸Þ¼¼Áö ¹ÞÀ» °÷ÀÇ IP lpManageCommand->usDataLen = (0 != lpData) ? usDataLen : 0; // Ãß°¡ µ¥ÀÌÅÍ ±æÀÌ lpManageCommand->usFlags = usFlags; // ±âŸ Ä¿¸Çµå (³»¿ë¿¡ µû¶ó¼­ ´Ù¸§) if(0 != lpData) { memcpy(reinterpret_cast(lpManageCommand + 1), lpData, usDataLen); } if(PacketWrap::WrapCrypt(lpBuffer, sizeof(ManageCommand) + usDataLen, cCmd, 0, cError) && Session.SendPending(lpBuffer)) { return true; } SAFE_RELEASE_BUFFER(lpBuffer); } return false; } /*! \brief °ü¸® ÆÐŶ Àü¼Û \param bufferFactory BufferFactory \param lpTarget ¼¼¼Ç. 0À̸é Broadcast \param lpUserInfo À¯Àú Á¤º¸ (³»ºÎÀûÀ¸·Î ÆÐ½º¿öµå¸¸ Á¦°ÅÇÏ°í º¸³½´Ù) \param cUserInfoNum À¯Àú Á¤º¸ °³¼ö \param cCommand Ä¿¸Çµå. \param cError ¿¡·¯. \return ÆÐŶ Àü¼Û ¼º°ø ¿©ºÎ */ bool ServerManage::SendUserInfo(CBufferFactory& bufferFactory, CSession* lpTarget, const ServerManage::UserInfo* lpUserInfo, unsigned char cUserInfoNum, unsigned char cCommand, unsigned char cError) { // ´Ù¸¥ À¯Àúµé¿¡°Ô ÀÚ½ÅÀÌ Ãß°¡µÇ¾ú´Ù´Â ¸Þ½ÃÁö¸¦ ´øÁø´Ù. CBuffer* lpBuffer = CREATE_BUFFER(bufferFactory, sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * cUserInfoNum); CBuffer* lpCompressedBuffer = CREATE_BUFFER(bufferFactory, CMiniLZO::GetLeastCompressBuffer(sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * cUserInfoNum)); if(0 != lpBuffer && 0 != lpCompressedBuffer) { ServerManage::UserCommand* lpUserCommand = reinterpret_cast(lpBuffer->wr_ptr()); ServerManage::UserInfo* lpFirstUserInfo = reinterpret_cast(lpUserCommand + 1); ServerManage::UserInfo* lpLastUserInfo = lpFirstUserInfo + cUserInfoNum; lpUserCommand->cUserInfoNum = cUserInfoNum; std::copy(lpUserInfo, lpUserInfo + cUserInfoNum, lpFirstUserInfo); for(ServerManage::UserInfo* lpTempUserInfo = lpFirstUserInfo; lpTempUserInfo != lpLastUserInfo; ++lpTempUserInfo) { memset(lpTempUserInfo->szPassword, 0, sizeof(ServerManage::UserInfo::PASS_LEN) * sizeof(TCHAR)); } if(PacketWrap::WrapCompress(lpCompressedBuffer, lpBuffer->rd_ptr(), sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * cUserInfoNum, cCommand, 0, cError)) { if(lpTarget) { if(lpTarget->SendPending(lpCompressedBuffer)) { SAFE_RELEASE_BUFFER(lpBuffer); return true; } } else { CToolUserManager::GetInstance().SendToAllLoginUser( lpCompressedBuffer->rd_ptr(), lpCompressedBuffer->length(), lpUserCommand->GetCmd()); SAFE_RELEASE_BUFFER(lpCompressedBuffer); SAFE_RELEASE_BUFFER(lpBuffer); return true; } } } SAFE_RELEASE_BUFFER(lpCompressedBuffer); SAFE_RELEASE_BUFFER(lpBuffer); return false; } bool ServerManage::CheckUserPacketLength(PktBase* lpPktBase, int nExpectUserInfoNum) { PktBase::LengthType nLength = lpPktBase->GetLen(); if(nLength < sizeof(ServerManage::UserCommand)) { return false; } ServerManage::UserCommand* lpUserCommand = reinterpret_cast(lpPktBase); ServerManage::UserInfo* lpUserInfo = reinterpret_cast(lpUserCommand + 1); if(0 < nExpectUserInfoNum) { if(nExpectUserInfoNum != lpUserCommand->cUserInfoNum || nLength != sizeof(ServerManage::UserCommand) + sizeof(ServerManage::UserInfo) * nExpectUserInfoNum) { ERRLOG2(g_Log, "Invalid packet size : userinfo num : %d, packet size : %d", lpUserCommand->cUserInfoNum, nLength); return false; } } else if(nLength != sizeof(ServerManage::UserCommand)) { return false; } return true; } bool ServerManage::CheckManagePacketLength(PktBase* lpPktBase) { unsigned short usPacketLength = lpPktBase->GetLen(); ServerManage::ManageCommand* lpManageCommand = reinterpret_cast(lpPktBase); if(usPacketLength < sizeof(ServerManage::ManageCommand) || (usPacketLength != lpManageCommand->usDataLen + sizeof(ServerManage::ManageCommand))) { ERRLOG2(g_Log, "Invalid packet size : DataLen : %d, Packet size : %d", lpManageCommand->usDataLen, lpPktBase->GetLen()); return false; } return true; } ServerManage::CSendManagePacketToClient::CSendManagePacketToClient(ManageCommand& manageCommand, const char* lpData) : m_ManageCommand(manageCommand), m_lpData(lpData) { } bool ServerManage::CSendManagePacketToClient::operator() (CPacketDispatch& dispatch) { return SendManagePacket(dispatch.GetSession(), m_ManageCommand.GetCmd(), m_ManageCommand.nMessage, m_ManageCommand.wParam, m_ManageCommand.lParam, m_ManageCommand.dwRunID, m_ManageCommand.usDataLen, m_ManageCommand.usFlags, m_lpData, static_cast(m_ManageCommand.GetError())); }