13#define epicsExportSharedSymbols
17using namespace epics::pvData;
18using namespace epics::pvAccess;
21namespace epics {
namespace pvaClient {
23class ChannelPutGetRequesterImpl :
public ChannelPutGetRequester
25 PvaClientPutGet::weak_pointer pvaClientPutGet;
26 PvaClient::weak_pointer pvaClient;
28 ChannelPutGetRequesterImpl(
31 : pvaClientPutGet(pvaClientPutGet),
34 virtual ~ChannelPutGetRequesterImpl() {
38 virtual std::string getRequesterName() {
40 if(!clientPutGet)
return string(
"clientPutGet is null");
41 return clientPutGet->getRequesterName();
44 virtual void message(std::string
const & message, MessageType messageType) {
46 if(!clientPutGet)
return;
47 clientPutGet->message(message,messageType);
50 virtual void channelPutGetConnect(
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);
61 virtual void putGetDone(
63 ChannelPutGet::shared_pointer
const & channelPutGet,
64 PVStructurePtr
const & getPVStructure,
65 BitSet::shared_pointer
const & getBitSet)
68 if(!clientPutGet)
return;
69 clientPutGet->putGetDone(status,channelPutGet,getPVStructure,getBitSet);
72 virtual void getPutDone(
74 ChannelPutGet::shared_pointer
const & channelPutGet,
75 PVStructurePtr
const & putPVStructure,
76 BitSet::shared_pointer
const & putBitSet)
79 if(!clientPutGet)
return;
80 clientPutGet->getPutDone(status,channelPutGet,putPVStructure,putBitSet);
84 virtual void getGetDone(
86 ChannelPutGet::shared_pointer
const & channelPutGet,
87 PVStructurePtr
const & getPVStructure,
88 BitSet::shared_pointer
const & getBitSet)
91 if(!clientPutGet)
return;
92 clientPutGet->getGetDone(status,channelPutGet,getPVStructure,getBitSet);
99 PVStructurePtr
const &pvRequest)
107PvaClientPutGet::PvaClientPutGet(
110 PVStructurePtr
const &pvRequest)
111: pvaClient(pvaClient),
112 pvaClientChannel(pvaClientChannel),
113 pvRequest(pvRequest),
114 connectState(connectIdle),
115 putGetState(putGetIdle)
118 cout<<
"PvaClientPutGet::PvaClientPutGet"
119 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
127 cout<<
"PvaClientPutGet::~PvaClientPutGet"
128 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
133void PvaClientPutGet::checkPutGetState()
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);
151string PvaClientPutGet::getRequesterName()
153 return pvaClientChannel->getRequesterName();
156void PvaClientPutGet::message(
string const & message,MessageType messageType)
158 pvaClientChannel->message(message,messageType);
161void PvaClientPutGet::channelPutGetConnect(
162 const Status& status,
163 ChannelPutGet::shared_pointer
const & channelPutGet,
164 StructureConstPtr
const & putStructure,
165 StructureConstPtr
const & getStructure)
168 cout <<
"PvaClientPutGet::channelPutGetConnect"
169 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
170 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
175 channelPutGetConnectStatus = status;
177 this->channelPutGet = channelPutGet;
178 connectState = connected;
180 pvaClientPutData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
182 pvaClientGetData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
184 waitForConnect.signal();
188 req->channelPutGetConnect(status,shared_from_this());
192void PvaClientPutGet::putGetDone(
193 const Status& status,
194 ChannelPutGet::shared_pointer
const & channelPutGet,
195 PVStructurePtr
const & getPVStructure,
196 BitSetPtr
const & getChangedBitSet)
199 cout <<
"PvaClientPutGet::putGetDone"
200 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
201 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
206 channelPutGetStatus = status;
208 pvaClientGetData->setData(getPVStructure,getChangedBitSet);
210 putGetState = putGetComplete;
211 waitForPutGet.signal();
215 req->putGetDone(status,shared_from_this());
219void PvaClientPutGet::getPutDone(
220 const Status& status,
221 ChannelPutGet::shared_pointer
const & channelPutGet,
222 PVStructurePtr
const & putPVStructure,
223 BitSetPtr
const & putBitSet)
226 cout <<
"PvaClientPutGet::getPutDone"
227 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
228 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
233 channelPutGetStatus = status;
235 PVStructurePtr pvs = pvaClientPutData->getPVStructure();
236 pvs->copyUnchecked(*putPVStructure,*putBitSet);
237 BitSetPtr bs = pvaClientPutData->getChangedBitSet();
241 putGetState = putGetComplete;
242 waitForPutGet.signal();
246 req->getPutDone(status,shared_from_this());
250void PvaClientPutGet::getGetDone(
251 const Status& status,
252 ChannelPutGet::shared_pointer
const & channelPutGet,
253 PVStructurePtr
const & getPVStructure,
254 BitSetPtr
const & getChangedBitSet)
257 cout <<
"PvaClientPutGet::getGetDone"
258 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
259 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
264 channelPutGetStatus = status;
266 pvaClientGetData->setData(getPVStructure,getChangedBitSet);
268 putGetState = putGetComplete;
269 waitForPutGet.signal();
273 req->getGetDone(status,shared_from_this());
280 cout <<
"PvaClientPutGet::connect"
281 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
286 if(status.isOK())
return;
287 string message = string(
"channel ")
288 + pvaClientChannel->getChannel()->getChannelName()
289 +
" PvaClientPutGet::connect "
290 + status.getMessage();
291 throw std::runtime_error(message);
297 cout <<
"PvaClientPutGet::issueConnect"
298 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
301 if(connectState!=connectIdle) {
302 string message = string(
"channel ")
303 + pvaClientChannel->getChannel()->getChannelName()
304 +
" pvaClientPutGet already connected ";
305 throw std::runtime_error(message);
307 connectState = connectActive;
308 channelPutGetConnectStatus = Status(Status::STATUSTYPE_ERROR,
"connect active");
309 channelPutGet = pvaClientChannel->getChannel()->createChannelPutGet(channelPutGetRequester,pvRequest);
315 cout <<
"PvaClientPutGet::waitConnect"
316 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
319 waitForConnect.wait();
320 return channelPutGetConnectStatus;
327 cout <<
"PvaClientPutGet::putGet"
328 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
333 if(status.isOK())
return;
334 string message = string(
"channel ")
335 + pvaClientChannel->getChannel()->getChannelName()
336 +
" PvaClientPut::putGet "
337 + status.getMessage();
338 throw std::runtime_error(message);
344 cout <<
"PvaClientPutGet::issuePutGet"
345 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
348 if(connectState==connectIdle)
connect();
349 if(putGetState==putGetActive) {
350 string message = string(
"channel ")
351 + pvaClientChannel->getChannel()->getChannelName()
352 +
" PvaClientPutGet::issuePutGet get or put aleady active ";
353 throw std::runtime_error(message);
355 putGetState = putGetActive;
356 channelPutGet->putGet(pvaClientPutData->getPVStructure(),pvaClientPutData->getChangedBitSet());
363 cout <<
"PvaClientPutGet::waitPutGet"
364 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
367 waitForPutGet.wait();
368 if(channelPutGetStatus.isOK()) pvaClientPutData->getChangedBitSet()->clear();
369 return channelPutGetStatus;
375 cout <<
"PvaClientPutGet::getGet"
376 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
381 if(status.isOK())
return;
382 string message = string(
"channel ")
383 + pvaClientChannel->getChannel()->getChannelName()
384 +
" PvaClientPut::getGet "
385 + status.getMessage();
386 throw std::runtime_error(message);
392 cout <<
"PvaClientPutGet::issueGetGet"
393 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
396 if(connectState==connectIdle)
connect();
397 if(putGetState==putGetActive) {
398 string message = string(
"channel ")
399 + pvaClientChannel->getChannel()->getChannelName()
400 +
" PvaClientPutGet::issueGetGet get or put aleady active ";
401 throw std::runtime_error(message);
403 putGetState = putGetActive;
404 channelPutGet->getGet();
410 cout <<
"PvaClientPutGet::waitGetGet"
411 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
414 waitForPutGet.wait();
415 return channelPutGetStatus;
421 cout <<
"PvaClientPutGet::getGetPut"
422 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
427 if(status.isOK())
return;
428 string message = string(
"channel ")
429 + pvaClientChannel->getChannel()->getChannelName()
430 +
" PvaClientPut::getPut "
431 + status.getMessage();
432 throw std::runtime_error(message);
438 cout <<
"PvaClientPutGet::issueGetPut"
439 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
442 if(connectState==connectIdle)
connect();
443 if(putGetState==putGetActive) {
444 string message = string(
"channel ")
445 + pvaClientChannel->getChannel()->getChannelName()
446 +
" PvaClientPutGet::issueGetPut get or put aleady active ";
447 throw std::runtime_error(message);
449 putGetState = putGetActive;
450 channelPutGet->getPut();
456 cout <<
"PvaClientPutGet::waitGetPut"
457 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
460 waitForPutGet.wait();
461 return channelPutGetStatus;
467 cout<<
"PvaClientPutGet::getGetData"
468 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
472 if(putGetState==putGetIdle){
476 return pvaClientGetData;
482 cout<<
"PvaClientPutGet::getPutData"
483 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
487 if(putGetState==putGetIdle){
491 return pvaClientPutData;
497 cout <<
"PvaClientPutGet::setRequester"
498 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
501 this->pvaClientPutGetRequester = pvaClientPutGetRequester;
507 return pvaClientChannel;
static PvaClientGetDataPtr create(epics::pvData::StructureConstPtr const &structure)
Factory method for creating an instance of PvaClientGetData.
static PvaClientPutDataPtr create(epics::pvData::StructureConstPtr const &structure)
An easy to use alternative to ChannelPutGet.
PvaClientChannelPtr getPvaClientChannel()
Get the PvaClientChannel;.
epics::pvData::Status waitGetGet()
Wait until getGet completes.
void issueGetPut()
Issue a getPut and return immediately.
void setRequester(PvaClientPutGetRequesterPtr const &pvaClientPutGetRequester)
Set a user callback.
epics::pvData::Status waitPutGet()
Wait until putGet completes.
~PvaClientPutGet()
Destructor.
void getGet()
Call issueGet and then waitGetGet. An exception is thrown if get fails.
static PvaClientPutGetPtr create(PvaClientPtr const &pvaClient, PvaClientChannelPtr const &pvaClientChannel, epics::pvData::PVStructurePtr const &pvRequest)
Create a PvaClientPutGet.
void putGet()
Call issuePutGet and then waitPutGet.
PvaClientPutDataPtr getPutData()
Get the put data.
void connect()
Call issueConnect and then waitConnect.
PvaClientGetDataPtr getGetData()
Get the get data.
friend class ChannelPutGetRequesterImpl
void getPut()
Call issuePut and then waitGetPut.
epics::pvData::Status waitGetPut()
Wait until getPut completes.
void issuePutGet()
Issue a putGet and return immediately.
epics::pvData::Status waitConnect()
Wait until the channelPutGet connection to the channel is complete.
void issueGetGet()
Issue a getGet and return immediately.
void issueConnect()
Issue the channelPutGet connection to the channel.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< ChannelPutGetRequesterImpl > ChannelPutGetRequesterImplPtr
std::tr1::shared_ptr< PvaClientPutGet > PvaClientPutGetPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr
std::tr1::shared_ptr< PvaClientPutGetRequester > PvaClientPutGetRequesterPtr