diff --git a/examples/getme.cpp b/examples/getme.cpp index 2fbdf1e..de99d28 100644 --- a/examples/getme.cpp +++ b/examples/getme.cpp @@ -20,9 +20,9 @@ //! [Headers] #include -#include #include #include +#include //! [Headers] namespace pvd = epics::pvData; @@ -40,55 +40,50 @@ void alldone(int num) } #endif -struct GetReq : public pva::ChannelGetRequester +struct Getter : public TestClientChannel::GetCallback, + public TestClientChannel::ConnectCallback { - POINTER_DEFINITIONS(GetReq); + POINTER_DEFINITIONS(Getter); const std::string name; - // we hold strong ref to ChannelGet - // which should only hold weak ref to us - operation_type::shared_pointer op; + TestClientChannel channel; + TestOperation op; - GetReq(const std::string& name) :name(name) {} - virtual ~GetReq() {} - - virtual std::string getRequesterName() { return "GetReq"; } - - virtual void channelGetConnect( - const epics::pvData::Status& status, - pva::ChannelGet::shared_pointer const & channelGet, - pvd::Structure::const_shared_pointer const & structure) + Getter(TestClientProvider& provider, const std::string& name) + :name(name) + ,channel(provider.connect(name)) { - // Called each time get operation becomes "ready" (channel connected) - if(status.isSuccess()) { - std::cout<<"Get execute "<get(); - } else { - std::cout<<"Oops GetConnect: "<getSubField("value")); + if(!valfld) + valfld = event.value; + std::cout<getSubField("value")); - if(!valfld) - valfld = pvStructure; - std::cout<createProvider(providerName, conf)); - if(!provider) - throw std::logic_error("pva provider not registered"); + TestClientProvider provider(providerName, conf); // need to store references to keep get (and channel) from being closed - typedef std::set gets_t; + typedef std::set gets_t; gets_t gets; for(pvs_t::const_iterator it=pvs.begin(); it!=pvs.end(); ++it) { const std::string& pv = *it; - GetReq::shared_pointer getreq(new GetReq(pv)); + Getter::shared_pointer get(new Getter(provider, pv)); + // addConnectListener() always invokes connectEvent() with current state - pva::Channel::shared_pointer chan(provider->createChannel(pv)); - assert(chan); - - // no need to wait for connection - - getreq->op = chan->createChannelGet(getreq, pvReq); - // if !op then channelGetConnect() called with error status - if(!getreq->op) continue; - - gets.insert(getreq); - // drop our explicit Channel reference, ChannelGet holds an additional reference + gets.insert(get); } if(waitTime<0.0)