diff options
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterI.cpp')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 76 |
1 files changed, 58 insertions, 18 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index e7c6e529095..d7998cf49a1 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -63,6 +63,12 @@ inline void checkServant(const ObjectPtr& servant) throw IllegalServantException(__FILE__, __LINE__, "cannot add null servant to Object Adapter"); } } + +inline EndpointIPtr toEndpointI(const EndpointPtr& endp) +{ + return ICE_DYNAMIC_CAST(EndpointI, endp); +} + } string @@ -641,6 +647,24 @@ Ice::ObjectAdapterI::getLocator() const } } +EndpointSeq +Ice::ObjectAdapterI::getEndpoints() const +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + EndpointSeq endpoints; + transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), + back_inserter(endpoints), +#ifdef ICE_CPP11_MAPPING + [](const IncomingConnectionFactoryPtr& factory) + { + return factory->endpoint(); + }); +#else + Ice::constMemFun(&IncomingConnectionFactory::endpoint)); +#endif + return endpoints; +} void Ice::ObjectAdapterI::refreshPublishedEndpoints() @@ -650,7 +674,6 @@ Ice::ObjectAdapterI::refreshPublishedEndpoints() { IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); - checkForDeactivation(); oldPublishedEndpoints = _publishedEndpoints; @@ -678,32 +701,49 @@ Ice::ObjectAdapterI::refreshPublishedEndpoints() } EndpointSeq -Ice::ObjectAdapterI::getEndpoints() const +Ice::ObjectAdapterI::getPublishedEndpoints() const { IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); EndpointSeq endpoints; - transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), - back_inserter(endpoints), -#ifdef ICE_CPP11_MAPPING - [](const IncomingConnectionFactoryPtr& factory) - { - return factory->endpoint(); - }); -#else - Ice::constMemFun(&IncomingConnectionFactory::endpoint)); -#endif + copy(_publishedEndpoints.begin(), _publishedEndpoints.end(), back_inserter(endpoints)); return endpoints; } -EndpointSeq -Ice::ObjectAdapterI::getPublishedEndpoints() const +void +Ice::ObjectAdapterI::setPublishedEndpoints(const EndpointSeq& newEndpoints) { - IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + vector<EndpointIPtr> newPublishedEndpoints; + transform(newEndpoints.begin(), newEndpoints.end(), back_inserter(newPublishedEndpoints), toEndpointI); - EndpointSeq endpoints; - copy(_publishedEndpoints.begin(), _publishedEndpoints.end(), back_inserter(endpoints)); - return endpoints; + LocatorInfoPtr locatorInfo; + vector<EndpointIPtr> oldPublishedEndpoints; + { + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + checkForDeactivation(); + + oldPublishedEndpoints = _publishedEndpoints; + _publishedEndpoints = newPublishedEndpoints; + + locatorInfo = _locatorInfo; + } + + try + { + Ice::Identity dummy; + dummy.name = "dummy"; + updateLocatorRegistry(locatorInfo, createDirectProxy(dummy)); + } + catch(const Ice::LocalException&) + { + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + // + // Restore the old published endpoints. + // + _publishedEndpoints = oldPublishedEndpoints; + throw; + } } bool |