diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index f6c7c06..66535f3 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -284,12 +284,12 @@ void CAChannel::activate(short priority) channelProvider->registerChannel(shared_from_this()); // TODO be sure that ca_connection_handler is not called before this call - EXCEPTION_GUARD(channelRequester->channelCreated(Status::Ok, shared_from_this())); + channelRequester->channelCreated(Status::Ok, shared_from_this()); } else { Status errorStatus(Status::STATUSTYPE_ERROR, string(ca_message(result))); - EXCEPTION_GUARD(channelRequester->channelCreated(errorStatus, shared_from_this())); + channelRequester->channelCreated(errorStatus, shared_from_this()); } } diff --git a/src/client/pv/pvAccess.h b/src/client/pv/pvAccess.h index 64ed03a..b2ce826 100644 --- a/src/client/pv/pvAccess.h +++ b/src/client/pv/pvAccess.h @@ -1023,6 +1023,16 @@ public: virtual void channelStateChange(Channel::shared_pointer const & channel, Channel::ConnectionState connectionState) = 0; }; +//! Used when ChannelProvider::createChannel() is passed a NULL ChannelRequester +struct epicsShareClass DefaultChannelRequester : public ChannelRequester +{ + virtual ~DefaultChannelRequester() {} + virtual std::string getRequesterName(); + virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel); + virtual void channelStateChange(Channel::shared_pointer const & channel, Channel::ConnectionState connectionState); + static ChannelRequester::shared_pointer build(); +}; + /** * @brief The FlushStrategy enum */ @@ -1087,8 +1097,9 @@ public: /** * See longer form */ - virtual Channel::shared_pointer createChannel(std::string const & name,ChannelRequester::shared_pointer const & requester, - short priority = PRIORITY_DEFAULT); + virtual Channel::shared_pointer createChannel(std::string const & name, + ChannelRequester::shared_pointer const & requester = DefaultChannelRequester::build(), + short priority = PRIORITY_DEFAULT); /** * Request a Channel. diff --git a/src/client/pvAccess.cpp b/src/client/pvAccess.cpp index b51e839..2d82c3e 100644 --- a/src/client/pvAccess.cpp +++ b/src/client/pvAccess.cpp @@ -100,5 +100,26 @@ ChannelArray::shared_pointer Channel::createChannelArray( return ret; } +std::string DefaultChannelRequester::getRequesterName() { return "DefaultChannelRequester"; } + +void DefaultChannelRequester::channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) +{ + if(!status.isSuccess()) { + std::ostringstream strm; + status.dump(strm); + throw std::runtime_error(strm.str()); + } +} + +void DefaultChannelRequester::channelStateChange(Channel::shared_pointer const & channel, Channel::ConnectionState connectionState) +{ /* no-op */ } + +ChannelRequester::shared_pointer DefaultChannelRequester::build() +{ + ChannelRequester::shared_pointer ret(new DefaultChannelRequester); + return ret; +} + + } }