void Session_Service::onRemoteObjectComplete(qi::Future<void> future, long requestId) { qiLogDebug() << "Got metaobject"; boost::recursive_mutex::scoped_lock l(_requestsMutex); ServiceRequest *sr = serviceRequest(requestId); if (!sr) return; if (future.hasError()) { sr->promise.setError(future.error()); removeRequest(requestId); return; } { boost::recursive_mutex::scoped_lock sl(_remoteObjectsMutex); RemoteObjectMap::iterator it = _remoteObjects.find(sr->name); if (it != _remoteObjects.end()) { //another object have been registered before us, return it //the new socket will be closed when the request is deleted qiLogVerbose() << "A request for the service " << sr->name << " have been discarded, " << "the remoteobject on the service was already available."; sr->promise.setValue(it->second); } else { AnyObject o = makeDynamicAnyObject(sr->remoteObject); //register the remote object in the cache addService(sr->name, o); sr->promise.setValue(o); sr->remoteObject = 0; } } removeRequest(requestId); }
RemoteObject::RemoteObject(unsigned int service, unsigned int object, qi::MetaObject metaObject, TransportSocketPtr socket) : ObjectHost(service) , _socket() , _service(service) , _object(object) , _linkMessageDispatcher(0) , _self(makeDynamicAnyObject(this, false)) { setMetaObject(metaObject); if (socket) setTransportSocket(socket); }
ServiceDirectoryClient::ServiceDirectoryClient() : Trackable<ServiceDirectoryClient>(this) , _remoteObject(qi::Message::Service_ServiceDirectory) , _addSignalLink(0) , _removeSignalLink(0) , _localSd(false) { _object = makeDynamicAnyObject(&_remoteObject, false); connected.setCallType(MetaCallType_Direct); disconnected.setCallType(MetaCallType_Direct); }
RemoteObject::RemoteObject(unsigned int service, qi::TransportSocketPtr socket) : ObjectHost(service) , _socket() , _service(service) , _object(1) , _linkMessageDispatcher(0) , _self(makeDynamicAnyObject(this, false)) { /* simple metaObject with only special methods. (<100) * Will be *replaced* by metaObject received from remote end, when * fetchMetaObject is invoked and retuns. */ static qi::MetaObject* mo = nullptr; QI_ONCE(mo = createRemoteObjectSpecialMetaObject()); setMetaObject(*mo); if (socket) setTransportSocket(socket); //fetchMetaObject should be called to make sure the metaObject is valid. }