pvAccessCPP 7.1.8
Loading...
Searching...
No Matches
remote.h
1
7#ifndef REMOTE_H_
8#define REMOTE_H_
9
10#ifdef epicsExportSharedSymbols
11# define remoteEpicsExportSharedSymbols
12# undef epicsExportSharedSymbols
13#endif
14
15#include <map>
16#include <string>
17
18#include <osiSock.h>
19
20#include <pv/serialize.h>
21#include <pv/pvType.h>
22#include <pv/byteBuffer.h>
23#include <pv/timer.h>
24#include <pv/pvData.h>
25#include <pv/sharedPtr.h>
26
27#ifdef remoteEpicsExportSharedSymbols
28# define epicsExportSharedSymbols
29# undef remoteEpicsExportSharedSymbols
30#endif
31
32#include <pv/pvaConstants.h>
33#include <pv/configuration.h>
34#include <pv/fairQueue.h>
35#include <pv/pvaDefs.h>
36
38#include <pv/pvAccess.h>
39
40namespace epics {
41namespace pvAccess {
42
43class TransportRegistry;
44class ClientChannelImpl;
45
46enum QoS {
66 QOS_INIT = 0x08,
74 QOS_SHARE = 0x20,
78 QOS_GET = 0x40,
82 QOS_GET_PUT = 0x80
83};
84
85enum ApplicationCommands {
86 CMD_BEACON = 0,
87 CMD_CONNECTION_VALIDATION = 1,
88 CMD_ECHO = 2,
89 CMD_SEARCH = 3,
90 CMD_SEARCH_RESPONSE = 4,
91 CMD_AUTHNZ = 5,
92 CMD_ACL_CHANGE = 6,
93 CMD_CREATE_CHANNEL = 7,
94 CMD_DESTROY_CHANNEL = 8,
95 CMD_CONNECTION_VALIDATED = 9,
96 CMD_GET = 10,
97 CMD_PUT = 11,
98 CMD_PUT_GET = 12,
99 CMD_MONITOR = 13,
100 CMD_ARRAY = 14,
101 CMD_DESTROY_REQUEST = 15,
102 CMD_PROCESS = 16,
103 CMD_GET_FIELD = 17,
104 CMD_MESSAGE = 18,
105 CMD_MULTIPLE_DATA = 19,
106 CMD_RPC = 20,
107 CMD_CANCEL_REQUEST = 21,
108 CMD_ORIGIN_TAG = 22
109};
110
111enum ControlCommands {
112 CMD_SET_MARKER = 0,
113 CMD_ACK_MARKER = 1,
114 CMD_SET_ENDIANESS = 2
115};
116
117void hackAroundRTEMSSocketInterrupt();
118
123public:
124 POINTER_DEFINITIONS(TransportSendControl);
125
126 virtual ~TransportSendControl() {}
127
128 virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize = 0) = 0;
129 virtual void endMessage() = 0;
130
131 virtual void flush(bool lastMessageCompleted) = 0;
132
133 virtual void setRecipient(osiSockAddr const & sendTo) = 0;
134};
135
139class TransportSender : public Lockable, public fair_queue<TransportSender>::entry {
140public:
141 POINTER_DEFINITIONS(TransportSender);
142
143 TransportSender() :bytesTX(0u), bytesRX(0u) {}
144 virtual ~TransportSender() {}
145
154 virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) = 0;
155
156 size_t bytesTX;
157 size_t bytesRX;
158};
159
160class ClientChannelImpl;
161class SecuritySession;
162
166class epicsShareClass Transport : public epics::pvData::DeserializableControl {
167public:
168 POINTER_DEFINITIONS(Transport);
169
170 static size_t num_instances;
171
172 Transport();
173 virtual ~Transport();
174
180 virtual bool acquire(std::tr1::shared_ptr<ClientChannelImpl> const & client) = 0;
181
186 virtual void release(pvAccessID clientId) = 0;
187
192 virtual std::string getType() const = 0;
193
194 virtual const osiSockAddr& getRemoteAddress() const = 0;
195
196 virtual const std::string& getRemoteName() const = 0;
197
198 // TODO getContext?
199
204 virtual std::size_t getReceiveBufferSize() const = 0;
205
211
216 virtual void setRemoteTransportReceiveBufferSize(std::size_t receiveBufferSize) = 0;
217
222 virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize) = 0;
223
228 // TODO enum
229 virtual void setByteOrder(int byteOrder) = 0;
230
235 virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0;
236
240 virtual void flushSendQueue() = 0;
241
246 virtual void verified(epics::pvData::Status const & status) = 0;
247
252 virtual bool verify(epics::pvData::int32 timeoutMs) = 0;
253
257 virtual void close() = 0;
258
260 virtual void waitJoin() {}
261
266 virtual bool isClosed() = 0;
267
272 virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer const & data) = 0;
273
274 size_t _totalBytesSent;
275 size_t _totalBytesRecv;
276};
277
278class Channel;
279class SecurityPlugin;
281
285class Context {
286public:
287 POINTER_DEFINITIONS(Context);
288
289 virtual ~Context() {}
290
291 virtual epics::pvData::Timer::shared_pointer getTimer() = 0;
292
293 virtual TransportRegistry* getTransportRegistry() = 0;
294
295
296
297
298 virtual Configuration::const_shared_pointer getConfiguration() = 0;
299
303
304 virtual void newServerDetected() = 0;
305
306 virtual std::tr1::shared_ptr<Channel> getChannel(pvAccessID id) = 0;
307 virtual Transport::shared_pointer getSearchTransport() = 0;
308};
309
314public:
315 POINTER_DEFINITIONS(ResponseHandler);
316
317 static size_t num_instances;
318
319 ResponseHandler(Context* context, const std::string& description);
320 virtual ~ResponseHandler();
321
332 virtual void
333 handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport,
334 epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize,
335 epics::pvData::ByteBuffer* payloadBuffer);
336
337protected:
341 std::string _description;
342
347};
348
354public:
355 POINTER_DEFINITIONS(ResponseRequest);
356
357 virtual ~ResponseRequest() {}
358
363 virtual pvAccessID getIOID() const = 0;
364
368 virtual void timeout() = 0;
369
373 virtual void cancel() = 0;
374
379 virtual void reportStatus(Channel::ConnectionState status) = 0;
380
386 virtual std::tr1::shared_ptr<ChannelBaseRequester> getRequester() = 0;
387
394 virtual void response(Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::ByteBuffer* payloadBuffer) = 0;
395
396};
397
398
399}
400}
401
402#endif /* REMOTE_H_ */
basic_ostream< _CharT, _Traits > & flush(basic_ostream< _CharT, _Traits > &__os)
The interface through which Operations (get, put, monitor, ...) are initiated.
Definition pvAccess.h:889
ConnectionState
Channel connection status.
Definition pvAccess.h:906
Not public IF, used by Transports, etc.
Definition remote.h:285
virtual void newServerDetected()=0
due to ClientContextImpl
Interface defining response handler.
Definition remote.h:313
std::string _description
Response hanlder description.
Definition remote.h:341
epics::pvData::int32 _debugLevel
Debug flag.
Definition remote.h:346
virtual void handleResponse(osiSockAddr *responseFrom, Transport::shared_pointer const &transport, epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize, epics::pvData::ByteBuffer *payloadBuffer)
Handle response.
A request that expects an response.
Definition remote.h:353
virtual void response(Transport::shared_pointer const &transport, epics::pvData::int8 version, epics::pvData::ByteBuffer *payloadBuffer)=0
Notification response.
virtual pvAccessID getIOID() const =0
Get I/O ID.
virtual void timeout()=0
Timeout notification.
virtual void cancel()=0
Cancel response request (always to be called to complete/destroy).
virtual std::tr1::shared_ptr< ChannelBaseRequester > getRequester()=0
used by MessageHandler and reportChannelStateChange().
virtual void reportStatus(Channel::ConnectionState status)=0
Report status to clients (e.g.
Interface defining transport (connection).
Definition remote.h:166
virtual void close()=0
Close transport.
virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer const &data)=0
Pass data to the active security plug-in session.
virtual void enqueueSendRequest(TransportSender::shared_pointer const &sender)=0
Enqueue send request.
virtual epics::pvData::int16 getPriority() const =0
Transport priority.
virtual void waitJoin()
Call after close() to wait for any worker threads to exit.
Definition remote.h:260
virtual void release(pvAccessID clientId)=0
Releases transport.
virtual std::string getType() const =0
Get protocol type (tcp, udp, ssl, etc.).
virtual bool isClosed()=0
Check connection status.
virtual void setByteOrder(int byteOrder)=0
Set byte order.
virtual bool verify(epics::pvData::int32 timeoutMs)=0
Waits (if needed) until transport is verified, i.e.
virtual bool acquire(std::tr1::shared_ptr< ClientChannelImpl > const &client)=0
Acquires transport.
virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize)=0
Set remote transport socket receive buffer size.
virtual std::size_t getReceiveBufferSize() const =0
Get receive buffer size.
virtual void flushSendQueue()=0
Flush send queue (sent messages).
virtual void verified(epics::pvData::Status const &status)=0
Notify transport that it is has been verified.
virtual void setRemoteTransportReceiveBufferSize(std::size_t receiveBufferSize)=0
Set remote transport receive buffer size.
Interface defining transport send control.
Definition remote.h:122
Interface defining transport sender (instance sending data over transport).
Definition remote.h:139
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control)=0
Called by transport.
@ QOS_REPLY_REQUIRED
Require reply (acknowledgment for reliable operation).
Definition remote.h:54
@ QOS_DESTROY
Destroy option.
Definition remote.h:70
@ QOS_GET_PUT
Get-put.
Definition remote.h:82
@ QOS_DEFAULT
Default behavior.
Definition remote.h:50
@ QOS_PROCESS
Process option.
Definition remote.h:62
@ QOS_INIT
Initialize option.
Definition remote.h:66
@ QOS_SHARE
Share data option.
Definition remote.h:74
@ QOS_BESY_EFFORT
Best-effort option (no reply).
Definition remote.h:58
@ QOS_GET
Get.
Definition remote.h:78
Copyright - See the COPYRIGHT that is included with this distribution.