14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
26 PvaClientGet::weak_pointer pvaClientGet;
27 PvaClient::weak_pointer pvaClient;
32 : pvaClientGet(pvaClientGet),
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelGetRequesterImpl" << std::endl;
41 if(!clientGet)
return string(
"clientGet is null");
42 return clientGet->getRequesterName();
47 if(!clientGet)
return;
48 clientGet->message(message,messageType);
53 ChannelGet::shared_pointer
const & channelGet,
54 Structure::const_shared_pointer
const &
structure)
57 if(!clientGet)
return;
58 clientGet->channelGetConnect(status,channelGet,structure);
63 ChannelGet::shared_pointer
const & channelGet,
65 BitSet::shared_pointer
const & bitSet)
68 if(!clientGet)
return;
69 clientGet->getDone(status,channelGet,pvStructure,bitSet);
78 if(PvaClient::getDebug()) {
79 cout<<
"PvaClientGet::create(pvaClient,channelName,pvRequest)\n" 80 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
81 <<
" pvRequest " << pvRequest
90 PvaClientGet::PvaClientGet(
94 : pvaClient(pvaClient),
95 pvaClientChannel(pvaClientChannel),
97 connectState(connectIdle),
100 if(PvaClient::getDebug()) {
101 cout <<
"PvaClientGet::PvaClientGet channelName " 102 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
106 PvaClientGet::~PvaClientGet()
108 if(PvaClient::getDebug()) {
109 cout<<
"PvaClientGet::~PvaClientGet channelName " 110 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
115 void PvaClientGet::checkConnectState()
117 if(PvaClient::getDebug()) {
118 cout <<
"PvaClientGet::checkConnectState channelName " 119 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
121 if(!pvaClientChannel->getChannel()->isConnected()) {
122 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
123 +
" PvaClientGet::checkConnectState channel not connected ";
124 throw std::runtime_error(message);
126 if(connectState==connectIdle) {
129 if(connectState==connectActive){
130 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
132 + channelGetConnectStatus.getMessage();
133 throw std::runtime_error(message);
138 string PvaClientGet::getRequesterName()
141 if(!yyy)
return string(
"PvaClientGet::getRequesterName PvaClient isDestroyed");
142 return yyy->getRequesterName();
145 void PvaClientGet::message(
string const & message,
MessageType messageType)
149 yyy->message(message, messageType);
152 void PvaClientGet::channelGetConnect(
154 ChannelGet::shared_pointer
const & channelGet,
157 if(PvaClient::getDebug()) {
158 cout <<
"PvaClientGet::channelGetConnect channelName " 159 << pvaClientChannel->getChannel()->getChannelName()
160 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
165 this->channelGet = channelGet;
167 channelGetConnectStatus =
status;
168 connectState = connected;
169 pvaClientData = PvaClientGetData::create(structure);
170 pvaClientData->setMessagePrefix(channelGet->getChannel()->getChannelName());
174 string message = string(
"\nPvaClientGet::channelGetConnect)")
175 +
"\npvRequest\n" + ss.str()
182 req->channelGetConnect(status,shared_from_this());
184 waitForConnect.signal();
188 void PvaClientGet::getDone(
190 ChannelGet::shared_pointer
const & channelGet,
194 if(PvaClient::getDebug()) {
195 cout <<
"PvaClientGet::getDone channelName " 196 << pvaClientChannel->getChannel()->getChannelName()
197 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
202 channelGetStatus =
status;
203 getState = getComplete;
205 pvaClientData->setData(pvStructure,bitSet);
210 req->getDone(status,shared_from_this());
215 void PvaClientGet::connect()
217 if(PvaClient::getDebug()) {
218 cout <<
"PvaClientGet::connect channelName " 219 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
222 Status status = waitConnect();
223 if(status.
isOK())
return;
224 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
225 +
" PvaClientGet::connect " + status.
getMessage();
226 throw std::runtime_error(message);
229 void PvaClientGet::issueConnect()
231 if(PvaClient::getDebug()) {
232 cout <<
"PvaClientGet::issueConnect channelName " 233 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
235 if(connectState!=connectIdle) {
236 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
237 +
" pvaClientGet already connected ";
238 throw std::runtime_error(message);
240 connectState = connectActive;
242 channelGet = pvaClientChannel->getChannel()->createChannelGet(channelGetRequester,pvRequest);
247 if(PvaClient::getDebug()) {
248 cout <<
"PvaClientGet::waitConnect channelName " 249 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
253 if(connectState==connected) {
254 if(!channelGetConnectStatus.isOK()) connectState = connectIdle;
255 return channelGetConnectStatus;
257 if(connectState!=connectActive) {
258 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
259 +
" PvaClientGet::waitConnect illegal connect state ";
260 throw std::runtime_error(message);
263 waitForConnect.wait();
264 if(!channelGetConnectStatus.isOK()) connectState = connectIdle;
265 return channelGetConnectStatus;
270 if(PvaClient::getDebug()) {
271 cout <<
"PvaClientGet::get channelName " 272 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
275 Status status = waitGet();
276 if(status.
isOK())
return;
277 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
278 +
" PvaClientGet::get " + status.
getMessage();
279 throw std::runtime_error(message);
282 void PvaClientGet::issueGet()
284 if(PvaClient::getDebug()) {
285 cout <<
"PvaClientGet::issueGet channelName " 286 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
288 if(connectState==connectIdle) connect();
289 if(getState==getActive) {
290 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
291 +
" PvaClientGet::issueGet get aleady active ";
292 throw std::runtime_error(message);
294 getState = getActive;
300 if(PvaClient::getDebug()) {
301 cout <<
"PvaClientGet::waitGet channelName " 302 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
306 if(getState==getComplete) {
308 return channelGetStatus;
310 if(getState!=getActive){
311 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
312 +
" PvaClientGet::waitGet llegal get state";
313 throw std::runtime_error(message);
317 getState = getComplete;
318 return channelGetStatus;
322 if(PvaClient::getDebug()) {
323 cout<<
"PvaClientGet::getData channelName " 324 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
327 if(getState==getIdle)
get();
328 return pvaClientData;
333 if(PvaClient::getDebug()) {
334 cout <<
"PvaClientGet::setRequester channelName " 335 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
337 this->pvaClientGetRequester = pvaClientGetRequester;
342 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
A lock for multithreading.
std::tr1::shared_ptr< ChannelGetRequesterImpl > ChannelGetRequesterImplPtr
const std::string & getMessage() const
virtual ~ChannelGetRequesterImpl()
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
virtual void channelGetConnect(const Status &status, ChannelGet::shared_pointer const &channelGet, Structure::const_shared_pointer const &structure)
An easy to use alternative to ChannelGet.
virtual void message(std::string const &message, epics::pvData::MessageType messageType)
ChannelGetRequesterImpl(PvaClientGetPtr const &pvaClientGet, PvaClientPtr const &pvaClient)
std::tr1::shared_ptr< BitSet > BitSetPtr
virtual std::string getRequesterName()
virtual void getDone(const Status &status, ChannelGet::shared_pointer const &channelGet, PVStructurePtr const &pvStructure, BitSet::shared_pointer const &bitSet)
std::tr1::shared_ptr< PvaClientGetRequester > PvaClientGetRequesterPtr