14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
26 PvaClientPut::weak_pointer pvaClientPut;
27 PvaClient::weak_pointer pvaClient;
32 : pvaClientPut(pvaClientPut),
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelPutRequesterImpl" << std::endl;
41 if(!clientPut)
return string(
"clientPut is null");
42 return clientPut->getRequesterName();
47 if(!clientPut)
return;
48 clientPut->message(message,messageType);
53 ChannelPut::shared_pointer
const & channelPut,
54 Structure::const_shared_pointer
const &
structure)
57 if(!clientPut)
return;
58 clientPut->channelPutConnect(status,channelPut,structure);
63 ChannelPut::shared_pointer
const & channelPut,
65 BitSet::shared_pointer
const & bitSet)
68 if(!clientPut)
return;
69 clientPut->getDone(status,channelPut,pvStructure,bitSet);
74 ChannelPut::shared_pointer
const & channelPut)
77 if(!clientPut)
return;
78 clientPut->putDone(status,channelPut);
94 PvaClientPut::PvaClientPut(
98 : pvaClient(pvaClient),
99 pvaClientChannel(pvaClientChannel),
100 pvRequest(pvRequest),
101 connectState(connectIdle),
104 if(PvaClient::getDebug()) {
105 cout<<
"PvaClientPut::PvaClientPut" 106 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
111 PvaClientPut::~PvaClientPut()
113 if(PvaClient::getDebug()) {
114 cout<<
"PvaClientPut::~PvaClientPut" 115 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
121 void PvaClientPut::checkConnectState()
123 if(PvaClient::getDebug()) {
124 cout <<
"PvaClientPut::checkConnectState" 125 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
128 if(connectState==connectIdle){
131 if(connectState==connectActive){
132 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
134 + channelPutConnectStatus.getMessage();
135 throw std::runtime_error(message);
139 string PvaClientPut::getRequesterName()
142 if(!yyy)
return string(
"PvaClientPut::getRequesterName() PvaClient isDestroyed");
143 return yyy->getRequesterName();
146 void PvaClientPut::message(
string const & message,
MessageType messageType)
150 yyy->message(message, messageType);
153 void PvaClientPut::channelPutConnect(
155 ChannelPut::shared_pointer
const & channelPut,
158 if(PvaClient::getDebug()) {
159 cout <<
"PvaClientPut::channelPutConnect" 160 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
161 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
166 this->channelPut = channelPut;
168 channelPutConnectStatus =
status;
169 connectState = connected;
170 pvaClientData = PvaClientPutData::create(structure);
171 pvaClientData->setMessagePrefix(channelPut->getChannel()->getChannelName());
175 string message = string(
"\nPvaClientPut::channelPutConnect)")
176 +
"\npvRequest\n" + ss.str()
183 req->channelPutConnect(status,shared_from_this());
185 waitForConnect.signal();
189 void PvaClientPut::getDone(
191 ChannelPut::shared_pointer
const & channelPut,
195 if(PvaClient::getDebug()) {
196 cout <<
"PvaClientPut::getDone" 197 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
198 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
203 channelGetPutStatus =
status;
206 pvs->copyUnchecked(*pvStructure,*bitSet);
207 BitSetPtr bs = pvaClientData->getChangedBitSet();
210 putState = putComplete;
215 req->getDone(status,shared_from_this());
217 waitForGetPut.signal();
220 void PvaClientPut::putDone(
222 ChannelPut::shared_pointer
const & channelPut)
224 if(PvaClient::getDebug()) {
225 cout <<
"PvaClientPut::putDone" 226 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
227 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
232 channelGetPutStatus =
status;
233 putState = putComplete;
237 req->putDone(status,shared_from_this());
239 waitForGetPut.signal();
242 void PvaClientPut::connect()
244 if(PvaClient::getDebug()) {
245 cout <<
"PvaClientPut::connect" 246 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
250 Status status = waitConnect();
251 if(status.
isOK())
return;
252 string message = string(
"channel ")
253 + pvaClientChannel->getChannel()->getChannelName()
254 +
" PvaClientPut::connect " 256 throw std::runtime_error(message);
259 void PvaClientPut::issueConnect()
261 if(PvaClient::getDebug()) {
262 cout <<
"PvaClientPut::issueConnect" 263 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
266 if(connectState!=connectIdle) {
267 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
268 +
" pvaClientPut already connected ";
269 throw std::runtime_error(message);
271 connectState = connectActive;
273 channelPut = pvaClientChannel->getChannel()->createChannelPut(channelPutRequester,pvRequest);
279 if(PvaClient::getDebug()) {
280 cout <<
"PvaClientPut::waitConnect" 281 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
286 if(connectState==connected) {
287 if(!channelPutConnectStatus.isOK()) connectState = connectIdle;
288 return channelPutConnectStatus;
290 if(connectState!=connectActive) {
291 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
292 +
" PvaClientPut::waitConnect illegal connect state ";
293 throw std::runtime_error(message);
296 waitForConnect.wait();
297 if(!channelPutConnectStatus.isOK()) connectState = connectIdle;
298 return channelPutConnectStatus;
303 if(PvaClient::getDebug()) {
304 cout <<
"PvaClientPut::get" 305 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
309 Status status = waitGet();
310 if(status.
isOK())
return;
311 string message = string(
"channel ")
312 + pvaClientChannel->getChannel()->getChannelName()
313 +
" PvaClientPut::get " 315 throw std::runtime_error(message);
318 void PvaClientPut::issueGet()
320 if(PvaClient::getDebug()) {
321 cout <<
"PvaClientPut::issueGet" 322 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
325 if(connectState==connectIdle) connect();
326 if(putState==getActive || putState==putActive) {
327 string message = string(
"channel ")
328 + pvaClientChannel->getChannel()->getChannelName()
329 +
"PvaClientPut::issueGet get or put aleady active ";
330 throw std::runtime_error(message);
332 putState = getActive;
338 if(PvaClient::getDebug()) {
339 cout <<
"PvaClientPut::waitGet" 340 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
345 if(putState==putComplete)
return channelGetPutStatus;
346 if(putState!=getActive){
347 string message = string(
"channel ")
348 + pvaClientChannel->getChannel()->getChannelName()
349 +
" PvaClientPut::waitGet illegal put state";
350 throw std::runtime_error(message);
353 waitForGetPut.wait();
354 return channelGetPutStatus;
359 if(PvaClient::getDebug()) {
360 cout <<
"PvaClientPut::put" 361 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
365 Status status = waitPut();
366 if(status.
isOK())
return;
367 string message = string(
"channel ")
368 + pvaClientChannel->getChannel()->getChannelName()
369 +
" PvaClientPut::put " 371 throw std::runtime_error(message);
374 void PvaClientPut::issuePut()
376 if(PvaClient::getDebug()) {
377 cout <<
"PvaClientPut::issuePut" 378 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
379 <<
" pvStructure\n" << pvaClientData->getPVStructure()
380 <<
" bitSet " << *pvaClientData->getChangedBitSet() << endl
383 if(connectState==connectIdle) connect();
384 if(putState==getActive || putState==putActive) {
385 string message = string(
"channel ")
386 + pvaClientChannel->getChannel()->getChannelName()
387 +
"PvaClientPut::issuePut get or put aleady active ";
388 throw std::runtime_error(message);
390 putState = putActive;
391 channelPut->put(pvaClientData->getPVStructure(),pvaClientData->getChangedBitSet());
396 if(PvaClient::getDebug()) {
397 cout <<
"PvaClientPut::waitPut" 398 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
403 if(putState==putComplete)
return channelGetPutStatus;
404 if(putState!=putActive){
405 string message = string(
"channel ")
406 + pvaClientChannel->getChannel()->getChannelName()
407 +
" PvaClientPut::waitPut illegal put state";
408 throw std::runtime_error(message);
411 waitForGetPut.wait();
412 if(channelGetPutStatus.isOK()) pvaClientData->getChangedBitSet()->clear();
413 return channelGetPutStatus;
418 if(PvaClient::getDebug()) {
419 cout<<
"PvaClientPut::getData" 420 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
424 if(putState==putIdle)
get();
425 return pvaClientData;
430 if(PvaClient::getDebug()) {
431 cout <<
"PvaClientPut::setRequester" 432 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
435 this->pvaClientPutRequester = pvaClientPutRequester;
440 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
virtual ~ChannelPutRequesterImpl()
ChannelPutRequesterImpl(PvaClientPutPtr const &pvaClientPut, PvaClientPtr const &pvaClient)
virtual void putDone(const Status &status, ChannelPut::shared_pointer const &channelPut)
std::tr1::shared_ptr< detail::SharedPut > put
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
A lock for multithreading.
const std::string & getMessage() const
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
virtual void getDone(const Status &status, ChannelPut::shared_pointer const &channelPut, PVStructurePtr const &pvStructure, BitSet::shared_pointer const &bitSet)
std::tr1::shared_ptr< PvaClientPutRequester > PvaClientPutRequesterPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
virtual std::string getRequesterName()
An easy to use alternative to ChannelPut.
virtual void channelPutConnect(const Status &status, ChannelPut::shared_pointer const &channelPut, Structure::const_shared_pointer const &structure)
std::tr1::shared_ptr< BitSet > BitSetPtr
virtual void message(std::string const &message, epics::pvData::MessageType messageType)
std::tr1::shared_ptr< ChannelPutRequesterImpl > ChannelPutRequesterImplPtr
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr