summaryrefslogtreecommitdiff
path: root/python/modules/IcePy/ObjectFactory.cpp
diff options
context:
space:
mode:
authorJoe George <joe@zeroc.com>2015-12-08 11:33:42 -0500
committerJoe George <joe@zeroc.com>2015-12-08 16:09:24 -0500
commit6a43686ce26de5d2d5edf4a485ecff3a242c26b6 (patch)
treed31e4f16dc9ed6e28056a7224e045a4638955f5e /python/modules/IcePy/ObjectFactory.cpp
parentC++11 mapping IceDiscovery plug-in (diff)
downloadice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.tar.bz2
ice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.tar.xz
ice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.zip
ICE-6908 - Add ValueFactory
ValueFactory is a replacement for ObjectFactory (which is still available if needed). It is an interface with only one operation and can has the "delegate" metadata.
Diffstat (limited to 'python/modules/IcePy/ObjectFactory.cpp')
-rw-r--r--python/modules/IcePy/ObjectFactory.cpp73
1 files changed, 50 insertions, 23 deletions
diff --git a/python/modules/IcePy/ObjectFactory.cpp b/python/modules/IcePy/ObjectFactory.cpp
index 1829d32956b..d3720714a29 100644
--- a/python/modules/IcePy/ObjectFactory.cpp
+++ b/python/modules/IcePy/ObjectFactory.cpp
@@ -25,7 +25,8 @@ IcePy::ObjectFactory::ObjectFactory()
IcePy::ObjectFactory::~ObjectFactory()
{
- assert(_factoryMap.empty());
+ assert(_valueFactoryMap.empty());
+ assert(_objectFactoryMap.empty());
}
Ice::ObjectPtr
@@ -39,8 +40,8 @@ IcePy::ObjectFactory::create(const string& id)
{
Lock sync(*this);
- FactoryMap::iterator p = _factoryMap.find(id);
- if(p != _factoryMap.end())
+ FactoryMap::iterator p = _valueFactoryMap.find(id);
+ if(p != _valueFactoryMap.end())
{
factory = p->second;
}
@@ -112,12 +113,15 @@ IcePy::ObjectFactory::create(const string& id)
void
IcePy::ObjectFactory::destroy()
{
- FactoryMap factories;
+ FactoryMap valueFactories;
+ FactoryMap objectFactories;
{
Lock sync(*this);
- factories = _factoryMap;
- _factoryMap.clear();
+ objectFactories = _objectFactoryMap;
+ valueFactories = _valueFactoryMap;
+ _valueFactoryMap.clear();
+ _objectFactoryMap.clear();
}
//
@@ -126,66 +130,89 @@ IcePy::ObjectFactory::destroy()
//
AdoptThread adoptThread;
- for(FactoryMap::iterator p = factories.begin(); p != factories.end(); ++p)
+ for(FactoryMap::iterator p = _objectFactoryMap.begin(); p != _objectFactoryMap.end(); ++p)
{
//
- // Invoke the destroy method on each registered Python factory.
+ // Invoke the destroy method on each registered Python "object" factory.
//
PyObjectHandle obj = PyObject_CallMethod(p->second, STRCAST("destroy"), 0);
PyErr_Clear(); // Ignore errors.
Py_DECREF(p->second);
}
+ for(FactoryMap::iterator p = _valueFactoryMap.begin(); p != _valueFactoryMap.end(); ++p)
+ {
+ PyErr_Clear(); // Ignore errors.
+ Py_DECREF(p->second);
+ }
}
bool
-IcePy::ObjectFactory::add(PyObject* factory, const string& id)
+IcePy::ObjectFactory::addValueFactory(PyObject* factory, const string& id)
{
Lock sync(*this);
- FactoryMap::iterator p = _factoryMap.find(id);
- if(p != _factoryMap.end())
+ FactoryMap::iterator p = _valueFactoryMap.find(id);
+ if(p != _valueFactoryMap.end())
{
Ice::AlreadyRegisteredException ex(__FILE__, __LINE__);
- ex.kindOfObject = "object factory";
+ ex.kindOfObject = "value factory";
ex.id = id;
setPythonException(ex);
return false;
}
- _factoryMap.insert(FactoryMap::value_type(id, factory));
+ _valueFactoryMap.insert(FactoryMap::value_type(id, factory));
Py_INCREF(factory);
return true;
}
bool
-IcePy::ObjectFactory::remove(const string& id)
+IcePy::ObjectFactory::addObjectFactory(PyObject* factory, const string& id)
{
Lock sync(*this);
- FactoryMap::iterator p = _factoryMap.find(id);
- if(p == _factoryMap.end())
+ FactoryMap::iterator p = _valueFactoryMap.find(id);
+ if(p != _valueFactoryMap.end())
{
- Ice::NotRegisteredException ex(__FILE__, __LINE__);
- ex.kindOfObject = "object factory";
+ Ice::AlreadyRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "value factory";
ex.id = id;
setPythonException(ex);
return false;
}
- Py_DECREF(p->second);
- _factoryMap.erase(p);
+ _valueFactoryMap.insert(FactoryMap::value_type(id, factory));
+ Py_INCREF(factory);
+ _objectFactoryMap.insert(FactoryMap::value_type(id, factory));
+ Py_INCREF(factory);
return true;
}
PyObject*
-IcePy::ObjectFactory::find(const string& id)
+IcePy::ObjectFactory::findValueFactory(const string& id)
+{
+ Lock sync(*this);
+
+ FactoryMap::iterator p = _valueFactoryMap.find(id);
+ if(p == _valueFactoryMap.end())
+ {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ Py_INCREF(p->second);
+ return p->second;
+}
+
+PyObject*
+IcePy::ObjectFactory::findObjectFactory(const string& id)
{
Lock sync(*this);
- FactoryMap::iterator p = _factoryMap.find(id);
- if(p == _factoryMap.end())
+ FactoryMap::iterator p = _objectFactoryMap.find(id);
+ if(p == _objectFactoryMap.end())
{
Py_INCREF(Py_None);
return Py_None;