#pragma once //======================================================================================================================= /// VarMsg class /** @author Kim Min Wook < taiyo@webzen.com > @since 2006. 1. 11 @remarks - °¡º¯ ÆÐŶÀ» º¸³¾¶§ »ç¿ëÇϴ Ŭ·¡½º @note - @history - 2006/01/12 : StartTypePtr(Type) ÇÔ¼ö Ãß°¡ : »ý¼ºÀÚ¸¦ È£ÃâÇÒ ÀÖ°Ô - 2006/04/04 : (WAVERIX) VarMsg ´ëüÇÏ´Â VarMsg2 ±¸Çö ¹× Àû¿ë - 2007/09/10 : (WAVERIX) VARMSG_EX ±¸Çö PacketStruct_AG.h (À§ÀÇ °ÍµéÀÌ »ç¿ëÇϱâ Èûµé´Ù ¹× ÆÐŶ ºê·Îµå ij½ºÅÍ ±¸ÇöÀ» ¸ñÀûÀ¸·Î ÇÔ) @todo - @usage - ex) *1¹øÂ° ¹æ¹ý : »ý¼ºÀÚ¸¦ È£ÃâÇÏÁö ¾Ê¾Æ¼­ ¹Ýµå½Ã ÃʱâÈ­¸¦ ÇØ¾ß ÇÔ! MSG_CG_PACKET * pMsgEx = (MSG_CG_PACKET *)m_VarMsg.StartPtr(); pMsgEx->m_byCategory = 0; pMsgEx->m_byProtocol = 1; m_VarMsg.SetSize( pMsgEx->GetSize() ); BASEINFO *pResultMsg = (BASEINFO*)m_VarMsg.NextPtr(); m_VarMsg.SetSize(pResultMsg->GetSize()); pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() ); *2¹øÂ° ¹æ¹ý : »ý¼ºÀÚ¸¦ È£ÃâÇØÁÜ MSG_CG_PACKET * pMsgEx = m_VarMsg.StartTypePtr(Param2Class()); m_VarMsg.SetSize( pMsgEx->GetSize() ); BASEINFO *pResultMsg = (BASEINFO*)m_VarMsg.NextPtr(); m_VarMsg.SetSize(pResultMsg->GetSize()); pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() ); ////////////////////////////////////////////////////////////////////////// */ //======================================================================================================================= #if SUN_CODE_BACKUP #define _MAX_MSG_NUM (500) #define _MAX_MSG_BUFFER_SIZE (1024) class VarMsg { public: VarMsg(void); ~VarMsg(void); inline BYTE * StartPtr() { m_wCout = 0; return m_ppMsg[m_wCout++]; } template< class PacketType > inline PacketType * StartTypePtr( Param2Class ) { m_wCout = 0; return new (m_ppMsg[m_wCout++])(PacketType); } inline BYTE * NextPtr() { ASSERT(m_wCout<_MAX_MSG_NUM); return m_ppMsg[m_wCout++]; } inline VOID SetSize( WORD wSize ) { ASSERT(m_wCout>0); m_pwSize[m_wCout-1] = wSize; } inline BYTE ** GetMsgPPtr() { return m_ppMsgOut; } inline WORD * GetMsgSizePtr() { return m_pwSize; } inline WORD GetMsgCount() { return m_wCout; } private: BYTE m_ppMsg[_MAX_MSG_NUM][_MAX_MSG_BUFFER_SIZE]; BYTE * m_ppMsgOut[_MAX_MSG_NUM]; WORD m_pwSize[_MAX_MSG_NUM]; WORD m_wCout; }; #endif //SUN_CODE_BACKUP ////////////////////////////////////////////////////////////////////////// // <2006-04-02> // <¼³¸í> // VarMsg¸¦ ½ºÆ®¸²ÀÇ ¿¬¼ÓÇüÀ¸·Î º¯È¯½ÃŲ °ÍÀ¸·Î VarMsg¿Í »ç¿ë¹æ¹ýÀº °°´Ù. (Ãß°¡ÀûÀÎ ÀÎÅÍÆäÀ̽º Çϳª Á¸Àç) // <°³¼±Á¡> // GetMsgCount()´Â Ç×»ó 1·Î À¯Áö½ÃÄÑ ³×Æ®¿öÅ© ¹öÆÛ·ÎÀÇ Ã³¸® º¹Àâµµ¸¦ O(1)À¸·Î ¸¸µé¾î ÁØ´Ù. // °ø°£ º¹Àâµµ¸¦ ±âÁ¸¿¡ ºñÇØ 1/10·Î ÁÙ¿©ÁØ´Ù. (»ç¿ëÀÚ ¹öÆÛ¿¡ ±âÁØÇÒ ÇÊ¿ä´Â ÀÖÀ» °ÍÀÌ´Ù. ÀÏ´Ü 64KByte) // <°³¼± ¹æ¾È> // VarMsg¿Í °°Àº ¼º°ÝÀÇ ±â´É°ú ÇÕÄ¡°í, Network Module´ÜÀÇ °³¼±ÀÌ ÀÌ·ïÁø´Ù¸é, // 󸮷®ÀÇ °¨¼ÒÀÇ ÀÌÁ¡À» ¾òÀ» ¼ö ÀÖÀ» °ÍÀ̸ç, ºÎ°¡ÀûÀ¸·Î // ¹°¸® ³×Æ®¿öÅ© ȯ°æÀÇ ¼º´Éµµ ³ôÀÏ ¼ö ÀÖÀ» °Å¶ó ±â´ëÇÑ´Ù. // ¿¹) TCP packet(20B)+SUN_ACK(5B) --- TCP packet(20B)+SUN_ACK(5B) == 50B // °³¼±µÈ´Ù¸é) TCP packet(20B)+SUN_ACK(5B)*2 = 30B // -> ÀÌ °æ¿ì TCP°¡ °¡Áö´Â ACK°ú °°Àº Ãß°¡Àû ¿À¹öÇìµåµµ ÁÙÀÏ °ÍÀÌ´Ù. // ¹°·Ð À§¿Í °°Àº ¿¹´Â (_CMD+_CMD, _CMD+_ACK, _CMD+_NAK)(¹Ý´ëµµ °¡´É) ¿¬°èµÇµµ ¹«¹æÇÑ ºÎºÐ¿¡ ´ëÇØ »ç¿ëÀÌ °¡´ÉÇÒÁöµµ... // ¶ÇÇÑ Á¤Ã¥ÀûÀÎ ¸éµµ °í·ÁµÇ¾î¾ß Çϰí, ¹«¾ùº¸´Ù ƯÁ¤ Å©±â À̳»¿¡¼­ ÀÌ·ïÁ®¾ß ÇÒ °ÍÀÌ´Ù. #define _MAX_MSG_BUFFER_TOTAL_SIZE ((((WORD)-1)+1)-(sizeof(DWORD)+sizeof(BYTE**))) class VarMsg2 { public: VarMsg2() {} ~VarMsg2() {} inline BYTE* StartPtr() { /*m_wCout=0;*/ m_ppMsgOut[0]=m_pMsgBlock; m_dwSize=0; return m_pMsgBlock; }; template inline PacketType* StartTypePtr( Param2Class ) { m_ppMsgOut[0]=m_pMsgBlock; m_dwSize /*= m_wCout*/ = 0; return new (m_pMsgBlock)(PacketType); } // ´ÙÀ½Àº Network ´ÜÀÇ °³¼±ÀÌ ÀÖ´Ù¸é »ç¿ëÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù //inline PacketType* StartTypePtrNext( Param2Class ) { ++m_wCout; return new (m_pMsgBlock+m_dwSize)(PacketType); } inline BYTE* NextPtr() { return (m_pMsgBlock+m_dwSize); } // »ç¿ëÇϱâ´Â ÆíÇÏÁö¸¸ ÃÖÀûÈ­ ·¹º§ÀÌ ³ô¾Æµµ (Release) ÅÛÇø´ÀÇ Æ¯¼º»ó inline °è¿­ÀÇ »ý¼ºÀÚ Á¶Â÷µµ ÇÔ¼ö È£Ãâ·Î º¯È¯µÈ´Ù. // ±»ÀÌ »ý¼ºÀÚ È£ÃâÀÌ ÇÊ¿ä¾ø°Å³ª »ç¿ëÀÚ ·¹º§ÀÇ È£Ãâ·Î º¯È¯ÇÒ °Å¶ó¸é À§ ÇÁ·ÎÅäŸÀÔÀÌ ´õ ÁÁÀ» °ÍÀÌ´Ù. template inline PacketType* NextPtrWithCTOR( Param2Class ) { return new (m_pMsgBlock+m_dwSize)(PacketType); } inline VOID SetSize( WORD wSize ) { DWORD conv_wSize = (DWORD)wSize; ASSERT( !((m_dwSize+conv_wSize)>_MAX_MSG_BUFFER_TOTAL_SIZE) ); m_dwSize += conv_wSize; } inline BYTE** GetMsgPPtr() { return (BYTE**)(m_ppMsgOut); } inline WORD* GetMsgSizePtr() { return (WORD*)&m_dwSize; } inline WORD GetMsgCount() { return 1; } private: #pragma pack(push, 1) BYTE m_pMsgBlock[_MAX_MSG_BUFFER_TOTAL_SIZE]; BYTE* m_ppMsgOut[1]; DWORD m_dwSize; #pragma pack(pop) /*WORD m_wCout;*/ }; // - (WAVERIX)(080317) Àû¿ë Çß´ø ºÎºÐ Á¦°Å (½ÇÁ¦ Àû¿ëÀº µÈ Àû ¾øÀ½) #ifdef __NA000000_070928_PACKET_UNICAST_UPDATE__ template class VARMSG_EX_ASSMBLER_ROUTER { typedef VARMSG_EX_ASSMBLER_ROUTER<_ROUTECOUNT> router_type; static const MAX_NODE_COUNT = 5; typedef VARMSG_ASSEMBLER0 node0_type; typedef VARMSG_ASSEMBLER1 node1_type; typedef VARMSG_ASSEMBLER2 node2_type; typedef VARMSG_ASSEMBLER3 node3_type; typedef VARMSG_ASSEMBLER4 node4_type; struct IVARMSG_EX_ROUTING_NODE { public: virtual ~IVARMSG_EX_ROUTING_NODE() { IRelease(); } virtual VOID Init() = 0; virtual PVOID IGetPtr() = 0; virtual VOID IRelease() {} virtual INT IAddOffset( INT iOffset ) = 0; virtual INT IControlOffset( BOOL bIsPlus, INT iOffset ) = 0; virtual PVOID IGetFirstPacketPtr() = 0; virtual VOID ISetTotalSize( INT iTotalSize ) = 0; virtual INT IGetTotalSize() = 0; }; template struct VARMSG_EX_ROUTING_NODE_W : public IVARMSG_EX_ROUTING_NODE { typedef _TYPE node_type; VARMSG_EX_ROUTING_NODE_W() { m_node.Clear(); } virtual VOID Init() { m_node.Clear(); } virtual PVOID IGetPtr() { return (PVOID)&(m_node.TypeOf()); } virtual VOID IRelease() { m_node.Clear(); } virtual INT IAddOffset( INT iOffset ) { return m_node.AddOffset( iOffset ); } virtual INT IControlOffset( BOOL bIsPlus, INT iOffset ) { return m_node.ControlOffset( bIsPlus, iOffset ); } virtual PVOID IGetFirstPacketPtr() { return m_node.GetFirstPacketPtr(); } virtual VOID ISetTotalSize( INT iTotalSize ) { m_node.SetTotalSize( iTotalSize ); } virtual INT IGetTotalSize() { return m_node.GetTotalSize(); } node_type m_node; }; typedef IVARMSG_EX_ROUTING_NODE super_node_type; typedef VARMSG_EX_ROUTING_NODE_W wnode0_type; typedef VARMSG_EX_ROUTING_NODE_W wnode1_type; typedef VARMSG_EX_ROUTING_NODE_W wnode2_type; typedef VARMSG_EX_ROUTING_NODE_W wnode3_type; typedef VARMSG_EX_ROUTING_NODE_W wnode4_type; public: VARMSG_EX_ASSMBLER_ROUTER() { ZeroMemory( m_pRouter, sizeof(m_pRouter) ); ZeroMemory( m_pStream, sizeof(m_pStream) ); INT iOffset = 0; if( _ROUTECOUNT > 0 ) { m_pRouter[0] = new (&m_pStream[iOffset]) wnode0_type; iOffset += sizeof(wnode0_type); } if( _ROUTECOUNT > 1 ) { m_pRouter[1] = new (&m_pStream[iOffset]) wnode1_type; iOffset += sizeof(wnode0_type); } if( _ROUTECOUNT > 2 ) { m_pRouter[2] = new (&m_pStream[iOffset]) wnode2_type; iOffset += sizeof(wnode0_type); } if( _ROUTECOUNT > 3 ) { m_pRouter[3] = new (&m_pStream[iOffset]) wnode3_type; iOffset += sizeof(wnode0_type); } if( _ROUTECOUNT > 4 ) { m_pRouter[4] = new (&m_pStream[iOffset]) wnode4_type; iOffset += sizeof(wnode0_type); } } template inline _TYPE& InstanceOf( DWORD dwRouterIdx ) { if( _ROUTECOUNT > dwRouterIdx ) { return *( new (m_pRouter[dwRouterIdx]->IGetPtr()) _TYPE ); } return *(_TYPE*)NULL; } template inline _TYPE& TypeOf( DWORD dwRouterIdx ) { if( _ROUTECOUNT > dwRouterIdx ) { return *(_TYPE*)( m_pRouter[dwRouterIdx]->IGetPtr()); } return *(_TYPE*)NULL; } inline VOID Clear( DWORD dwRouterIdx ) { if( _ROUTECOUNT > dwRouterIdx ) { m_pRouter[dwRouterIdx]->IRelease(); } } inline INT AddOffset( DWORD dwRouterIdx, INT iOffset ) { if( _ROUTECOUNT > dwRouterIdx ) { return ( m_pRouter[dwRouterIdx]->IAddOffset( iOffset ) ); } return 0; } inline INT ControlOffset( DWORD dwRouterIdx, BOOL bIsPlus, SIZE_T szSize ) { if( _ROUTECOUNT > dwRouterIdx ) { return ( m_pRouter[dwRouterIdx]->IControlOffset( bIsPlus, iOffset ) ); } return 0; } inline MSG_BASE_FORWARD* GetFirstPacketPtr( DWORD dwRouterIdx ) { if( _ROUTECOUNT > dwRouterIdx ) { return (MSG_BASE_FORWARD*)( m_pRouter[dwRouterIdx]->IGetFirstPacketPtr() ); } return 0; } inline VOID SetTotalSize( DWORD dwRouterIdx, INT iTotalSize ) { if( _ROUTECOUNT > dwRouterIdx ) { return ( m_pRouter[dwRouterIdx]->ISetTotalSize( iTotalSize ) ); } return 0; } inline INT GetTotalSize( DWORD dwRouterIdx ) { if( _ROUTECOUNT > dwRouterIdx ) { return ( m_pRouter[dwRouterIdx]->IGetTotalSize() ); } return 0; } private: IVARMSG_EX_ROUTING_NODE* m_pRouter[MAX_NODE_COUNT]; BYTE m_pStream[sizeof(wnode0_type)*MAX_NODE_COUNT]; }; #endif //