13 #ifdef epicsExportSharedSymbols 14 # define pvAccessEpicsExportSharedSymbols 15 # undef epicsExportSharedSymbols 18 #include <pv/pvData.h> 19 #include <pv/createRequest.h> 20 #include <pv/status.h> 21 #include <pv/bitSet.h> 23 #ifdef pvAccessEpicsExportSharedSymbols 24 # define epicsExportSharedSymbols 25 # undef pvAccessEpicsExportSharedSymbols 28 #include <pv/pvaVersion.h> 29 #include <pv/destroyable.h> 30 #include <pv/monitor.h> 45 # if __cplusplus
>=201103L
52 # if __cplusplus
>=201103L
53 # define OVERRIDE override 64 using epics::pvData::Requester;
65 using epics::pvData::RequesterPtr;
66 using epics::pvData::MessageType;
67 using epics::pvData::getMessageTypeName;
90 class epicsShareClass Lockable
93 POINTER_DEFINITIONS(Lockable);
95 virtual ~Lockable() {}
97 virtual void lock() {}
98 virtual void unlock() {}
104 class epicsShareClass ScopedLock {
105 EPICS_NOT_COPYABLE(ScopedLock)
108 explicit ScopedLock(Lockable::shared_pointer
const & li)
109 : lockable(li), locked(
true) {
131 bool ownsLock()
const {
137 Lockable::shared_pointer
const lockable;
142 class ChannelProvider;
143 class ChannelArrayRequester;
144 class ChannelFindRequester;
145 class ChannelGetRequester;
146 class ChannelProcessRequester;
147 class ChannelPutRequester;
148 class ChannelPutGetRequester;
149 class ChannelRPCRequester;
156 struct epicsShareClass NetStats {
160 inline Counter() :tx(0u), rx(0u) {}
163 std::string transportPeer;
164 Counter transportBytes;
165 Counter operationBytes;
168 inline Stats() :populated(
false) {}
173 virtual void stats(Stats& s)
const =0;
177 struct epicsShareClass ChannelBaseRequester :
virtual public epics::pvData::Requester
179 POINTER_DEFINITIONS(ChannelBaseRequester);
181 static size_t num_instances;
183 ChannelBaseRequester();
184 virtual ~ChannelBaseRequester();
198 virtual void channelDisconnect(
bool destroy) {}
201 ChannelBaseRequester(
const ChannelBaseRequester&);
202 ChannelBaseRequester& operator=(
const ChannelBaseRequester&);
208 class epicsShareClass ChannelRequest :
public virtual Destroyable,
public Lockable {
210 POINTER_DEFINITIONS(ChannelRequest);
212 static size_t num_instances;
215 virtual ~ChannelRequest();
221 virtual std::tr1::shared_ptr<Channel> getChannel() = 0;
231 virtual void cancel() = 0;
237 virtual void lastRequest() = 0;
240 EPICS_NOT_COPYABLE(ChannelRequest)
249 class epicsShareClass MonitorRequester :
public ChannelBaseRequester {
251 POINTER_DEFINITIONS(MonitorRequester);
252 typedef Monitor operation_type;
254 virtual ~MonitorRequester(){}
263 virtual void monitorConnect(epics::pvData::Status
const & status,
264 MonitorPtr
const & monitor, epics::pvData::StructureConstPtr
const & structure) = 0;
271 virtual void monitorEvent(MonitorPtr
const & monitor) = 0;
276 virtual void unlisten(MonitorPtr
const & monitor) = 0;
283 class epicsShareClass ChannelArray :
public ChannelRequest {
285 POINTER_DEFINITIONS(ChannelArray);
286 typedef ChannelArrayRequester requester_type;
288 virtual ~ChannelArray() {}
301 virtual void putArray(
302 epics::pvData::PVArray::shared_pointer
const & putArray,
303 size_t offset = 0, size_t count = 0, size_t stride = 1) = 0;
315 virtual void getArray(size_t offset = 0, size_t count = 0, size_t stride = 1) = 0;
320 virtual void getLength() = 0;
326 virtual void setLength(size_t length) = 0;
332 class epicsShareClass ChannelArrayRequester :
public ChannelBaseRequester {
334 POINTER_DEFINITIONS(ChannelArrayRequester);
335 typedef ChannelArray operation_type;
337 virtual ~ChannelArrayRequester() {}
347 virtual void channelArrayConnect(
348 const epics::pvData::Status& status,
349 ChannelArray::shared_pointer
const & channelArray,
350 epics::pvData::Array::const_shared_pointer
const & array) = 0;
360 virtual void putArrayDone(
361 const epics::pvData::Status& status,
362 ChannelArray::shared_pointer
const & channelArray) = 0;
374 virtual void getArrayDone(
375 const epics::pvData::Status& status,
376 ChannelArray::shared_pointer
const & channelArray,
377 epics::pvData::PVArray::shared_pointer
const & pvArray) = 0;
385 virtual void getLengthDone(
386 const epics::pvData::Status& status,
387 ChannelArray::shared_pointer
const & channelArray,
395 virtual void setLengthDone(
396 const epics::pvData::Status& status,
397 ChannelArray::shared_pointer
const & channelArray) = 0;
404 class epicsShareClass ChannelFind :
public Destroyable {
405 EPICS_NOT_COPYABLE(ChannelFind)
407 POINTER_DEFINITIONS(ChannelFind);
408 typedef ChannelFindRequester requester_type;
411 virtual ~ChannelFind() {}
413 virtual std::tr1::shared_ptr<ChannelProvider> getChannelProvider() = 0;
414 virtual void cancel() = 0;
418 static ChannelFind::shared_pointer buildDummy(
const std::tr1::shared_ptr<ChannelProvider>& provider);
426 class epicsShareClass ChannelFindRequester {
428 POINTER_DEFINITIONS(ChannelFindRequester);
429 typedef ChannelFind operation_type;
431 virtual ~ChannelFindRequester() {}
436 virtual void channelFindResult(
437 const epics::pvData::Status& status,
438 ChannelFind::shared_pointer
const & channelFind,
462 virtual std::tr1::shared_ptr<
const PeerInfo> getPeerInfo()
463 {
return std::tr1::shared_ptr<
const PeerInfo>(); }
469 class epicsShareClass ChannelListRequester {
471 POINTER_DEFINITIONS(ChannelListRequester);
472 typedef ChannelFind operation_type;
474 virtual ~ChannelListRequester() {}
479 virtual void channelListResult(
480 const epics::pvData::Status& status,
481 ChannelFind::shared_pointer
const & channelFind,
482 epics::pvData::PVStringArray::const_svector
const & channelNames,
483 bool hasDynamic) = 0;
489 class epicsShareClass ChannelGet :
public ChannelRequest {
491 POINTER_DEFINITIONS(ChannelGet);
492 typedef ChannelGetRequester requester_type;
494 virtual ~ChannelGet() {}
504 virtual void get() = 0;
511 class epicsShareClass ChannelGetRequester :
public ChannelBaseRequester {
513 POINTER_DEFINITIONS(ChannelGetRequester);
514 typedef ChannelGet operation_type;
516 virtual ~ChannelGetRequester() {}
524 virtual void channelGetConnect(
525 const epics::pvData::Status& status,
526 ChannelGet::shared_pointer
const & channelGet,
527 epics::pvData::Structure::const_shared_pointer
const & structure) = 0;
540 virtual void getDone(
541 const epics::pvData::Status& status,
542 ChannelGet::shared_pointer
const & channelGet,
543 epics::pvData::PVStructure::shared_pointer
const & pvStructure,
544 epics::pvData::BitSet::shared_pointer
const & bitSet) = 0;
551 class epicsShareClass ChannelProcess :
public ChannelRequest {
553 POINTER_DEFINITIONS(ChannelProcess);
554 typedef ChannelProcessRequester requester_type;
556 virtual ~ChannelProcess() {}
562 virtual void process() = 0;
569 class epicsShareClass ChannelProcessRequester :
public ChannelBaseRequester {
571 POINTER_DEFINITIONS(ChannelProcessRequester);
572 typedef ChannelProcess operation_type;
574 virtual ~ChannelProcessRequester() {}
582 virtual void channelProcessConnect(
583 const epics::pvData::Status& status,
584 ChannelProcess::shared_pointer
const & channelProcess) = 0;
591 virtual void processDone(
592 const epics::pvData::Status& status,
593 ChannelProcess::shared_pointer
const & channelProcess) = 0;
600 class epicsShareClass ChannelPut :
public ChannelRequest {
602 POINTER_DEFINITIONS(ChannelPut);
603 typedef ChannelPutRequester requester_type;
605 virtual ~ChannelPut() {}
620 epics::pvData::PVStructure::shared_pointer
const & pvPutStructure,
621 epics::pvData::BitSet::shared_pointer
const & putBitSet) = 0;
628 virtual void get() = 0;
635 class epicsShareClass ChannelPutRequester :
public ChannelBaseRequester {
637 POINTER_DEFINITIONS(ChannelPutRequester);
638 typedef ChannelPut operation_type;
640 virtual ~ChannelPutRequester() {}
648 virtual void channelPutConnect(
649 const epics::pvData::Status& status,
650 ChannelPut::shared_pointer
const & channelPut,
651 epics::pvData::Structure::const_shared_pointer
const & structure) = 0;
658 virtual void putDone(
659 const epics::pvData::Status& status,
660 ChannelPut::shared_pointer
const & channelPut) = 0;
672 virtual void getDone(
673 const epics::pvData::Status& status,
674 ChannelPut::shared_pointer
const & channelPut,
675 epics::pvData::PVStructure::shared_pointer
const & pvStructure,
676 epics::pvData::BitSet::shared_pointer
const & bitSet) = 0;
684 class epicsShareClass ChannelPutGet :
public ChannelRequest {
686 POINTER_DEFINITIONS(ChannelPutGet);
687 typedef ChannelPutGetRequester requester_type;
689 virtual ~ChannelPutGet() {}
698 epics::pvData::PVStructure::shared_pointer
const & pvPutStructure,
699 epics::pvData::BitSet::shared_pointer
const & putBitSet) = 0;
705 virtual void getPut() = 0;
711 virtual void getGet() = 0;
718 class epicsShareClass ChannelPutGetRequester :
public ChannelBaseRequester
721 POINTER_DEFINITIONS(ChannelPutGetRequester);
722 typedef ChannelPutGet operation_type;
724 virtual ~ChannelPutGetRequester() {}
733 virtual void channelPutGetConnect(
734 const epics::pvData::Status& status,
735 ChannelPutGet::shared_pointer
const & channelPutGet,
736 epics::pvData::Structure::const_shared_pointer
const & putStructure,
737 epics::pvData::Structure::const_shared_pointer
const & getStructure) = 0;
746 virtual void putGetDone(
747 const epics::pvData::Status& status,
748 ChannelPutGet::shared_pointer
const & channelPutGet,
749 epics::pvData::PVStructure::shared_pointer
const & pvGetStructure,
750 epics::pvData::BitSet::shared_pointer
const & getBitSet) = 0;
759 virtual void getPutDone(
760 const epics::pvData::Status& status,
761 ChannelPutGet::shared_pointer
const & channelPutGet,
762 epics::pvData::PVStructure::shared_pointer
const & pvPutStructure,
763 epics::pvData::BitSet::shared_pointer
const & putBitSet) = 0;
772 virtual void getGetDone(
773 const epics::pvData::Status& status,
774 ChannelPutGet::shared_pointer
const & channelPutGet,
775 epics::pvData::PVStructure::shared_pointer
const & pvGetStructure,
776 epics::pvData::BitSet::shared_pointer
const & getBitSet) = 0;
783 class epicsShareClass ChannelRPC :
public ChannelRequest {
785 POINTER_DEFINITIONS(ChannelRPC);
786 typedef ChannelRPCRequester requester_type;
788 virtual ~ChannelRPC() {}
804 virtual void request(epics::pvData::PVStructure::shared_pointer
const & pvArgument) = 0;
813 class epicsShareClass ChannelRPCRequester :
public ChannelBaseRequester {
815 POINTER_DEFINITIONS(ChannelRPCRequester);
816 typedef ChannelRPC operation_type;
818 virtual ~ChannelRPCRequester() {}
830 virtual void channelRPCConnect(
831 const epics::pvData::Status& status,
832 ChannelRPC::shared_pointer
const & operation) = 0;
843 virtual void requestDone(
844 const epics::pvData::Status& status,
845 ChannelRPC::shared_pointer
const & operation,
846 epics::pvData::PVStructure::shared_pointer
const & pvResponse) = 0;
853 class epicsShareClass GetFieldRequester :
public ChannelBaseRequester {
855 POINTER_DEFINITIONS(GetFieldRequester);
857 virtual ~GetFieldRequester() {}
867 virtual void getDone(
868 const epics::pvData::Status& status,
869 epics::pvData::FieldConstPtr
const & field) = 0;
873 class ChannelRequester;
886 class epicsShareClass Channel :
890 EPICS_NOT_COPYABLE(Channel)
892 POINTER_DEFINITIONS(Channel);
893 typedef ChannelRequester requester_type;
895 static size_t num_instances;
900 virtual std::string getRequesterName();
901 virtual void message(std::string
const & message, epics::pvData::MessageType messageType);
906 enum ConnectionState {
907 NEVER_CONNECTED, CONNECTED, DISCONNECTED, DESTROYED
910 static const char* ConnectionStateNames[];
916 virtual std::tr1::shared_ptr<ChannelProvider> getProvider() = 0;
927 virtual std::string getRemoteAddress() = 0;
932 virtual ConnectionState getConnectionState();
937 virtual std::string getChannelName() = 0;
944 virtual std::tr1::shared_ptr<ChannelRequester> getChannelRequester() = 0;
949 virtual bool isConnected();
961 virtual void getField(GetFieldRequester::shared_pointer
const & requester,std::string
const & subField);
969 virtual AccessRights getAccessRights(epics::pvData::PVField::shared_pointer
const & pvField);
988 virtual ChannelProcess::shared_pointer createChannelProcess(
989 ChannelProcessRequester::shared_pointer
const & requester,
990 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1009 virtual ChannelGet::shared_pointer createChannelGet(
1010 ChannelGetRequester::shared_pointer
const & requester,
1011 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1030 virtual ChannelPut::shared_pointer createChannelPut(
1031 ChannelPutRequester::shared_pointer
const & requester,
1032 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1051 virtual ChannelPutGet::shared_pointer createChannelPutGet(
1052 ChannelPutGetRequester::shared_pointer
const & requester,
1053 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1072 virtual ChannelRPC::shared_pointer createChannelRPC(
1073 ChannelRPCRequester::shared_pointer
const & requester,
1074 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1093 virtual Monitor::shared_pointer createMonitor(
1094 MonitorRequester::shared_pointer
const & requester,
1095 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1119 virtual ChannelArray::shared_pointer createChannelArray(
1120 ChannelArrayRequester::shared_pointer
const & requester,
1121 epics::pvData::PVStructure::shared_pointer
const & pvRequest);
1126 virtual void printInfo() { printInfo(std::cout); }
1132 virtual void printInfo(std::ostream& out) {}
1141 class epicsShareClass ChannelRequester :
public virtual Requester
1143 ChannelRequester(
const ChannelRequester&);
1144 ChannelRequester& operator=(
const ChannelRequester&);
1146 POINTER_DEFINITIONS(ChannelRequester);
1147 typedef Channel operation_type;
1149 static size_t num_instances;
1152 virtual ~ChannelRequester();
1174 virtual void channelCreated(
const epics::pvData::Status& status, Channel::shared_pointer
const & channel) = 0;
1185 virtual void channelStateChange(Channel::shared_pointer
const & channel, Channel::ConnectionState connectionState) = 0;
1205 virtual std::tr1::shared_ptr<
const PeerInfo> getPeerInfo();
1209 struct epicsShareClass DefaultChannelRequester :
public ChannelRequester
1211 virtual ~DefaultChannelRequester() {}
1213 virtual void channelCreated(
const epics::pvData::Status& status, Channel::shared_pointer
const & channel)
OVERRIDE FINAL;
1214 virtual void channelStateChange(Channel::shared_pointer
const & channel, Channel::ConnectionState connectionState)
OVERRIDE FINAL;
1215 static ChannelRequester::shared_pointer build();
1221 enum FlushStrategy {
1222 IMMEDIATE, DELAYED, USER_CONTROLED
1230 class epicsShareClass ChannelProvider :
public Destroyable
1232 EPICS_NOT_COPYABLE(ChannelProvider)
1234 POINTER_DEFINITIONS(ChannelProvider);
1237 static const short PRIORITY_MIN = 0;
1239 static const short PRIORITY_MAX = 99;
1241 static const short PRIORITY_DEFAULT = PRIORITY_MIN;
1243 static const short PRIORITY_LINKS_DB = PRIORITY_MAX;
1245 static const short PRIORITY_ARCHIVE = (PRIORITY_MAX + PRIORITY_MIN) / 2;
1247 static const short PRIORITY_OPI = PRIORITY_MIN;
1249 static size_t num_instances;
1252 virtual ~ChannelProvider();
1258 virtual std::string getProviderName() = 0;
1270 virtual ChannelFind::shared_pointer channelFind(std::string
const & name,
1271 ChannelFindRequester::shared_pointer
const & requester) = 0;
1282 virtual ChannelFind::shared_pointer channelList(ChannelListRequester::shared_pointer
const & requester);
1287 virtual Channel::shared_pointer createChannel(std::string
const & name,
1288 ChannelRequester::shared_pointer
const & requester = DefaultChannelRequester::build(),
1289 short priority = PRIORITY_DEFAULT);
1314 virtual Channel::shared_pointer createChannel(std::string
const & name,ChannelRequester::shared_pointer
const & requester,
1315 short priority, std::string
const & address) = 0;
1321 class epicsShareClass ChannelProviderFactory {
1322 EPICS_NOT_COPYABLE(ChannelProviderFactory)
1324 POINTER_DEFINITIONS(ChannelProviderFactory);
1326 ChannelProviderFactory() {}
1327 virtual ~ChannelProviderFactory() {}
1333 virtual std::string getFactoryName() = 0;
1339 virtual ChannelProvider::shared_pointer sharedInstance() = 0;
1345 virtual ChannelProvider::shared_pointer newInstance() {
1346 return newInstance(std::tr1::shared_ptr<Configuration>());
1353 virtual ChannelProvider::shared_pointer newInstance(
const std::tr1::shared_ptr<Configuration>&) {
1354 throw std::logic_error(
"This ChannelProviderFactory does not support non-default configurations");
1361 template<
class Provider>
1362 struct SimpleChannelProviderFactory :
public ChannelProviderFactory
1364 SimpleChannelProviderFactory(
const std::string& name) :pname(name) {}
1365 virtual ~SimpleChannelProviderFactory() {}
1371 epics::pvData::Lock L(sharedM);
1372 ChannelProvider::shared_pointer ret(shared.lock());
1374 std::tr1::shared_ptr<Provider> inst(
new Provider(std::tr1::shared_ptr<Configuration>()));
1375 shared = ret = inst;
1380 virtual ChannelProvider::shared_pointer newInstance(
const std::tr1::shared_ptr<Configuration>& conf)
OVERRIDE FINAL 1382 std::tr1::shared_ptr<Provider> ret(
new Provider(conf));
1387 const std::string pname;
1388 epics::pvData::Mutex sharedM;
1389 ChannelProvider::weak_pointer shared;
1396 template<
class Provider>
1397 struct SingletonChannelProviderFactory :
public ChannelProviderFactory
1399 SingletonChannelProviderFactory(
const std::string& name,
1400 const std::tr1::shared_ptr<
const Configuration>& conf = std::tr1::shared_ptr<
const Configuration>())
1401 :pname(name), config(conf)
1403 virtual ~SingletonChannelProviderFactory() {}
1409 epics::pvData::Lock L(sharedM);
1410 ChannelProvider::shared_pointer ret(shared.lock());
1412 std::tr1::shared_ptr<Provider> inst(
new Provider(config));
1413 shared = ret = inst;
1418 virtual ChannelProvider::shared_pointer newInstance(
const std::tr1::shared_ptr<Configuration>& conf)
OVERRIDE FINAL 1421 return sharedInstance();
1424 const std::string pname;
1425 epics::pvData::Mutex sharedM;
1426 ChannelProvider::weak_pointer shared;
1427 const std::tr1::shared_ptr<
const Configuration> config;
1433 class epicsShareClass ChannelProviderRegistry {
1435 POINTER_DEFINITIONS(ChannelProviderRegistry);
1437 typedef std::vector<std::string> stringVector_t;
1439 virtual ~ChannelProviderRegistry() {}
1443 static ChannelProviderRegistry::shared_pointer build();
1448 static ChannelProviderRegistry::shared_pointer clients();
1453 static ChannelProviderRegistry::shared_pointer servers();
1460 ChannelProvider::shared_pointer getProvider(std::string
const & providerName);
1467 ChannelProvider::shared_pointer createProvider(std::string
const & providerName,
1468 const std::tr1::shared_ptr<Configuration>& conf = std::tr1::shared_ptr<Configuration>());
1475 virtual ChannelProviderFactory::shared_pointer getFactory(std::string
const & providerName);
1477 typedef std::set<std::string> provider_name_set;
1481 virtual void getProviderNames(provider_name_set& names);
1485 virtual bool add(
const ChannelProviderFactory::shared_pointer& fact,
bool replace=
true);
1488 template<
class Provider>
1489 ChannelProviderFactory::shared_pointer add(
const std::string& name,
bool replace=
true)
1491 typedef SimpleChannelProviderFactory<Provider> Factory;
1492 typename Factory::shared_pointer fact(
new Factory(name));
1493 return add(fact, replace) ? fact :
typename Factory::shared_pointer();
1496 typedef ChannelProvider::shared_pointer (*factoryfn_t)(
const std::tr1::shared_ptr<Configuration>&);
1498 ChannelProviderFactory::shared_pointer add(
const std::string& name, factoryfn_t,
bool replace=
true);
1501 template<
class Provider>
1502 ChannelProviderFactory::shared_pointer addSingleton(
const std::string& name,
1503 const std::tr1::shared_ptr<
const Configuration>& conf = std::tr1::shared_ptr<
const Configuration>(),
1506 typedef SingletonChannelProviderFactory<Provider> Factory;
1507 typename Factory::shared_pointer fact(
new Factory(name, conf));
1508 return add(fact, replace) ? fact :
typename Factory::shared_pointer();
1515 ChannelProviderFactory::shared_pointer addSingleton(
const ChannelProvider::shared_pointer& provider,
1519 ChannelProviderFactory::shared_pointer remove(
const std::string& name);
1522 virtual bool remove(
const ChannelProviderFactory::shared_pointer& factory);
1525 virtual void clear();
1530 ChannelProviderRegistry() {}
1531 friend struct CompatRegistry;
1533 epics::pvData::Mutex mutex;
1534 typedef std::map<std::string, ChannelProviderFactory::shared_pointer> providers_t;
1535 providers_t providers;
1543 #if __GNUC__
>4
|| (__GNUC__
==4
&&__GNUC_MINOR__
>=3
) 1545 #define gCPRMSG __attribute__((error("ChannelProvider shared_ptr ownership rules have changed."))) 1547 epicsShareFunc ChannelProviderRegistry::shared_pointer getChannelProviderRegistry() gCPRMSG;
1549 epicsShareFunc
void registerChannelProviderFactory(ChannelProviderFactory::shared_pointer
const & channelProviderFactory) gCPRMSG;
1551 epicsShareFunc
void unregisterChannelProviderFactory(ChannelProviderFactory::shared_pointer
const & channelProviderFactory) gCPRMSG;
1553 epicsShareFunc
void unregisterAllChannelProviderFactory() gCPRMSG;
1563 typedef Monitor PipelineMonitor;
1570 namespace epics {
namespace pvData {
1571 using epics::pvAccess::MonitorRequester;
#define FINAL
Copyright - See the COPYRIGHT that is included with this distribution.