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

#include "responseHandlers.h"

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

Public Member Functions

 ServerArrayHandler (ServerContextImpl::shared_pointer const &context)
 
virtual ~ServerArrayHandler ()
 
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

Array request handler.

Definition at line 521 of file responseHandlers.h.

Constructor & Destructor Documentation

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

Definition at line 524 of file responseHandlers.h.

524  :
525  AbstractServerResponseHandler(context, "Array request") {
526  }
AbstractServerResponseHandler(ServerContextImpl::shared_pointer const &context, std::string description)
virtual epics::pvAccess::ServerArrayHandler::~ServerArrayHandler ( )
inlinevirtual

Definition at line 527 of file responseHandlers.h.

527 {}

Member Function Documentation

void epics::pvAccess::ServerArrayHandler::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 2113 of file responseHandlers.cpp.

2115  {
2117  transport, version, command, payloadSize, payloadBuffer);
2118 
2119  // NOTE: we do not explicitly check if transport is OK
2120  detail::BlockingServerTCPTransportCodec* casTransport(static_cast<detail::BlockingServerTCPTransportCodec*>(transport.get()));
2121 
2122  transport->ensureData(2*sizeof(int32)/sizeof(int8)+1);
2123  const pvAccessID sid = payloadBuffer->getInt();
2124  const pvAccessID ioid = payloadBuffer->getInt();
2125 
2126  // mode
2127  const int8 qosCode = payloadBuffer->getByte();
2128 
2129  ServerChannel::shared_pointer channel = casTransport->getChannel(sid);
2130  if (!channel.get())
2131  {
2133  return;
2134  }
2135 
2136  const bool init = (QOS_INIT & qosCode) != 0;
2137  if (init)
2138  {
2139  // pvRequest
2140  PVStructure::shared_pointer pvRequest(SerializationHelper::deserializePVRequest(payloadBuffer, transport.get()));
2141 
2142  // create...
2143  ServerChannelArrayRequesterImpl::create(_context, channel, ioid, transport, pvRequest);
2144  }
2145  else
2146  {
2147  const bool lastRequest = (QOS_DESTROY & qosCode) != 0;
2148  const bool get = (QOS_GET & qosCode) != 0;
2149  const bool setLength = (QOS_GET_PUT & qosCode) != 0;
2150  const bool getLength = (QOS_PROCESS & qosCode) != 0;
2151 
2153  if (!request.get())
2154  {
2156  return;
2157  }
2158  atomic::add(request->bytesRX, payloadSize);
2159 
2160  if (!request->startRequest(qosCode))
2161  {
2163  return;
2164  }
2165 
2166  ChannelArray::shared_pointer channelArray = request->getChannelArray();
2167  if (lastRequest)
2168  channelArray->lastRequest();
2169 
2170  if (get)
2171  {
2172  size_t offset = SerializeHelper::readSize(payloadBuffer, transport.get());
2173  size_t count = SerializeHelper::readSize(payloadBuffer, transport.get());
2174  size_t stride = SerializeHelper::readSize(payloadBuffer, transport.get());
2175 
2176  request->getChannelArray()->getArray(offset, count, stride);
2177  }
2178  else if (setLength)
2179  {
2180  size_t length = SerializeHelper::readSize(payloadBuffer, transport.get());
2181 
2182  request->getChannelArray()->setLength(length);
2183  }
2184  else if (getLength)
2185  {
2186  request->getChannelArray()->getLength();
2187  }
2188  else
2189  {
2190  // deserialize data to put
2191  size_t offset;
2192  size_t stride;
2193  PVArray::shared_pointer array = request->getPVArray();
2194  {
2195  ScopedLock lock(channelArray); // TODO not needed if read by the same thread
2196 
2198  offset = SerializeHelper::readSize(payloadBuffer, transport.get());
2199  stride = SerializeHelper::readSize(payloadBuffer, transport.get());
2200  array->deserialize(payloadBuffer, transport.get());
2201  );
2202  }
2203 
2204  channelArray->putArray(array, offset, array->getLength(), stride);
2205  }
2206  }
2207 }
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 std::size_t readSize(ByteBuffer *buffer, DeserializableControl *control)
static ChannelArrayRequester::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)
static const epics::pvData::Status badIOIDStatus
EPICS_ALWAYS_INLINE int32 getInt()
Definition: byteBuffer.h:629
std::tr1::shared_ptr< ServerChannelArrayRequesterImpl > shared_pointer
#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)
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)
int32_t int32
Definition: pvType.h:83

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