WSF
WsfXIO_Publisher.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2003-2015 The Boeing Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11
12#ifndef WSFXIO_PUBLISHER_HPP
13#define WSFXIO_PUBLISHER_HPP
14
15#include "wsf_export.h"
16
17#include <list>
18#include <map>
19#include <string>
20#include <vector>
21
22#include "GenMemI.hpp"
23#include "GenMemIO.hpp"
24#include "GenUniqueId.hpp"
25#include "UtBinder.hpp"
26#include "UtCallback.hpp"
27#include "UtCallbackHolder.hpp"
33
34// Includes for serialization
38
39
75{
76 WsfXIO_Publisher& operator=(const WsfXIO_Publisher&) = delete; // Not implemented
77 template<typename C>
78 using MemberFnPtr = void (C::*)(const WsfXIO_PublishKey&);
79 using NonMemberFnPtr = void (*)(const WsfXIO_PublishKey&);
80
81public:
82 WsfXIO_Publisher(WsfXIO_Interface* aInterfacePtr);
83
84 using SubscriptionId = GenUniqueId;
85 using SubscribeCallbackList = UtCallbackListN<void(const WsfXIO_PublishKey&)>;
86 using SubscribeCallback = SubscribeCallbackList::CallbackType;
87
89 void Unpublish(const WsfXIO_PublishKey& aKey);
90
92 template<typename T>
93 void Publish(const WsfXIO_PublishKey& aKey, const T& aData)
94 {
95 GenBuffer buf;
96 buf.SetBigEndian();
97 PakO ar(&buf);
98 ar& const_cast<T&>(aData);
99 auto bytes = static_cast<int>(buf.GetPutPos());
100 Publish(aKey, (char*)buf.GetBuffer(), bytes);
101 }
102
103 bool Unsubscribe(const SubscriptionId& aSubscriptionId);
104
108 SubscribeCallback* Subscribe(const WsfXIO_PublishFilter& aFilter, SubscribeCallback* aCallbackPtr);
109
110 SubscribeCallback* Subscribe(SubscriptionId& aSubscriptionId,
111 const WsfXIO_PublishFilter& aFilter,
112 SubscribeCallback* aCallbackPtr);
113
114 template<typename C>
115 std::unique_ptr<SubscribeCallback> Subscribe(const WsfXIO_PublishFilter& aFilter, MemberFnPtr<C> aMethodPtr, C* aThisPtr)
116 {
117 SubscriptionId subscriptionId;
118 return Subscribe(subscriptionId, aFilter, aMethodPtr, aThisPtr);
119 }
120
121 template<typename C>
122 std::unique_ptr<SubscribeCallback>
123 Subscribe(SubscriptionId& aSubscriptionId, const WsfXIO_PublishFilter& aFilter, MemberFnPtr<C> aMethodPtr, C* aThisPtr)
124 {
125 auto callbackPtr = ut::make_unique<SubscribeCallback>(UtStd::Bind(aMethodPtr, aThisPtr));
126 Subscribe(aSubscriptionId, aFilter, callbackPtr.get());
127 return callbackPtr;
128 }
129
130 std::unique_ptr<SubscribeCallback> Subscribe(const WsfXIO_PublishFilter& aFilter, NonMemberFnPtr aFunctionPtr)
131 {
132 SubscriptionId subscriptionId;
133 return Subscribe(subscriptionId, aFilter, aFunctionPtr);
134 }
135
136 std::unique_ptr<SubscribeCallback> Subscribe(SubscriptionId& aSubscriptionId,
137 const WsfXIO_PublishFilter& aFilter,
138 NonMemberFnPtr aFunctionPtr)
139 {
140 auto callbackPtr = ut::make_unique<SubscribeCallback>(UtStd::Bind(aFunctionPtr));
141 Subscribe(aSubscriptionId, aFilter, callbackPtr.get());
142 return callbackPtr;
143 }
144
145 std::unique_ptr<SubscribeCallback> Subscribe(const WsfXIO_PublishFilter& aFilter,
146 const SubscribeCallback::FunctionType& aFunc)
147 {
148 SubscriptionId subscriptionId;
149 return Subscribe(subscriptionId, aFilter, aFunc);
150 }
151
152 std::unique_ptr<SubscribeCallback> Subscribe(SubscriptionId& aSubscriptionId,
153 const WsfXIO_PublishFilter& aFilter,
154 const SubscribeCallback::FunctionType& aFunc)
155 {
156 auto callbackPtr = ut::make_unique<SubscribeCallback>(aFunc);
157 Subscribe(aSubscriptionId, aFilter, callbackPtr.get());
158 return callbackPtr;
159 }
160
164 template<typename T>
165 bool GetData(const WsfXIO_PublishKey aKey, T& aData)
166 {
167 bool ok = false;
168 auto i = mReceivedPublications.find(aKey);
169 if (i != mReceivedPublications.end())
170 {
171 GenBuffer io(&i->second.mData[0], static_cast<int>(i->second.mData.size()));
172 io.SetBigEndian();
173 PakI ar(&io);
174 ar& aData;
175 ok = true;
176 }
177 return ok;
178 }
179
180 void SetDebugLevel(int aDebugLevel) { mDebugLevel = aDebugLevel; }
181
182private:
183 void HandleConnect(WsfXIO_Connection* aConnection);
184 void HandleDisconnect(WsfXIO_Connection* aConnection);
185
186 void ProcessSubscription(WsfXIO_SubscriptionPkt& aPkt);
187 void ProcessUnsubscription(WsfXIO_SubscriptionPkt& aPkt);
188 void ProcessPublication(WsfXIO_PublicationPkt& aPkt);
189
190 void Publish(const WsfXIO_PublishKey& aKey, char* aData, int aBytes);
191
192 using DataBuffer = std::vector<char>;
193
194 struct ReceivedSubscription;
195
196 struct Publication
197 {
199 DataBuffer mData;
200 WsfXIO_Destination mDestination;
201 std::vector<ReceivedSubscription*> mRcvSubscriptions;
202 };
203
204 struct Subscription
205 {
206 private:
207 Subscription& operator=(const Subscription& aRhs);
208
209 public:
210 SubscriptionId mSubscriptionId;
211 WsfXIO_PublishFilter mFilter;
212 SubscribeCallbackList mCallback;
213
214 bool operator==(const SubscriptionId& aSubscriptionId) const { return mSubscriptionId == aSubscriptionId; }
215 bool operator!=(const SubscriptionId& aSubscriptionId) const { return !(mSubscriptionId == aSubscriptionId); }
216 };
217
218 struct ReceivedPublication
219 {
220 WsfXIO_PublishKey mKey;
221 DataBuffer mData;
222 std::vector<Subscription*> mSubscriptions;
223 };
224
225 struct ReceivedSubscription
226 {
227 WsfXIO_Connection* mConnectionPtr;
228 WsfXIO_PublishFilter mFilter;
229 SubscriptionId mSubscriptionId;
230
231 bool operator==(const SubscriptionId& aSubscriptionId) const { return mSubscriptionId == aSubscriptionId; }
232 bool operator!=(const SubscriptionId& aSubscriptionId) const { return !(mSubscriptionId == aSubscriptionId); }
233 };
234
235 bool DispatchToSubscriber(const std::vector<SubscriptionId>& aSubscriberIds, const Subscription& aSubscription) const;
236
237 std::map<WsfXIO_PublishKey, Publication> mPublished;
238 std::list<Subscription> mSubscriptions;
239 std::map<WsfXIO_PublishKey, ReceivedPublication> mReceivedPublications;
240 std::list<ReceivedSubscription> mReceivedSubscriptions;
241
242 UtCallbackHolder mCallbacks;
243 WsfXIO_Interface* mInterfacePtr;
244 int mDebugLevel;
245};
246
247#endif
bool ok
Definition WsfScriptWeaponClass.cpp:211
bool operator!=(int aId, const WsfStringInt &aRhs)
Not equal relational operator for the case of an integer on the LHS and a StringId on the RHS.
Definition WsfStringId.hpp:75
bool operator==(int aId, const WsfStringInt &aRhs)
Equal relational operator for the case of an integer on the LHS and a StringId on the RHS.
Definition WsfStringId.hpp:69
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfXIO_Connection.hpp:37
Definition WsfXIO_Destination.hpp:26
Definition WsfXIO_Interface.hpp:54
Definition WsfXIO_PacketRegistry.hpp:1008
Definition WsfXIO_PublishKey.hpp:159
Definition WsfXIO_PublishKey.hpp:27
std::unique_ptr< SubscribeCallback > Subscribe(const WsfXIO_PublishFilter &aFilter, const SubscribeCallback::FunctionType &aFunc)
Definition WsfXIO_Publisher.hpp:145
GenUniqueId SubscriptionId
Definition WsfXIO_Publisher.hpp:84
bool GetData(const WsfXIO_PublishKey aKey, T &aData)
Definition WsfXIO_Publisher.hpp:165
std::unique_ptr< SubscribeCallback > Subscribe(const WsfXIO_PublishFilter &aFilter, NonMemberFnPtr aFunctionPtr)
Definition WsfXIO_Publisher.hpp:130
void SetDebugLevel(int aDebugLevel)
Definition WsfXIO_Publisher.hpp:180
SubscribeCallback * Subscribe(const WsfXIO_PublishFilter &aFilter, SubscribeCallback *aCallbackPtr)
Definition WsfXIO_Publisher.cpp:378
void Publish(const WsfXIO_PublishKey &aKey, const T &aData)
Publish some data using a key.
Definition WsfXIO_Publisher.hpp:93
UtCallbackListN< void(const WsfXIO_PublishKey &)> SubscribeCallbackList
Definition WsfXIO_Publisher.hpp:85
std::unique_ptr< SubscribeCallback > Subscribe(SubscriptionId &aSubscriptionId, const WsfXIO_PublishFilter &aFilter, MemberFnPtr< C > aMethodPtr, C *aThisPtr)
Definition WsfXIO_Publisher.hpp:123
std::unique_ptr< SubscribeCallback > Subscribe(SubscriptionId &aSubscriptionId, const WsfXIO_PublishFilter &aFilter, NonMemberFnPtr aFunctionPtr)
Definition WsfXIO_Publisher.hpp:136
SubscribeCallbackList::CallbackType SubscribeCallback
Definition WsfXIO_Publisher.hpp:86
WsfXIO_Publisher(WsfXIO_Interface *aInterfacePtr)
Definition WsfXIO_Publisher.cpp:34
std::unique_ptr< SubscribeCallback > Subscribe(const WsfXIO_PublishFilter &aFilter, MemberFnPtr< C > aMethodPtr, C *aThisPtr)
Definition WsfXIO_Publisher.hpp:115
void Unpublish(const WsfXIO_PublishKey &aKey)
Remove a previously published publication.
Definition WsfXIO_Publisher.cpp:177
std::unique_ptr< SubscribeCallback > Subscribe(SubscriptionId &aSubscriptionId, const WsfXIO_PublishFilter &aFilter, const SubscribeCallback::FunctionType &aFunc)
Definition WsfXIO_Publisher.hpp:152
Definition WsfXIO_PacketRegistry.hpp:998
Copyrights Multiple, All Rights Reserved