ChannelProvider::createChannel() optional ChannelRequester

This commit is contained in:
Michael Davidsaver
2017-06-20 19:01:22 +02:00
parent 67c07aa979
commit 7f625c43e3
3 changed files with 36 additions and 4 deletions
+2 -2
View File
@@ -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());
}
}
+13 -2
View File
@@ -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.
+21
View File
@@ -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;
}
}
}