13 #define epicsExportSharedSymbols 21 namespace epics {
namespace pvaClient {
25 PvaClientPutGet::weak_pointer pvaClientPutGet;
26 PvaClient::weak_pointer pvaClient;
31 : pvaClientPutGet(pvaClientPutGet),
35 if(PvaClient::getDebug()) std::cout <<
"~ChannelPutGetRequesterImpl" << std::endl;
40 if(!clientPutGet)
return string(
"clientPutGet is null");
41 return clientPutGet->getRequesterName();
46 if(!clientPutGet)
return;
47 clientPutGet->message(message,messageType);
52 ChannelPutGet::shared_pointer
const & channelPutGet,
53 Structure::const_shared_pointer
const & putStructure,
54 Structure::const_shared_pointer
const & getStructure)
57 if(!clientPutGet)
return;
58 clientPutGet->channelPutGetConnect(status,channelPutGet,putStructure,getStructure);
63 ChannelPutGet::shared_pointer
const & channelPutGet,
65 BitSet::shared_pointer
const & getBitSet)
68 if(!clientPutGet)
return;
69 clientPutGet->putGetDone(status,channelPutGet,getPVStructure,getBitSet);
74 ChannelPutGet::shared_pointer
const & channelPutGet,
76 BitSet::shared_pointer
const & putBitSet)
79 if(!clientPutGet)
return;
80 clientPutGet->getPutDone(status,channelPutGet,putPVStructure,putBitSet);
86 ChannelPutGet::shared_pointer
const & channelPutGet,
88 BitSet::shared_pointer
const & getBitSet)
91 if(!clientPutGet)
return;
92 clientPutGet->getGetDone(status,channelPutGet,getPVStructure,getBitSet);
107 PvaClientPutGet::PvaClientPutGet(
111 : pvaClient(pvaClient),
112 pvaClientChannel(pvaClientChannel),
113 pvRequest(pvRequest),
114 connectState(connectIdle),
115 putGetState(putGetIdle)
117 if(PvaClient::getDebug()) {
118 cout<<
"PvaClientPutGet::PvaClientPutGet" 119 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
124 PvaClientPutGet::~PvaClientPutGet()
126 if(PvaClient::getDebug()) {
127 cout<<
"PvaClientPutGet::~PvaClientPutGet" 128 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
133 void PvaClientPutGet::checkPutGetState()
135 if(PvaClient::getDebug()) {
136 cout <<
"PvaClientPutGet::checkPutGetState" 137 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
140 if(connectState==connectIdle){
143 if(connectState==connectActive){
144 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
146 + channelPutGetConnectStatus.getMessage();
147 throw std::runtime_error(message);
151 string PvaClientPutGet::getRequesterName()
154 if(!yyy)
return string(
"PvaClientPutGet::getRequesterName() PvaClient isDestroyed");
155 return yyy->getRequesterName();
158 void PvaClientPutGet::message(
string const & message,
MessageType messageType)
162 yyy->message(message, messageType);
165 void PvaClientPutGet::channelPutGetConnect(
167 ChannelPutGet::shared_pointer
const & channelPutGet,
171 if(PvaClient::getDebug()) {
172 cout <<
"PvaClientPutGet::channelPutGetConnect" 173 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
174 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
179 this->channelPutGet = channelPutGet;
181 channelPutGetConnectStatus =
status;
182 connectState = connected;
183 pvaClientPutData = PvaClientPutData::create(putStructure);
184 pvaClientPutData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
185 pvaClientGetData = PvaClientGetData::create(getStructure);
186 pvaClientGetData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
191 string message = string(
"\nPvaClientPutGet::channelPutGetConnect)")
192 +
"\npvRequest\n" + ss.str()
199 req->channelPutGetConnect(status,shared_from_this());
201 waitForConnect.signal();
205 void PvaClientPutGet::putGetDone(
207 ChannelPutGet::shared_pointer
const & channelPutGet,
211 if(PvaClient::getDebug()) {
212 cout <<
"PvaClientPutGet::putGetDone" 213 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
214 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
219 channelPutGetStatus =
status;
220 putGetState = putGetComplete;
222 pvaClientGetData->setData(getPVStructure,getChangedBitSet);
227 req->putGetDone(status,shared_from_this());
229 waitForPutGet.signal();
232 void PvaClientPutGet::getPutDone(
234 ChannelPutGet::shared_pointer
const & channelPutGet,
238 if(PvaClient::getDebug()) {
239 cout <<
"PvaClientPutGet::getPutDone" 240 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
241 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
246 channelPutGetStatus =
status;
247 putGetState = putGetComplete;
250 pvs->copyUnchecked(*putPVStructure,*putBitSet);
251 BitSetPtr bs = pvaClientPutData->getChangedBitSet();
258 req->getPutDone(status,shared_from_this());
260 waitForPutGet.signal();
263 void PvaClientPutGet::getGetDone(
265 ChannelPutGet::shared_pointer
const & channelPutGet,
269 if(PvaClient::getDebug()) {
270 cout <<
"PvaClientPutGet::getGetDone" 271 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
272 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
277 channelPutGetStatus =
status;
278 putGetState = putGetComplete;
280 pvaClientGetData->setData(getPVStructure,getChangedBitSet);
285 req->getGetDone(status,shared_from_this());
287 waitForPutGet.signal();
290 void PvaClientPutGet::connect()
292 if(PvaClient::getDebug()) {
293 cout <<
"PvaClientPutGet::connect" 294 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
298 Status status = waitConnect();
299 if(status.
isOK())
return;
300 string message = string(
"channel ")
301 + pvaClientChannel->getChannel()->getChannelName()
302 +
" PvaClientPutGet::connect " 304 throw std::runtime_error(message);
307 void PvaClientPutGet::issueConnect()
309 if(PvaClient::getDebug()) {
310 cout <<
"PvaClientPutGet::issueConnect" 311 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
314 if(connectState!=connectIdle) {
315 string message = string(
"channel ")
316 + pvaClientChannel->getChannel()->getChannelName()
317 +
" pvaClientPutGet already connected ";
318 throw std::runtime_error(message);
320 connectState = connectActive;
322 channelPutGet = pvaClientChannel->getChannel()->createChannelPutGet(channelPutGetRequester,pvRequest);
327 if(PvaClient::getDebug()) {
328 cout <<
"PvaClientPutGet::waitConnect" 329 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
334 if(connectState==connected) {
335 if(!channelPutGetConnectStatus.isOK()) connectState = connectIdle;
336 return channelPutGetConnectStatus;
338 if(connectState!=connectActive) {
339 string message = string(
"channel ")
340 + pvaClientChannel->getChannel()->getChannelName()
341 +
" PvaClientPutGet::waitConnect illegal connect state ";
342 throw std::runtime_error(message);
345 waitForConnect.wait();
346 if(!channelPutGetConnectStatus.isOK()) connectState = connectIdle;
347 return channelPutGetConnectStatus;
351 void PvaClientPutGet::putGet()
353 if(PvaClient::getDebug()) {
354 cout <<
"PvaClientPutGet::putGet" 355 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
359 Status status = waitPutGet();
360 if(status.
isOK())
return;
361 string message = string(
"channel ")
362 + pvaClientChannel->getChannel()->getChannelName()
363 +
" PvaClientPut::putGet " 365 throw std::runtime_error(message);
368 void PvaClientPutGet::issuePutGet()
370 if(PvaClient::getDebug()) {
371 cout <<
"PvaClientPutGet::issuePutGet" 372 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
375 if(connectState==connectIdle) connect();
376 if(putGetState==putGetActive) {
377 string message = string(
"channel ")
378 + pvaClientChannel->getChannel()->getChannelName()
379 +
" PvaClientPutGet::issuePutGet get or put aleady active ";
380 throw std::runtime_error(message);
382 putGetState = putGetActive;
383 channelPutGet->putGet(pvaClientPutData->getPVStructure(),pvaClientPutData->getChangedBitSet());
389 if(PvaClient::getDebug()) {
390 cout <<
"PvaClientPutGet::waitPutGet" 391 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
394 if(putGetState==putGetComplete)
return channelPutGetStatus;
395 if(putGetState!=putGetActive){
396 string message = string(
"channel ")
397 + pvaClientChannel->getChannel()->getChannelName()
398 +
" PvaClientPutGet::waitPutGet get or put aleady active ";
399 throw std::runtime_error(message);
401 waitForPutGet.wait();
402 if(channelPutGetStatus.isOK()) pvaClientPutData->getChangedBitSet()->clear();
403 return channelPutGetStatus;
406 void PvaClientPutGet::getGet()
408 if(PvaClient::getDebug()) {
409 cout <<
"PvaClientPutGet::getGet" 410 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
414 Status status = waitGetGet();
415 if(status.
isOK())
return;
416 string message = string(
"channel ")
417 + pvaClientChannel->getChannel()->getChannelName()
418 +
" PvaClientPut::getGet " 420 throw std::runtime_error(message);
423 void PvaClientPutGet::issueGetGet()
425 if(PvaClient::getDebug()) {
426 cout <<
"PvaClientPutGet::issueGetGet" 427 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
430 if(connectState==connectIdle) connect();
431 if(putGetState==putGetActive) {
432 string message = string(
"channel ")
433 + pvaClientChannel->getChannel()->getChannelName()
434 +
" PvaClientPutGet::issueGetGet get or put aleady active ";
435 throw std::runtime_error(message);
437 putGetState = putGetActive;
438 channelPutGet->getGet();
443 if(PvaClient::getDebug()) {
444 cout <<
"PvaClientPutGet::waitGetGet" 445 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
448 if(putGetState==putGetComplete)
return channelPutGetStatus;
449 if(putGetState!=putGetActive){
450 string message = string(
"channel ")
451 + pvaClientChannel->getChannel()->getChannelName()
452 +
" PvaClientPutGet::waitGetGet get or put aleady active ";
453 throw std::runtime_error(message);
455 waitForPutGet.wait();
456 return channelPutGetStatus;
459 void PvaClientPutGet::getPut()
461 if(PvaClient::getDebug()) {
462 cout <<
"PvaClientPutGet::getGetPut" 463 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
467 Status status = waitGetPut();
468 if(status.
isOK())
return;
469 string message = string(
"channel ")
470 + pvaClientChannel->getChannel()->getChannelName()
471 +
" PvaClientPut::getPut " 473 throw std::runtime_error(message);
476 void PvaClientPutGet::issueGetPut()
478 if(PvaClient::getDebug()) {
479 cout <<
"PvaClientPutGet::issueGetPut" 480 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
483 if(connectState==connectIdle) connect();
484 if(putGetState==putGetActive) {
485 string message = string(
"channel ")
486 + pvaClientChannel->getChannel()->getChannelName()
487 +
" PvaClientPutGet::issueGetPut get or put aleady active ";
488 throw std::runtime_error(message);
490 putGetState = putGetActive;
491 channelPutGet->getPut();
496 if(PvaClient::getDebug()) {
497 cout <<
"PvaClientPutGet::waitGetPut" 498 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
501 if(putGetState==putGetComplete)
return channelPutGetStatus;
502 if(putGetState!=putGetActive){
503 string message = string(
"channel ")
504 + pvaClientChannel->getChannel()->getChannelName()
505 +
" PvaClientPutGet::waitGetPut get or put aleady active ";
506 throw std::runtime_error(message);
508 waitForPutGet.wait();
509 return channelPutGetStatus;
514 if(PvaClient::getDebug()) {
515 cout<<
"PvaClientPutGet::getGetData" 516 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
520 if(putGetState==putGetIdle){
524 return pvaClientGetData;
529 if(PvaClient::getDebug()) {
530 cout<<
"PvaClientPutGet::getPutData" 531 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
535 if(putGetState==putGetIdle){
539 return pvaClientPutData;
544 if(PvaClient::getDebug()) {
545 cout <<
"PvaClientPutGet::setRequester" 546 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
549 this->pvaClientPutGetRequester = pvaClientPutGetRequester;
555 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
virtual void getGetDone(const Status &status, ChannelPutGet::shared_pointer const &channelPutGet, PVStructurePtr const &getPVStructure, BitSet::shared_pointer const &getBitSet)
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
A lock for multithreading.
const std::string & getMessage() const
virtual void channelPutGetConnect(const Status &status, ChannelPutGet::shared_pointer const &channelPutGet, Structure::const_shared_pointer const &putStructure, Structure::const_shared_pointer const &getStructure)
virtual ~ChannelPutGetRequesterImpl()
virtual void putGetDone(const Status &status, ChannelPutGet::shared_pointer const &channelPutGet, PVStructurePtr const &getPVStructure, BitSet::shared_pointer const &getBitSet)
std::tr1::shared_ptr< PvaClientPutGetRequester > PvaClientPutGetRequesterPtr
virtual void message(std::string const &message, epics::pvData::MessageType messageType)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PvaClientPutGet > PvaClientPutGetPtr
std::tr1::shared_ptr< BitSet > BitSetPtr
virtual std::string getRequesterName()
std::tr1::shared_ptr< ChannelPutGetRequesterImpl > ChannelPutGetRequesterImplPtr
An easy to use alternative to ChannelPutGet.
virtual void getPutDone(const Status &status, ChannelPutGet::shared_pointer const &channelPutGet, PVStructurePtr const &putPVStructure, BitSet::shared_pointer const &putBitSet)
ChannelPutGetRequesterImpl(PvaClientPutGetPtr const &pvaClientPutGet, PvaClientPtr const &pvaClient)
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr