void onRtfCompleted( RCF::Future<Void> fv, RcfClientPtr rtfClientPtr, ClientStub & clientStubOrig, boost::shared_ptr<std::vector<FilterPtr> > filters, boost::function0<void> onCompletion) { ClientStubPtr rtfStubPtr = rtfClientPtr->getClientStubPtr(); clientStubOrig.setTransport( rtfStubPtr->releaseTransport() ); clientStubOrig.setSubRcfClientPtr( RcfClientPtr() ); std::auto_ptr<Exception> ePtr = fv.getAsyncException(); if ( ePtr.get() ) { clientStubOrig.setAsyncException(ePtr); } else { // Get OOB response. OobRequestTransportFilters msg(clientStubOrig.getRuntimeVersion()); ByteBuffer controlResponse = rtfStubPtr->getOutOfBandResponse(); rtfStubPtr->setOutofBandRequest(ByteBuffer()); rtfStubPtr->setOutofBandResponse(ByteBuffer()); msg.decodeResponse(controlResponse); int ret = msg.mResponseError; if (ret != RcfError_Ok) { ePtr.reset( new RemoteException(Error(ret)) ); clientStubOrig.setAsyncException(ePtr); } else { for (std::size_t i=0; i<filters->size(); ++i) { (*filters)[i]->resetState(); } clientStubOrig.getTransport().setTransportFilters(*filters); } } onCompletion(); }
boost::int32_t SubscriptionService::doRequestSubscription( ClientStub & clientStubOrig, const std::string & publisherName, boost::uint32_t subToPubPingIntervalMs, boost::uint32_t & pubToSubPingIntervalMs, bool & pingsEnabled) { I_RcfClient client("", clientStubOrig); ClientStub & clientStub = client.getClientStub(); clientStub.setTransport(clientStubOrig.releaseTransport()); pingsEnabled = true; // Set OOB request. OobRequestSubscription msg( clientStubOrig.getRuntimeVersion(), publisherName, subToPubPingIntervalMs); ByteBuffer controlRequest; msg.encodeRequest(controlRequest); clientStub.setOutofBandRequest(controlRequest); clientStub.ping(RCF::Twoway); // Get OOB response. ByteBuffer controlResponse = clientStub.getOutOfBandResponse(); clientStub.setOutofBandRequest(ByteBuffer()); clientStub.setOutofBandResponse(ByteBuffer()); msg.decodeResponse(controlResponse); boost::int32_t ret = msg.mResponseError; pubToSubPingIntervalMs = msg.mPubToSubPingIntervalMs; clientStubOrig.setTransport( client.getClientStub().releaseTransport() ); return ret; }