WSF
WsfXIO_Service.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_SERVICE_HPP
13#define WSFXIO_SERVICE_HPP
14
15#include "wsf_export.h"
16
17#include <map>
18#include <utility>
19#include <vector>
20
21#include "UtCallbackHolder.hpp"
22class WsfPlatform;
27class WsfXIO_Service;
30
35{
36public:
37 WsfXIO_Service(WsfXIO_Interface* aInterfacePtr);
38 virtual ~WsfXIO_Service();
39
40 WsfXIO_Subscription* FindSubscription(WsfXIO_Connection* aConnectionPtr, int aSubscriptionId);
41
43
44protected:
45 using SubscriptionMap = std::map<WsfXIO_SubscriptionId, WsfXIO_Subscription*>;
46
47 void DenyRequest(WsfXIO_RequestDataPkt& aRequest);
48
49 void HandleDisconnect(WsfXIO_Connection* aConnection);
50
51 void AddSubscription(WsfXIO_Subscription* aSubscriptionPtr);
52
53 bool RemoveSubscription(WsfXIO_Subscription* aSubscriptionPtr);
54
56
58
59 virtual void SubscriptionCancelled(WsfXIO_Subscription* aSubscriptionPtr);
60
61 const SubscriptionMap GetSubscriptions() const { return mSubscriptions; }
62
63 WsfXIO_Subscription* FindSubscription(const WsfXIO_SubscriptionId& aSubscriptionId);
64
65 virtual void RemovingSubscription(WsfXIO_Subscription* aSubscriptionPtr) {}
66
67 UtCallbackHolder mCallbacks;
69
70private:
71 SubscriptionMap mSubscriptions;
72};
73
78template<typename T, typename SERVICE_TYPE = WsfXIO_Service>
79class WsfXIO_ServiceT : public SERVICE_TYPE
80{
81public:
82 using RequestType = T;
83
85 : SERVICE_TYPE(aInterfacePtr)
86 {
87 }
88
91 {
92 WsfXIO_Subscription* subscriptionPtr = SERVICE_TYPE::CreateSubscription(aRequest);
93 mRequests[subscriptionPtr->GetId()] = aRequest;
94 return subscriptionPtr;
95 }
96
99 virtual void SubscriptionCancelledT(WsfXIO_Subscription* aSubscriptionPtr, RequestType& aRequest)
100 {
101 SERVICE_TYPE::SubscriptionCancelled(aSubscriptionPtr);
102 }
103
104protected:
105 using RequestMapT = std::map<WsfXIO_SubscriptionId, T>;
106 void SubscriptionCancelled(WsfXIO_Subscription* aSubscriptionPtr) override
107 {
108 typename RequestMapT::iterator i = mRequests.find(aSubscriptionPtr->GetId());
109 if (i != mRequests.end())
110 {
111 SubscriptionCancelledT(aSubscriptionPtr, i->second);
112 mRequests.erase(i);
113 }
114 }
116 {
117 typename RequestMapT::const_iterator i = mRequests.find(aId);
118 if (i != mRequests.end())
119 {
120 return &i->second;
121 }
122 return nullptr;
123 }
124 const RequestMapT& GetRequests() const { return mRequests; }
125
126private:
127 RequestMapT mRequests;
128};
129
133{
134public:
136 virtual ~WsfXIO_ServiceSession();
138 virtual void HandleResponse(WsfXIO_ResponsePkt& aPkt) {}
139 WsfXIO_Subscription& GetSubscription() { return *mSubscriptionPtr; }
140
141private:
142 WsfXIO_Subscription* mSubscriptionPtr;
143};
144
150template<typename SESSION_TYPE, typename REQUEST_TYPE, typename SERVICE_TYPE>
151class WsfXIO_SessionServiceT : protected SERVICE_TYPE
152{
153public:
154 using SessionType = SESSION_TYPE;
155 using RequestType = REQUEST_TYPE;
156
158 : SERVICE_TYPE(aInterfacePtr)
159 {
160 }
161
164 {
165 WsfXIO_Subscription* subscriptionPtr = SERVICE_TYPE::CreateSubscription(aRequest);
166 mRequests[subscriptionPtr->GetId()] = new SessionType(subscriptionPtr, aRequest);
167 return subscriptionPtr;
168 }
169
172 virtual void SubscriptionCancelledT(WsfXIO_Subscription* aSubscriptionPtr, SessionType& aSession)
173 {
174 delete &aSession;
175 SERVICE_TYPE::SubscriptionCancelled(aSubscriptionPtr);
176 }
177
178 WsfXIO_Subscription* FindSubscription(WsfXIO_Connection* aConnectionPtr, int aSubscriptionId)
179 {
180 return SERVICE_TYPE::FindSubscription(aConnectionPtr, aSubscriptionId);
181 }
182
183 void AddRequiredPlatform(WsfPlatform& aPlatform, WsfXIO_Subscription* aSubscriptionPtr)
184 {
185 SERVICE_TYPE::AddRequiredPlatform(aPlatform, aSubscriptionPtr);
186 }
187
188protected:
189 using RequestMapT = std::map<WsfXIO_SubscriptionId, SessionType*>;
190
191 virtual void SubscriptionCancelled(WsfXIO_Subscription* aSubscriptionPtr)
192 {
193 typename RequestMapT::iterator i = mRequests.find(aSubscriptionPtr->GetId());
194 if (mRequests.end() != i)
195 {
196 SubscriptionCancelledT(aSubscriptionPtr, *i->second);
197 mRequests.erase(i);
198 }
199 }
200
201 const RequestMapT& GetRequests() const { return mRequests; }
202
203private:
204 RequestMapT mRequests;
205};
206
207#endif
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
std::pair< int, int > WsfXIO_SubscriptionId
Definition WsfXIO_Subscription.hpp:26
Platforms represent a entity within the simulation.
Definition WsfPlatform.hpp:115
Definition WsfXIO_Connection.hpp:37
Definition WsfXIO_Interface.hpp:54
Basic information required for subscription requests.
Definition WsfXIO_PacketRegistry.hpp:137
Definition WsfXIO_PacketRegistry.hpp:171
WsfXIO_Subscription & GetSubscription()
Definition WsfXIO_Service.hpp:139
WsfXIO_ServiceSession(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.cpp:150
virtual void HandleResponse(WsfXIO_ResponsePkt &aPkt)
Called when a WsfXIO_ResponsePkt is received from a the request object.
Definition WsfXIO_Service.hpp:138
WsfXIO_Subscription * CreateSubscription(RequestType &aRequest)
Create a subscription from a request.
Definition WsfXIO_Service.hpp:90
const RequestMapT & GetRequests() const
Definition WsfXIO_Service.hpp:124
const T * FindRequest(WsfXIO_SubscriptionId aId) const
Definition WsfXIO_Service.hpp:115
std::map< WsfXIO_SubscriptionId, T > RequestMapT
Definition WsfXIO_Service.hpp:105
void SubscriptionCancelled(WsfXIO_Subscription *aSubscriptionPtr) override
Definition WsfXIO_Service.hpp:106
virtual void SubscriptionCancelledT(WsfXIO_Subscription *aSubscriptionPtr, RequestType &aRequest)
Definition WsfXIO_Service.hpp:99
WsfXIO_ServiceT(WsfXIO_Interface *aInterfacePtr)
Definition WsfXIO_Service.hpp:84
T RequestType
Definition WsfXIO_Service.hpp:82
Definition WsfXIO_Service.hpp:35
UtCallbackHolder mCallbacks
Definition WsfXIO_Service.hpp:67
WsfXIO_Service(WsfXIO_Interface *aInterfacePtr)
Definition WsfXIO_Service.cpp:21
void DenyRequest(WsfXIO_RequestDataPkt &aRequest)
Definition WsfXIO_Service.cpp:86
std::map< WsfXIO_SubscriptionId, WsfXIO_Subscription * > SubscriptionMap
Definition WsfXIO_Service.hpp:45
void AddSubscription(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.cpp:37
WsfXIO_Interface * GetInterface() const
Definition WsfXIO_Service.hpp:42
const SubscriptionMap GetSubscriptions() const
Definition WsfXIO_Service.hpp:61
WsfXIO_Interface * mInterfacePtr
Definition WsfXIO_Service.hpp:68
void HandleDisconnect(WsfXIO_Connection *aConnection)
Definition WsfXIO_Service.cpp:95
WsfXIO_Subscription * FindSubscription(WsfXIO_Connection *aConnectionPtr, int aSubscriptionId)
Definition WsfXIO_Service.cpp:73
virtual void SubscriptionCancelled(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.cpp:134
WsfXIO_Subscription * CreateSubscription(WsfXIO_RequestDataPkt &aRequest)
Definition WsfXIO_Service.cpp:127
void HandleCancellation(WsfXIO_SubscriptionCancelPkt &aPkt)
Definition WsfXIO_Service.cpp:114
virtual void RemovingSubscription(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.hpp:65
bool RemoveSubscription(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.cpp:43
std::map< WsfXIO_SubscriptionId, SessionType * > RequestMapT
Definition WsfXIO_Service.hpp:189
REQUEST_TYPE RequestType
Definition WsfXIO_Service.hpp:155
WsfXIO_SessionServiceT(WsfXIO_Interface *aInterfacePtr)
Definition WsfXIO_Service.hpp:157
SESSION_TYPE SessionType
Definition WsfXIO_Service.hpp:154
const RequestMapT & GetRequests() const
Definition WsfXIO_Service.hpp:201
virtual void SubscriptionCancelledT(WsfXIO_Subscription *aSubscriptionPtr, SessionType &aSession)
Definition WsfXIO_Service.hpp:172
void AddRequiredPlatform(WsfPlatform &aPlatform, WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.hpp:183
virtual void SubscriptionCancelled(WsfXIO_Subscription *aSubscriptionPtr)
Definition WsfXIO_Service.hpp:191
WsfXIO_Subscription * CreateSubscription(RequestType &aRequest)
Create a subscription from a request.
Definition WsfXIO_Service.hpp:163
WsfXIO_Subscription * FindSubscription(WsfXIO_Connection *aConnectionPtr, int aSubscriptionId)
Definition WsfXIO_Service.hpp:178
Definition WsfXIO_PacketRegistry.hpp:128
A WsfXIO_Subscription wraps information about a remote request for information.
Definition WsfXIO_Subscription.hpp:30
WsfXIO_SubscriptionId GetId() const
Returns a unique value identifying this subscription.
Definition WsfXIO_Subscription.hpp:40
Copyrights Multiple, All Rights Reserved