This is Unofficial EPICS BASE Doxygen Site
codec.h
Go to the documentation of this file.
1 
7 #ifndef CODEC_H_
8 #define CODEC_H_
9 
10 #include <set>
11 #include <map>
12 #include <deque>
13 
14 #include <shareLib.h>
15 #include <osiSock.h>
16 #include <epicsTime.h>
17 #include <epicsThread.h>
18 #include <epicsVersion.h>
19 #include <epicsAtomic.h>
20 
21 #include <pv/byteBuffer.h>
22 #include <pv/pvType.h>
23 #include <pv/lock.h>
24 #include <pv/timer.h>
25 #include <pv/event.h>
26 #include <pv/likely.h>
27 
28 #include <pv/pvaConstants.h>
29 #include <pv/remote.h>
30 #include <pv/security.h>
31 #include <pv/transportRegistry.h>
33 #include <pv/inetAddressUtil.h>
34 
35 /* C++11 keywords
36  @code
37  struct Base {
38  virtual void foo();
39  };
40  struct Class : public Base {
41  virtual void foo() OVERRIDE FINAL FINAL;
42  };
43  @endcode
44  */
45 #ifndef FINAL
46 # if __cplusplus>=201103L
47 # define FINAL final
48 # else
49 # define FINAL
50 # endif
51 #endif
52 #ifndef OVERRIDE
53 # if __cplusplus>=201103L
54 # define OVERRIDE override
55 # else
56 # define OVERRIDE
57 # endif
58 #endif
59 
60 
61 namespace epics {
62 namespace pvAccess {
63 
64 class ServerChannel;
65 
66 namespace detail {
67 
68 template<typename T>
70 {
71  T val;
72 public:
73  AtomicValue() :val(0) {}
74  inline T getAndSet(T newval)
75  {
76  int oldval;
77  // epicsAtomic doesn't have unconditional swap
78  do {
79  oldval = epics::atomic::get(val);
80  } while(epics::atomic::compareAndSwap(val, oldval, newval)!=oldval);
81  return oldval;
82  }
83  inline T get() {
84  return epics::atomic::get(val);
85  }
86 };
87 // treat bool as int
88 template<>
89 class AtomicValue<bool>
90 {
91  AtomicValue<int> realval;
92 public:
93  inline bool getAndSet(bool newval)
94  {
95  return this->realval.getAndSet(newval?1:0)!=0;
96  }
97  inline bool get() {
98  return !!this->realval.get();
99  }
100 };
101 
102 
103 class io_exception: public std::runtime_error {
104 public:
105  explicit io_exception(const std::string &s): std::runtime_error(s) {}
106 };
107 
108 
109 class invalid_data_stream_exception: public std::runtime_error {
110 public:
112  const std::string &s): std::runtime_error(s) {}
113 };
114 
115 
116 class connection_closed_exception: public std::runtime_error {
117 public:
118  explicit connection_closed_exception(const std::string &s): std::runtime_error(s) {}
119 };
120 
121 
123 
125 
126 
128  public TransportSendControl,
129  public Transport
130 {
131 public:
132 
133  static const std::size_t MAX_MESSAGE_PROCESS;
134  static const std::size_t MAX_MESSAGE_SEND;
135  static const std::size_t MAX_ENSURE_SIZE;
136  static const std::size_t MAX_ENSURE_DATA_SIZE;
137  static const std::size_t MAX_ENSURE_BUFFER_SIZE;
138  static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE;
139 
141  bool serverFlag,
142  size_t sendBufferSize,
143  size_t receiveBufferSize,
144  int32_t socketSendBufferSize,
145  bool blockingProcessQueue);
146 
147  virtual void processControlMessage() = 0;
148  virtual void processApplicationMessage() = 0;
149  virtual const osiSockAddr* getLastReadBufferSocketAddress() = 0;
150  virtual void invalidDataStreamHandler() = 0;
151  virtual void readPollOne()=0;
152  virtual void writePollOne() = 0;
153  virtual void scheduleSend() = 0;
154  virtual void sendCompleted() = 0;
155  virtual bool terminated() = 0;
156  virtual int write(epics::pvData::ByteBuffer* src) = 0;
157  virtual int read(epics::pvData::ByteBuffer* dst) = 0;
158  virtual bool isOpen() = 0;
159 
160 
161  virtual ~AbstractCodec()
162  {
163  }
164 
165  virtual void alignBuffer(std::size_t alignment) OVERRIDE FINAL;
166  virtual void ensureData(std::size_t size) OVERRIDE FINAL;
167  virtual void alignData(std::size_t alignment) OVERRIDE FINAL;
168  virtual void startMessage(
169  epics::pvData::int8 command,
170  std::size_t ensureCapacity = 0,
171  epics::pvData::int32 payloadSize = 0) OVERRIDE FINAL;
172  void putControlMessage(
173  epics::pvData::int8 command,
174  epics::pvData::int32 data);
175  virtual void endMessage() OVERRIDE FINAL;
176  virtual void ensureBuffer(std::size_t size) OVERRIDE FINAL;
177  virtual void flushSerializeBuffer() OVERRIDE FINAL;
178  virtual void flush(bool lastMessageCompleted) OVERRIDE FINAL;
179  void processWrite();
180  void processRead();
181  void processSendQueue();
182  virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) OVERRIDE FINAL;
183  void enqueueSendRequest(TransportSender::shared_pointer const & sender,
184  std::size_t requiredBufferSize);
185  void setSenderThread();
186  virtual void setRecipient(osiSockAddr const & sendTo) OVERRIDE FINAL;
187  virtual void setByteOrder(int byteOrder) OVERRIDE FINAL;
188 
189  static std::size_t alignedValue(std::size_t value, std::size_t alignment);
190 
191  virtual bool directSerialize(
192  epics::pvData::ByteBuffer * /*existingBuffer*/,
193  const char* /*toSerialize*/,
194  std::size_t /*elementCount*/, std::size_t /*elementSize*/) OVERRIDE;
195 
196 
197  virtual bool directDeserialize(epics::pvData::ByteBuffer * /*existingBuffer*/,
198  char* /*deserializeTo*/,
199  std::size_t /*elementCount*/, std::size_t /*elementSize*/) OVERRIDE;
200 
201  bool sendQueueEmpty() const {
202  return _sendQueue.empty();
203  }
204 
206  epicsGuard<epicsMutex> G(_mutex);
207  int8_t myver = _clientServerFlag ? PVA_SERVER_PROTOCOL_REVISION : PVA_CLIENT_PROTOCOL_REVISION;
208  return myver < _version ? myver : _version;
209  }
210 
211 protected:
212 
213  virtual void sendBufferFull(int tries) = 0;
214  void send(epics::pvData::ByteBuffer *buffer);
215  void flushSendBuffer();
216 
217  virtual void setRxTimeout(bool ena) {}
218 
220  int8_t _version;
221  int8_t _flags;
222  int8_t _command;
223  int32_t _payloadSize; // TODO why not size_t?
225  //TODO initialize union
230 
233 
235 
236 private:
237 
238  void processHeader();
239  void processReadNormal();
240  void postProcessApplicationMessage();
241  void processReadSegmented();
242  bool readToBuffer(std::size_t requiredBytes, bool persistent);
243  void endMessage(bool hasMoreSegments);
244  void processSender(
245  epics::pvAccess::TransportSender::shared_pointer const & sender);
246 
247  std::size_t _storedPayloadSize;
248  std::size_t _storedPosition;
249  std::size_t _storedLimit;
250  std::size_t _startPosition;
251 
252  const std::size_t _maxSendPayloadSize;
253  std::size_t _lastMessageStartPosition;
254  std::size_t _lastSegmentedMessageType;
255  int8_t _lastSegmentedMessageCommand;
256  std::size_t _nextMessagePayloadOffset;
257 
258  epics::pvData::int8 _byteOrderFlag;
259 protected:
261 private:
262 
263 public:
265 };
266 
267 
269  public AbstractCodec,
271  public std::tr1::enable_shared_from_this<BlockingTCPTransportCodec>
272 {
273 
274 public:
275 
277 
278  static size_t num_instances;
279 
281  bool serverFlag,
282  Context::shared_pointer const & context,
283  SOCKET channel,
284  ResponseHandler::shared_pointer const & responseHandler,
285  size_t sendBufferSize,
286  size_t receiveBufferSize,
287  epics::pvData::int16 priority);
288  virtual ~BlockingTCPTransportCodec();
289 
290  virtual void readPollOne() OVERRIDE FINAL;
291  virtual void writePollOne() OVERRIDE FINAL;
292  virtual void scheduleSend() OVERRIDE FINAL {}
293  virtual void sendCompleted() OVERRIDE FINAL {}
294  virtual void close() OVERRIDE FINAL;
295  virtual void waitJoin() OVERRIDE FINAL;
296  virtual bool terminated() OVERRIDE FINAL;
297  virtual bool isOpen() OVERRIDE FINAL;
298  virtual void start();
299 
300  virtual int read(epics::pvData::ByteBuffer* dst) OVERRIDE FINAL;
301  virtual int write(epics::pvData::ByteBuffer* src) OVERRIDE FINAL;
303  return &_socketAddress;
304  }
305  virtual void invalidDataStreamHandler() OVERRIDE FINAL;
306 
307  virtual std::string getType() const OVERRIDE FINAL {
308  return std::string("tcp");
309  }
310 
311  virtual void processControlMessage() OVERRIDE FINAL {
312  if (_command == CMD_SET_ENDIANESS)
313  {
314  // check 7-th bit
315  setByteOrder(_flags < 0 ? EPICS_ENDIAN_BIG : EPICS_ENDIAN_LITTLE);
316  }
317  }
318 
319 
320  virtual void processApplicationMessage() OVERRIDE FINAL {
321  _responseHandler->handleResponse(&_socketAddress, shared_from_this(),
322  _version, _command, _payloadSize, &_socketBuffer);
323  }
324 
325 
326  virtual const osiSockAddr& getRemoteAddress() const OVERRIDE FINAL {
327  return _socketAddress;
328  }
329 
330  virtual const std::string& getRemoteName() const OVERRIDE FINAL {
331  return _socketName;
332  }
333 
334 
335  virtual std::size_t getReceiveBufferSize() const OVERRIDE FINAL {
336  return _socketBuffer.getSize();
337  }
338 
339 
340  virtual epics::pvData::int16 getPriority() const OVERRIDE FINAL {
341  return _priority;
342  }
343 
344 
346  std::size_t remoteTransportReceiveBufferSize) OVERRIDE FINAL {
347  _remoteTransportReceiveBufferSize = remoteTransportReceiveBufferSize;
348  }
349 
350 
352  std::size_t socketReceiveBufferSize) OVERRIDE FINAL {
353  _remoteTransportSocketReceiveBufferSize = socketReceiveBufferSize;
354  }
355 
356 
357  std::tr1::shared_ptr<const epics::pvData::Field>
359  {
360  return _incomingIR.deserialize(buffer, this);
361  }
362 
363 
364  virtual void cachedSerialize(
365  const std::tr1::shared_ptr<const epics::pvData::Field>& field,
366  epics::pvData::ByteBuffer* buffer) OVERRIDE FINAL
367  {
368  _outgoingIR.serialize(field, buffer, this);
369  }
370 
371 
372  virtual void flushSendQueue() OVERRIDE FINAL { }
373 
374 
375  virtual bool isClosed() OVERRIDE FINAL {
376  return !isOpen();
377  }
378 
379 
380  void activate() {
381  Transport::shared_pointer thisSharedPtr = shared_from_this();
382  _context->getTransportRegistry()->install(thisSharedPtr);
383 
384  start();
385  }
386 
387  virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE;
388 
389  virtual void verified(epics::pvData::Status const & status) OVERRIDE;
390 
391  virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer const & data) OVERRIDE FINAL;
392 
393  virtual void sendSecurityPluginMessage(epics::pvData::PVStructure::const_shared_pointer const & data) OVERRIDE FINAL;
394 
395 private:
396  void receiveThread();
397  void sendThread();
398 
399 protected:
400  virtual void setRxTimeout(bool ena) OVERRIDE FINAL;
401 
402  virtual void sendBufferFull(int tries) OVERRIDE FINAL;
403 
408  virtual void internalClose();
409 
410 private:
411  AtomicValue<bool> _isOpen;
412  epics::pvData::Thread _readThread, _sendThread;
413  const SOCKET _channel;
414 protected:
416  std::string _socketName;
417 protected:
418  Context::shared_pointer _context;
419 
422 
423  // active authentication exchange, if any
424  std::string _authSessionName;
425  AuthenticationSession::shared_pointer _authSession;
426 public:
427  // final info, after authentication complete.
428  PeerInfo::const_shared_pointer _peerInfo;
429 
430 private:
431 
432  ResponseHandler::shared_pointer _responseHandler;
433  size_t _remoteTransportReceiveBufferSize;
434  epics::pvData::int16 _priority;
435 
436 protected:
437  bool _verified;
439 };
440 
443  public TransportSender {
444 
445 public:
447 
448 protected:
450  Context::shared_pointer const & context,
451  SOCKET channel,
452  ResponseHandler::shared_pointer const & responseHandler,
453  int32_t sendBufferSize,
454  int32_t receiveBufferSize );
455 
456 public:
457  static shared_pointer create(
458  Context::shared_pointer const & context,
459  SOCKET channel,
460  ResponseHandler::shared_pointer const & responseHandler,
461  int sendBufferSize,
462  int receiveBufferSize)
463  {
464  shared_pointer thisPointer(
466  context, channel, responseHandler,
467  sendBufferSize, receiveBufferSize)
468  );
469  thisPointer->activate();
470  return thisPointer;
471  }
472 
473 public:
474 
475  virtual bool acquire(std::tr1::shared_ptr<ClientChannelImpl> const & /*client*/) OVERRIDE FINAL
476  {
477  return false;
478  }
479 
480  virtual void release(pvAccessID /*clientId*/) OVERRIDE FINAL {}
481 
482  pvAccessID preallocateChannelSID();
483 
485 
486  void registerChannel(
487  pvAccessID sid,
488  std::tr1::shared_ptr<ServerChannel> const & channel);
489 
490  void unregisterChannel(pvAccessID sid);
491 
492  std::tr1::shared_ptr<ServerChannel> getChannel(pvAccessID sid);
493 
494  void getChannels(std::vector<std::tr1::shared_ptr<ServerChannel> >& channels) const;
495 
496  size_t getChannelCount() const;
497 
498  virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE FINAL {
499 
500  TransportSender::shared_pointer transportSender =
501  std::tr1::dynamic_pointer_cast<TransportSender>(shared_from_this());
502  enqueueSendRequest(transportSender);
503 
504  bool verifiedStatus = BlockingTCPTransportCodec::verify(timeoutMs);
505 
506  enqueueSendRequest(transportSender);
507 
508  return verifiedStatus;
509  }
510 
512  {
513  epicsGuard<epicsMutex> G(_mutex);
514  _verificationStatus = status;
515  }
517  }
518 
519  void authNZInitialize(const std::string& securityPluginName,
520  const epics::pvData::PVStructure::shared_pointer& data);
521 
522  virtual void authenticationCompleted(epics::pvData::Status const & status,
523  const std::tr1::shared_ptr<PeerInfo>& peer) OVERRIDE FINAL;
524 
525  virtual void send(epics::pvData::ByteBuffer* buffer,
527 
529 
530 protected:
531 
532  void destroyAllChannels();
533  virtual void internalClose() OVERRIDE FINAL;
534 
535 private:
536 
540  pvAccessID _lastChannelSID;
541 
542  typedef std::map<pvAccessID, std::tr1::shared_ptr<ServerChannel> > _channels_t;
546  _channels_t _channels;
547 
548  mutable epics::pvData::Mutex _channelsMutex;
549 
550  epics::pvData::Status _verificationStatus;
551 
552  bool _verifyOrVerified;
553 
554  std::vector<std::string> advertisedAuthPlugins;
555 
556 };
557 
560  public TransportSender,
562 
563 public:
565 
566 protected:
568  Context::shared_pointer const & context,
569  SOCKET channel,
570  ResponseHandler::shared_pointer const & responseHandler,
571  int32_t sendBufferSize,
572  int32_t receiveBufferSize,
573  std::tr1::shared_ptr<ClientChannelImpl> const & client,
574  epics::pvData::int8 remoteTransportRevision,
575  float heartbeatInterval,
576  int16_t priority);
577 
578 public:
579  static shared_pointer create(
580  Context::shared_pointer const & context,
581  SOCKET channel,
582  ResponseHandler::shared_pointer const & responseHandler,
583  int32_t sendBufferSize,
584  int32_t receiveBufferSize,
585  std::tr1::shared_ptr<ClientChannelImpl> const & client,
586  int8_t remoteTransportRevision,
587  float heartbeatInterval,
588  int16_t priority )
589  {
590  shared_pointer thisPointer(
592  context, channel, responseHandler,
593  sendBufferSize, receiveBufferSize,
594  client, remoteTransportRevision,
595  heartbeatInterval, priority)
596  );
597  thisPointer->activate();
598  return thisPointer;
599  }
600 
601 public:
602 
603  virtual void start() OVERRIDE FINAL;
604 
606 
607  virtual void timerStopped() OVERRIDE FINAL {
608  // noop
609  }
610 
611  virtual void callback() OVERRIDE FINAL;
612 
613  virtual bool acquire(std::tr1::shared_ptr<ClientChannelImpl> const & client) OVERRIDE FINAL;
614 
615  virtual void release(pvAccessID clientId) OVERRIDE FINAL;
616 
617  virtual void send(epics::pvData::ByteBuffer* buffer,
619 
620  void authNZInitialize(const std::vector<std::string>& offeredSecurityPlugins);
621 
622  virtual void authenticationCompleted(epics::pvData::Status const & status,
623  const std::tr1::shared_ptr<PeerInfo>& peer) OVERRIDE FINAL;
624 
625  virtual void verified(epics::pvData::Status const & status) OVERRIDE FINAL;
626 protected:
627 
628  virtual void internalClose() OVERRIDE FINAL;
629 
630 private:
631 
635  // TODO consider using TR1 hash map
636  typedef std::map<pvAccessID, std::tr1::weak_ptr<ClientChannelImpl> > TransportClientMap_t;
637  TransportClientMap_t _owners;
638 
642  const double _connectionTimeout;
643 
644  bool _verifyOrEcho;
645 
646  // are we queued to send verify or echo?
647  bool sendQueued;
648 
652  void closedNotifyClients();
653 };
654 
655 }
656 }
657 }
658 
659 #endif /* CODEC_H_ */
static shared_pointer create(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int sendBufferSize, int receiveBufferSize)
Definition: codec.h:457
int8_t int8
Definition: pvType.h:75
epics::pvData::ByteBuffer _socketBuffer
Definition: codec.h:231
static const std::size_t MAX_ENSURE_DATA_SIZE
Definition: codec.h:136
Definition: link.h:174
virtual void timerStopped() OVERRIDE FINAL
Definition: codec.h:607
static shared_pointer create(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, std::tr1::shared_ptr< ClientChannelImpl > const &client, int8_t remoteTransportRevision, float heartbeatInterval, int16_t priority)
Definition: codec.h:579
C++ wrapper for epicsEvent from EPICS base.
Definition: event.h:31
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
static const std::size_t MAX_MESSAGE_PROCESS
Definition: codec.h:133
pvd::Status status
#define verify(exp)
Definition: acctst.c:65
Class that must be implemented by code that makes Timer requests.
Definition: timer.h:40
const epics::pvData::int8 PVA_CLIENT_PROTOCOL_REVISION
Definition: pvaConstants.h:32
virtual void cachedSerialize(const std::tr1::shared_ptr< const epics::pvData::Field > &field, epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
Definition: codec.h:364
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
virtual void setRxTimeout(bool ena)
Definition: codec.h:217
virtual void sendCompleted() OVERRIDE FINAL
Definition: codec.h:293
virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE
Definition: codec.cpp:1369
Mark external symbols and entry points for shared libraries.
epics::pvData::Mutex _mutex
Definition: codec.h:264
static const std::size_t MAX_MESSAGE_SEND
Definition: codec.h:134
virtual void processControlMessage() OVERRIDE FINAL
Definition: codec.h:311
AuthenticationSession::shared_pointer _authSession
Definition: codec.h:425
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
Definition: server.h:76
epics::pvData::int8 getRevision() const
Definition: codec.h:205
virtual bool isClosed() OVERRIDE FINAL
Definition: codec.h:375
Definition: caget.c:48
static const std::size_t MAX_ENSURE_SIZE
Definition: codec.h:135
#define OVERRIDE
Definition: codec.h:56
virtual void flushSendQueue() OVERRIDE FINAL
Definition: codec.h:372
#define EPICS_ENDIAN_BIG
Definition: epicsEndian.h:16
virtual void verified(epics::pvData::Status const &status) OVERRIDE FINAL
Definition: codec.h:511
#define epicsShareClass
Definition: shareLib.h:206
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Definition: byteBuffer.h:233
int SOCKET
Definition: osdSock.h:31
virtual void setRemoteTransportReceiveBufferSize(std::size_t remoteTransportReceiveBufferSize) OVERRIDE FINAL
Definition: codec.h:345
virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE FINAL
Definition: codec.h:498
virtual void processApplicationMessage() OVERRIDE FINAL
Definition: codec.h:320
const epics::pvData::int8 PVA_SERVER_PROTOCOL_REVISION
Definition: pvaConstants.h:31
virtual epics::pvData::int16 getPriority() const OVERRIDE FINAL
Definition: codec.h:340
static const std::size_t MAX_ENSURE_BUFFER_SIZE
Definition: codec.h:137
virtual std::size_t getReceiveBufferSize() const OVERRIDE FINAL
Definition: codec.h:335
virtual std::tr1::shared_ptr< const epics::pvData::Field > cachedDeserialize(epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
Definition: codec.h:358
io_exception(const std::string &s)
Definition: codec.h:105
virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize) OVERRIDE FINAL
Definition: codec.h:351
#define FINAL
Definition: codec.h:49
epics::pvData::int32 _remoteTransportSocketReceiveBufferSize
Definition: codec.h:224
epicsEventId flush
Definition: errlog.c:70
virtual const osiSockAddr * getLastReadBufferSocketAddress() OVERRIDE FINAL
Definition: codec.h:302
PeerInfo::const_shared_pointer _peerInfo
Definition: codec.h:428
Definition: caget.c:48
fair_queue< TransportSender > _sendQueue
Definition: codec.h:234
C++ wrapper for epicsThread from EPICS base.
Definition: thread.h:65
epics::pvData::ByteBuffer _sendBuffer
Definition: codec.h:232
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:808
int16_t int16
Definition: pvType.h:79
virtual void release(pvAccessID) OVERRIDE FINAL
Definition: codec.h:480
const epics::pvData::int8 _clientServerFlag
Definition: codec.h:260
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...
virtual const std::string & getRemoteName() const OVERRIDE FINAL
Definition: codec.h:330
epicsMutex Mutex
Definition: lock.h:28
static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE
Definition: codec.h:138
C++ and C descriptions for a thread.
virtual bool acquire(std::tr1::shared_ptr< ClientChannelImpl > const &) OVERRIDE FINAL
Definition: codec.h:475
virtual std::string getType() const OVERRIDE FINAL
Definition: codec.h:307
int32_t int32
Definition: pvType.h:83
virtual void verified(epics::pvData::Status const &status) OVERRIDE
Definition: codec.cpp:1373
Callbacks for use by AuthenticationSession.
Definition: security.h:176
#define EPICS_ENDIAN_LITTLE
Definition: epicsEndian.h:15
virtual const osiSockAddr & getRemoteAddress() const OVERRIDE FINAL
Definition: codec.h:326