diff --git a/src/Configuration/SettingsManager.cpp b/src/Configuration/SettingsManager.cpp index 9d7d48a2f25724793263f3b3924565b5104b09b8..0de183372ee6e120d26005dd348443411a9d0747 100644 --- a/src/Configuration/SettingsManager.cpp +++ b/src/Configuration/SettingsManager.cpp @@ -46,10 +46,10 @@ SettingsManager::~SettingsManager() void SettingsManager::setValues( const QString& part, QHash values ) { - if ( !m_data.contains( part ) ) + if ( !m_tempData.contains( part ) ) addNewSettingsPart( part ); m_globalLock.lockForRead(); - SettingsPart* sett = m_data[part]; + SettingsPart* sett = m_tempData[part]; m_globalLock.unlock(); QHash::iterator it = values.begin(); QHash::iterator end = values.end(); @@ -63,13 +63,13 @@ void SettingsManager::setValues( const QString& part, QHash void SettingsManager::setValue( const QString& part , const QString& key, QVariant& value ) { m_globalLock.lockForRead(); - if ( !m_data.contains( part ) ) + if ( !m_tempData.contains( part ) ) { addNewSettingsPart( part ); } m_globalLock.unlock(); QWriteLocker lock( &m_globalLock ); - SettingsPart* tmp = m_data[part]; + SettingsPart* tmp = m_tempData[part]; tmp->m_data.insert( key, value ); return ; } @@ -154,6 +154,41 @@ void SettingsManager::addNewSettingsPart( const QString& name ) rLock.unlock(); QWriteLocker lock( &m_globalLock ); m_data.insert( name, new SettingsPart ); + m_tempData.insert( name, new SettingsPart ); + } +} + +void SettingsManager::commit() +{ + QWriteLocker lock( &m_globalLock ); + + QHash::iterator it = m_tempData.begin(); + QHash::iterator ed = m_tempData.end(); + + for ( ; it != ed; ++it ) + { + SettingsPart* sett = it.value(); + + QReadLocker rLock( &sett->m_lock ); + QHash::iterator iter = sett->m_data.begin(); + QHash::iterator ed = sett->m_data.end(); + QWriteLocker wLock( &m_data[it.key()]->m_lock ); + for ( ; iter != ed; ++iter ) + m_data[it.key()]->m_data.insert( iter.key(), iter.value() ); + } +} + +void SettingsManager::flush() +{ + QWriteLocker lock( &m_globalLock ); + + QHash::iterator it = m_tempData.begin(); + QHash::iterator ed = m_tempData.end(); + + for ( ; it != ed; ++it ) + { + QWriteLocker wLock( &it.value()->m_lock ); + it.value()->m_data.clear(); } }