summaryrefslogtreecommitdiff
path: root/python/modules
diff options
context:
space:
mode:
Diffstat (limited to 'python/modules')
-rw-r--r--python/modules/IcePy/Communicator.cpp86
-rw-r--r--python/modules/IcePy/Makefile.mak1
-rw-r--r--python/modules/IcePy/ObjectFactory.cpp73
-rw-r--r--python/modules/IcePy/ObjectFactory.h11
-rw-r--r--python/modules/IcePy/Util.cpp2
5 files changed, 143 insertions, 30 deletions
diff --git a/python/modules/IcePy/Communicator.cpp b/python/modules/IcePy/Communicator.cpp
index 919086d9ae8..df7d2282927 100644
--- a/python/modules/IcePy/Communicator.cpp
+++ b/python/modules/IcePy/Communicator.cpp
@@ -24,6 +24,7 @@
#include <Thread.h>
#include <Types.h>
#include <Util.h>
+#include <Ice/ValueFactory.h>
#include <Ice/Initialize.h>
#include <Ice/CommunicatorAsync.h>
#include <Ice/LocalException.h>
@@ -1197,7 +1198,51 @@ communicatorAddObjectFactory(CommunicatorObject* self, PyObject* args)
}
- if(!pof->add(factory, id))
+ if(!pof->addObjectFactory(factory, id))
+ {
+ return 0;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+communicatorAddValueFactory(CommunicatorObject* self, PyObject* args)
+{
+ PyObject* factoryType = lookupType("Ice.ValueFactory");
+ assert(factoryType);
+
+ PyObject* factory;
+ PyObject* strObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O!O"), factoryType, &factory, &strObj))
+ {
+ return 0;
+ }
+
+ string id;
+ if(!getStringArg(strObj, "id", id))
+ {
+ return 0;
+ }
+
+ ObjectFactoryPtr pof;
+ try
+ {
+ pof = ObjectFactoryPtr::dynamicCast((*self->communicator)->findObjectFactory(""));
+ assert(pof);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+
+ }
+
+ if(!pof->addValueFactory(factory, id))
{
return 0;
}
@@ -1236,7 +1281,40 @@ communicatorFindObjectFactory(CommunicatorObject* self, PyObject* args)
return 0;
}
- return pof->find(id);
+ return pof->findObjectFactory(id);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+communicatorFindValueFactory(CommunicatorObject* self, PyObject* args)
+{
+ PyObject* strObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &strObj))
+ {
+ return 0;
+ }
+
+ string id;
+ if(!getStringArg(strObj, "id", id))
+ {
+ return 0;
+ }
+
+ ObjectFactoryPtr pof;
+ try
+ {
+ pof = ObjectFactoryPtr::dynamicCast((*self->communicator)->findObjectFactory(""));
+ assert(pof);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return pof->findValueFactory(id);
}
#ifdef WIN32
@@ -1570,6 +1648,10 @@ static PyMethodDef CommunicatorMethods[] =
PyDoc_STR(STRCAST("addObjectFactory(factory, id) -> None")) },
{ STRCAST("findObjectFactory"), reinterpret_cast<PyCFunction>(communicatorFindObjectFactory), METH_VARARGS,
PyDoc_STR(STRCAST("findObjectFactory(id) -> Ice.ObjectFactory")) },
+ { STRCAST("addValueFactory"), reinterpret_cast<PyCFunction>(communicatorAddValueFactory), METH_VARARGS,
+ PyDoc_STR(STRCAST("addValueFactory(factory, id) -> None")) },
+ { STRCAST("findValueFactory"), reinterpret_cast<PyCFunction>(communicatorFindValueFactory), METH_VARARGS,
+ PyDoc_STR(STRCAST("findValueFactory(id) -> Ice.ValueFactory")) },
{ STRCAST("getImplicitContext"), reinterpret_cast<PyCFunction>(communicatorGetImplicitContext), METH_NOARGS,
PyDoc_STR(STRCAST("getImplicitContext() -> Ice.ImplicitContext")) },
{ STRCAST("getProperties"), reinterpret_cast<PyCFunction>(communicatorGetProperties), METH_NOARGS,
diff --git a/python/modules/IcePy/Makefile.mak b/python/modules/IcePy/Makefile.mak
index 6ef88199500..4473a818f67 100644
--- a/python/modules/IcePy/Makefile.mak
+++ b/python/modules/IcePy/Makefile.mak
@@ -35,6 +35,7 @@ OBJS = .\BatchRequestInterceptor.obj \
.\Types.obj \
.\Util.obj
+
#
# Get Make.common.rules.mak to figure out CPP_COMPILER by setting it
# to "auto"
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;
diff --git a/python/modules/IcePy/ObjectFactory.h b/python/modules/IcePy/ObjectFactory.h
index 8445996b330..57b93352bdd 100644
--- a/python/modules/IcePy/ObjectFactory.h
+++ b/python/modules/IcePy/ObjectFactory.h
@@ -34,14 +34,17 @@ public:
virtual void destroy();
- bool add(PyObject*, const std::string&);
- bool remove(const std::string&);
- PyObject* find(const std::string&);
+ bool addValueFactory(PyObject*, const std::string&);
+ bool addObjectFactory(PyObject*, const std::string&);
+
+ PyObject* findValueFactory(const std::string&);
+ PyObject* findObjectFactory(const std::string&);
private:
typedef std::map<std::string, PyObject*> FactoryMap;
- FactoryMap _factoryMap;
+ FactoryMap _valueFactoryMap;
+ FactoryMap _objectFactoryMap;
};
typedef IceUtil::Handle<ObjectFactory> ObjectFactoryPtr;
diff --git a/python/modules/IcePy/Util.cpp b/python/modules/IcePy/Util.cpp
index 74869df7121..b86ddffd953 100644
--- a/python/modules/IcePy/Util.cpp
+++ b/python/modules/IcePy/Util.cpp
@@ -818,7 +818,7 @@ convertLocalException(const Ice::LocalException& ex, PyObject* p)
m = IcePy::createEncodingVersion(e.supported);
PyObject_SetAttrString(p, STRCAST("supported"), m.get());
}
- catch(const Ice::NoObjectFactoryException& e)
+ catch(const Ice::NoValueFactoryException& e)
{
IcePy::PyObjectHandle m;
m = IcePy::createString(e.reason);