00001 #include "SctApiConfigCache.h" 00002 #include "ConfigurationUtility.h" 00003 #include "SctApiException.h" 00004 00005 using boost::shared_ptr; 00006 using SctApi::SctApiConfigCache; 00007 00008 SctApiConfigCache::SctApiConfigCache(){ 00009 } 00010 00011 SctApiConfigCache::~SctApiConfigCache(){ 00012 } 00013 00014 void SctApiConfigCache::set(UINT32 mid, shared_ptr<ModuleBanks> banks){ 00015 boost::recursive_mutex::scoped_lock lock(cache_mutex); 00016 m_map[mid] = banks; 00017 } 00018 00019 void SctApiConfigCache::clearMid(const UINT32 mid){ 00020 boost::recursive_mutex::scoped_lock lock(cache_mutex); 00021 std::map<UINT32, boost::shared_ptr<ModuleBanks> >::iterator mit=m_map.find(mid); 00022 if (mit != m_map.end() ) m_map.erase(mit); 00023 } 00024 00025 void SctApiConfigCache::clearAll(){ 00026 boost::recursive_mutex::scoped_lock lock(cache_mutex); 00027 m_map.clear(); 00028 } 00029 00030 shared_ptr<SctApi::SctApiConfigCache::ModuleBanks> SctApiConfigCache::getFromMid(const UINT32 mid){ 00031 boost::recursive_mutex::scoped_lock lock(cache_mutex); 00032 shared_ptr<ModuleBanks> banks; 00033 if (m_map.find(mid)!=m_map.end()) banks = m_map[mid]; 00034 return banks; 00035 } 00036 00037 shared_ptr<const SctApi::SctApiConfigCache::ModuleBanks> SctApiConfigCache::getFromMid(const UINT32 mid) const { 00038 boost::recursive_mutex::scoped_lock lock(cache_mutex); 00039 boost::shared_ptr<const ModuleBanks> banks; 00040 std::map<UINT32, boost::shared_ptr<ModuleBanks> >::const_iterator it=m_map.find(mid); 00041 if (it!=m_map.end()) banks = (*it).second; 00042 return banks; 00043 } 00044 00045 void SctApiConfigCache::copyAllModules(BankType from, BankType to){ 00046 for (std::map<UINT32, boost::shared_ptr<ModuleBanks> >::const_iterator it=m_map.begin(); it!= m_map.end(); ++it){ 00047 shared_ptr<ModuleBanks> banks = it->second; 00048 if (!banks.get()) throw SctApiException("Internal error - null pointer in SctApiConfigCache copyAllModules"); 00049 banks->copy(from, to); 00050 } 00051 } 00052 00053 void SctApiConfigCache::copyAllModules(BankType from, std::list<BankType> to){ 00054 for (std::list<BankType>::const_iterator i = to.begin(); i!= to.end(); ++i){ 00055 copyAllModules(from, *i); 00056 } 00057 } 00058 00059 boost::shared_ptr<ABCDModule> SctApiConfigCache::ModuleBanks::get(BankType b){ 00060 boost::recursive_mutex::scoped_lock lock(bank_mutex); 00061 boost::shared_ptr<ABCDModule> config; 00062 std::map<BankType, boost::shared_ptr<ABCDModule> >::iterator it=m_map.find(b); 00063 if (it!=m_map.end()) config=(*it).second; 00064 return config; 00065 } 00066 00067 boost::shared_ptr<const ABCDModule> SctApiConfigCache::ModuleBanks::get(BankType b) const{ 00068 boost::recursive_mutex::scoped_lock lock(bank_mutex); 00069 boost::shared_ptr<const ABCDModule> config; 00070 std::map<BankType, boost::shared_ptr<ABCDModule> >::const_iterator it=m_map.find(b); 00071 if (it!=m_map.end()) config=(*it).second; 00072 return config; 00073 } 00074 00075 void SctApiConfigCache::ModuleBanks::set(BankType bank, boost::shared_ptr<ABCDModule> config){ 00076 boost::recursive_mutex::scoped_lock lock(bank_mutex); 00077 m_map[bank]=config; 00078 } 00079 00080 void SctApiConfigCache::ModuleBanks::copy(BankType from, std::list<BankType> to){ 00081 for (std::list<BankType>::const_iterator i = to.begin(); i!= to.end(); ++i){ 00082 copy(from, *i); 00083 } 00084 } 00085 00086 void SctApiConfigCache::ModuleBanks::copy(BankType from, BankType to){ 00087 boost::recursive_mutex::scoped_lock lock(bank_mutex); 00088 boost::shared_ptr<ABCDModule> copyme=get(from); 00089 if (!copyme.get()) { 00090 std::string message("Attempt to copy null bank"); 00091 message += __FILE__; 00092 message += __LINE__; 00093 throw SctApiException(message); 00094 } 00095 std::auto_ptr<ABCDModule> copy=ConfigUtility::clone(*copyme); 00096 m_map[to]=copy; 00097 }