summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/PropertiesAdminI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-08-30 14:43:15 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-08-30 14:43:15 +0200
commitaab12cf1719b425b5a2c571b8938d47cdd71d151 (patch)
tree876561b05764721306eb8629883e7b0b9cbbc99a /cpp/src/Ice/PropertiesAdminI.cpp
parentminor g++ warning (diff)
downloadice-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.cpp187
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;
+}