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

#include "responseHandlers.h"

+ Inheritance diagram for epics::pvAccess::ServerPutGetHandler:
+ Collaboration diagram for epics::pvAccess::ServerPutGetHandler:

Public Member Functions

 ServerPutGetHandler (ServerContextImpl::shared_pointer const &context)
 
virtual ~ServerPutGetHandler ()
 
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) OVERRIDE FINAL
 
- Public Member Functions inherited from epics::pvAccess::AbstractServerResponseHandler
 AbstractServerResponseHandler (ServerContextImpl::shared_pointer const &context, std::string description)
 
virtual ~AbstractServerResponseHandler ()
 
- Public Member Functions inherited from epics::pvAccess::ResponseHandler
 POINTER_DEFINITIONS (ResponseHandler)
 
 ResponseHandler (Context *context, const std::string &description)
 
virtual ~ResponseHandler ()
 

Additional Inherited Members

- Static Public Attributes inherited from epics::pvAccess::ResponseHandler
static size_t num_instances
 
- Protected Attributes inherited from epics::pvAccess::AbstractServerResponseHandler
ServerContextImpl::shared_pointer _context
 
- Protected Attributes inherited from epics::pvAccess::ResponseHandler
std::string _description
 
epics::pvData::int32 _debugLevel
 

Detailed Description

Put request handler.

Definition at line 387 of file responseHandlers.h.

Constructor & Destructor Documentation

epics::pvAccess::ServerPutGetHandler::ServerPutGetHandler ( ServerContextImpl::shared_pointer const &  context)
inline

Definition at line 390 of file responseHandlers.h.

390  :
391  AbstractServerResponseHandler(context, "Put-get request") {
392  }
AbstractServerResponseHandler(ServerContextImpl::shared_pointer const &context, std::string description)
virtual epics::pvAccess::ServerPutGetHandler::~ServerPutGetHandler ( )
inlinevirtual

Definition at line 394 of file responseHandlers.h.

394 {}

Member Function Documentation

void epics::pvAccess::ServerPutGetHandler::handleResponse ( osiSockAddr responseFrom,
Transport::shared_pointer const &  transport,
epics::pvData::int8  version,
epics::pvData::int8  command,
std::size_t  payloadSize,
epics::pvData::ByteBuffer payloadBuffer 
)
virtual

Handle response.

Parameters
[in]responseFromremote address of the responder, 0 if unknown.
[in]transportresponse source transport.
[in]versionmessage version.
[in]payloadSizesize of this message data available in the payloadBuffer.
[in]payloadBuffermessage payload data. Note that this might not be the only message in the buffer. Code must not manipulate buffer.

Reimplemented from epics::pvAccess::ResponseHandler.

Definition at line 1485 of file responseHandlers.cpp.

1487  {
1489  transport, version, command, payloadSize, payloadBuffer);
1490 
1491  // NOTE: we do not explicitly check if transport is OK
1492  detail::BlockingServerTCPTransportCodec* casTransport(static_cast<detail::BlockingServerTCPTransportCodec*>(transport.get()));
1493 
1494  transport->ensureData(2*sizeof(int32)/sizeof(int8)+1);
1495  const pvAccessID sid = payloadBuffer->getInt();
1496  const pvAccessID ioid = payloadBuffer->getInt();
1497 
1498  // mode
1499  const int8 qosCode = payloadBuffer->getByte();
1500 
1501  ServerChannel::shared_pointer channel = casTransport->getChannel(sid);
1502  if (!channel.get())
1503  {
1505  return;
1506  }
1507 
1508  const bool init = (QOS_INIT & qosCode) != 0;
1509  if (init)
1510  {
1511  // pvRequest
1512  PVStructure::shared_pointer pvRequest(SerializationHelper::deserializePVRequest(payloadBuffer, transport.get()));
1513 
1514  // create...
1515  ServerChannelPutGetRequesterImpl::create(_context, channel, ioid, transport, pvRequest);
1516  }
1517  else
1518  {
1519  const bool lastRequest = (QOS_DESTROY & qosCode) != 0;
1520  const bool getGet = (QOS_GET & qosCode) != 0;
1521  const bool getPut = (QOS_GET_PUT & qosCode) != 0;
1522 
1524  if (!request.get())
1525  {
1527  return;
1528  }
1529  atomic::add(request->bytesRX, payloadSize);
1530 
1531  if (!request->startRequest(qosCode))
1532  {
1534  return;
1535  }
1536 
1537  ChannelPutGet::shared_pointer channelPutGet = request->getChannelPutGet();
1538  if (lastRequest)
1539  channelPutGet->lastRequest();
1540 
1541  if (getGet)
1542  {
1543  channelPutGet->getGet();
1544  }
1545  else if(getPut)
1546  {
1547  channelPutGet->getPut();
1548  }
1549  else
1550  {
1551  // deserialize bitSet and do a put
1552  {
1553  ScopedLock lock(channelPutGet); // TODO not necessary if read is done in putGet
1554  BitSet::shared_pointer putBitSet = request->getPutGetBitSet();
1555  PVStructure::shared_pointer putPVStructure = request->getPutGetPVStructure();
1556 
1558  putBitSet->deserialize(payloadBuffer, transport.get());
1559  putPVStructure->deserialize(payloadBuffer, transport.get(), putBitSet.get());
1560  );
1561 
1562  lock.unlock();
1563 
1564  channelPutGet->putGet(putPVStructure, putBitSet);
1565  }
1566  }
1567  }
1568 }
int8_t int8
Definition: pvType.h:75
std::string request
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
EPICS_ALWAYS_INLINE int8 getByte()
Definition: byteBuffer.h:617
epicsMutexId lock
Definition: osiClockTime.c:37
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)
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
static const epics::pvData::Status otherRequestPendingStatus
static const epics::pvData::Status badIOIDStatus
EPICS_ALWAYS_INLINE int32 getInt()
Definition: byteBuffer.h:629
#define DESERIALIZE_EXCEPTION_GUARD(code)
static const epics::pvData::Status badCIDStatus
static epics::pvData::PVStructure::shared_pointer deserializePVRequest(epics::pvData::ByteBuffer *payloadBuffer, epics::pvData::DeserializableControl *control)
std::tr1::shared_ptr< ServerChannelPutGetRequesterImpl > shared_pointer
ServerContextImpl::shared_pointer _context
static void sendFailureMessage(const epics::pvData::int8 command, Transport::shared_pointer const &transport, const pvAccessID ioid, const epics::pvData::int8 qos, const epics::pvData::Status status)
static ChannelPutGetRequester::shared_pointer create(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport, epics::pvData::PVStructure::shared_pointer const &pvRequest)
int32_t int32
Definition: pvType.h:83

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