From f3035ff7585af3a7bfb4f867367c012bd3c06e82 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Feb 2016 10:28:06 -0500 Subject: [PATCH 1/3] Defaults for some Channel methods printInfo() to std::cout, as a no-op isConnected() using getConnectionState() various create*() fail with "Not Implemented" Requester methods try to forward to ChannelRequest, fallback to std::cerr. --- src/client/pv/pvAccess.h | 23 ++++++----- src/client/pvAccess.cpp | 88 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 10 deletions(-) diff --git a/src/client/pv/pvAccess.h b/src/client/pv/pvAccess.h index 54776cc..cce0563 100644 --- a/src/client/pv/pvAccess.h +++ b/src/client/pv/pvAccess.h @@ -616,6 +616,9 @@ public: virtual ~Channel() {} + virtual std::string getRequesterName(); + virtual void message(std::string const & message, epics::pvData::MessageType messageType); + /** * Channel connection status. */ @@ -664,7 +667,7 @@ public: * Is the channel connected? * @return (false,true) means (not, is) connected. */ - virtual bool isConnected() = 0; + virtual bool isConnected() { return getConnectionState()==CONNECTED; } /** * Get a Field which describes the subField. @@ -695,7 +698,7 @@ public: */ virtual ChannelProcess::shared_pointer createChannelProcess( ChannelProcessRequester::shared_pointer const & channelProcessRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a ChannelGet. @@ -709,7 +712,7 @@ public: */ virtual ChannelGet::shared_pointer createChannelGet( ChannelGetRequester::shared_pointer const & channelGetRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a ChannelPut. @@ -723,7 +726,7 @@ public: */ virtual ChannelPut::shared_pointer createChannelPut( ChannelPutRequester::shared_pointer const & channelPutRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a ChannelPutGet. @@ -737,7 +740,7 @@ public: */ virtual ChannelPutGet::shared_pointer createChannelPutGet( ChannelPutGetRequester::shared_pointer const & channelPutGetRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a ChannelRPC (Remote Procedure Call). @@ -747,7 +750,7 @@ public: */ virtual ChannelRPC::shared_pointer createChannelRPC( ChannelRPCRequester::shared_pointer const & channelRPCRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a Monitor. @@ -758,7 +761,7 @@ public: */ virtual epics::pvData::Monitor::shared_pointer createMonitor( epics::pvData::MonitorRequester::shared_pointer const & monitorRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Create a ChannelArray. @@ -768,18 +771,18 @@ public: */ virtual ChannelArray::shared_pointer createChannelArray( ChannelArrayRequester::shared_pointer const & channelArrayRequester, - epics::pvData::PVStructure::shared_pointer const & pvRequest) = 0; + epics::pvData::PVStructure::shared_pointer const & pvRequest); /** * Prints detailed information about the context to the standard output stream. */ - virtual void printInfo() = 0; + virtual void printInfo() { printInfo(std::cout); } /** * Prints detailed information about the context to the specified output stream. * @param out the output stream. */ - virtual void printInfo(std::ostream& out) = 0; + virtual void printInfo(std::ostream& out) {} }; diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index 124cc3e..c932f9f 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -7,10 +7,98 @@ #define epicsExportSharedSymbols #include +namespace pvd = epics::pvData; + namespace epics { namespace pvAccess { const char* Channel::ConnectionStateNames[] = { "NEVER_CONNECTED", "CONNECTED", "DISCONNECTED", "DESTROYED" }; +std::string Channel::getRequesterName() +{ + std::tr1::shared_ptr req(getChannelRequester()); + return req ? req->getRequesterName() : std::string(""); +} + +void Channel::message(std::string const & message, epics::pvData::MessageType messageType) +{ + std::tr1::shared_ptr req(getChannelRequester()); + if(req) { + req->message(message, messageType); + } else { + std::cerr<channelProcessConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), ret); + return ret; +} + +ChannelGet::shared_pointer Channel::createChannelGet( + ChannelGetRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + ChannelGet::shared_pointer ret; + requester->channelGetConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), + ret, pvd::StructureConstPtr()); + return ret; +} + +ChannelPut::shared_pointer Channel::createChannelPut( + ChannelPutRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + ChannelPut::shared_pointer ret; + requester->channelPutConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), + ret, pvd::StructureConstPtr()); + return ret; +} + +ChannelPutGet::shared_pointer Channel::createChannelPutGet( + ChannelPutGetRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + ChannelPutGet::shared_pointer ret; + requester->channelPutGetConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), + ret, pvd::StructureConstPtr(), pvd::StructureConstPtr()); + return ret; +} + +ChannelRPC::shared_pointer Channel::createChannelRPC( + ChannelRPCRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + ChannelRPC::shared_pointer ret; + requester->channelRPCConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), ret); + return ret; +} + +pvd::Monitor::shared_pointer Channel::createMonitor( + epics::pvData::MonitorRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + pvd::Monitor::shared_pointer ret; + requester->monitorConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), + ret, pvd::StructureConstPtr()); + return ret; +} + +ChannelArray::shared_pointer Channel::createChannelArray( + ChannelArrayRequester::shared_pointer const & requester, + epics::pvData::PVStructure::shared_pointer const & pvRequest) +{ + ChannelArray::shared_pointer ret; + requester->channelArrayConnect(pvd::Status(pvd::Status::STATUSTYPE_FATAL, "Not Implemented"), + ret, pvd::Array::const_shared_pointer()); + return ret; +} + } } From 52ff5ace95b04f03dd500b11e5c3804d74f36043 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Feb 2016 10:48:45 -0500 Subject: [PATCH 2/3] CAChannel use base class methods --- src/ca/caChannel.cpp | 28 ---------------------------- src/ca/pv/caChannel.h | 9 --------- 2 files changed, 37 deletions(-) diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index 15f03fe..2a4bfcf 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -277,13 +277,6 @@ std::tr1::shared_ptr CAChannel::getChannelRequester() return channelRequester; } - -bool CAChannel::isConnected() -{ - return (ca_state(channelID) == cs_conn); -} - - void CAChannel::getField(GetFieldRequester::shared_pointer const & requester, std::string const & subField) { @@ -383,12 +376,6 @@ ChannelArray::shared_pointer CAChannel::createChannelArray( } -void CAChannel::printInfo() -{ - printInfo(std::cout); -} - - void CAChannel::printInfo(std::ostream& out) { out << "CHANNEL : " << getChannelName() << std::endl; @@ -403,21 +390,6 @@ void CAChannel::printInfo(std::ostream& out) } -/* --------------- epics::pvData::Requester --------------- */ - - -string CAChannel::getRequesterName() -{ - return getChannelName(); -} - - -void CAChannel::message(std::string const & message,MessageType messageType) -{ - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; -} - - /* --------------- epics::pvData::Destroyable --------------- */ diff --git a/src/ca/pv/caChannel.h b/src/ca/pv/caChannel.h index 30517aa..ce1383f 100644 --- a/src/ca/pv/caChannel.h +++ b/src/ca/pv/caChannel.h @@ -47,7 +47,6 @@ public: virtual ConnectionState getConnectionState(); virtual std::string getChannelName(); virtual std::tr1::shared_ptr getChannelRequester(); - virtual bool isConnected(); virtual void getField(GetFieldRequester::shared_pointer const & requester,std::string const & subField); @@ -81,16 +80,8 @@ public: ChannelArrayRequester::shared_pointer const & channelArrayRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); - virtual void printInfo(); - virtual void printInfo(std::ostream& out); - /* --------------- epics::pvData::Requester --------------- */ - - virtual std::string getRequesterName(); - - virtual void message(std::string const & message, epics::pvData::MessageType messageType); - /* --------------- epics::pvData::Destroyable --------------- */ virtual void destroy(); From 775d3c9827c6ceeb6cd462e709498cdf6f1c3656 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 26 Feb 2016 10:51:30 -0500 Subject: [PATCH 3/3] rpcServer use base class methods --- src/rpcService/rpcServer.cpp | 89 ++---------------------------------- 1 file changed, 4 insertions(+), 85 deletions(-) diff --git a/src/rpcService/rpcServer.cpp b/src/rpcService/rpcServer.cpp index a8bd294..0c9a9d9 100644 --- a/src/rpcService/rpcServer.cpp +++ b/src/rpcService/rpcServer.cpp @@ -189,9 +189,6 @@ class RPCChannel : { private: - static Status notSupportedStatus; - static Status destroyedStatus; - AtomicBoolean m_destroyed; ChannelProvider::shared_pointer m_provider; @@ -233,7 +230,7 @@ public: virtual ConnectionState getConnectionState() { - return isConnected() ? + return (!m_destroyed.get()) ? Channel::CONNECTED : Channel::DESTROYED; } @@ -248,12 +245,6 @@ public: return m_channelRequester; } - virtual bool isConnected() - { - return !m_destroyed.get(); - } - - virtual AccessRights getAccessRights(epics::pvData::PVField::shared_pointer const & /*pvField*/) { return none; @@ -261,47 +252,8 @@ public: virtual void getField(GetFieldRequester::shared_pointer const & requester,std::string const & /*subField*/) { - requester->getDone(notSupportedStatus, epics::pvData::Field::shared_pointer()); - } - - virtual ChannelProcess::shared_pointer createChannelProcess( - ChannelProcessRequester::shared_pointer const & channelProcessRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - ChannelProcess::shared_pointer nullPtr; - channelProcessRequester->channelProcessConnect(notSupportedStatus, nullPtr); - return nullPtr; - } - - virtual ChannelGet::shared_pointer createChannelGet( - ChannelGetRequester::shared_pointer const & channelGetRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - ChannelGet::shared_pointer nullPtr; - channelGetRequester->channelGetConnect(notSupportedStatus, nullPtr, - epics::pvData::Structure::const_shared_pointer()); - return nullPtr; - } - - virtual ChannelPut::shared_pointer createChannelPut( - ChannelPutRequester::shared_pointer const & channelPutRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - ChannelPut::shared_pointer nullPtr; - channelPutRequester->channelPutConnect(notSupportedStatus, nullPtr, - epics::pvData::Structure::const_shared_pointer()); - return nullPtr; - } - - - virtual ChannelPutGet::shared_pointer createChannelPutGet( - ChannelPutGetRequester::shared_pointer const & channelPutGetRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - ChannelPutGet::shared_pointer nullPtr; - epics::pvData::Structure::const_shared_pointer nullStructure; - channelPutGetRequester->channelPutGetConnect(notSupportedStatus, nullPtr, nullStructure, nullStructure); - return nullPtr; + requester->getDone(epics::pvData::Status(epics::pvData::Status::STATUSTYPE_ERROR, "Only RPC is implemented"), + epics::pvData::Field::shared_pointer()); } virtual ChannelRPC::shared_pointer createChannelRPC( @@ -316,7 +268,7 @@ public: if (m_destroyed.get()) { ChannelRPC::shared_pointer nullPtr; - channelRPCRequester->channelRPCConnect(destroyedStatus, nullPtr); + channelRPCRequester->channelRPCConnect(epics::pvData::Status(epics::pvData::Status::STATUSTYPE_ERROR, "channel destroyed"), nullPtr); return nullPtr; } @@ -329,30 +281,6 @@ public: return channelRPCImpl; } - virtual epics::pvData::Monitor::shared_pointer createMonitor( - epics::pvData::MonitorRequester::shared_pointer const & monitorRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - epics::pvData::Monitor::shared_pointer nullPtr; - monitorRequester->monitorConnect(notSupportedStatus, nullPtr, epics::pvData::Structure::shared_pointer()); - return nullPtr; - } - - virtual ChannelArray::shared_pointer createChannelArray( - ChannelArrayRequester::shared_pointer const & channelArrayRequester, - epics::pvData::PVStructure::shared_pointer const & /*pvRequest*/) - { - ChannelArray::shared_pointer nullPtr; - channelArrayRequester->channelArrayConnect(notSupportedStatus, nullPtr, epics::pvData::Array::const_shared_pointer()); - return nullPtr; - } - - - virtual void printInfo() - { - printInfo(std::cout); - } - virtual void printInfo(std::ostream& out) { out << "RPCChannel: "; @@ -367,21 +295,12 @@ public: return getChannelName(); } - virtual void message(std::string const & message,MessageType messageType) - { - // just delegate - m_channelRequester->message(message, messageType); - } - virtual void destroy() { m_destroyed.set(); } }; -Status RPCChannel::notSupportedStatus(Status::STATUSTYPE_ERROR, "only channelRPC requests are supported by this channel"); -Status RPCChannel::destroyedStatus(Status::STATUSTYPE_ERROR, "channel destroyed"); - Channel::shared_pointer createRPCChannel(ChannelProvider::shared_pointer const & provider, std::string const & channelName, ChannelRequester::shared_pointer const & channelRequester,