#include "StdAfx.h" #include ".\accessinfoparser.h" #include "AccessInfo.h" #include "ServerInfoParser.h" #include "UserInfoParser.h" #include "UserInfo.h" AccessInfoParser::AccessInfoParser(void) { m_XMLParser.Init(); m_AccessInfoHash.Initialize( MAX_USER_COUNT ); } AccessInfoParser::~AccessInfoParser(void) { UnLoad(); } BOOL AccessInfoParser::Load( char* pszFileName ) { if( !m_XMLParser.Load( pszFileName ) ) return FALSE; long nUserNum = 0; NODELISTPtr pUserNodeList = m_XMLParser.FindNodeList( L"//USER", nUserNum ); if( pUserNodeList == NULL ) return FALSE; DWORD dwUserKey = 0; DWORD dwServerKey = 0; BOOL bAccess = FALSE; for( int nUser = 0; nUser < nUserNum; nUser++ ) { NODEPtr pUserNode = m_XMLParser.FindNode( pUserNodeList, nUser ); if( pUserNode == NULL ) continue; // À¯Àú۸¦ ¾ò´Â´Ù. dwUserKey = 0; if( !m_XMLParser.GetAttriDataDWORD( pUserNode, L"KEY", dwUserKey ) ) continue; // À¯Àú°¡ °¡Áö°í ÀÖ´Â ¼­¹öÀÇ ¸ñ·ÏÀ» ¾ò´Â´Ù. long nServerNum = 0; NODELISTPtr pServerList = m_XMLParser.FindChildNodeList( pUserNode, nServerNum ); if( pServerList == NULL ) continue; // ¼­¹ö Á¢±Ù Á¤º¸¸¦ Ãß°¡ÇÑ´Ù. AccessInfo *pAccessInfo = new AccessInfo; pAccessInfo->SetUserGUID( dwUserKey ); m_AccessInfoHash.Add( pAccessInfo, dwUserKey ); for( int nServer = 0; nServer < nServerNum; nServer++ ) { NODEPtr pServerNode = m_XMLParser.FindNode( pServerList, nServer ); //ù¹øÂ° ä³ÎºÎÅÍ ¼øÂ÷ÀûÀ¸·Î. if( pServerNode == NULL ) continue; // ¼­¹öŰ¿Í, Á¢±Ù±ÇÇÑÀ» ¾ò¾î¿Â´Ù. dwServerKey = 0; bAccess = FALSE; if( !m_XMLParser.GetAttriDataDWORD( pServerNode, L"KEY", dwServerKey ) ) continue; if( !m_XMLParser.GetAttriDataBOOL( pServerNode, L"ACCESS", bAccess ) ) continue; ACCESS_SERVER* pAccessServer = new ACCESS_SERVER; pAccessServer->m_dwServerKey = dwServerKey; pAccessServer->m_bAccess = bAccess; pAccessInfo->InsertAccessServer( pAccessServer ); } } return TRUE; } VOID AccessInfoParser::UnLoad() { AccessInfo* pAccessInfo = NULL; for( ACCESS_INFO_HASH_ITR it = m_AccessInfoHash.begin(); it != m_AccessInfoHash.end(); ++it ) { pAccessInfo = *it; delete pAccessInfo; } m_AccessInfoHash.RemoveAll(); } //»õ·Î¿î À¯Àú¸¦ Ãß°¡ÇÑ´Ù. //¸ðµç ±ÇÇÑÀº ¾ø´Â°ÍÀ¸·Î ÇÑ´Ù. BOOL AccessInfoParser::InsertUser( DWORD dwUserKey ) { if( GetAccessInfo( dwUserKey ) ) //ÀÌ¹Ì ÇØ´çÀ¯Àú۰¡ Á¸ÀçÇÑ´Ù¸é.. return FALSE; // »õ·Î¿î User Element¸¦ »ý¼ºÇÑ´Ù. ELEMENTPtr pUserEle = m_XMLParser.InsertElement( L"USER_ACCESS", L"USER" ); if( pUserEle == NULL ) return FALSE; m_XMLParser.SetAttributeDWORD( pUserEle, L"KEY", dwUserKey ); AccessInfo *pAccessInfo = new AccessInfo; pAccessInfo->SetUserGUID( dwUserKey ); m_AccessInfoHash.Add( pAccessInfo, dwUserKey ); SERVER_TOTAL_INFO info; ServerInfoParser::Instance()->SerializeServerInfoStream( info, FALSE ); for( int i = 0; i < info.m_Count; i++ ) { SERVER_INFO_EX ServerInfo = (SERVER_INFO_EX)info.m_Data[i]; ACCESS_SERVER* pAccessServer = new ACCESS_SERVER; pAccessServer->m_bAccess = FALSE; pAccessServer->m_dwServerKey = ServerInfo.m_dwServerKey; pAccessInfo->InsertAccessServer( pAccessServer ); ELEMENTPtr pServerEle = m_XMLParser.CreateElement( L"SERVER" ); if( pServerEle == NULL ) return FALSE; m_XMLParser.SetAttributeDWORD( pServerEle, L"KEY", pAccessServer->m_dwServerKey ); m_XMLParser.SetAttributeBYTE( pServerEle, L"ACCESS", pAccessServer->m_bAccess ); pUserEle->appendChild( pServerEle ); } if( !m_XMLParser.Save() ) return FALSE; return TRUE; } BOOL AccessInfoParser::SerializeStreamForUser( DWORD dwUserKey, SERVER_ACCESS_TOTAL_INFO& info, BOOL bSave ) { if( bSave ) { AccessInfo* pAccessInfo = GetAccessInfo( dwUserKey ); if( !pAccessInfo ) return FALSE; //1. ¿ì¼± ¸Þ¸ð¸®»óÀÇ µ¥ÀÌÅ͸¦ ÀúÀå½Ã۰í.. pAccessInfo->SerializeStream( info, TRUE ); for( int i = 0; i < info.m_Count; i++ ) { TCHAR szQuery[MAX_PATH]; _snprintf( szQuery, MAX_PATH, "//USER[@KEY='%u']/SERVER[@KEY='%u']", dwUserKey, info.m_Data[i].m_dwServerKey ); NODEPtr pNode = m_XMLParser.SingleQuery( szQuery ); if( pNode == NULL ) continue; // Å×½ºÆ® ÇØº¸ÀÚ... ¿¤·¹¸àÆ®¸¦ ³ëµåÇüÅ·Π»ç¿ëÇÒ ¼ö ÀÖ´ÂÁö....==> °á·ÎÀº »ç¿ëÇÒ ¼ö Àִµ¥.. ¿Ö ±×·²±î? m_XMLParser.SetAttributeBOOL( pNode, L"ACCESS", info.m_Data[i].bAccessRight ); } if( !m_XMLParser.Save() ) return FALSE; } else { AccessInfo* pAccessInfo = GetAccessInfo( dwUserKey ); if( !pAccessInfo ) return FALSE; pAccessInfo->SerializeStream( info, FALSE ); } return TRUE; } // Á¢±Ù±ÇÇÑÁ¤º¸¸¦ ÇöÀç À¯ÀúÀÇ ¼ö¿¡ ¸Â°Ô µ¿±âÈ­ ½ÃŲ´Ù. // Á¢±Ù Å×ÀÌºí¿¡ À¯Àú°¡ ¾øÀ¸¸é, ±ÇÇÑÀÌ ¾ø´Â °ÍÀ¸·Î ÇÏ¿© Å×ÀÌºí¿¡ À¯Àú¸¦ Ãß°¡ÇÑ´Ù. BOOL AccessInfoParser::SyncAllUserRight() { //1. ¸ðµç µ¥ÀÌÅ͸¦ »èÁ¦ÇÑ´Ù. if( !m_XMLParser.RemoveElement( "USER_ACCESS" ) ) return FALSE; //2. ¸Þ¸ð¸®»óÀÇ µ¥ÀÌÅ͸¦ »èÁ¦ÇÑ´Ù. UnLoad(); //3. ·çÆ® ¿¤·¹¸ÕÆ®¸¦ »ðÀÔÇÑ´Ù. ELEMENTPtr pRootEle = m_XMLParser.InsertElement( L"/", L"USER_ACCESS" ); if( pRootEle == NULL ) return FALSE; //4. À¯ÀúÀÇ ¼ö¸¸Å­¿¡ ¼­¹öÀÇ °³¼ö¸¸Å­ »ðÀÔÇÑ´Ù. USER_INFO_MAP_ITER UserIter = NULL; for( UserIter = UserInfoParser::Instance()->Begin(); UserIter != UserInfoParser::Instance()->End(); ++UserIter ) { UserInfo* pUserInfo = UserIter->second; if( !pUserInfo ) continue; InsertUser( pUserInfo->GetUserGUID() ); } return TRUE; }