diff options
author | Benoit Foucher <benoit@zeroc.com> | 2012-08-30 14:43:15 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2012-08-30 14:43:15 +0200 |
commit | aab12cf1719b425b5a2c571b8938d47cdd71d151 (patch) | |
tree | 876561b05764721306eb8629883e7b0b9cbbc99a /cpp/src/Ice/PropertiesAdminI.cpp | |
parent | minor g++ warning (diff) | |
download | ice-aab12cf1719b425b5a2c571b8938d47cdd71d151.tar.bz2 ice-aab12cf1719b425b5a2c571b8938d47cdd71d151.tar.xz ice-aab12cf1719b425b5a2c571b8938d47cdd71d151.zip |
ICE-4774: Merged skype_props enhancement
Diffstat (limited to 'cpp/src/Ice/PropertiesAdminI.cpp')
-rw-r--r-- | cpp/src/Ice/PropertiesAdminI.cpp | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/cpp/src/Ice/PropertiesAdminI.cpp b/cpp/src/Ice/PropertiesAdminI.cpp new file mode 100644 index 00000000000..fc929bb959a --- /dev/null +++ b/cpp/src/Ice/PropertiesAdminI.cpp @@ -0,0 +1,187 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2010 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <IceUtil/DisableWarnings.h> +#include <Ice/PropertiesAdminI.h> +#include <Ice/Logger.h> +#include <Ice/LoggerUtil.h> + +using namespace std; +using namespace Ice; +using namespace IceInternal; + +Ice::PropertiesAdminI::PropertiesAdminI(const string& name, const PropertiesPtr& properties, const LoggerPtr& logger) : + _name(name), _properties(properties), _logger(logger) +{ +} + +string +Ice::PropertiesAdminI::getProperty(const string& name, const Ice::Current&) +{ + IceUtil::Mutex::Lock sync(*this); + return _properties->getProperty(name); +} + +Ice::PropertyDict +Ice::PropertiesAdminI::getPropertiesForPrefix(const string& prefix, const Ice::Current&) +{ + IceUtil::Mutex::Lock sync(*this); + return _properties->getPropertiesForPrefix(prefix); +} + +void +Ice::PropertiesAdminI::setProperties_async(const AMD_PropertiesAdmin_setPropertiesPtr& cb, const PropertyDict& props, + const Ice::Current&) +{ + PropertyDict added, changed, removed; + PropertiesAdminUpdateCallbackPtr callback; + { + IceUtil::Mutex::Lock sync(*this); + + PropertyDict old = _properties->getPropertiesForPrefix(""); + PropertyDict::const_iterator p; + const int traceLevel = _properties->getPropertyAsInt("Ice.Trace.Admin.Properties"); + + // + // Compute the difference between the new property set and the existing property set: + // + // 1) Any properties in the new set that were not defined in the existing set. + // + // 2) Any properties that appear in both sets but with different values. + // + // 3) Any properties not present in the new set but present in the existing set. + // In other words, the property has been removed. + // + for(p = props.begin(); p != props.end(); ++p) + { + PropertyDict::iterator q = old.find(p->first); + if(q == old.end()) + { + if(!p->second.empty()) + { + // + // This property is new. + // + added.insert(*p); + } + } + else + { + if(p->second != q->second) + { + if(p->second.empty()) + { + // + // This property was removed. + // + removed.insert(*p); + } + else + { + // + // This property has changed. + // + changed.insert(*p); + } + } + } + } + + if(traceLevel > 0 && (!added.empty() || !changed.empty() || !removed.empty())) + { + Trace out(_logger, _name); + + out << "Summary of property changes"; + + if(!added.empty()) + { + out << "\nNew properties:"; + for(p = added.begin(); p != added.end(); ++p) + { + out << "\n " << p->first; + if(traceLevel > 1) + { + out << " = " << p->second; + } + } + } + + if(!changed.empty()) + { + out << "\nChanged properties:"; + for(p = changed.begin(); p != changed.end(); ++p) + { + out << "\n " << p->first; + if(traceLevel > 1) + { + out << " = " << p->second << " (old value = " << _properties->getProperty(p->first) << ")"; + } + } + } + + if(!removed.empty()) + { + out << "\nRemoved properties:"; + for(p = removed.begin(); p != removed.end(); ++p) + { + out << "\n " << p->first; + } + } + } + + // + // Update the property set. + // + + for(p = added.begin(); p != added.end(); ++p) + { + _properties->setProperty(p->first, p->second); + } + + for(p = changed.begin(); p != changed.end(); ++p) + { + _properties->setProperty(p->first, p->second); + } + + for(p = removed.begin(); p != removed.end(); ++p) + { + _properties->setProperty(p->first, ""); + } + + callback = _updateCallback; + } + + // + // Send the response now so that we do not block the client during the call to the update callback. + // + cb->ice_response(); + + if(callback) + { + PropertyDict changes = added; + changes.insert(changed.begin(), changed.end()); + changes.insert(removed.begin(), removed.end()); + + try + { + callback->updated(changes); + } + catch(...) + { + // Ignore. + } + } +} + +void +Ice::PropertiesAdminI::setUpdateCallback(const PropertiesAdminUpdateCallbackPtr& cb) +{ + IceUtil::Mutex::Lock sync(*this); + _updateCallback = cb; +} |