diff options
Diffstat (limited to 'python/modules')
-rw-r--r-- | python/modules/IcePy/Communicator.cpp | 86 | ||||
-rw-r--r-- | python/modules/IcePy/Makefile.mak | 1 | ||||
-rw-r--r-- | python/modules/IcePy/ObjectFactory.cpp | 73 | ||||
-rw-r--r-- | python/modules/IcePy/ObjectFactory.h | 11 | ||||
-rw-r--r-- | python/modules/IcePy/Util.cpp | 2 |
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); |