void SubscriptionService::doRequestSubscriptionAsync( ClientStub & clientStubOrig, const std::string & publisherName, RcfClientPtr rcfClientPtr, const SubscriptionParms & parms) { RcfClientPtr requestClientPtr( new I_RcfClient("", clientStubOrig) ); requestClientPtr->getClientStub().setTransport( clientStubOrig.releaseTransport() ); requestClientPtr->getClientStub().setAsyncDispatcher(*mpServer); // Set OOB request. boost::uint32_t subToPubPingIntervalMs = mPingIntervalMs; OobRequestSubscription msg( clientStubOrig.getRuntimeVersion(), publisherName, subToPubPingIntervalMs); ByteBuffer controlRequest; msg.encodeRequest(controlRequest); requestClientPtr->getClientStub().setOutofBandRequest(controlRequest); Future<Void> fv; fv = requestClientPtr->getClientStub().ping( RCF::AsyncTwoway( boost::bind( &SubscriptionService::doRequestSubscriptionAsync_Complete, this, fv, requestClientPtr, publisherName, rcfClientPtr, parms.mOnDisconnect, parms.mOnAsyncSubscribeCompleted ))); }
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; }
int getRuntimeVersionOfThisRemoteCall() { int runtimeVersion = 0; RcfSession * pRcfSession = getTlsRcfSessionPtr(); ClientStub * pClientStub = getTlsClientStubPtr(); if (pRcfSession) { runtimeVersion = pRcfSession->getRuntimeVersion(); } else if (pClientStub) { runtimeVersion = pClientStub->getRuntimeVersion(); } else { // This function must be called from within the client-side // or server-side portion of a remote call. RCF_ASSERT(0); runtimeVersion = getDefaultRuntimeVersion(); } return runtimeVersion; }