Exemplo n.º 1
0
    boost::int32_t PublishingService::RequestSubscription(
        const std::string &subscriptionName,
        boost::uint32_t subToPubPingIntervalMs,
        boost::uint32_t & pubToSubPingIntervalMs)
    {
        PublisherPtr publisherPtr;
        std::string publisherName = subscriptionName;
        Lock lock(mPublishersMutex);
        Publishers::iterator iter = mPublishers.find(publisherName);
        if (iter != mPublishers.end())
        {
            PublisherWeakPtr publisherWeakPtr = iter->second;
            publisherPtr = publisherWeakPtr.lock();
        }
        lock.unlock();
        if (publisherPtr)
        {
            RcfSession & rcfSession = getTlsRcfSession();

            if (publisherPtr->mParms.mOnSubscriberConnect)
            {
                bool allowSubscriber = publisherPtr->mParms.mOnSubscriberConnect(rcfSession, subscriptionName);
                if (!allowSubscriber)
                {
                    return RcfError_AccessDenied;
                }
            }

            rcfSession.setPingIntervalMs(subToPubPingIntervalMs);

            ServerTransportEx &serverTransport = dynamic_cast<ServerTransportEx &>(
                rcfSession.getNetworkSession().getServerTransport());

            ClientTransportAutoPtrPtr clientTransportAutoPtrPtr( new ClientTransportAutoPtr(
                serverTransport.createClientTransport( rcfSession.shared_from_this() )));

            (*clientTransportAutoPtrPtr)->setRcfSession(
                rcfSession.shared_from_this());

            if ( publisherPtr->mParms.mOnSubscriberDisconnect )
            {
                rcfSession.setOnDestroyCallback( boost::bind(
                    publisherPtr->mParms.mOnSubscriberDisconnect,
                    _1,
                    publisherName));
            }

            rcfSession.setPingTimestamp();

            rcfSession.addOnWriteCompletedCallback( boost::bind(
                &PublishingService::addSubscriberTransport,
                this,
                _1,
                publisherName,
                clientTransportAutoPtrPtr) );
        }  
        pubToSubPingIntervalMs = mPingIntervalMs;
        return publisherPtr ? RcfError_Ok : RcfError_UnknownPublisher;
    }
Exemplo n.º 2
0
    TransportPair HttpsTransportFactory::createTransports()
    {
        typedef boost::shared_ptr<HttpServerTransport> HttpServerTransportPtr;
        HttpServerTransportPtr serverTransportPtr(
            new HttpServerTransport(HttpEndpoint(mLoopback, 0)));

        serverTransportPtr->open();
        int port = serverTransportPtr->getPort();

        ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(new ClientTransportAutoPtr(
            new HttpClientTransport(HttpEndpoint(mLoopback, port))));

        return std::make_pair(
            ServerTransportPtr(serverTransportPtr),
            clientTransportAutoPtrPtr);
    }
    TransportPair Win32NamedPipeTransportFactory::createTransports()
    {
        typedef boost::shared_ptr<Win32NamedPipeServerTransport> Win32NamedPipeServerTransportPtr;
        Win32NamedPipeServerTransportPtr serverTransportPtr(
            new Win32NamedPipeServerTransport(RCF_T("")));

        tstring pipeName = serverTransportPtr->getPipeName();

        ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
            new ClientTransportAutoPtr(
                new Win32NamedPipeClientTransport(pipeName)));

        return std::make_pair(
            ServerTransportPtr(serverTransportPtr), 
            clientTransportAutoPtrPtr);

    }
    TransportPair UdpTransportFactory::createTransports()
    {
        typedef boost::shared_ptr<UdpServerTransport> UdpServerTransportPtr;
        UdpServerTransportPtr udpServerTransportPtr(
            new UdpServerTransport( IpAddress(mLoopback, 0) ));

        udpServerTransportPtr->open();
        int port = udpServerTransportPtr->getPort();

        ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
            new ClientTransportAutoPtr(
                new UdpClientTransport( IpAddress(mLoopback, port) )));

        return std::make_pair(
            ServerTransportPtr(udpServerTransportPtr), 
            clientTransportAutoPtrPtr);
    }
    TransportPair TcpAsioTransportFactory::createTransports()
    {
        typedef boost::shared_ptr<TcpAsioServerTransport> TcpAsioServerTransportPtr;
        TcpAsioServerTransportPtr tcpServerTransportPtr(
            new TcpAsioServerTransport( IpAddress(mLoopback, 0)));

        tcpServerTransportPtr->open();
        int port = tcpServerTransportPtr->getPort();

        ClientTransportAutoPtrPtr clientTransportAutoPtrPtr(
            new ClientTransportAutoPtr(
                new TcpClientTransport( IpAddress(mLoopback, port))));

        return std::make_pair(
            ServerTransportPtr(tcpServerTransportPtr), 
            clientTransportAutoPtrPtr);
    }