#include "Stdafx.h" #include "EtActionBase.h" #include "EtActionCoreMng.h" #include "EtActionSignal.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CEtActionBase::CEtActionBase() { m_pVecActionElementList = NULL; m_pMapSearch = NULL; #ifdef PRE_FIX_CLIENT_MEMOPTIMIZE m_pCheckInitSignalFunc = CEtActionBase::pCheckInitSignal; #endif m_pCheckPreSignalFunc = CEtActionBase::pCheckPreSignal; m_pCheckPostSignalFunc = CEtActionBase::pCheckPostSignal; } CEtActionBase::~CEtActionBase() { FreeAction(); } bool CEtActionBase::LoadAction( const char *szFullPathName ) { if( m_pVecActionElementList ) return true; m_pVecActionElementList = CEtActionCoreMng::GetInstance().LoadAction( szFullPathName, this ); if( !m_pVecActionElementList ) return false; m_szFileName = szFullPathName; return true; } void CEtActionBase::FreeAction() { if( m_pVecActionElementList ) CEtActionCoreMng::GetInstance().RemoveAction( m_szFileName.c_str(), this ); m_pVecActionElementList = NULL; m_pMapSearch = NULL; } DWORD CEtActionBase::GetElementCount() { if( !m_pVecActionElementList ) return 0; return (DWORD)m_pVecActionElementList->size(); } CEtActionBase::ActionElementStruct *CEtActionBase::GetElement( DWORD dwIndex ) { if( !m_pVecActionElementList ) return NULL; if( dwIndex < 0 || dwIndex >= m_pVecActionElementList->size() ) return NULL; return (*m_pVecActionElementList)[dwIndex]; } CEtActionBase::ActionElementStruct *CEtActionBase::GetElement( const char *szName ) { if( !m_pVecActionElementList ) return NULL; std::map::iterator it = m_pMapSearch->find( szName ); if( it == m_pMapSearch->end() ) return NULL; return (*m_pVecActionElementList)[it->second]; return NULL; } int CEtActionBase::GetElementIndex( const char *szName ) { if( !m_pVecActionElementList ) return -1; std::map::iterator it = m_pMapSearch->find( szName ); if( it == m_pMapSearch->end() ) return -1; return it->second; } bool CEtActionBase::IsExistAction( const char *szAction ) { if( GetElementIndex( szAction ) == -1 ) return false; return true; } DWORD CEtActionBase::GetSignalCount( DWORD dwElementIndex, int nSignalIndex ) { if( !m_pVecActionElementList ) return 0; if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return 0; std::map>::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearch.find( nSignalIndex ); if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearch.end() ) return 0; return (DWORD)it->second.size(); } CEtActionSignal *CEtActionBase::GetSignal( DWORD dwElementIndex, int nSignalIndex, DWORD dwIndex ) { if( !m_pVecActionElementList ) return NULL; if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return NULL; std::map>::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearch.find( nSignalIndex ); if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearch.end() ) return NULL; if( dwIndex < 0 || dwIndex >= it->second.size() ) return NULL; return it->second[dwIndex]; } CEtActionSignal *CEtActionBase::GetSignal( DWORD dwElementIndex, int nSignalArrayIndex ) { if( !m_pVecActionElementList ) return NULL; if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return NULL; std::map::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearchByArrayIndex.find( nSignalArrayIndex ); if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearchByArrayIndex.end() ) return NULL; return it->second; } #ifdef PRE_FIX_CLIENT_MEMOPTIMIZE void CEtActionBase::CheckInitSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase ) { if( m_pCheckInitSignalFunc ) m_pCheckInitSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase ); } #endif void CEtActionBase::CheckPreSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase ) { if( m_pCheckPreSignalFunc ) m_pCheckPreSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase ); } void CEtActionBase::CheckPostSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase ) { if( m_pCheckPostSignalFunc ) m_pCheckPostSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase ); } #ifdef PRE_FIX_CLIENT_MEMOPTIMIZE void CEtActionBase::SetUsingElement( std::vector &szVecList ) { m_szVecUsingElementList = szVecList; } void CEtActionBase::AddUsingElement( const char *szName ) { if( !m_pVecActionElementList ) { m_szVecUsingElementList.push_back( szName ); return; } CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() ); if( !pContainer ) return; pContainer->szVecUsingElementList.push_back( szName ); } void CEtActionBase::ClearUsingElement() { if( !m_pVecActionElementList ) { m_szVecUsingElementList.clear(); return; } CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() ); if( !pContainer ) return; pContainer->szVecUsingElementList.clear(); } void CEtActionBase::RefreshUsingElement() { if( !m_pVecActionElementList ) return; CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() ); if( !pContainer ) return; if( !m_szVecUsingElementList.empty() ) { pContainer->szVecUsingElementList = m_szVecUsingElementList; m_szVecUsingElementList.clear(); } if( pContainer->szVecUsingElementList.empty() ) return; for( DWORD i=0; isize(); i++ ) { ActionElementStruct *pElement = (*m_pVecActionElementList)[i]; if( std::find( pContainer->szVecUsingElementList.begin(), pContainer->szVecUsingElementList.end(), pElement->szParentFileName ) == pContainer->szVecUsingElementList.end() ) { if( pElement->bUsing ) { for( DWORD j=0; jpVecSignalList.size(); j++ ) { CheckPostSignal( pElement, j, pElement->pVecSignalList[j], j, this ); } pElement->bUsing = false; } } else { if( !pElement->bUsing ) { for( DWORD j=0; jpVecSignalList.size(); j++ ) { CheckPreSignal( pElement, j, pElement->pVecSignalList[j], j, this ); } pElement->bUsing = true; } } } } void CEtActionBase::RefreshUsingElement( const char *szElementName, bool bUse ) { if( !m_pVecActionElementList ) return; CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() ); if( !pContainer ) return; if( pContainer->szVecUsingElementList.empty() ) return; ActionElementStruct *pElement = GetElement( szElementName ); if( !pElement ) return; if( bUse ) { if( !pElement->bUsing ) { for( DWORD j=0; jpVecSignalList.size(); j++ ) { CheckPreSignal( pElement, j, pElement->pVecSignalList[j], j, this ); } pElement->bUsing = true; } } else { if( pElement->bUsing ) { for( DWORD j=0; jpVecSignalList.size(); j++ ) { CheckPostSignal( pElement, j, pElement->pVecSignalList[j], j, this ); } pElement->bUsing = false; } } } #endif