Ejemplo n.º 1
0
    SubscriptionPtr SubscriptionService::createSubscriptionImpl(
        RcfClientPtr rcfClientPtr, 
        const SubscriptionParms & parms,
        const std::string & defaultPublisherName)
    {
        if (parms.mOnAsyncSubscribeCompleted)
        {
            // Async code path.
            createSubscriptionImplBegin(rcfClientPtr, parms, defaultPublisherName);
            return SubscriptionPtr();
        }

        ClientStub & clientStub = const_cast<ClientStub &>(parms.mClientStub);
        OnSubscriptionDisconnect onDisconnect = parms.mOnDisconnect;
        std::string publisherName = parms.mPublisherName;
        if (publisherName.empty())
        {
            publisherName = defaultPublisherName;
        }

        boost::uint32_t     subToPubPingIntervalMs = mPingIntervalMs;
        boost::uint32_t     pubToSubPingIntervalMs = 0;
        bool                pingsEnabled = true;

        boost::int32_t ret = 0;

        // First round trip, to do version negotiation with the server.
        clientStub.ping();

        if (clientStub.getRuntimeVersion() <= 11)
        {
            ret = doRequestSubscription_Legacy(
                clientStub,
                publisherName,
                subToPubPingIntervalMs,
                pubToSubPingIntervalMs,
                pingsEnabled);
        }
        else
        {
            ret = doRequestSubscription(
                clientStub,
                publisherName,
                subToPubPingIntervalMs,
                pubToSubPingIntervalMs,
                pingsEnabled);
        }

        SubscriptionPtr subscriptionPtr = onRequestSubscriptionCompleted(
            ret,
            publisherName,
            clientStub,
            rcfClientPtr,
            onDisconnect,
            pubToSubPingIntervalMs,
            pingsEnabled);

        return subscriptionPtr;
    }
Ejemplo n.º 2
0
    SubscriptionPtr SubscriptionService::createSubscriptionImpl(
        RcfClientPtr rcfClientPtr, 
        const SubscriptionParms & parms,
        const std::string & defaultPublisherName)
    {
        if (parms.mOnAsyncSubscribeCompleted)
        {
            // Async code path.
            createSubscriptionImplBegin(rcfClientPtr, parms, defaultPublisherName);
            return SubscriptionPtr();
        }

        ClientStub & clientStub = const_cast<ClientStub &>(parms.mClientStub);
        OnSubscriptionDisconnect onDisconnect = parms.mOnDisconnect;
        std::string publisherName = parms.mPublisherName;
        if (publisherName.empty())
        {
            publisherName = defaultPublisherName;
        }

        RcfClient<I_RequestSubscription> client(clientStub);
        client.getClientStub().setTransport(clientStub.releaseTransport());
        boost::uint32_t subToPubPingIntervalMs = mPingIntervalMs;
        boost::uint32_t pubToSubPingIntervalMs = 0;

        bool pingsEnabled = true;

        boost::int32_t ret = 0;
        if (clientStub.getRuntimeVersion() < 8)
        {
            pingsEnabled = false;

            ret = client.RequestSubscription(
                Twoway, 
                publisherName);
        }
        else
        {
            ret = client.RequestSubscription(
                Twoway, 
                publisherName, 
                subToPubPingIntervalMs, 
                pubToSubPingIntervalMs);
        }

        SubscriptionPtr subscriptionPtr = onRequestSubscriptionCompleted(
            ret,
            publisherName,
            client,
            rcfClientPtr,
            onDisconnect,
            pubToSubPingIntervalMs,
            pingsEnabled);

        return subscriptionPtr;
    }
Ejemplo n.º 3
0
    SubscriptionPtr SubscriptionService::onRequestSubscriptionCompleted(
        boost::int32_t                      ret,
        const std::string &                 publisherName,
        RcfClient<I_RequestSubscription> &  client,
        RcfClientPtr                        rcfClientPtr,
        OnSubscriptionDisconnect            onDisconnect,
        boost::uint32_t                     pubToSubPingIntervalMs,
        bool                                pingsEnabled)
    {
        bool ok = (ret == RcfError_Ok);
        if (ok)
        {
            ClientTransportAutoPtr clientTransportAutoPtr(
                client.getClientStub().releaseTransport());

            I_ServerTransport * pTransport = NULL;
            I_ServerTransportEx * pTransportEx = NULL;

            if (clientTransportAutoPtr->isInProcess())
            {
                pTransport = dynamic_cast<I_ServerTransport *>(
                    clientTransportAutoPtr.get());
            }
            else
            {
                pTransport = & mpServer->findTransportCompatibleWith(
                    *clientTransportAutoPtr);
            }

            pTransportEx = dynamic_cast<I_ServerTransportEx *>(pTransport);

            I_ServerTransportEx & serverTransportEx = * pTransportEx; 

            SessionPtr sessionPtr = serverTransportEx.createServerSession(
                clientTransportAutoPtr,
                StubEntryPtr(new StubEntry(rcfClientPtr)),
                true);

            RCF_ASSERT( sessionPtr );

            RcfSessionPtr rcfSessionPtr = sessionPtr;

            rcfSessionPtr->setUserData(client.getClientStub().getUserData());
            rcfSessionPtr->setPingTimestamp();

            std::string publisherUrl;
            EndpointPtr epPtr = client.getClientStub().getEndpoint();
            if (epPtr)
            {
                publisherUrl = epPtr->asString();
            }

            if (    !clientTransportAutoPtr->isInProcess() 
                &&  !clientTransportAutoPtr->isAssociatedWithIoService())
            {
                AsioServerTransport & asioTransport = dynamic_cast<AsioServerTransport &>(
                    mpServer->getServerTransport());

                clientTransportAutoPtr->associateWithIoService(asioTransport.getIoService());
            }

            SubscriptionPtr subscriptionPtr( new Subscription(
                *this,
                clientTransportAutoPtr, 
                rcfSessionPtr, 
                pubToSubPingIntervalMs, 
                publisherUrl,
                publisherName,
                onDisconnect));

            rcfSessionPtr->setOnDestroyCallback( boost::bind(
                &Subscription::onDisconnect,
                SubscriptionWeakPtr(subscriptionPtr),
                _1));

            subscriptionPtr->setWeakThisPtr(subscriptionPtr);

            subscriptionPtr->mPingsEnabled = pingsEnabled;

            Lock lock(mSubscriptionsMutex);
            mSubscriptions.insert(subscriptionPtr);

            return subscriptionPtr;                
        }
        return SubscriptionPtr();
    }