18 #include <epicsVersion.h> 46 # if __cplusplus>=201103L 53 # if __cplusplus>=201103L 54 # define OVERRIDE override 80 }
while(epics::atomic::compareAndSwap(val, oldval, newval)!=oldval);
95 return this->realval.getAndSet(newval?1:0)!=0;
98 return !!this->realval.get();
112 const std::string &s):
std::runtime_error(s) {}
142 size_t sendBufferSize,
143 size_t receiveBufferSize,
144 int32_t socketSendBufferSize,
145 bool blockingProcessQueue);
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;
158 virtual bool isOpen() = 0;
165 virtual void alignBuffer(std::size_t alignment)
OVERRIDE FINAL;
167 virtual void alignData(std::size_t alignment)
OVERRIDE FINAL;
168 virtual void startMessage(
170 std::size_t ensureCapacity = 0,
172 void putControlMessage(
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();
189 static std::size_t alignedValue(std::size_t
value, std::size_t alignment);
191 virtual bool directSerialize(
194 std::size_t , std::size_t )
OVERRIDE;
199 std::size_t , std::size_t )
OVERRIDE;
202 return _sendQueue.empty();
208 return myver < _version ? myver : _version;
213 virtual void sendBufferFull(
int tries) = 0;
215 void flushSendBuffer();
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);
245 epics::pvAccess::TransportSender::shared_pointer
const & sender);
247 std::size_t _storedPayloadSize;
248 std::size_t _storedPosition;
249 std::size_t _storedLimit;
250 std::size_t _startPosition;
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;
271 public std::tr1::enable_shared_from_this<BlockingTCPTransportCodec>
282 Context::shared_pointer
const & context,
284 ResponseHandler::shared_pointer
const & responseHandler,
285 size_t sendBufferSize,
286 size_t receiveBufferSize,
291 virtual
void writePollOne()
OVERRIDE FINAL;
298 virtual void start();
303 return &_socketAddress;
308 return std::string(
"tcp");
321 _responseHandler->handleResponse(&_socketAddress, shared_from_this(),
322 _version, _command, _payloadSize, &_socketBuffer);
327 return _socketAddress;
336 return _socketBuffer.getSize();
346 std::size_t remoteTransportReceiveBufferSize)
OVERRIDE FINAL {
347 _remoteTransportReceiveBufferSize = remoteTransportReceiveBufferSize;
352 std::size_t socketReceiveBufferSize)
OVERRIDE FINAL {
353 _remoteTransportSocketReceiveBufferSize = socketReceiveBufferSize;
357 std::tr1::shared_ptr<const epics::pvData::Field>
360 return _incomingIR.deserialize(buffer,
this);
365 const std::tr1::shared_ptr<const epics::pvData::Field>& field,
368 _outgoingIR.serialize(field, buffer,
this);
381 Transport::shared_pointer thisSharedPtr = shared_from_this();
382 _context->getTransportRegistry()->install(thisSharedPtr);
391 virtual void authNZMessage(epics::pvData::PVStructure::shared_pointer
const & data) OVERRIDE
FINAL;
393 virtual void sendSecurityPluginMessage(epics::pvData::PVStructure::const_shared_pointer
const & data) OVERRIDE
FINAL;
396 void receiveThread();
400 virtual void setRxTimeout(
bool ena) OVERRIDE
FINAL;
402 virtual void sendBufferFull(
int tries) OVERRIDE
FINAL;
408 virtual void internalClose();
432 ResponseHandler::shared_pointer _responseHandler;
433 size_t _remoteTransportReceiveBufferSize;
450 Context::shared_pointer
const & context,
452 ResponseHandler::shared_pointer
const & responseHandler,
453 int32_t sendBufferSize,
454 int32_t receiveBufferSize );
458 Context::shared_pointer
const & context,
460 ResponseHandler::shared_pointer
const & responseHandler,
462 int receiveBufferSize)
464 shared_pointer thisPointer(
466 context, channel, responseHandler,
467 sendBufferSize, receiveBufferSize)
469 thisPointer->activate();
486 void registerChannel(
488 std::tr1::shared_ptr<ServerChannel>
const & channel);
492 std::tr1::shared_ptr<ServerChannel> getChannel(
pvAccessID sid);
494 void getChannels(std::vector<std::tr1::shared_ptr<ServerChannel> >& channels)
const;
496 size_t getChannelCount()
const;
500 TransportSender::shared_pointer transportSender =
502 enqueueSendRequest(transportSender);
506 enqueueSendRequest(transportSender);
508 return verifiedStatus;
514 _verificationStatus =
status;
519 void authNZInitialize(
const std::string& securityPluginName,
520 const epics::pvData::PVStructure::shared_pointer& data);
532 void destroyAllChannels();
542 typedef std::map<pvAccessID, std::tr1::shared_ptr<ServerChannel> > _channels_t;
546 _channels_t _channels;
552 bool _verifyOrVerified;
554 std::vector<std::string> advertisedAuthPlugins;
568 Context::shared_pointer
const & context,
570 ResponseHandler::shared_pointer
const & responseHandler,
571 int32_t sendBufferSize,
572 int32_t receiveBufferSize,
573 std::tr1::shared_ptr<ClientChannelImpl>
const &
client,
575 float heartbeatInterval,
580 Context::shared_pointer
const & context,
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,
590 shared_pointer thisPointer(
592 context, channel, responseHandler,
593 sendBufferSize, receiveBufferSize,
594 client, remoteTransportRevision,
595 heartbeatInterval, priority)
597 thisPointer->activate();
613 virtual bool acquire(std::tr1::shared_ptr<ClientChannelImpl>
const & client)
OVERRIDE FINAL;
620 void authNZInitialize(
const std::vector<std::string>& offeredSecurityPlugins);
636 typedef std::map<pvAccessID, std::tr1::weak_ptr<ClientChannelImpl> > TransportClientMap_t;
637 TransportClientMap_t _owners;
642 const double _connectionTimeout;
652 void closedNotifyClients();
static shared_pointer create(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int sendBufferSize, int receiveBufferSize)
epics::pvData::ByteBuffer _socketBuffer
static const std::size_t MAX_ENSURE_DATA_SIZE
virtual void timerStopped() OVERRIDE FINAL
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)
C++ wrapper for epicsEvent from EPICS base.
static const std::size_t MAX_MESSAGE_PROCESS
IntrospectionRegistry _outgoingIR
Class that must be implemented by code that makes Timer requests.
const epics::pvData::int8 PVA_CLIENT_PROTOCOL_REVISION
virtual void cachedSerialize(const std::tr1::shared_ptr< const epics::pvData::Field > &field, epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
TODO only here because of the Lockable.
virtual void setRxTimeout(bool ena)
virtual void sendCompleted() OVERRIDE FINAL
virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE
Mark external symbols and entry points for shared libraries.
epics::pvData::Mutex _mutex
bool sendQueueEmpty() const
invalid_data_stream_exception(const std::string &s)
static const std::size_t MAX_MESSAGE_SEND
virtual void processControlMessage() OVERRIDE FINAL
AuthenticationSession::shared_pointer _authSession
#define POINTER_DEFINITIONS(clazz)
std::string _authSessionName
epics::pvData::int8 getRevision() const
virtual bool isClosed() OVERRIDE FINAL
epicsThreadId _senderThread
static const std::size_t MAX_ENSURE_SIZE
virtual void flushSendQueue() OVERRIDE FINAL
virtual void verified(epics::pvData::Status const &status) OVERRIDE FINAL
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
virtual void setRemoteTransportReceiveBufferSize(std::size_t remoteTransportReceiveBufferSize) OVERRIDE FINAL
virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE FINAL
virtual void processApplicationMessage() OVERRIDE FINAL
const epics::pvData::int8 PVA_SERVER_PROTOCOL_REVISION
Context::shared_pointer _context
virtual epics::pvData::int16 getPriority() const OVERRIDE FINAL
osiSockAddr _socketAddress
epics::pvData::Event _verifiedEvent
static const std::size_t MAX_ENSURE_BUFFER_SIZE
virtual std::size_t getReceiveBufferSize() const OVERRIDE FINAL
virtual std::tr1::shared_ptr< const epics::pvData::Field > cachedDeserialize(epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
io_exception(const std::string &s)
virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize) OVERRIDE FINAL
IntrospectionRegistry _incomingIR
epics::pvData::int32 _remoteTransportSocketReceiveBufferSize
virtual const osiSockAddr * getLastReadBufferSocketAddress() OVERRIDE FINAL
PeerInfo::const_shared_pointer _peerInfo
fair_queue< TransportSender > _sendQueue
C++ wrapper for epicsThread from EPICS base.
epics::pvData::ByteBuffer _sendBuffer
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
virtual void release(pvAccessID) OVERRIDE FINAL
const epics::pvData::int8 _clientServerFlag
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...
virtual const std::string & getRemoteName() const OVERRIDE FINAL
static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE
C++ and C descriptions for a thread.
void depreallocateChannelSID(pvAccessID)
connection_closed_exception(const std::string &s)
virtual bool acquire(std::tr1::shared_ptr< ClientChannelImpl > const &) OVERRIDE FINAL
bool getAndSet(bool newval)
virtual std::string getType() const OVERRIDE FINAL
static size_t num_instances
virtual void verified(epics::pvData::Status const &status) OVERRIDE
Callbacks for use by AuthenticationSession.
#define EPICS_ENDIAN_LITTLE
virtual const osiSockAddr & getRemoteAddress() const OVERRIDE FINAL