19 #ifndef INCLUDE_RCF_SUBSCRIPTIONSERVICE_HPP 20 #define INCLUDE_RCF_SUBSCRIPTIONSERVICE_HPP 30 #include <RCF/Export.hpp> 33 #include <RCF/PeriodicTimer.hpp> 34 #include <RCF/ServerStub.hpp> 35 #include <RCF/Service.hpp> 45 SubscriptionService & subscriptionService,
47 RcfSessionWeakPtr rcfSessionWeakPtr,
48 std::uint32_t incomingPingIntervalMs,
49 const std::string & publisherUrl,
50 const std::string & topic,
53 void setWeakThisPtr(SubscriptionWeakPtr thisWeakPtr);
59 unsigned int getPingTimestamp();
60 RcfSessionPtr getRcfSessionPtr();
69 friend class SubscriptionService;
71 static void onDisconnect(SubscriptionWeakPtr subPtr,
RcfSession & session);
73 SubscriptionService & mSubscriptionService;
74 SubscriptionWeakPtr mThisWeakPtr;
76 RecursiveMutex mMutex;
77 RcfSessionWeakPtr mRcfSessionWeakPtr;
79 RcfClientPtr mConnectionPtr;
81 std::uint32_t mPubToSubPingIntervalMs = 0;
82 bool mPublisherSupportsPubSubPings =
true;
83 std::string mPublisherUrl;
97 void setTopicName(
const std::string & publisherName);
100 std::string getTopicName()
const;
103 void setPublisherEndpoint(
const Endpoint & publisherEp);
106 void setPublisherEndpoint(
I_RcfClient & rcfClient);
116 friend class SubscriptionService;
118 std::string mPublisherName;
124 class RCF_EXPORT SubscriptionService :
130 SubscriptionService(std::uint32_t pingIntervalMs = 0);
132 ~SubscriptionService();
134 template<
typename Interface,
typename T>
135 SubscriptionPtr createSubscription(
139 std::string defaultPublisherName = getInterfaceName((Interface *) NULL);
141 std::reference_wrapper<T> refWrapper(t);
143 RcfClientPtr rcfClientPtr(
144 createServerStub((Interface *) 0, (T *) 0, refWrapper));
146 return createSubscriptionImpl(rcfClientPtr, parms, defaultPublisherName);
149 template<
typename Interface,
typename T>
150 SubscriptionPtr createSubscription(
156 return createSubscription<Interface>(t, parms);
159 SubscriptionPtr createSubscriptionImpl(
160 RcfClientPtr rcfClientPtr,
162 const std::string & defaultPublisherName);
164 void createSubscriptionImplBegin(
165 RcfClientPtr rcfClientPtr,
167 const std::string & defaultPublisherName);
169 void createSubscriptionImplEnd(
171 ClientStubPtr clientStubPtr,
173 const std::string & publisherName,
174 RcfClientPtr rcfClientPtr,
177 std::uint32_t pubToSubPingIntervalMs,
180 void closeSubscription(SubscriptionWeakPtr subscriptionPtr);
182 void setPingIntervalMs(std::uint32_t pingIntervalMs);
183 std::uint32_t getPingIntervalMs()
const;
191 Mutex mSubscriptionsMutex;
193 typedef std::set<SubscriptionWeakPtr> Subscriptions;
194 Subscriptions mSubscriptions;
196 std::uint32_t mPingIntervalMs;
197 PeriodicTimer mPeriodicTimer;
199 virtual void onTimer();
200 void pingAllSubscriptions();
201 void harvestExpiredSubscriptions();
203 static void sOnPingCompleted(RecursiveLockPtr lockPtr);
207 SubscriptionPtr onRequestSubscriptionCompleted(
209 const std::string & publisherName,
211 RcfClientPtr rcfClientPtr,
213 std::uint32_t pubToSubPingIntervalMs,
218 std::int32_t doRequestSubscription(
220 const std::string & publisherName,
221 std::uint32_t subToPubPingIntervalMs,
222 std::uint32_t & pubToSubPingIntervalMs,
223 bool & pingsEnabled);
225 void doRequestSubscriptionAsync(
227 const std::string & publisherName,
228 RcfClientPtr rcfClientPtr,
231 void doRequestSubscriptionAsync_Complete(
233 RcfClientPtr requestClientPtr,
234 const std::string & publisherName,
235 RcfClientPtr rcfClientPtr,
241 std::int32_t doRequestSubscription_Legacy(
243 const std::string & publisherName,
244 std::uint32_t subToPubPingIntervalMs,
245 std::uint32_t & pubToSubPingIntervalMs,
246 bool & pingsEnabled);
248 void doRequestSubscriptionAsync_Legacy(
250 const std::string & publisherName,
251 RcfClientPtr rcfClientPtr,
254 void doRequestSubscriptionAsync_Legacy_Complete(
255 ClientStubPtr clientStubPtr,
257 const std::string & publisherName,
258 RcfClientPtr rcfClientPtr,
267 typedef std::shared_ptr<SubscriptionService> SubscriptionServicePtr;
271 #endif // ! INCLUDE_RCF_SUBSCRIPTIONSERVICE_HPP
Base class of all RcfClient<> templates.
Definition: RcfClient.hpp:45
Represents a server side session, associated with a client connection.
Definition: RcfSession.hpp:65
Controls the client side of a RCF connection.
Definition: ClientStub.hpp:83
std::unique_ptr< ClientTransport > ClientTransportUniquePtr
Unique pointer wrapper for RCF::ClientTransport.
Definition: RcfFwd.hpp:44
void setPublisherEndpoint(const Endpoint &publisherEp)
Sets the network endpoint of the publishing server.
Provides the ability for remote calls to be executed asynchronously.
Definition: Future.hpp:51
Provides RCF server-side functionality.
Definition: RcfServer.hpp:54
Base class for all network endpoint types.
Definition: Endpoint.hpp:41
std::function< void(RcfSession &)> OnSubscriptionDisconnect
Describes a user-provided callback function to be called on the subscriber side, whenever a subscribe...
Definition: RcfFwd.hpp:78
General configuration of a subscription.
Definition: SubscriptionService.hpp:91
Definition: AmiIoHandler.hpp:24
Represents a subscription to a RCF publisher. To create a subscription, use RcfServer::createSubscrip...
Definition: SubscriptionService.hpp:40
std::function< void(SubscriptionPtr, ExceptionPtr)> OnAsyncSubscribeCompleted
Describes a user-provided callback function to be called on the subscriber side, when an subscription...
Definition: RcfFwd.hpp:81