diff --git a/src/pv/pvaClient.h b/src/pv/pvaClient.h index ffa3229..a78284b 100644 --- a/src/pv/pvaClient.h +++ b/src/pv/pvaClient.h @@ -223,15 +223,17 @@ class PvaClientGetCache; typedef std::tr1::shared_ptr PvaClientGetCachePtr; class PvaClientPutCache; typedef std::tr1::shared_ptr PvaClientPutCachePtr; +class ChannelRequesterImpl; +typedef std::tr1::shared_ptr ChannelRequesterImplPtr; /** * @brief An easy to use alternative to directly calling the Channel methods of pvAccess. * * @author mrk */ -class epicsShareClass PvaClientChannel : - public epics::pvAccess::ChannelRequester, - public std::tr1::enable_shared_from_this +class epicsShareClass PvaClientChannel //: +// public epics::pvAccess::ChannelRequester, +// public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(PvaClientChannel); @@ -451,10 +453,6 @@ public: /** Get the number of cached gets and puts. */ size_t cacheSize(); - PvaClientChannelPtr getPtrSelf() - { - return shared_from_this(); - } /** Deprecated method * \deprecated This method will go away in future versions. */ @@ -485,6 +483,7 @@ private: epics::pvData::Mutex mutex; epics::pvData::Event waitForConnect; epics::pvAccess::Channel::shared_pointer channel; + ChannelRequesterImplPtr channelRequester; friend class PvaClient; }; @@ -971,9 +970,11 @@ private: * * @author mrk */ -class epicsShareClass PvaClientGet : - public epics::pvAccess::ChannelGetRequester, - public std::tr1::enable_shared_from_this +class ChannelGetRequesterImpl; +typedef std::tr1::shared_ptr ChannelGetRequesterImplPtr; +class epicsShareClass PvaClientGet //: +// public epics::pvAccess::ChannelGetRequester, +// public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(PvaClientGet); @@ -1063,7 +1064,7 @@ private: enum GetState {getIdle,getActive,getComplete}; GetState getState; - friend class ChannelGetRequesterImpl; + ChannelGetRequesterImplPtr channelGetRequester; }; /** @@ -1175,7 +1176,6 @@ private : enum PutState {putIdle,getActive,putActive}; PutState putState; - friend class ChannelPutRequesterImpl; }; /** @@ -1311,7 +1311,6 @@ private : enum PutGetState {putGetIdle,putGetActive,putGetComplete}; PutGetState putGetState; - friend class ChannelPutGetRequesterImpl; }; //class ChannelMonitorRequester; // private to PvaClientMonitor @@ -1464,7 +1463,6 @@ private: MonitorConnectState connectState; bool userPoll; bool userWait; - friend class ChannelMonitorRequester; }; }} diff --git a/src/pvaClientChannel.cpp b/src/pvaClientChannel.cpp index 7b692b2..22ce712 100644 --- a/src/pvaClientChannel.cpp +++ b/src/pvaClientChannel.cpp @@ -122,6 +122,63 @@ size_t PvaClientPutCache::cacheSize() } +class ChannelRequesterImpl : public ChannelRequester +{ + PvaClientChannel::weak_pointer pvaClientChannel; + PvaClient::weak_pointer pvaClient; +public: + ChannelRequesterImpl( + PvaClientChannelPtr const & pvaClientChannel, + PvaClientPtr const &pvaClient) + : pvaClientChannel(pvaClientChannel), + pvaClient(pvaClient) + {} + virtual ~ChannelRequesterImpl() { + if(PvaClient::getDebug()) std::cout << "~ChannelRequesterImpl" << std::endl; + } + + virtual std::string getRequesterName() { + PvaClientChannelPtr clientChannel(pvaClientChannel.lock()); + if(!clientChannel) return string("clientChannel is null"); + return clientChannel->getRequesterName(); + } + + virtual void message(std::string const & message, epics::pvData::MessageType messageType) { + PvaClientChannelPtr clientChannel(pvaClientChannel.lock()); + if(!clientChannel) return; + clientChannel->message(message,messageType); + } + + virtual void channelCreated( + const epics::pvData::Status& status, + Channel::shared_pointer const & channel) + { + PvaClientChannelPtr clientChannel(pvaClientChannel.lock()); + if(!clientChannel) return; + clientChannel->channelCreated(status,channel); + } + + virtual void channelStateChange( + Channel::shared_pointer const & channel, + Channel::ConnectionState connectionState) + { + PvaClientChannelPtr clientChannel(pvaClientChannel.lock()); + if(!clientChannel) return; + clientChannel->channelStateChange(channel,connectionState); + } +}; + +PvaClientChannelPtr PvaClientChannel::create( + PvaClientPtr const &pvaClient, + string const & channelName, + string const & providerName) +{ + PvaClientChannelPtr channel(new PvaClientChannel(pvaClient,channelName,providerName)); + channel->channelRequester = ChannelRequesterImplPtr( + new ChannelRequesterImpl(channel,pvaClient)); + return channel; +} + PvaClientChannel::PvaClientChannel( PvaClientPtr const &pvaClient, @@ -282,7 +339,7 @@ void PvaClientChannel::issueConnect() if(!provider) { throw std::runtime_error(channelName + " provider " + providerName + " not registered"); } - ChannelRequester::shared_pointer channelRequester(shared_from_this()); +// ChannelRequester::shared_pointer channelRequester(shared_from_this()); if(PvaClient::getDebug()) cout << "PvaClientChannel::issueConnect calling provider->createChannel\n"; channel = provider->createChannel(channelName,channelRequester,ChannelProvider::PRIORITY_DEFAULT); if(!channel) { @@ -540,13 +597,5 @@ size_t PvaClientChannel::cacheSize() } -PvaClientChannelPtr PvaClientChannel::create( - PvaClientPtr const &pvaClient, - string const & channelName, - string const & providerName) -{ - PvaClientChannelPtr channel(new PvaClientChannel(pvaClient,channelName,providerName)); - return channel; -} }} diff --git a/src/pvaClientGet.cpp b/src/pvaClientGet.cpp index 4e1242c..5e5e6f0 100644 --- a/src/pvaClientGet.cpp +++ b/src/pvaClientGet.cpp @@ -22,30 +22,67 @@ using namespace std; namespace epics { namespace pvaClient { - class ChannelGetRequesterImpl : public ChannelGetRequester { - PvaClientGet * pvaClientGet; + PvaClientGet::weak_pointer pvaClientGet; + PvaClient::weak_pointer pvaClient; public: - ChannelGetRequesterImpl(PvaClientGet * pvaClientGet) - : pvaClientGet(pvaClientGet) {} - string getRequesterName() - {return pvaClientGet->getRequesterName();} - void message(string const & message,MessageType messageType) - {pvaClientGet->message(message,messageType);} - void channelGetConnect( + ChannelGetRequesterImpl( + PvaClientGetPtr const & pvaClientGet, + PvaClientPtr const &pvaClient) + : pvaClientGet(pvaClientGet), + pvaClient(pvaClient) + {} + virtual ~ChannelGetRequesterImpl() { + if(PvaClient::getDebug()) std::cout << "~ChannelGetRequesterImpl" << std::endl; + } + + virtual std::string getRequesterName() { + PvaClientGetPtr clientGet(pvaClientGet.lock()); + if(!clientGet) return string("clientGet is null"); + return clientGet->getRequesterName(); + } + + virtual void message(std::string const & message, epics::pvData::MessageType messageType) { + PvaClientGetPtr clientGet(pvaClientGet.lock()); + if(!clientGet) return; + clientGet->message(message,messageType); + } + + virtual void channelGetConnect( const Status& status, ChannelGet::shared_pointer const & channelGet, - StructureConstPtr const & structure) - {pvaClientGet->channelGetConnect(status,channelGet,structure);} - void getDone( + Structure::const_shared_pointer const & structure) + { + PvaClientGetPtr clientGet(pvaClientGet.lock()); + if(!clientGet) return; + clientGet->channelGetConnect(status,channelGet,structure); + } + + virtual void getDone( const Status& status, ChannelGet::shared_pointer const & channelGet, PVStructurePtr const & pvStructure, - BitSetPtr const & bitSet) - {pvaClientGet->getDone(status,channelGet,pvStructure,bitSet);} + BitSet::shared_pointer const & bitSet) + { + PvaClientGetPtr clientGet(pvaClientGet.lock()); + if(!clientGet) return; + clientGet->getDone(status,channelGet,pvStructure,bitSet); + } }; +PvaClientGetPtr PvaClientGet::create( + PvaClientPtr const &pvaClient, + Channel::shared_pointer const & channel, + PVStructurePtr const &pvRequest) +{ + PvaClientGetPtr epv(new PvaClientGet(pvaClient,channel,pvRequest)); + epv->channelGetRequester = ChannelGetRequesterImplPtr( + new ChannelGetRequesterImpl(epv,pvaClient)); + return epv; +} + + PvaClientGet::PvaClientGet( PvaClientPtr const &pvaClient, Channel::shared_pointer const & channel, @@ -166,11 +203,11 @@ void PvaClientGet::issueConnect() + " pvaClientGet already connected "; throw std::runtime_error(message); } - ChannelGetRequester::shared_pointer getRequester(shared_from_this()); +// ChannelGetRequester::shared_pointer channelGetRequester(shared_from_this()); connectState = connectActive; Channel::shared_pointer chan(channel.lock()); if(chan) { - channelGet = chan->createChannelGet(getRequester,pvRequest); + channelGet = chan->createChannelGet(channelGetRequester,pvRequest); return; } throw std::runtime_error("PvaClientGet::issueConnect channel was destroyed"); @@ -257,13 +294,5 @@ PvaClientGetDataPtr PvaClientGet::getData() return pvaClientData; } -PvaClientGetPtr PvaClientGet::create( - PvaClientPtr const &pvaClient, - Channel::shared_pointer const & channel, - PVStructurePtr const &pvRequest) -{ - PvaClientGetPtr epv(new PvaClientGet(pvaClient,channel,pvRequest)); - return epv; -} }} diff --git a/src/pvaClientProcess.cpp b/src/pvaClientProcess.cpp index cb46b3b..bbe7195 100644 --- a/src/pvaClientProcess.cpp +++ b/src/pvaClientProcess.cpp @@ -22,27 +22,6 @@ using namespace std; namespace epics { namespace pvaClient { - -class ChannelProcessRequesterImpl : public ChannelProcessRequester -{ - PvaClientProcess * pvaClientProcess; -public: - ChannelProcessRequesterImpl(PvaClientProcess * pvaClientProcess) - : pvaClientProcess(pvaClientProcess) {} - string getRequesterName() - {return pvaClientProcess->getRequesterName();} - void message(string const & message,MessageType messageType) - {pvaClientProcess->message(message,messageType);} - void channelProcessConnect( - const Status& status, - ChannelProcess::shared_pointer const & channelProcess) - {pvaClientProcess->channelProcessConnect(status,channelProcess);} - void processDone( - const Status& status, - ChannelProcess::shared_pointer const & channelProcess) - {pvaClientProcess->processDone(status,channelProcess);} -}; - PvaClientProcess::PvaClientProcess( PvaClientPtr const &pvaClient, Channel::shared_pointer const & channel, diff --git a/src/pvaClientPut.cpp b/src/pvaClientPut.cpp index e8760f0..7cec325 100644 --- a/src/pvaClientPut.cpp +++ b/src/pvaClientPut.cpp @@ -22,33 +22,6 @@ using namespace std; namespace epics { namespace pvaClient { -class ChannelPutRequesterImpl : public ChannelPutRequester -{ - PvaClientPut * pvaClientPut; -public: - ChannelPutRequesterImpl(PvaClientPut * pvaClientPut) - : pvaClientPut(pvaClientPut) {} - string getRequesterName() - {return pvaClientPut->getRequesterName();} - void message(string const & message,MessageType messageType) - {pvaClientPut->message(message,messageType);} - void channelPutConnect( - const Status& status, - ChannelPut::shared_pointer const & channelPut, - StructureConstPtr const & structure) - {pvaClientPut->channelPutConnect(status,channelPut,structure);} - void getDone( - const Status& status, - ChannelPut::shared_pointer const & channelPut, - PVStructurePtr const & pvStructure, - BitSetPtr const & bitSet) - {pvaClientPut->getDone(status,channelPut,pvStructure,bitSet);} - void putDone( - const Status& status, - ChannelPut::shared_pointer const & channelPut) - {pvaClientPut->putDone(status,channelPut);} -}; - PvaClientPut::PvaClientPut( PvaClientPtr const &pvaClient, Channel::shared_pointer const & channel, diff --git a/src/pvaClientPutGet.cpp b/src/pvaClientPutGet.cpp index 35a84b5..974bfc9 100644 --- a/src/pvaClientPutGet.cpp +++ b/src/pvaClientPutGet.cpp @@ -21,50 +21,6 @@ using namespace std; namespace epics { namespace pvaClient { -class ChannelPutGetRequesterImpl : public ChannelPutGetRequester -{ - PvaClientPutGet * pvaClientPutGet; -public: - ChannelPutGetRequesterImpl(PvaClientPutGet * pvaClientPutGet) - : pvaClientPutGet(pvaClientPutGet) {} - string getRequesterName() - {return pvaClientPutGet->getRequesterName();} - void message(string const & message,MessageType messageType) - {pvaClientPutGet->message(message,messageType);} - void channelPutGetConnect( - const epics::pvData::Status& status, - epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet, - epics::pvData::StructureConstPtr const & putStructure, - epics::pvData::StructureConstPtr const & getStructure) - { - pvaClientPutGet->channelPutGetConnect(status,channelPutGet,putStructure,getStructure); - } - void putGetDone( - const epics::pvData::Status& status, - epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet, - epics::pvData::PVStructurePtr const & getPVStructure, - epics::pvData::BitSetPtr const & getChangedBitSet) - { - pvaClientPutGet->putGetDone(status,channelPutGet,getPVStructure,getChangedBitSet); - } - void getPutDone( - const epics::pvData::Status& status, - epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet, - epics::pvData::PVStructurePtr const & putPVStructure, - epics::pvData::BitSet::shared_pointer const & putBitSet) - { - pvaClientPutGet->getPutDone(status,channelPutGet,putPVStructure,putBitSet); - } - void getGetDone( - const epics::pvData::Status& status, - epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet, - epics::pvData::PVStructurePtr const & getPVStructure, - epics::pvData::BitSet::shared_pointer const & getChangedBitSet) - { - pvaClientPutGet->getGetDone(status,channelPutGet,getPVStructure,getChangedBitSet); - } -}; - PvaClientPutGet::PvaClientPutGet( PvaClientPtr const &pvaClient, Channel::shared_pointer const & channel,