bool Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const { // // NOTE: it's important that isLocal() doesn't perform any blocking operations as // it can be called for AMI invocations if the proxy has no delegate set yet. // ReferencePtr ref = proxy->__reference(); if(ref->isWellKnown()) { // // Check the active servant map to see if the well-known // proxy is for a local object. // return _servantManager->hasServant(ref->getIdentity()); } else if(ref->isIndirect()) { // // Proxy is local if the reference adapter id matches this // adapter id or replica group id. // return ref->getAdapterId() == _id || ref->getAdapterId() == _replicaGroupId; } else { vector<EndpointIPtr> endpoints = ref->getEndpoints(); IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); checkForDeactivation(); // // Proxies which have at least one endpoint in common with the // endpoints used by this object adapter are considered local. // for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p) { for(vector<IncomingConnectionFactoryPtr>::const_iterator q = _incomingConnectionFactories.begin(); q != _incomingConnectionFactories.end(); ++q) { if((*p)->equivalent((*q)->endpoint())) { return true; } } for(vector<EndpointIPtr>::const_iterator r = _publishedEndpoints.begin(); r != _publishedEndpoints.end(); ++r) { if((*p)->equivalent(*r)) { return true; } } } // // Proxies which have at least one endpoint in common with the // router's server proxy endpoints (if any), are also considered // local. // if(_routerInfo && _routerInfo->getRouter() == proxy->ice_getRouter()) { for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p) { for(vector<EndpointIPtr>::const_iterator r = _routerEndpoints.begin(); r != _routerEndpoints.end(); ++r) { if((*p)->equivalent(*r)) { return true; } } } } } return false; }
bool Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const { ReferencePtr ref = proxy->__reference(); vector<EndpointIPtr>::const_iterator p; vector<EndpointIPtr> endpoints; IndirectReferencePtr ir = IndirectReferencePtr::dynamicCast(ref); if(ir) { if(!ir->getAdapterId().empty()) { // // Proxy is local if the reference adapter id matches this // adapter id or replica group id. // return ir->getAdapterId() == _id || ir->getAdapterId() == _replicaGroupId; } // // Get Locator endpoint information for indirect references. // LocatorInfoPtr info = ir->getLocatorInfo(); if(info) { bool isCached; try { endpoints = info->getEndpoints(ir, ir->getLocatorCacheTimeout(), isCached); } catch(const Ice::LocalException&) { return false; } } else { return false; } } else { endpoints = ref->getEndpoints(); } IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); checkForDeactivation(); // // Proxies which have at least one endpoint in common with the // endpoints used by this object adapter's incoming connection // factories are considered local. // for(p = endpoints.begin(); p != endpoints.end(); ++p) { vector<IncomingConnectionFactoryPtr>::const_iterator q; for(q = _incomingConnectionFactories.begin(); q != _incomingConnectionFactories.end(); ++q) { if((*q)->equivalent(*p)) { return true; } } } // // Proxies which have at least one endpoint in common with the // router's server proxy endpoints (if any), are also considered // local. // if(_routerInfo && _routerInfo->getRouter() == proxy->ice_getRouter()) { for(p = endpoints.begin(); p != endpoints.end(); ++p) { if(binary_search(_routerEndpoints.begin(), _routerEndpoints.end(), *p)) // _routerEndpoints is sorted. { return true; } } } return false; }