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; }
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); }