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

#include "responseHandlers.h"

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

Public Member Functions

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

Create channel request handler.

Definition at line 176 of file responseHandlers.h.

Constructor & Destructor Documentation

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

Definition at line 179 of file responseHandlers.h.

180  :AbstractServerResponseHandler(context, "Create channel request")
181  {}
AbstractServerResponseHandler(ServerContextImpl::shared_pointer const &context, std::string description)
virtual epics::pvAccess::ServerCreateChannelHandler::~ServerCreateChannelHandler ( )
inlinevirtual

Definition at line 182 of file responseHandlers.h.

182 {}

Member Function Documentation

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

728 {
730  transport, version, command, payloadSize, payloadBuffer);
731 
732  // TODO for not only one request at the time is supported, i.e. dataCount == 1
733  transport->ensureData((sizeof(int32)+sizeof(int16))/sizeof(int8));
734  const int16 count = payloadBuffer->getShort();
735  if (count != 1)
736  {
737  THROW_BASE_EXCEPTION("only 1 supported for now");
738  }
739  const pvAccessID cid = payloadBuffer->getInt();
740 
741  string channelName = SerializeHelper::deserializeString(payloadBuffer, transport.get());
742  if (channelName.size() == 0)
743  {
744  LOG(logLevelDebug,"Zero length channel name, disconnecting client: %s", transport->getRemoteName().c_str());
745  disconnect(transport);
746  return;
747  }
748  else if (channelName.size() > MAX_CHANNEL_NAME_LENGTH)
749  {
750  LOG(logLevelDebug,"Unreasonable channel name length, disconnecting client: %s", transport->getRemoteName().c_str());
751  disconnect(transport);
752  return;
753  }
754 
755  if (channelName == SERVER_CHANNEL_NAME)
756  {
757  // TODO singleton!!!
758  ServerRPCService::shared_pointer serverRPCService(new ServerRPCService(_context));
759 
760  // TODO use std::make_shared
761  std::tr1::shared_ptr<ServerChannelRequesterImpl> tp(new ServerChannelRequesterImpl(transport, channelName, cid));
762  ChannelRequester::shared_pointer cr = tp;
763  Channel::shared_pointer serverChannel = createRPCChannel(ChannelProvider::shared_pointer(), channelName, cr, serverRPCService);
764  cr->channelCreated(Status::Ok, serverChannel);
765  }
766  else
767  {
768  const std::vector<ChannelProvider::shared_pointer>& _providers(_context->getChannelProviders());
769  ServerContextImpl::s_channelNameToProvider_t::const_iterator it;
770 
771  if (_providers.size() == 1)
772  ServerChannelRequesterImpl::create(_providers[0], transport, channelName, cid);
773  else {
774  ChannelProvider::shared_pointer prov;
775  {
776  Lock L(_context->_mutex);
777  if((it = _context->s_channelNameToProvider.find(channelName)) != _context->s_channelNameToProvider.end())
778  prov = it->second.lock();
779  }
780  if(prov)
781  ServerChannelRequesterImpl::create(prov, transport, channelName, cid);
782  }
783  }
784 }
int8_t int8
Definition: pvType.h:75
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
static std::string deserializeString(ByteBuffer *buffer, DeserializableControl *control)
static Status Ok
Definition: status.h:47
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)
A lock for multithreading.
Definition: lock.h:36
EPICS_ALWAYS_INLINE int32 getInt()
Definition: byteBuffer.h:629
#define LOG(level, format,...)
Definition: logger.h:48
epicsShareFunc Channel::shared_pointer createRPCChannel(ChannelProvider::shared_pointer const &provider, std::string const &channelName, ChannelRequester::shared_pointer const &channelRequester, RPCServiceAsync::shared_pointer const &rpcService)
Definition: rpcServer.cpp:229
EPICS_ALWAYS_INLINE int16 getShort()
Definition: byteBuffer.h:623
#define THROW_BASE_EXCEPTION(msg)
ServerContextImpl::shared_pointer _context
static ChannelRequester::shared_pointer create(ChannelProvider::shared_pointer const &provider, Transport::shared_pointer const &transport, const std::string channelName, const pvAccessID cid)
int16_t int16
Definition: pvType.h:79
const epics::pvData::uint32 MAX_CHANNEL_NAME_LENGTH
Definition: pvaConstants.h:73
int32_t int32
Definition: pvType.h:83

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