This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::detail::BlockingServerTCPTransportCodec Class Reference

#include "codec.h"

+ Inheritance diagram for epics::pvAccess::detail::BlockingServerTCPTransportCodec:
+ Collaboration diagram for epics::pvAccess::detail::BlockingServerTCPTransportCodec:

Public Member Functions

 POINTER_DEFINITIONS (BlockingServerTCPTransportCodec)
 
virtual bool acquire (std::tr1::shared_ptr< ClientChannelImpl > const &) OVERRIDE FINAL
 
virtual void release (pvAccessID) OVERRIDE FINAL
 
pvAccessID preallocateChannelSID ()
 
void depreallocateChannelSID (pvAccessID)
 
void registerChannel (pvAccessID sid, std::tr1::shared_ptr< ServerChannel > const &channel)
 
void unregisterChannel (pvAccessID sid)
 
std::tr1::shared_ptr< ServerChannelgetChannel (pvAccessID sid)
 
void getChannels (std::vector< std::tr1::shared_ptr< ServerChannel > > &channels) const
 
size_t getChannelCount () const
 
virtual bool verify (epics::pvData::int32 timeoutMs) OVERRIDE FINAL
 
virtual void verified (epics::pvData::Status const &status) OVERRIDE FINAL
 
void authNZInitialize (const std::string &securityPluginName, const epics::pvData::PVStructure::shared_pointer &data)
 
virtual void authenticationCompleted (epics::pvData::Status const &status, const std::tr1::shared_ptr< PeerInfo > &peer) OVERRIDE FINAL
 
virtual void send (epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
 
virtual ~BlockingServerTCPTransportCodec () OVERRIDE FINAL
 
- Public Member Functions inherited from epics::pvAccess::detail::BlockingTCPTransportCodec
 POINTER_DEFINITIONS (BlockingTCPTransportCodec)
 
 BlockingTCPTransportCodec (bool serverFlag, Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, size_t sendBufferSize, size_t receiveBufferSize, epics::pvData::int16 priority)
 
virtual ~BlockingTCPTransportCodec ()
 
virtual void readPollOne () OVERRIDE FINAL
 
virtual void writePollOne () OVERRIDE FINAL
 
virtual void scheduleSend () OVERRIDE FINAL
 
virtual void sendCompleted () OVERRIDE FINAL
 
virtual void close () OVERRIDE FINAL
 
virtual void waitJoin () OVERRIDE FINAL
 Call after close() to wait for any worker threads to exit. More...
 
virtual bool terminated () OVERRIDE FINAL
 
virtual bool isOpen () OVERRIDE FINAL
 
virtual void start ()
 
virtual int read (epics::pvData::ByteBuffer *dst) OVERRIDE FINAL
 
virtual int write (epics::pvData::ByteBuffer *src) OVERRIDE FINAL
 
virtual const osiSockAddrgetLastReadBufferSocketAddress () OVERRIDE FINAL
 
virtual void invalidDataStreamHandler () OVERRIDE FINAL
 
virtual std::string getType () const OVERRIDE FINAL
 
virtual void processControlMessage () OVERRIDE FINAL
 
virtual void processApplicationMessage () OVERRIDE FINAL
 
virtual const osiSockAddrgetRemoteAddress () const OVERRIDE FINAL
 
virtual const std::string & getRemoteName () const OVERRIDE FINAL
 
virtual std::size_t getReceiveBufferSize () const OVERRIDE FINAL
 
virtual epics::pvData::int16 getPriority () const OVERRIDE FINAL
 
virtual void setRemoteTransportReceiveBufferSize (std::size_t remoteTransportReceiveBufferSize) OVERRIDE FINAL
 
virtual void setRemoteTransportSocketReceiveBufferSize (std::size_t socketReceiveBufferSize) OVERRIDE FINAL
 
virtual std::tr1::shared_ptr< const epics::pvData::FieldcachedDeserialize (epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
 
virtual void cachedSerialize (const std::tr1::shared_ptr< const epics::pvData::Field > &field, epics::pvData::ByteBuffer *buffer) OVERRIDE FINAL
 
virtual void flushSendQueue () OVERRIDE FINAL
 
virtual bool isClosed () OVERRIDE FINAL
 
void activate ()
 
virtual void authNZMessage (epics::pvData::PVStructure::shared_pointer const &data) OVERRIDE FINAL
 
virtual void sendSecurityPluginMessage (epics::pvData::PVStructure::const_shared_pointer const &data) OVERRIDE FINAL
 
- Public Member Functions inherited from epics::pvAccess::detail::AbstractCodec
 AbstractCodec (bool serverFlag, size_t sendBufferSize, size_t receiveBufferSize, int32_t socketSendBufferSize, bool blockingProcessQueue)
 
virtual ~AbstractCodec ()
 
virtual void alignBuffer (std::size_t alignment) OVERRIDE FINAL
 
virtual void ensureData (std::size_t size) OVERRIDE FINAL
 
virtual void alignData (std::size_t alignment) OVERRIDE FINAL
 
virtual void startMessage (epics::pvData::int8 command, std::size_t ensureCapacity=0, epics::pvData::int32 payloadSize=0) OVERRIDE FINAL
 
void putControlMessage (epics::pvData::int8 command, epics::pvData::int32 data)
 
virtual void endMessage () OVERRIDE FINAL
 
virtual void ensureBuffer (std::size_t size) OVERRIDE FINAL
 
virtual void flushSerializeBuffer () OVERRIDE FINAL
 
virtual void flush (bool lastMessageCompleted) OVERRIDE FINAL
 
void processWrite ()
 
void processRead ()
 
void processSendQueue ()
 
virtual void enqueueSendRequest (TransportSender::shared_pointer const &sender) OVERRIDE FINAL
 
void enqueueSendRequest (TransportSender::shared_pointer const &sender, std::size_t requiredBufferSize)
 
void setSenderThread ()
 
virtual void setRecipient (osiSockAddr const &sendTo) OVERRIDE FINAL
 
virtual void setByteOrder (int byteOrder) OVERRIDE FINAL
 
virtual bool directSerialize (epics::pvData::ByteBuffer *, const char *, std::size_t, std::size_t) OVERRIDE
 
virtual bool directDeserialize (epics::pvData::ByteBuffer *, char *, std::size_t, std::size_t) OVERRIDE
 
bool sendQueueEmpty () const
 
epics::pvData::int8 getRevision () const
 
- Public Member Functions inherited from epics::pvAccess::TransportSendControl
 POINTER_DEFINITIONS (TransportSendControl)
 
virtual ~TransportSendControl ()
 
- Public Member Functions inherited from epics::pvData::SerializableControl
virtual ~SerializableControl ()
 
virtual void cachedSerialize (std::tr1::shared_ptr< const Field > const &field, ByteBuffer *buffer)=0
 
- Public Member Functions inherited from epics::pvAccess::Transport
 POINTER_DEFINITIONS (Transport)
 
 Transport ()
 
virtual ~Transport ()
 
- Public Member Functions inherited from epics::pvData::DeserializableControl
virtual ~DeserializableControl ()
 
- Public Member Functions inherited from epics::pvAccess::AuthenticationPluginControl
 POINTER_DEFINITIONS (AuthenticationPluginControl)
 
virtual ~AuthenticationPluginControl ()
 
- Public Member Functions inherited from epics::pvAccess::TransportSender
 POINTER_DEFINITIONS (TransportSender)
 
 TransportSender ()
 
virtual ~TransportSender ()
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 
- Public Member Functions inherited from epics::pvAccess::fair_queue< T >::entry
 entry ()
 
 ~entry ()
 

Static Public Member Functions

static shared_pointer create (Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int sendBufferSize, int receiveBufferSize)
 
- Static Public Member Functions inherited from epics::pvAccess::detail::AbstractCodec
static std::size_t alignedValue (std::size_t value, std::size_t alignment)
 

Protected Member Functions

 BlockingServerTCPTransportCodec (Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize)
 
void destroyAllChannels ()
 
virtual void internalClose () OVERRIDE FINAL
 
- Protected Member Functions inherited from epics::pvAccess::detail::BlockingTCPTransportCodec
virtual void setRxTimeout (bool ena) OVERRIDE FINAL
 
virtual void sendBufferFull (int tries) OVERRIDE FINAL
 
- Protected Member Functions inherited from epics::pvAccess::detail::AbstractCodec
void send (epics::pvData::ByteBuffer *buffer)
 
void flushSendBuffer ()
 

Additional Inherited Members

- Public Attributes inherited from epics::pvAccess::detail::BlockingTCPTransportCodec
PeerInfo::const_shared_pointer _peerInfo
 
- Public Attributes inherited from epics::pvAccess::detail::AbstractCodec
epics::pvData::Mutex _mutex
 
- Public Attributes inherited from epics::pvAccess::Transport
size_t _totalBytesSent
 
size_t _totalBytesRecv
 
- Public Attributes inherited from epics::pvAccess::TransportSender
size_t bytesTX
 
size_t bytesRX
 
- Static Public Attributes inherited from epics::pvAccess::detail::BlockingTCPTransportCodec
static size_t num_instances
 
- Static Public Attributes inherited from epics::pvAccess::detail::AbstractCodec
static const std::size_t MAX_MESSAGE_PROCESS = 100
 
static const std::size_t MAX_MESSAGE_SEND = 100
 
static const std::size_t MAX_ENSURE_SIZE = 1024
 
static const std::size_t MAX_ENSURE_DATA_SIZE = MAX_ENSURE_SIZE/2
 
static const std::size_t MAX_ENSURE_BUFFER_SIZE = MAX_ENSURE_SIZE
 
static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE = 1024
 
- Static Public Attributes inherited from epics::pvAccess::Transport
static size_t num_instances
 
- Protected Attributes inherited from epics::pvAccess::detail::BlockingTCPTransportCodec
osiSockAddr _socketAddress
 
std::string _socketName
 
Context::shared_pointer _context
 
IntrospectionRegistry _incomingIR
 
IntrospectionRegistry _outgoingIR
 
std::string _authSessionName
 
AuthenticationSession::shared_pointer _authSession
 
bool _verified
 
epics::pvData::Event _verifiedEvent
 
- Protected Attributes inherited from epics::pvAccess::detail::AbstractCodec
ReadMode _readMode
 
int8_t _version
 
int8_t _flags
 
int8_t _command
 
int32_t _payloadSize
 
epics::pvData::int32 _remoteTransportSocketReceiveBufferSize
 
osiSockAddr _sendTo
 
epicsThreadId _senderThread
 
WriteMode _writeMode
 
bool _writeOpReady
 
epics::pvData::ByteBuffer _socketBuffer
 
epics::pvData::ByteBuffer _sendBuffer
 
fair_queue< TransportSender_sendQueue
 
const epics::pvData::int8 _clientServerFlag
 

Detailed Description

Definition at line 441 of file codec.h.

Constructor & Destructor Documentation

epics::pvAccess::detail::BlockingServerTCPTransportCodec::BlockingServerTCPTransportCodec ( Context::shared_pointer const &  context,
SOCKET  channel,
ResponseHandler::shared_pointer const &  responseHandler,
int32_t  sendBufferSize,
int32_t  receiveBufferSize 
)
protected

Definition at line 1434 of file codec.cpp.

1440  :BlockingTCPTransportCodec(true, context, channel, responseHandler,
1441  sendBufferSize, receiveBufferSize, PVA_DEFAULT_PRIORITY)
1442  ,_lastChannelSID(0x12003400)
1443  ,_verificationStatus(pvData::Status::fatal("Uninitialized error"))
1444  ,_verifyOrVerified(false)
1445 {
1446  // NOTE: priority not yet known, default priority is used to
1447  //register/unregister
1448  // TODO implement priorities in Reactor... not that user will
1449  // change it.. still getPriority() must return "registered" priority!
1450 }
BlockingTCPTransportCodec(bool serverFlag, Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, size_t sendBufferSize, size_t receiveBufferSize, epics::pvData::int16 priority)
Definition: codec.cpp:1226
static Status fatal(const std::string &m)
Definition: status.h:51
const epics::pvData::int16 PVA_DEFAULT_PRIORITY
Definition: pvaConstants.h:70
epics::pvAccess::detail::BlockingServerTCPTransportCodec::~BlockingServerTCPTransportCodec ( )
virtual

Definition at line 1453 of file codec.cpp.

1453  {
1454 }

Member Function Documentation

virtual bool epics::pvAccess::detail::BlockingServerTCPTransportCodec::acquire ( std::tr1::shared_ptr< ClientChannelImpl > const &  client)
inlinevirtual

Acquires transport.

Parameters
clientclient (channel) acquiring the transport
Returns
true if transport was granted, false otherwise.

Implements epics::pvAccess::Transport.

Definition at line 475 of file codec.h.

476  {
477  return false;
478  }
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::authenticationCompleted ( epics::pvData::Status const &  status,
const std::tr1::shared_ptr< PeerInfo > &  peer 
)
virtual

Called by server plugin to indicate the the exchange has completed.

Parameters
statusIf !status.isSuccess() then the connection will be closed without being used.
peerPartially initialized PeerInfo. See AuthenticationPlugin::createSession(). PeerInfo::realm and/or PeerInfo::account will now be considered valid. Caller transfers ownership to callee, which may modify.

Implements epics::pvAccess::AuthenticationPluginControl.

Definition at line 1629 of file codec.cpp.

1631 {
1633  {
1634  LOG(logLevelDebug, "Authentication completed with status '%s' for PVA client: %s.", Status::StatusTypeName[status.getType()], _socketName.c_str());
1635  }
1636 
1637  if(peer)
1639 
1640  bool isVerified;
1641  {
1642  Guard G(_mutex);
1643  isVerified = _verified;
1644  if(status.isSuccess())
1645  _peerInfo = peer;
1646  else
1647  _peerInfo.reset();
1648  }
1649 
1650  if (!isVerified)
1651  verified(status);
1652  else if (!status.isSuccess())
1653  {
1654  string errorMessage = "Re-authentication failed: " + status.getMessage();
1655  if (!status.getStackDump().empty())
1656  errorMessage += "\n" + status.getStackDump();
1657  LOG(logLevelInfo, "%s", errorMessage.c_str());
1658 
1659  close();
1660  }
1661 }
pvd::Status status
void run(const std::tr1::shared_ptr< PeerInfo > &peer)
Definition: security.cpp:290
epics::pvData::Mutex _mutex
Definition: codec.h:264
const std::string & getMessage() const
Definition: status.h:80
#define LOG(level, format,...)
Definition: logger.h:48
const std::string & getStackDump() const
Definition: status.h:86
bool isSuccess() const
Definition: status.h:103
virtual void verified(epics::pvData::Status const &status) OVERRIDE FINAL
Definition: codec.h:511
static const char * StatusTypeName[]
Definition: status.h:45
PeerInfo::const_shared_pointer _peerInfo
Definition: codec.h:428
static AuthorizationRegistry & plugins()
Definition: security.cpp:258
StatusType getType() const
Definition: status.h:74
#define IS_LOGGABLE(level)
Definition: logger.h:51
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::authNZInitialize ( const std::string &  securityPluginName,
const epics::pvData::PVStructure::shared_pointer &  data 
)

Definition at line 1663 of file codec.cpp.

1665 {
1666  AuthenticationPlugin::shared_pointer plugin(AuthenticationRegistry::servers().lookup(securityPluginName));
1667  // attempting the force use of an un-advertised/non-existant plugin is treated as a protocol error.
1668  // We cheat here by assuming the the registry doesn't often change after server start,
1669  // and don't test if securityPluginName is in advertisedAuthPlugins
1670  if(!plugin)
1671  throw std::runtime_error(_socketName+" failing attempt to select non-existant auth. plugin "+securityPluginName);
1672 
1673  PeerInfo::shared_pointer info(new PeerInfo);
1674  info->peer = _socketName;
1675  info->transport = "pva";
1676  info->transportVersion = getRevision();
1677  info->authority = securityPluginName;
1678 
1679  if (!plugin->isValidFor(*info))
1680  verified(pvData::Status::error("invalid security plug-in name"));
1681 
1683  {
1684  LOG(logLevelDebug, "Accepted security plug-in '%s' for PVA client: %s.", securityPluginName.c_str(), _socketName.c_str());
1685  }
1686 
1687  AuthenticationSession::shared_pointer sess(plugin->createSession(info, shared_from_this(), data));
1688 
1689  Guard G(_mutex);
1690  _authSessionName = securityPluginName;
1691  _authSession.swap(sess);
1692 }
Information provded by a client to a server-type ChannelProvider.
Definition: security.h:119
static Status error(const std::string &m)
Definition: status.h:50
bucket * lookup(char *name)
Definition: symtab.c:66
epics::pvData::Mutex _mutex
Definition: codec.h:264
#define LOG(level, format,...)
Definition: logger.h:48
static AuthenticationRegistry & servers()
The server side of the conversation.
Definition: security.cpp:204
AuthenticationSession::shared_pointer _authSession
Definition: codec.h:425
epics::pvData::int8 getRevision() const
Definition: codec.h:205
virtual void verified(epics::pvData::Status const &status) OVERRIDE FINAL
Definition: codec.h:511
#define IS_LOGGABLE(level)
Definition: logger.h:51
static shared_pointer epics::pvAccess::detail::BlockingServerTCPTransportCodec::create ( Context::shared_pointer const &  context,
SOCKET  channel,
ResponseHandler::shared_pointer const &  responseHandler,
int  sendBufferSize,
int  receiveBufferSize 
)
inlinestatic

Definition at line 457 of file codec.h.

463  {
464  shared_pointer thisPointer(
466  context, channel, responseHandler,
467  sendBufferSize, receiveBufferSize)
468  );
469  thisPointer->activate();
470  return thisPointer;
471  }
BlockingServerTCPTransportCodec(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize)
Definition: codec.cpp:1434
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::depreallocateChannelSID ( pvAccessID  )
inline

Definition at line 484 of file codec.h.

484 {}
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::destroyAllChannels ( )
protected

Definition at line 1604 of file codec.cpp.

1604  {
1605  Lock lock(_channelsMutex);
1606  if(_channels.size()==0) return;
1607 
1609  {
1610  LOG(
1611  logLevelDebug,
1612  "Transport to %s still has %zu channel(s) active and closing...",
1613  _socketName.c_str(), _channels.size());
1614  }
1615 
1616  _channels_t temp;
1617  temp.swap(_channels);
1618 
1619  for(_channels_t::iterator it(temp.begin()), end(temp.end()); it!=end; ++it)
1620  it->second->destroy();
1621 }
A lock for multithreading.
Definition: lock.h:36
#define LOG(level, format,...)
Definition: logger.h:48
virtual void lock()
Definition: pvAccess.h:97
#define IS_LOGGABLE(level)
Definition: logger.h:51
ServerChannel::shared_pointer epics::pvAccess::detail::BlockingServerTCPTransportCodec::getChannel ( pvAccessID  sid)

Definition at line 1486 of file codec.cpp.

1486  {
1487 
1488  Lock lock(_channelsMutex);
1489 
1490  std::map<pvAccessID, ServerChannel::shared_pointer>::iterator it =
1491  _channels.find(sid);
1492 
1493  if(it!=_channels.end()) return it->second;
1494 
1495  return ServerChannel::shared_pointer();
1496 }
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
size_t epics::pvAccess::detail::BlockingServerTCPTransportCodec::getChannelCount ( ) const

Definition at line 1499 of file codec.cpp.

1499  {
1500 
1501  Lock lock(_channelsMutex);
1502  return _channels.size();
1503 }
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::getChannels ( std::vector< std::tr1::shared_ptr< ServerChannel > > &  channels) const

Definition at line 1505 of file codec.cpp.

1506 {
1507  Lock lock(_channelsMutex);
1508  for(_channels_t::const_iterator it(_channels.begin()), end(_channels.end());
1509  it!=end; ++it)
1510  {
1511  channels.push_back(it->second);
1512  }
1513 }
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::internalClose ( )
protectedvirtual

Called from close(). after start of shutdown (isOpen()==false) but before worker thread shutdown.

Reimplemented from epics::pvAccess::detail::BlockingTCPTransportCodec.

Definition at line 1623 of file codec.cpp.

1623  {
1624  Transport::shared_pointer thisSharedPtr = shared_from_this();
1627 }
epics::pvAccess::detail::BlockingServerTCPTransportCodec::POINTER_DEFINITIONS ( BlockingServerTCPTransportCodec  )
pvAccessID epics::pvAccess::detail::BlockingServerTCPTransportCodec::preallocateChannelSID ( )

Definition at line 1457 of file codec.cpp.

1457  {
1458 
1459  Lock lock(_channelsMutex);
1460  // search first free (theoretically possible loop of death)
1461  pvAccessID sid = ++_lastChannelSID;
1462  while(_channels.find(sid)!=_channels.end())
1463  sid = ++_lastChannelSID;
1464  return sid;
1465 }
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::registerChannel ( pvAccessID  sid,
std::tr1::shared_ptr< ServerChannel > const &  channel 
)

Definition at line 1468 of file codec.cpp.

1470  {
1471 
1472  Lock lock(_channelsMutex);
1473  _channels[sid] = channel;
1474 
1475 }
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
virtual void epics::pvAccess::detail::BlockingServerTCPTransportCodec::release ( pvAccessID  clientId)
inlinevirtual

Releases transport.

Parameters
clientclient (channel) releasing the transport

Implements epics::pvAccess::Transport.

Definition at line 480 of file codec.h.

480 {}
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::send ( epics::pvData::ByteBuffer buffer,
TransportSendControl control 
)
virtual

Called by transport. By this call transport gives callee ownership over the buffer. Calls on TransportSendControl instance must be made from calling thread. Moreover, ownership is valid only for the time of call of this method. NOTE: these limitations allow efficient implementation.

Implements epics::pvAccess::TransportSender.

Definition at line 1515 of file codec.cpp.

1516  {
1517 
1518  if (!_verifyOrVerified)
1519  {
1520  _verifyOrVerified = true;
1521 
1522  //
1523  // set byte order control message
1524  //
1525 
1527  buffer->putByte(PVA_MAGIC);
1529  buffer->putByte(
1530  0x01 | 0x40 | ((EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG)
1531  ? 0x80 : 0x00)); // control + server + endian
1532  buffer->putByte(CMD_SET_ENDIANESS); // set byte order
1533  buffer->putInt(0);
1534 
1535 
1536  //
1537  // send verification message
1538  //
1539  control->startMessage(CMD_CONNECTION_VALIDATION, 4+2);
1540 
1541  // receive buffer size
1542  buffer->putInt(static_cast<int32>(getReceiveBufferSize()));
1543 
1544  // server introspection registy max size
1545  // TODO
1546  buffer->putShort(0x7FFF);
1547 
1548  // list of authNZ plugin names advertised to this client
1549 
1551  AuthenticationRegistry::servers().snapshot(plugins); // copy
1552  std::vector<std::string> validSPNames;
1553  validSPNames.reserve(plugins.size()); // assume all will be valid
1554 
1555  PeerInfo info;
1556  info.transport = "pva";
1557  info.peer = _socketName;
1558  info.transportVersion = this->getRevision();
1559 
1560  // filter plugins which may be used by this peer
1561  for(AuthenticationRegistry::list_t::iterator it(plugins.begin()), end(plugins.end());
1562  it!=end; ++it)
1563  {
1564  info.authority = it->first;
1565  if(it->second->isValidFor(info))
1566  validSPNames.push_back(it->first);
1567  }
1568 
1569  SerializeHelper::writeSize(validSPNames.size(), buffer, this);
1570  for (vector<string>::const_iterator iter(validSPNames.begin()), end(validSPNames.end());
1571  iter != end; iter++)
1572  {
1573  SerializeHelper::serializeString(*iter, buffer, this);
1574  }
1575 
1576  {
1577  Guard G(_mutex);
1578  advertisedAuthPlugins.swap(validSPNames);
1579  }
1580 
1581  // send immediately
1582  control->flush(true);
1583  }
1584  else
1585  {
1586  //
1587  // send verified message
1588  //
1590 
1591  pvData::Status sts;
1592  {
1593  Lock lock(_mutex);
1594  sts = _verificationStatus;
1595  }
1596  sts.serialize(buffer, control);
1597 
1598  // send immediately
1599  control->flush(true);
1600 
1601  }
1602 }
Information provded by a client to a server-type ChannelProvider.
Definition: security.h:119
EPICS_ALWAYS_INLINE void putInt(int32 value)
Definition: byteBuffer.h:537
const epics::pvData::int8 PVA_MAGIC
Definition: pvaConstants.h:29
std::string transport
transport protocol used eg. "pva". Must not be empty.
Definition: security.h:125
virtual void ensureBuffer(std::size_t size) OVERRIDE FINAL
Definition: codec.cpp:701
A lock for multithreading.
Definition: lock.h:36
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
epics::pvData::Mutex _mutex
Definition: codec.h:264
virtual void flush(bool lastMessageCompleted)=0
static AuthenticationRegistry & servers()
The server side of the conversation.
Definition: security.cpp:204
std::string peer
network address of remote peer. eg. "192.168.1.1:5075".
Definition: security.h:124
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const
Definition: status.cpp:45
epics::pvData::int8 getRevision() const
Definition: codec.h:205
void snapshot(list_t &plugmap) const
Save a copy of the current registry in order of increasing priority.
Definition: security.cpp:211
#define EPICS_ENDIAN_BIG
Definition: epicsEndian.h:16
const epics::pvData::int16 PVA_MESSAGE_HEADER_SIZE
Definition: pvaConstants.h:47
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
static void serializeString(const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
const epics::pvData::int8 PVA_SERVER_PROTOCOL_REVISION
Definition: pvaConstants.h:31
virtual std::size_t getReceiveBufferSize() const OVERRIDE FINAL
Definition: codec.h:335
virtual void lock()
Definition: pvAccess.h:97
std::vector< map_t::mapped_type > list_t
Definition: security.h:239
#define EPICS_BYTE_ORDER
Definition: osdWireConfig.h:16
std::string authority
authentication mechanism used. eg. "anonymous" or "gssapi". Must not be empty.
Definition: security.h:126
virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize=0)=0
unsigned transportVersion
If applicable, the protocol minor version number.
Definition: security.h:137
EPICS_ALWAYS_INLINE void putShort(int16 value)
Definition: byteBuffer.h:531
void epics::pvAccess::detail::BlockingServerTCPTransportCodec::unregisterChannel ( pvAccessID  sid)

Definition at line 1478 of file codec.cpp.

1478  {
1479 
1480  Lock lock(_channelsMutex);
1481  _channels.erase(sid);
1482 }
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
virtual void epics::pvAccess::detail::BlockingServerTCPTransportCodec::verified ( epics::pvData::Status const &  status)
inlinevirtual

Notify transport that it is has been verified.

Parameters
statusvefification status;

Reimplemented from epics::pvAccess::detail::BlockingTCPTransportCodec.

Definition at line 511 of file codec.h.

511  {
512  {
514  _verificationStatus = status;
515  }
517  }
pvd::Status status
epics::pvData::Mutex _mutex
Definition: codec.h:264
virtual void verified(epics::pvData::Status const &status) OVERRIDE
Definition: codec.cpp:1373
virtual bool epics::pvAccess::detail::BlockingServerTCPTransportCodec::verify ( epics::pvData::int32  timeoutMs)
inlinevirtual

Waits (if needed) until transport is verified, i.e. verified() method is being called.

Parameters
timeoutMstimeout to wait for verification, infinite if 0.

Reimplemented from epics::pvAccess::detail::BlockingTCPTransportCodec.

Definition at line 498 of file codec.h.

498  {
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  }
virtual bool verify(epics::pvData::int32 timeoutMs) OVERRIDE
Definition: codec.cpp:1369
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:808
virtual void enqueueSendRequest(TransportSender::shared_pointer const &sender) OVERRIDE FINAL
Definition: codec.cpp:873

The documentation for this class was generated from the following files: