12 #define GETPID() GetCurrentProcessId() 17 #define GETPID() taskIdSelf() 21 #define GETPID() getpid() 32 #define epicsExportSharedSymbols 44 using std::ostringstream;
59 static BitSet::shared_pointer createBitSetFor(
60 PVStructure::shared_pointer
const & pvStructure,
61 BitSet::shared_pointer
const & existingBitSet)
64 int pvStructureSize = pvStructure->getNumberFields();
65 if (existingBitSet.get() &&
static_cast<int32>(existingBitSet->size()) >= pvStructureSize)
69 existingBitSet->clear();
70 return existingBitSet;
73 return BitSet::shared_pointer(
new BitSet(pvStructureSize));
76 static PVField::shared_pointer reuseOrCreatePVField(
77 Field::const_shared_pointer
const & field,
78 PVField::shared_pointer
const & existingPVField)
80 if (existingPVField.get() && *field == *existingPVField->getField())
81 return existingPVField;
83 return pvDataCreate->createPVField(field);
88 void ServerBadResponse::handleResponse(
osiSockAddr* responseFrom,
89 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
92 AbstractServerResponseHandler::handleResponse(responseFrom,
93 transport, version, command, payloadSize, payloadBuffer);
99 "Undecipherable message (bad response type %d) from %s.",
107 ,handle_beacon(context,
"Beacon")
108 ,handle_validation(context)
109 ,handle_echo(context)
110 ,handle_search(context)
111 ,handle_authnz(context.
get())
112 ,handle_create(context)
113 ,handle_destroy(context)
116 ,handle_putget(context)
117 ,handle_monitor(context)
118 ,handle_array(context)
119 ,handle_close(context)
120 ,handle_process(context)
121 ,handle_getfield(context)
123 ,handle_cancel(context)
129 m_handlerTable[
CMD_ECHO] = &handle_echo;
138 m_handlerTable[
CMD_GET] = &handle_get;
139 m_handlerTable[
CMD_PUT] = &handle_put;
142 m_handlerTable[
CMD_ARRAY] = &handle_array;
149 m_handlerTable[
CMD_RPC] = &handle_rpc;
154 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
155 size_t payloadSize,
ByteBuffer* payloadBuffer)
157 if(command<0||command>=(
int8)m_handlerTable.size())
160 "Invalid (or unsupported) command: %x.", (0xFF&command));
163 std::cerr<<
"Invalid (or unsupported) command: "<<
std::hex<<(int)(0xFF&command)<<
"\n" 170 m_handlerTable[command]->handleResponse(responseFrom, transport,
171 version, command, payloadSize, payloadBuffer);
175 osiSockAddr* responseFrom, Transport::shared_pointer
const & transport,
int8 version,
176 int8 command,
size_t payloadSize,
180 transport, version, command, payloadSize, payloadBuffer);
182 transport->ensureData(4+2+2);
183 transport->setRemoteTransportReceiveBufferSize(payloadBuffer->
getInt());
193 PVStructure::shared_pointer data;
196 if(raw && raw->getField()->getType()==
structure) {
209 }
catch(std::exception& e){
212 LOG(
logLevelDebug,
"Security plug-in '%s' failed to create a session for PVA client: %s.", securityPluginName.c_str(), casTransport->
getRemoteName().c_str());
225 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
226 size_t payloadSize,
ByteBuffer* payloadBuffer)
229 transport, version, command, payloadSize, payloadBuffer);
232 TransportSender::shared_pointer echoReply(
new EchoTransportSender(responseFrom, payloadSize, *payloadBuffer));
233 transport->enqueueSendRequest(echoReply);
244 srand ( time(
NULL) );
248 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
249 size_t payloadSize,
ByteBuffer* payloadBuffer)
252 transport, version, command, payloadSize, payloadBuffer);
254 transport->ensureData(4+1+3+16+2);
256 size_t startPosition = payloadBuffer->
getPosition();
258 const int32 searchSequenceId = payloadBuffer->
getInt();
266 memset(&responseAddress, 0,
sizeof(responseAddress));
267 responseAddress.
ia.sin_family = AF_INET;
273 if (responseAddress.
ia.sin_addr.s_addr == INADDR_ANY)
274 responseAddress.
ia.sin_addr = responseFrom->
ia.sin_addr;
278 responseAddress.
ia.sin_port = htons(port);
281 bool allowed = (protocolsCount == 0);
282 for (
size_t i = 0;
i < protocolsCount;
i++)
291 transport->ensureData(2);
301 if ((qosCode & 0x80) == 0x80)
304 if (bt && bt->hasLocalMulticastAddress())
313 payloadBuffer->
putInt(16);
318 payloadBuffer->
put(startPosition+4, (
int8)(qosCode & ~0x80));
328 bt->getLocalMulticastAddress());
334 PeerInfo::shared_pointer info;
337 info->transport =
"pva";
339 info->transportVersion = version;
347 transport->ensureData(4);
354 const std::vector<ChannelProvider::shared_pointer>& _providers =
_context->getChannelProviders();
356 int providerCount = _providers.size();
358 tp->set(name, searchSequenceId, cid, responseAddress, responseRequired,
false);
360 for (
int i = 0;
i < providerCount;
i++)
361 _providers[
i]->channelFind(name, tp);
372 double delay = double(rand())/RAND_MAX;
373 delay = delay*0.1 + 0.05;
376 tp->set(
"", searchSequenceId, 0, responseAddress,
true,
true);
378 TimerCallback::shared_pointer tc = tp;
379 _context->getTimer()->scheduleAfterDelay(tc, delay);
385 int32 expectedResponseCount) :
386 _guid(context->getGUID()),
391 _expectedResponseCount(expectedResponseCount),
401 _serverSearch =
false;
415 bool responseRequired,
bool serverSearch)
419 _searchSequenceId = searchSequenceId;
422 _responseRequired = responseRequired;
423 _serverSearch = serverSearch;
433 if (_responseCount > _expectedResponseCount)
435 if ((_responseCount+1) == _expectedResponseCount)
437 LOG(
logLevelDebug,
"[ServerChannelFindRequesterImpl::channelFindResult] More responses received than expected fpr channel '%s'!", _name.c_str());
442 if (wasFound && _wasFound)
444 LOG(
logLevelDebug,
"[ServerChannelFindRequesterImpl::channelFindResult] Channel '%s' is hosted by different channel providers!", _name.c_str());
448 if (wasFound || (_responseRequired && (_responseCount == _expectedResponseCount)))
450 if (wasFound && _expectedResponseCount > 1)
452 Lock L(_context->_mutex);
453 _context->s_channelNameToProvider[_name] = channelFind->getChannelProvider();
455 _wasFound = wasFound;
457 BlockingUDPTransport::shared_pointer bt = _context->getBroadcastTransport();
460 TransportSender::shared_pointer thisSender = shared_from_this();
461 bt->enqueueSendRequest(thisSender);
477 buffer->
putInt(_searchSequenceId);
515 ChannelFind::shared_pointer
const & channelFind,
522 this->channelNames = channelNames;
528 return _waitEvent.wait(timeoutSec);
532 _waitEvent.tryWait();
549 static int32 TIMEOUT_SEC;
551 static Structure::const_shared_pointer helpStructure;
552 static Structure::const_shared_pointer channelListStructure;
553 static Structure::const_shared_pointer infoStructure;
555 static const std::string helpString;
560 static bool starts_with(
const string& s1,
const string& s2) {
561 return s2.size() <= s1.size() && s1.compare(0, s2.size(), s2) == 0;
567 m_serverContext(context)
571 virtual epics::pvData::PVStructure::shared_pointer
request(
572 epics::pvData::PVStructure::shared_pointer
const & arguments
576 PVStructure::shared_pointer args(
577 (starts_with(arguments->getStructure()->getID(),
"epics:nt/NTURI:1.")) ?
583 if (args->getSubField(
"help"))
585 PVStructure::shared_pointer help =
getPVDataCreate()->createPVStructure(helpStructure);
586 help->getSubFieldT<
PVString>(
"value")->
put(helpString);
590 PVString::shared_pointer opField = args->getSubField<
PVString>(
"op");
594 string op = opField->get();
595 if (op ==
"channels")
597 PVStructure::shared_pointer
result =
599 PVStringArray::shared_pointer allChannelNames = result->getSubFieldT<
PVStringArray>(
"value");
602 const std::vector<ChannelProvider::shared_pointer>& providers = m_serverContext->getChannelProviders();
604 size_t providerCount = providers.size();
605 for (
size_t i = 0;
i < providerCount;
i++)
607 providers[
i]->channelList(listListener);
608 if (!listListener->waitForCompletion(TIMEOUT_SEC))
617 if (providerCount == 1)
621 LOG(
logLevelDebug,
"%s: %s", providers[
i]->getProviderName().c_str(), errorMessage.c_str());
626 if (providerCount == 1)
628 allChannelNames->replace(listListener->channelNames);
633 std::copy(listListener->channelNames.begin(), listListener->channelNames.end(),
634 back_inserter(list));
635 allChannelNames->replace(freeze(list));
638 listListener->resetEvent();
643 else if (op ==
"info")
645 PVStructure::shared_pointer
result =
650 std::string hostName(
"localhost");
651 if (gethostname(buffer,
sizeof(buffer)) == 0)
654 std::stringstream ret;
655 ret << EPICS_PVA_MAJOR_VERSION <<
'.' <<
656 EPICS_PVA_MINOR_VERSION <<
'.' <<
657 EPICS_PVA_MAINTENANCE_VERSION;
658 if (EPICS_PVA_DEVELOPMENT_FLAG)
661 result->getSubFieldT<
PVString>(
"version")->
put(ret.str());
662 result->getSubFieldT<
PVString>(
"implLang")->
put(
"cpp");
663 result->getSubFieldT<
PVString>(
"host")->
put(hostName);
665 std::stringstream sspid;
667 result->getSubFieldT<
PVString>(
"process")->
put(sspid.str());
670 epicsTimeToStrftime(timeText, 64,
"%Y-%m-%dT%H:%M:%S.%03f", &m_serverContext->getStartTime());
672 result->getSubFieldT<
PVString>(
"startTime")->
put(timeText);
682 int32 ServerRPCService::TIMEOUT_SEC = 3;
683 Structure::const_shared_pointer ServerRPCService::helpStructure =
685 setId(
"epics:nt/NTScalar:1.0")->
689 Structure::const_shared_pointer ServerRPCService::channelListStructure =
691 setId(
"epics:nt/NTScalarArray:1.0")->
695 Structure::const_shared_pointer ServerRPCService::infoStructure =
708 const std::string ServerRPCService::helpString =
709 "pvAccess server RPC service.\n" 711 "\tstring op\toperation to execute\n" 714 "\t\tinfo\t\treturns some information about the server\n" 715 "\t\tchannels\treturns a list of 'static' channels the server can provide\n" 723 const std::string ServerCreateChannelHandler::SERVER_CHANNEL_NAME =
"server";
726 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
727 size_t payloadSize,
ByteBuffer* payloadBuffer)
730 transport, version, command, payloadSize, payloadBuffer);
733 transport->ensureData((
sizeof(
int32)+
sizeof(
int16))/
sizeof(
int8));
742 if (channelName.size() == 0)
744 LOG(
logLevelDebug,
"Zero length channel name, disconnecting client: %s", transport->getRemoteName().c_str());
745 disconnect(transport);
750 LOG(
logLevelDebug,
"Unreasonable channel name length, disconnecting client: %s", transport->getRemoteName().c_str());
751 disconnect(transport);
755 if (channelName == SERVER_CHANNEL_NAME)
758 ServerRPCService::shared_pointer serverRPCService(
new ServerRPCService(_context));
762 ChannelRequester::shared_pointer cr = tp;
763 Channel::shared_pointer serverChannel =
createRPCChannel(ChannelProvider::shared_pointer(), channelName, cr, serverRPCService);
764 cr->channelCreated(
Status::Ok, serverChannel);
768 const std::vector<ChannelProvider::shared_pointer>& _providers(_context->getChannelProviders());
769 ServerContextImpl::s_channelNameToProvider_t::const_iterator it;
771 if (_providers.size() == 1)
774 ChannelProvider::shared_pointer prov;
776 Lock L(_context->_mutex);
777 if((it = _context->s_channelNameToProvider.find(channelName)) != _context->s_channelNameToProvider.end())
778 prov = it->second.lock();
786 void ServerCreateChannelHandler::disconnect(Transport::shared_pointer
const & transport)
792 const string channelName,
const pvAccessID cid) :
795 _channelName(channelName),
802 ChannelProvider::shared_pointer
const & provider, Transport::shared_pointer
const & transport,
803 const string channelName,
const pvAccessID cid)
807 ChannelRequester::shared_pointer cr = tp;
809 provider->createChannel(channelName, cr, transport->getPriority());
816 throw std::logic_error(
"Channel already created");
817 if(detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock())
819 ServerChannel::shared_pointer serverChannel;
827 pvAccessID sid = transport->preallocateChannelSID();
830 serverChannel.reset(
new ServerChannel(channel, shared_from_this(), _cid, sid));
833 transport->registerChannel(sid, serverChannel);
838 transport->depreallocateChannelSID(sid);
847 _serverChannel = serverChannel;
851 TransportSender::shared_pointer thisSender = shared_from_this();
852 transport->enqueueSendRequest(thisSender);
854 catch (std::exception& e)
856 LOG(
logLevelDebug,
"Exception caught when creating channel '%s': %s", _channelName.c_str(), e.what());
861 TransportSender::shared_pointer thisSender = shared_from_this();
862 transport->enqueueSendRequest(thisSender);
866 LOG(
logLevelDebug,
"Exception caught when creating channel: %s", _channelName.c_str());
871 TransportSender::shared_pointer thisSender = shared_from_this();
872 transport->enqueueSendRequest(thisSender);
882 if(detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock())
884 ServerChannel::shared_pointer channel;
898 transport->unregisterChannel(channel->getSID());
902 transport->enqueueSendRequest(sr);
908 if(detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock()) {
910 return transport->_peerInfo;
913 return std::tr1::shared_ptr<const PeerInfo>();
919 detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock();
921 return transport->getRemoteName();
923 return "<unknown>:0";
933 ServerChannel::shared_pointer serverChannel;
937 serverChannel = _serverChannel.lock();
941 if (detail::BlockingServerTCPTransportCodec::shared_pointer transport = _transport.lock())
959 buffer->
putInt(serverChannelImpl->getCID());
960 buffer->
putInt(serverChannelImpl->getSID());
969 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
970 size_t payloadSize,
ByteBuffer* payloadBuffer)
973 transport, version, command, payloadSize, payloadBuffer);
979 transport->ensureData(8);
984 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
985 if (channel.get() ==
NULL)
987 if (!transport->isClosed())
991 LOG(
logLevelDebug,
"Trying to destroy a channel that no longer exists (SID: %d, CID %d, client: %s).", sid, cid, host);
1004 transport->enqueueSendRequest(sr);
1010 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
1011 size_t payloadSize,
ByteBuffer* payloadBuffer)
1014 transport, version, command, payloadSize, payloadBuffer);
1019 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
1026 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
1027 if (channel.get() ==
NULL)
1033 const bool init = (
QOS_INIT & qosCode) != 0;
1044 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
1052 atomic::add(request->bytesRX, payloadSize);
1054 if (!request->startRequest(qosCode))
1060 ChannelGet::shared_pointer channelGet = request->getChannelGet();
1062 channelGet->lastRequest();
1067 #define INIT_EXCEPTION_GUARD(cmd, var, code) \ 1069 operation_type::shared_pointer op(code); \ 1070 epicsGuard<epicsMutex> G(_mutex); \ 1073 catch (std::exception &e) { \ 1074 Status status(Status::STATUSTYPE_FATAL, e.what()); \ 1075 BaseChannelRequester::sendFailureMessage((int8)cmd, _transport, _ioid, (int8)QOS_INIT, status); \ 1079 Status status(Status::STATUSTYPE_FATAL, "unknown exception caught"); \ 1080 BaseChannelRequester::sendFailureMessage((int8)cmd, _transport, _ioid, (int8)QOS_INIT, status); \ 1084 #define DESERIALIZE_EXCEPTION_GUARD(code) \ 1088 catch (std::exception &e) { \ 1089 Status status(Status::STATUSTYPE_ERROR, e.what()); \ 1090 BaseChannelRequester::sendFailureMessage((int8)command, transport, ioid, qosCode, status); \ 1094 Status status(Status::STATUSTYPE_ERROR, "unknown exception caught"); \ 1095 BaseChannelRequester::sendFailureMessage((int8)command, transport, ioid, qosCode, status); \ 1106 PVStructure::shared_pointer
const & pvRequest)
1110 ChannelGetRequester::shared_pointer thisPointer = tp;
1128 _channelGet = channelGet;
1133 _bitSet = createBitSetFor(_pvStructure, _bitSet);
1137 TransportSender::shared_pointer thisSender = shared_from_this();
1148 PVStructure::shared_pointer
const & pvStructure, BitSet::shared_pointer
const & bitSet)
1156 _pvStructure->copyUnchecked(*pvStructure, *_bitSet);
1160 TransportSender::shared_pointer thisSender = shared_from_this();
1173 ChannelGet::shared_pointer channelGet = _channelGet;
1180 _channelGet->destroy();
1181 _channelGet.reset();
1196 ChannelGet::shared_pointer channelGet;
1199 channelGet = _channelGet;
1201 if (!channelGet && !(request &
QOS_INIT))
1231 _bitSet->serialize(buffer, control);
1232 _pvStructure->serialize(buffer, control, _bitSet.get());
1246 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
1247 size_t payloadSize,
ByteBuffer* payloadBuffer) {
1249 transport, version, command, payloadSize, payloadBuffer);
1255 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
1262 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
1269 const bool init = (
QOS_INIT & qosCode) != 0;
1280 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
1281 const bool get = (
QOS_GET & qosCode) != 0;
1289 atomic::add(request->bytesRX, payloadSize);
1291 if (!request->startRequest(qosCode))
1297 ChannelPut::shared_pointer channelPut = request->getChannelPut();
1300 channelPut->lastRequest();
1312 BitSet::shared_pointer putBitSet = request->getPutBitSet();
1313 PVStructure::shared_pointer putPVStructure = request->getPutPVStructure();
1316 putBitSet->deserialize(payloadBuffer, transport.
get());
1317 putPVStructure->deserialize(payloadBuffer, transport.
get(), putBitSet.get());
1322 channelPut->put(putPVStructure, putBitSet);
1329 const pvAccessID ioid, Transport::shared_pointer
const & transport):
1335 const pvAccessID ioid, Transport::shared_pointer
const & transport, PVStructure::shared_pointer
const & pvRequest)
1339 ChannelPutRequester::shared_pointer thisPointer = tp;
1357 _channelPut = channelPut;
1361 _bitSet = createBitSetFor(_pvStructure, _bitSet);
1365 TransportSender::shared_pointer thisSender = shared_from_this();
1381 TransportSender::shared_pointer thisSender = shared_from_this();
1393 _pvStructure->copyUnchecked(*pvStructure, *_bitSet);
1396 TransportSender::shared_pointer thisSender = shared_from_this();
1409 ChannelPut::shared_pointer channelPut = _channelPut;
1416 _channelPut->destroy();
1417 _channelPut.reset();
1437 return _pvStructure;
1444 ChannelPut::shared_pointer channelPut;
1447 channelPut = _channelPut;
1449 if (!channelPut && !(request &
QOS_INIT))
1468 else if ((
QOS_GET & request) != 0)
1471 _bitSet->serialize(buffer, control);
1472 _pvStructure->serialize(buffer, control, _bitSet.get());
1486 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
1487 size_t payloadSize,
ByteBuffer* payloadBuffer) {
1489 transport, version, command, payloadSize, payloadBuffer);
1494 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
1501 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
1508 const bool init = (
QOS_INIT & qosCode) != 0;
1519 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
1520 const bool getGet = (
QOS_GET & qosCode) != 0;
1529 atomic::add(request->bytesRX, payloadSize);
1531 if (!request->startRequest(qosCode))
1537 ChannelPutGet::shared_pointer channelPutGet = request->getChannelPutGet();
1539 channelPutGet->lastRequest();
1543 channelPutGet->getGet();
1547 channelPutGet->getPut();
1554 BitSet::shared_pointer putBitSet = request->getPutGetBitSet();
1555 PVStructure::shared_pointer putPVStructure = request->getPutGetPVStructure();
1558 putBitSet->deserialize(payloadBuffer, transport.
get());
1559 putPVStructure->deserialize(payloadBuffer, transport.
get(), putBitSet.get());
1564 channelPutGet->putGet(putPVStructure, putBitSet);
1571 const pvAccessID ioid, Transport::shared_pointer
const & transport):
1572 BaseChannelRequester(context, channel, ioid, transport), _channelPutGet(), _pvPutStructure(), _pvGetStructure()
1577 const pvAccessID ioid, Transport::shared_pointer
const & transport,PVStructure::shared_pointer
const & pvRequest)
1581 ChannelPutGetRequester::shared_pointer thisPointer = tp;
1595 Structure::const_shared_pointer
const & putStructure, Structure::const_shared_pointer
const & getStructure)
1600 _channelPutGet = channelPutGet;
1604 _pvPutBitSet = createBitSetFor(_pvPutStructure, _pvPutBitSet);
1607 _pvGetBitSet = createBitSetFor(_pvGetStructure, _pvGetBitSet);
1611 TransportSender::shared_pointer thisSender = shared_from_this();
1622 PVStructure::shared_pointer
const & pvStructure, BitSet::shared_pointer
const & bitSet)
1629 *_pvGetBitSet = *bitSet;
1630 _pvGetStructure->copyUnchecked(*pvStructure, *_pvGetBitSet);
1633 TransportSender::shared_pointer thisSender = shared_from_this();
1638 PVStructure::shared_pointer
const & pvStructure, BitSet::shared_pointer
const & bitSet)
1645 *_pvPutBitSet = *bitSet;
1646 _pvPutStructure->copyUnchecked(*pvStructure, *_pvPutBitSet);
1649 TransportSender::shared_pointer thisSender = shared_from_this();
1654 PVStructure::shared_pointer
const & pvStructure, BitSet::shared_pointer
const & bitSet)
1661 *_pvGetBitSet = *bitSet;
1662 _pvGetStructure->copyUnchecked(*pvStructure, *_pvGetBitSet);
1665 TransportSender::shared_pointer thisSender = shared_from_this();
1678 ChannelPutGet::shared_pointer channelPutGet = _channelPutGet;
1685 _channelPutGet->destroy();
1686 _channelPutGet.reset();
1694 return _channelPutGet;
1700 return _pvPutStructure;
1706 return _pvPutBitSet;
1713 ChannelPutGet::shared_pointer channelPutGet;
1716 channelPutGet = _channelPutGet;
1718 if (!channelPutGet && !(request &
QOS_INIT))
1738 else if ((
QOS_GET & request) != 0)
1741 _pvGetBitSet->serialize(buffer, control);
1742 _pvGetStructure->serialize(buffer, control, _pvGetBitSet.get());
1748 _pvPutBitSet->serialize(buffer, control);
1749 _pvPutStructure->serialize(buffer, control, _pvPutBitSet.get());
1755 _pvGetBitSet->serialize(buffer, control);
1756 _pvGetStructure->serialize(buffer, control, _pvGetBitSet.get());
1769 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
1770 size_t payloadSize,
ByteBuffer* payloadBuffer) {
1772 transport, version, command, payloadSize, payloadBuffer);
1777 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
1784 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
1791 const bool init = (
QOS_INIT & qosCode) != 0;
1804 transport->ensureData(4);
1807 request->ack(nfree);
1813 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
1814 const bool get = (
QOS_GET & qosCode) != 0;
1815 const bool process = (
QOS_PROCESS & qosCode) != 0;
1824 atomic::add(request->bytesRX, payloadSize);
1828 transport->ensureData(4);
1830 request->ack(nfree);
1846 request->getChannelMonitor()->start();
1848 request->getChannelMonitor()->stop();
1863 ServerChannel::shared_pointer
const & channel,
1864 const pvAccessID ioid, Transport::shared_pointer
const & transport)
1873 const pvAccessID ioid, Transport::shared_pointer
const & transport,PVStructure::shared_pointer
const & pvRequest)
1876 tp->activate(pvRequest);
1882 epics::pvData::PVScalar::const_shared_pointer O(pvRequest->getSubField<
epics::pvData::PVScalar>(
"record._options.pipeline"));
1886 }
catch(std::exception& e){
1887 std::ostringstream strm;
1888 strm<<
"Ignoring invalid pipeline= : "<<e.what();
1903 _channelMonitor = monitor;
1906 TransportSender::shared_pointer thisSender = shared_from_this();
1922 TransportSender::shared_pointer thisSender = shared_from_this();
1928 TransportSender::shared_pointer thisSender = shared_from_this();
1941 Monitor::shared_pointer monitor;
1947 window.swap(_window_closed);
1949 monitor.swap(_channelMonitor);
1960 return _channelMonitor;
1997 busy = _window_open==0;
2012 const BitSet::shared_pointer& changedBitSet = element->
changedBitSet;
2015 changedBitSet->serialize(buffer, control);
2016 element->
pvStructurePtr->serialize(buffer, control, changedBitSet.get());
2025 }
else if(_window_open==0) {
2029 LOG(
logLevelError,
"Monitor Logic Error: send outside of window %zu", _window_closed.size());
2032 _window_closed.push_back(element.
letGo());
2041 TransportSender::shared_pointer thisSender = shared_from_this();
2050 unlisten = _unlisten;
2053 window.swap(_window_closed);
2058 for(window_t::iterator it(window.begin()), end(window.end()); it!=end; ++it) {
2059 monitor->release(*it);
2077 typedef std::vector<MonitorElementPtr> acking_t;
2079 Monitor::shared_pointer mon;
2085 size_t nack =
std::min(cnt, _window_closed.size());
2087 _window_open += cnt;
2089 window_t::iterator it, end(_window_closed.begin());
2090 std::advance(end, nack);
2092 acking.resize(nack);
2095 for(i=0, it=_window_closed.begin(); i<nack; i++, ++it)
2097 acking[
i].swap(*it);
2100 _window_closed.erase(_window_closed.begin(), end);
2102 mon = _channelMonitor;
2105 for(acking_t::iterator it(acking.begin()), end(acking.end()); it!=end; ++it) {
2109 mon->reportRemoteQueueStatus(cnt);
2114 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2115 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2117 transport, version, command, payloadSize, payloadBuffer);
2122 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
2129 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2136 const bool init = (
QOS_INIT & qosCode) != 0;
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;
2158 atomic::add(request->bytesRX, payloadSize);
2160 if (!request->startRequest(qosCode))
2166 ChannelArray::shared_pointer channelArray = request->getChannelArray();
2168 channelArray->lastRequest();
2176 request->getChannelArray()->getArray(offset, count, stride);
2182 request->getChannelArray()->setLength(length);
2186 request->getChannelArray()->getLength();
2193 PVArray::shared_pointer array = request->getPVArray();
2200 array->deserialize(payloadBuffer, transport.
get());
2204 channelArray->putArray(array, offset, array->getLength(), stride);
2211 const pvAccessID ioid, Transport::shared_pointer
const & transport):
2218 const pvAccessID ioid, Transport::shared_pointer
const & transport,PVStructure::shared_pointer
const & pvRequest)
2222 ChannelArrayRequester::shared_pointer thisPointer = tp;
2241 _channelArray.reset();
2248 _channelArray = channelArray;
2255 TransportSender::shared_pointer thisSender = shared_from_this();
2272 _pvArray->copyUnchecked(*pvArray);
2275 TransportSender::shared_pointer thisSender = shared_from_this();
2285 TransportSender::shared_pointer thisSender = shared_from_this();
2295 TransportSender::shared_pointer thisSender = shared_from_this();
2307 TransportSender::shared_pointer thisSender = shared_from_this();
2320 ChannelArray::shared_pointer channelArray = _channelArray;
2327 _channelArray->destroy();
2328 _channelArray.reset();
2336 return _channelArray;
2349 ChannelArray::shared_pointer channelArray;
2352 channelArray = _channelArray;
2354 if (!channelArray && !(request &
QOS_INIT))
2372 _pvArray->serialize(buffer, control, 0, _pvArray->getLength());
2379 else if ((
QOS_INIT & request) != 0)
2395 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2396 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2398 transport, version, command, payloadSize, payloadBuffer);
2403 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8));
2407 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2414 Destroyable::shared_pointer
request = channel->getRequest(ioid);
2426 channel->unregisterRequest(ioid);
2429 void ServerDestroyRequestHandler::failureResponse(Transport::shared_pointer
const & transport,
pvAccessID ioid,
const Status& errorStatus)
2436 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2437 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2439 transport, version, command, payloadSize, payloadBuffer);
2444 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8));
2448 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2455 BaseChannelRequester::shared_pointer
request(channel->getRequest(ioid));
2473 void ServerCancelRequestHandler::failureResponse(Transport::shared_pointer
const & transport,
pvAccessID ioid,
const Status& errorStatus)
2480 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2481 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2483 transport, version, command, payloadSize, payloadBuffer);
2488 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
2495 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2502 const bool init = (
QOS_INIT & qosCode) != 0;
2513 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
2521 atomic::add(request->bytesRX, payloadSize);
2523 if (!request->startRequest(qosCode))
2530 request->getChannelProcess()->lastRequest();
2532 request->getChannelProcess()->process();
2538 const pvAccessID ioid, Transport::shared_pointer
const & transport):
2545 const pvAccessID ioid, Transport::shared_pointer
const & transport,PVStructure::shared_pointer
const & pvRequest)
2549 ChannelProcessRequester::shared_pointer thisPointer = tp;
2567 _channelProcess = channelProcess;
2569 TransportSender::shared_pointer thisSender = shared_from_this();
2585 TransportSender::shared_pointer thisSender = shared_from_this();
2600 if (_channelProcess.get())
2602 _channelProcess->destroy();
2606 _channelProcess.reset();
2612 return _channelProcess;
2639 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2640 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2642 transport, version, command, payloadSize, payloadBuffer);
2647 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8));
2651 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2661 GetFieldRequester::shared_pointer req;
2667 channel->installGetField(req);
2670 channel->getChannel()->getField(req, subField);
2673 void ServerGetFieldHandler::getFieldFailureResponse(Transport::shared_pointer
const & transport,
const pvAccessID ioid,
const Status& errorStatus)
2676 transport->enqueueSendRequest(sender);
2681 const pvAccessID ioid, Transport::shared_pointer
const & transport) :
2697 TransportSender::shared_pointer thisSender = shared_from_this();
2721 Transport::shared_pointer
const & transport,
int8 version,
int8 command,
2722 size_t payloadSize,
ByteBuffer* payloadBuffer) {
2724 transport, version, command, payloadSize, payloadBuffer);
2729 transport->ensureData(2*
sizeof(
int32)/
sizeof(
int8)+1);
2736 ServerChannel::shared_pointer channel = casTransport->
getChannel(sid);
2743 const bool init = (
QOS_INIT & qosCode) != 0;
2754 const bool lastRequest = (
QOS_DESTROY & qosCode) != 0;
2762 atomic::add(request->bytesRX, payloadSize);
2764 if (!request->startRequest(qosCode))
2771 ChannelRPC::shared_pointer channelRPC = request->getChannelRPC();
2773 PVStructure::shared_pointer pvArgument;
2780 channelRPC->lastRequest();
2782 channelRPC->request(pvArgument);
2788 const pvAccessID ioid, Transport::shared_pointer
const & transport):
2790 _channelRPC(), _pvResponse()
2798 const pvAccessID ioid, Transport::shared_pointer
const & transport, PVStructure::shared_pointer
const & pvRequest)
2802 tp->activate(pvRequest);
2819 _channelRPC = channelRPC;
2821 TransportSender::shared_pointer thisSender = shared_from_this();
2836 _pvResponse = pvResponse;
2838 TransportSender::shared_pointer thisSender = shared_from_this();
2853 if (_channelRPC.get())
2855 _channelRPC->destroy();
2859 _channelRPC.reset();
static ChannelPutRequester::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)
epics::pvData::PVStructure::shared_pointer getPutGetPVStructure()
void fatal(char *msg) NORETURN
virtual void setRecipient(osiSockAddr const &sendTo)=0
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
std::tr1::shared_ptr< ServerChannelRPCRequesterImpl > shared_pointer
virtual void putGetDone(const epics::pvData::Status &status, ChannelPutGet::shared_pointer const &channelPutGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
PVScalar is the base class for each scalar field.
virtual void destroy() OVERRIDE FINAL
C++ wrapper for epicsEvent from EPICS base.
#define assert(exp)
Declare that a condition should be true.
ServerGetFieldRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
std::tr1::shared_ptr< ServerChannelGetRequesterImpl > shared_pointer
virtual void timerStopped() OVERRIDE FINAL
std::tr1::shared_ptr< detail::SharedPut > put
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
const std::tr1::shared_ptr< ServerChannel > _channel
epics::pvData::PVStructure::shared_pointer getPutPVStructure()
ChannelRPC::shared_pointer getChannelRPC()
epicsShareExtern std::string getMessageTypeName(MessageType messageType)
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
Information provded by a client to a server-type ChannelProvider.
ChannelPutGet::shared_pointer getChannelPutGet()
EPICS_ALWAYS_INLINE int8 getByte()
virtual void getGetDone(const epics::pvData::Status &status, ChannelPutGet::shared_pointer const &channelPutGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
virtual void getDone(const epics::pvData::Status &status, ChannelGet::shared_pointer const &channelGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
An EPICS-specific replacement for ANSI C's assert.
static std::string deserializeString(ByteBuffer *buffer, DeserializableControl *control)
static ChannelProcessRequester::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)
epics::pvData::PVArray::shared_pointer getPVArray()
static Status error(const std::string &m)
EPICS_ALWAYS_INLINE void putInt(int32 value)
const char * getBuffer() const
virtual void destroy() OVERRIDE FINAL
epics::pvData::BitSet::shared_pointer getPutGetBitSet()
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)
virtual void getPutDone(const epics::pvData::Status &status, ChannelPutGet::shared_pointer const &channelPutGet, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
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
#define INIT_EXCEPTION_GUARD(cmd, var, code)
epics::pvData::Mutex _mutex
virtual void putDone(const epics::pvData::Status &status, ChannelPut::shared_pointer const &channelPut) OVERRIDE FINAL
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
bool startRequest(epics::pvData::int32 qos)
ServerChannelProcessRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
static const epics::pvData::Status otherRequestPendingStatus
std::size_t getLimit() const
virtual void channelStateChange(Channel::shared_pointer const &c, const Channel::ConnectionState isConnected) OVERRIDE FINAL
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
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
A lock for multithreading.
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
ChannelGet::shared_pointer getChannelGet()
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
bool waitForCompletion(int32 timeoutSec)
ServerChannelPutRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
static std::size_t readSize(ByteBuffer *buffer, DeserializableControl *control)
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual void destroy() OVERRIDE FINAL
virtual void channelCreated(const epics::pvData::Status &status, Channel::shared_pointer const &channel) OVERRIDE FINAL
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
std::size_t getPosition() const
virtual void getLengthDone(const epics::pvData::Status &status, ChannelArray::shared_pointer const &channelArray, std::size_t length) OVERRIDE FINAL
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 epics::pvData::PVField::shared_pointer deserializeFull(epics::pvData::ByteBuffer *payloadBuffer, epics::pvData::DeserializableControl *control)
const std::string & getMessage() const
const Transport::shared_pointer _transport
const epics::pvData::PVStructurePtr pvStructurePtr
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
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
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
static const epics::pvData::Status badIOIDStatus
ServerChannelRequesterImpl(Transport::shared_pointer const &transport, const std::string channelName, const pvAccessID cid)
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual void channelPutConnect(const epics::pvData::Status &status, ChannelPut::shared_pointer const &channelPut, epics::pvData::Structure::const_shared_pointer const &structure) OVERRIDE FINAL
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
EPICS_ALWAYS_INLINE int32 getInt()
std::tr1::shared_ptr< ServerChannelArrayRequesterImpl > shared_pointer
virtual void destroy() OVERRIDE FINAL
LIBCOM_API size_t epicsStdCall epicsTimeToStrftime(char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS)
Convert epicsTimeStamp to string. See epicsTime::strftime()
PVString is special case, since it implements SerializableArray.
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
virtual void destroy() OVERRIDE FINAL
MonitorElementPtr letGo()
#define LOG(level, format,...)
void authNZInitialize(const std::string &securityPluginName, const epics::pvData::PVStructure::shared_pointer &data)
ServerChannelRPCRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
virtual void getDone(const epics::pvData::Status &status, epics::pvData::FieldConstPtr const &field) OVERRIDE FINAL
virtual void channelGetConnect(const epics::pvData::Status &status, ChannelGet::shared_pointer const &channelGet, epics::pvData::Structure::const_shared_pointer const &structure) OVERRIDE FINAL
virtual void channelProcessConnect(const epics::pvData::Status &status, ChannelProcess::shared_pointer const &channelProcess) OVERRIDE FINAL
void setPosition(std::size_t pos)
ChannelArray::shared_pointer getChannelArray()
virtual std::tr1::shared_ptr< const PeerInfo > getPeerInfo() OVERRIDE FINAL
Return information on requesting peer if applicable.
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual std::tr1::shared_ptr< const PeerInfo > getPeerInfo() OVERRIDE FINAL
Return information on connected peer if applicable.
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const
virtual void putArrayDone(const epics::pvData::Status &status, ChannelArray::shared_pointer const &channelArray) OVERRIDE FINAL
std::tr1::shared_ptr< ServerChannel > getChannel(pvAccessID sid)
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
#define DESERIALIZE_EXCEPTION_GUARD(code)
template class for all extensions of PVArray.
static Status fatal(const std::string &m)
virtual void unlisten(Monitor::shared_pointer const &monitor) OVERRIDE FINAL
virtual void processDone(const epics::pvData::Status &status, ChannelProcess::shared_pointer const &channelProcess) OVERRIDE FINAL
ServerChannelPutGetRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
void encodeAsIPv6Address(ByteBuffer *buffer, const osiSockAddr *address)
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
virtual void requestDone(const epics::pvData::Status &status, ChannelRPC::shared_pointer const &channelRPC, epics::pvData::PVStructure::shared_pointer const &pvResponse) OVERRIDE FINAL
virtual void callback() OVERRIDE FINAL
virtual void channelRPCConnect(const epics::pvData::Status &status, ChannelRPC::shared_pointer const &channelRPC) OVERRIDE FINAL
epicsShareFunc Channel::shared_pointer createRPCChannel(ChannelProvider::shared_pointer const &provider, std::string const &channelName, ChannelRequester::shared_pointer const &channelRequester, RPCServiceAsync::shared_pointer const &rpcService)
const std::string & getStackDump() const
const epics::pvData::int16 PVA_MESSAGE_HEADER_SIZE
static const epics::pvData::Status badCIDStatus
HexDump & limit(size_t n=(size_t)-1)
safety limit on max bytes printed
virtual void verified(epics::pvData::Status const &status) OVERRIDE FINAL
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
virtual void getDone(const epics::pvData::Status &status, ChannelPut::shared_pointer const &channelPut, epics::pvData::PVStructure::shared_pointer const &pvStructure, epics::pvData::BitSet::shared_pointer const &bitSet) OVERRIDE FINAL
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
EPICS_ALWAYS_INLINE void putByte(int8 value)
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
static void serializeStructureFull(epics::pvData::ByteBuffer *buffer, epics::pvData::SerializableControl *control, epics::pvData::PVStructure::shared_pointer const &pvStructure)
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
void unregisterChannel(pvAccessID sid)
EPICS_ALWAYS_INLINE int16 getShort()
virtual void setLengthDone(const epics::pvData::Status &status, ChannelArray::shared_pointer const &channelArray) OVERRIDE FINAL
const epics::pvData::BitSet::shared_pointer overrunBitSet
void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
POINTER_DEFINITIONS(ChannelFindRequester)
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
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
static void serializeString(const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
std::tr1::shared_ptr< ServerChannelPutRequesterImpl > shared_pointer
virtual void monitorConnect(const epics::pvData::Status &status, Monitor::shared_pointer const &monitor, epics::pvData::StructureConstPtr const &structure) OVERRIDE FINAL
Data interface for a structure,.
std::size_t getRemaining() const
std::tr1::shared_ptr< const Field > FieldConstPtr
static epics::pvData::PVStructure::shared_pointer deserializeStructureFull(epics::pvData::ByteBuffer *payloadBuffer, epics::pvData::DeserializableControl *control)
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
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
virtual void channelPutGetConnect(const epics::pvData::Status &status, ChannelPutGet::shared_pointer const &channelPutGet, epics::pvData::Structure::const_shared_pointer const &putStructure, epics::pvData::Structure::const_shared_pointer const &getStructure) OVERRIDE FINAL
virtual void cachedSerialize(std::tr1::shared_ptr< const Field > const &field, ByteBuffer *buffer)=0
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
ChannelPut::shared_pointer getChannelPut()
bool decodeAsIPv6Address(ByteBuffer *buffer, osiSockAddr *address)
epics::pvData::int32 getPendingRequest()
virtual void destroy() OVERRIDE FINAL
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
const epics::pvData::BitSet::shared_pointer changedBitSet
static ChannelGetRequester::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 epics::pvData::PVStructure::shared_pointer deserializePVRequest(epics::pvData::ByteBuffer *payloadBuffer, epics::pvData::DeserializableControl *control)
virtual void getArrayDone(const epics::pvData::Status &status, ChannelArray::shared_pointer const &channelArray, epics::pvData::PVArray::shared_pointer const &pvArray) OVERRIDE FINAL
#define THROW_BASE_EXCEPTION(msg)
PVStringArray::const_svector channelNames
virtual void message(std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
ServerChannelGetRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
virtual void channelListResult(const epics::pvData::Status &status, ChannelFind::shared_pointer const &channelFind, PVStringArray::const_svector const &channelNames, bool hasDynamic)
virtual void destroy() OVERRIDE FINAL
std::tr1::shared_ptr< ServerChannelProcessRequesterImpl > shared_pointer
std::tr1::shared_ptr< ServerMonitorRequesterImpl > shared_pointer
std::tr1::shared_ptr< ServerChannelPutGetRequesterImpl > shared_pointer
static const std::string SUPPORTED_PROTOCOL
ServerContextImpl::shared_pointer _context
ServerChannelArrayRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
Monitor::shared_pointer getChannelMonitor()
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)
virtual void ensureBuffer(std::size_t size)=0
ServerChannelFindRequesterImpl(ServerContextImpl::shared_pointer const &context, const PeerInfo::const_shared_pointer &peer, epics::pvData::int32 expectedResponseCount)
ServerMonitorRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
detail::pick_type< int8_t, signed char, detail::pick_type< uint8_t, char, unsigned char >::type >::type boolean
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
ServerChannelFindRequesterImpl * set(std::string _name, epics::pvData::int32 searchSequenceId, epics::pvData::int32 cid, osiSockAddr const &sendTo, bool responseRequired, bool serverSearch)
static ChannelRequester::shared_pointer create(ChannelProvider::shared_pointer const &provider, Transport::shared_pointer const &transport, const std::string channelName, const pvAccessID cid)
std::string * get(StringArray &value)
ChannelPut::shared_pointer op
const epics::pvData::uint32 MAX_CHANNEL_NAME_LENGTH
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
virtual void send(epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
virtual const std::string & getRemoteName() const OVERRIDE FINAL
ServerSearchHandler(ServerContextImpl::shared_pointer const &context)
PVArray is the base class for all array types.
epics::pvData::BitSet::shared_pointer getPutBitSet()
virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize=0)=0
ChannelProcess::shared_pointer getChannelProcess()
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
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
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)
static 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)
string inetAddressToString(const osiSockAddr &addr, bool displayPort, bool displayHex)
EPICS_ALWAYS_INLINE void putShort(int16 value)
virtual void monitorEvent(Monitor::shared_pointer const &monitor) OVERRIDE FINAL
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< ServerContextImpl > shared_pointer
void activate(epics::pvData::PVStructure::shared_pointer const &pvRequest)
virtual void destroy() OVERRIDE FINAL
virtual std::string getRequesterName() OVERRIDE FINAL
#define IS_LOGGABLE(level)
virtual void channelFindResult(const epics::pvData::Status &status, ChannelFind::shared_pointer const &channelFind, bool wasFound) OVERRIDE FINAL
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
static ChannelRPCRequester::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)
virtual void message(std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
virtual void channelArrayConnect(const epics::pvData::Status &status, ChannelArray::shared_pointer const &channelArray, epics::pvData::Array::const_shared_pointer const &array) OVERRIDE FINAL
static const epics::pvData::Status notAChannelRequestStatus