Example #1
0
  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);
  }
Example #2
0
 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);
 }
Example #3
0
  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);
  }
Example #4
0
 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.
 }