#pragma once ////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////// // #include ////////////////////////////////////////////////////////////////////////// // struct MSG_AM_CONNECTION_CCU_REPORT_NTF; struct PlayerObjectKeyStreamAddin { DWORD CharGuid; PlayerObjectKeyStreamAddin() : CharGuid(0) {} PlayerObjectKeyStreamAddin(const DWORD charGuid) : CharGuid(charGuid) {} PlayerObjectKeyStreamAddin(const PlayerObjectKeyStreamAddin& rSrc) : CharGuid(rSrc.CharGuid) {} PlayerObjectKeyStreamAddin& operator = (const PlayerObjectKeyStreamAddin& rSrc) { CharGuid = rSrc.CharGuid; return *this; } }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // class UserManager { public: ////////////////////////////////////////////////////////////////////////// // private: typedef USER_HASH USER_AUTH_IDS; typedef USER_HASH_IT USER_AUTH_IDS_IT; typedef USER_HASH_PAIR USER_AUTH_IDS_PAIR; typedef STLX_LIST TEMPUSER_LIST; typedef TEMPUSER_LIST::iterator TEMPUSER_LIST_IT; typedef STLX_MAP CONNECT_BLOCK_MAP; typedef CONNECT_BLOCK_MAP::iterator CONNECT_BLOCK_MAP_IT; class UserDelegator { private: User* m_pUserRef; public: UserDelegator() : m_pUserRef(NULL) {} UserDelegator(User* pUserRef) : m_pUserRef(pUserRef) {} UserDelegator(const UserDelegator& REF) : m_pUserRef(REF.m_pUserRef) {} inline User*& USER() { return m_pUserRef; } }; typedef ObjectKeyStream ObjectKeyStream; typedef STLX_HASH_MAP CHARGUID_HASH; typedef CHARGUID_HASH CHARNAME_HASH; // CHANGES: f110517.3L typedef STLX_HASH_MAP M_USER_LIST; typedef M_USER_LIST::iterator M_USER_LIST_IT; typedef std::pair M_USER_LIST_PAIR; private: UserManager(); ~UserManager(); public: static VOID CreateInstance(); static VOID DestroyInstance(); static UserManager* Instance(); ////////////////////////////////////////////////////////////////////////// // public: VOID ReleaseAllUser(); public: inline User* GetUser(const DWORD userKey) const; inline User* GetUserByObjKey(const DWORD objectKey) const; inline User* GetUserByCharGuid(const DWORD charKey) const; inline User* GetUserByAuthID(const DWORD authKey) const; public: BOOL AddUser(User* pUserSession); VOID RemoveUser(DWORD dwUserKey); User* FindUserForCharName(const TCHAR* pszName); // CHANGES: f110516.3L, changes to the pair information insertion on select character bool AddUserForSelectedCharInfoHashes(User* const user); void RemoveUserForSelectedCharInfoHashes(User* const user); inline DWORD GetNumberOfUsers() { return (DWORD)m_UserHashTable.size(); } // // TempUser::OnAccept½Ã¿¡ Ãß°¡µÇ°í, Timeout Routine¿¡ ÀÇÇØ »èÁ¦µÈ´Ù. inline VOID __AddTempUser(TempUser* pTempUser) { if(pTempUser) m_TempUserList4Timeout.push_back(pTempUser); } // CHANGES: f110516.3L, renewaled 'Foreach' interface void Foreach(ns_functor::IUserForeachFunctor* functor) const; // CHANGES: f110516.3L, unity function for all user notification // CHANGES: f110609.4L, changes the method action that include the packing // whether the message need packing void SendMessageToAllUsers(MSG_BASE* msg, uint16_t msg_size); // for loop ¿ÜºÎ¿¡¼­ Çϱâ À§ÇÑ °Í... À̰Ϳ¡ ´ëÇÑ º°µµÀÇ ¿¬»êÀº ÇÏÁö ¸»°Í! ¸ðµâ¼º ±úÁø´Ù! inline const USER_HASH& RefUserList() { return m_UserHashTable; } VOID DisconnectLinkedServerUser(eSERVER_TYPE Type); ////////////////////////////////////////////////////////////////////////// // - by "AgentServer.Timer.WorkLoad" VOID GarbageCollector(); VOID TempUserClosureTimeout(); // (WAVERIX) (CHANGES) ChangeName + AddinFunction // - #1 : CalculationCCU -> Process // - #2 : + function for 'server select' VOID Process(BOOLEAN bCCUControl, BOOLEAN bServerSelectProcess, MSG_AM_CONNECTION_CCU_REPORT_NTF* OUT pINFO /* + args...*/); ////////////////////////////////////////////////////////////////////////// // public: UserSession* AllocUser(eUSER_TYPE type); VOID FreeUser(UserSession* pUser); private: VOID _FreeUserPair(const USER_HASH_PAIR& rPAIR); ////////////////////////////////////////////////////////////////////////// // private: USER_HASH m_UserHashTable; ObjectKeyStream* m_pObjectKeyStream; USER_AUTH_IDS m_UserAuthIDs; CHARGUID_HASH m_CharGuidUserHash; CHARNAME_HASH m_CharNameHashTable; TEMPUSER_LIST m_TempUserList4Timeout; ///////////////////////////////////////////////////////////////////////////////////////////////////////// }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // ////////////////////////////////////////////////////////////////////////// // inline User* UserManager::GetUser(const DWORD userKey) const { USER_HASH::const_iterator itFind = m_UserHashTable.find(userKey); return itFind != m_UserHashTable.end() ? itFind->second : NULL ; } inline User* UserManager::GetUserByObjKey(const DWORD objectKey) const { const ObjectKeyStream::sNode* pNode = m_pObjectKeyStream->GetObjectInfo(objectKey); return (pNode) ? pNode->pObject : 0 ; } inline User* UserManager::GetUserByCharGuid(const DWORD charKey) const { CHARGUID_HASH::const_iterator itFind = m_CharGuidUserHash.find(charKey); if(itFind != m_CharGuidUserHash.end()) { const DWORD objectKey = itFind->second; const ObjectKeyStream::sNode* pNode = m_pObjectKeyStream->GetObjectInfo(objectKey); return (pNode) ? pNode->pObject : 0 ; } return 0; } inline User* UserManager::GetUserByAuthID(const DWORD authKey) const { USER_AUTH_IDS::const_iterator itFind = m_UserAuthIDs.find(authKey); return itFind != m_UserAuthIDs.end() ? itFind->second : NULL ; } #if SUN_CODE_BACKUP ////////////////////////////////////////////////////////////////////////// // // (WAVERIX)(080704) - class ¾È¿¡ ÀÖ´Â ÄÚµå ·çÆ¾µé ¿ÜºÎ·Î »°À½. template inline VOID UserManager::Foreach(ObjectOperator& op) { FOREACH_CONTAINER(const USER_HASH_PAIR& rPair, m_UserHashTable, USER_HASH) { User* pUser = rPair.second; op(pUser); } } template inline VOID UserManager::Foreach(const _FN& _funcRaw, _OBJ& _Left) const { FOREACH_CONTAINER(const USER_HASH_PAIR& rPair, m_UserHashTable, USER_HASH) { boost::bind(_funcRaw, &_Left, _1)(rPair); } } #endif //SUN_CODE_BACKUP inline void UserManager::Foreach(ns_functor::IUserForeachFunctor* functor) const { USER_HASH::const_iterator it = m_UserHashTable.begin(), end = m_UserHashTable.end(); for (; it != end; ++it) { User* user = it->second; functor->operator()(user); }; } ////////////////////////////////////////////////////////////////////////// // template class UserPacketSender { PACKET_TYPE& m_rMSG; public: UserPacketSender(PACKET_TYPE& rMSG) : m_rMSG(rMSG) {} ~UserPacketSender() {} VOID operator() (User* pUser) { pUser->SendPacket(&m_rMSG, sizeof(m_rMSG)); } };