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 )));
    }
Esempio n. 2
0
    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;
    }
Esempio n. 4
0
    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;
    }