13 #define epicsExportSharedSymbols 21 namespace epics {
namespace pvaClient {
23 class ChannelPutGetRequesterImpl :
public ChannelPutGetRequester
25 PvaClientPutGet::weak_pointer pvaClientPutGet;
26 PvaClient::weak_pointer pvaClient;
28 ChannelPutGetRequesterImpl(
31 : pvaClientPutGet(pvaClientPutGet),
34 virtual ~ChannelPutGetRequesterImpl() {
35 if(PvaClient::getDebug()) std::cout <<
"~ChannelPutGetRequesterImpl" << std::endl;
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)
103 new ChannelPutGetRequesterImpl(clientPutGet,pvaClient));
107 PvaClientPutGet::PvaClientPutGet(
110 PVStructurePtr
const &pvRequest)
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()
153 return pvaClientChannel->getRequesterName();
156 void PvaClientPutGet::message(
string const & message,MessageType messageType)
158 pvaClientChannel->message(message,messageType);
161 void PvaClientPutGet::channelPutGetConnect(
162 const Status& status,
163 ChannelPutGet::shared_pointer
const & channelPutGet,
164 StructureConstPtr
const & putStructure,
165 StructureConstPtr
const & getStructure)
167 if(PvaClient::getDebug()) {
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;
179 pvaClientPutData = PvaClientPutData::create(putStructure);
180 pvaClientPutData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
181 pvaClientGetData = PvaClientGetData::create(getStructure);
182 pvaClientGetData->setMessagePrefix(channelPutGet->getChannel()->getChannelName());
184 waitForConnect.signal();
188 req->channelPutGetConnect(status,shared_from_this());
192 void PvaClientPutGet::putGetDone(
193 const Status& status,
194 ChannelPutGet::shared_pointer
const & channelPutGet,
195 PVStructurePtr
const & getPVStructure,
196 BitSetPtr
const & getChangedBitSet)
198 if(PvaClient::getDebug()) {
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());
219 void PvaClientPutGet::getPutDone(
220 const Status& status,
221 ChannelPutGet::shared_pointer
const & channelPutGet,
222 PVStructurePtr
const & putPVStructure,
223 BitSetPtr
const & putBitSet)
225 if(PvaClient::getDebug()) {
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());
250 void PvaClientPutGet::getGetDone(
251 const Status& status,
252 ChannelPutGet::shared_pointer
const & channelPutGet,
253 PVStructurePtr
const & getPVStructure,
254 BitSetPtr
const & getChangedBitSet)
256 if(PvaClient::getDebug()) {
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());
277 void PvaClientPutGet::connect()
279 if(PvaClient::getDebug()) {
280 cout <<
"PvaClientPutGet::connect" 281 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
285 Status status = waitConnect();
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);
294 void PvaClientPutGet::issueConnect()
296 if(PvaClient::getDebug()) {
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);
312 Status PvaClientPutGet::waitConnect()
314 if(PvaClient::getDebug()) {
315 cout <<
"PvaClientPutGet::waitConnect" 316 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
319 waitForConnect.wait();
320 return channelPutGetConnectStatus;
324 void PvaClientPutGet::putGet()
326 if(PvaClient::getDebug()) {
327 cout <<
"PvaClientPutGet::putGet" 328 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
332 Status status = waitPutGet();
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);
341 void PvaClientPutGet::issuePutGet()
343 if(PvaClient::getDebug()) {
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());
360 Status PvaClientPutGet::waitPutGet()
362 if(PvaClient::getDebug()) {
363 cout <<
"PvaClientPutGet::waitPutGet" 364 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
367 waitForPutGet.wait();
368 if(channelPutGetStatus.isOK()) pvaClientPutData->getChangedBitSet()->clear();
369 return channelPutGetStatus;
372 void PvaClientPutGet::getGet()
374 if(PvaClient::getDebug()) {
375 cout <<
"PvaClientPutGet::getGet" 376 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
380 Status status = waitGetGet();
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);
389 void PvaClientPutGet::issueGetGet()
391 if(PvaClient::getDebug()) {
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();
407 Status PvaClientPutGet::waitGetGet()
409 if(PvaClient::getDebug()) {
410 cout <<
"PvaClientPutGet::waitGetGet" 411 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
414 waitForPutGet.wait();
415 return channelPutGetStatus;
418 void PvaClientPutGet::getPut()
420 if(PvaClient::getDebug()) {
421 cout <<
"PvaClientPutGet::getGetPut" 422 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
426 Status status = waitGetPut();
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);
435 void PvaClientPutGet::issueGetPut()
437 if(PvaClient::getDebug()) {
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();
453 Status PvaClientPutGet::waitGetPut()
455 if(PvaClient::getDebug()) {
456 cout <<
"PvaClientPutGet::waitGetPut" 457 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
460 waitForPutGet.wait();
461 return channelPutGetStatus;
466 if(PvaClient::getDebug()) {
467 cout<<
"PvaClientPutGet::getGetData" 468 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
472 if(putGetState==putGetIdle){
476 return pvaClientGetData;
481 if(PvaClient::getDebug()) {
482 cout<<
"PvaClientPutGet::getPutData" 483 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
487 if(putGetState==putGetIdle){
491 return pvaClientPutData;
496 if(PvaClient::getDebug()) {
497 cout <<
"PvaClientPutGet::setRequester" 498 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
501 this->pvaClientPutGetRequester = pvaClientPutGetRequester;
507 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientPutGetRequester > PvaClientPutGetRequesterPtr
std::tr1::shared_ptr< PvaClientPutGet > PvaClientPutGetPtr
std::tr1::shared_ptr< ChannelPutGetRequesterImpl > ChannelPutGetRequesterImplPtr
An easy to use alternative to ChannelPutGet.
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr