14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
24 class ChannelPutRequesterImpl :
public ChannelPutRequester
26 PvaClientPut::weak_pointer pvaClientPut;
27 PvaClient::weak_pointer pvaClient;
29 ChannelPutRequesterImpl(
32 : pvaClientPut(pvaClientPut),
35 virtual ~ChannelPutRequesterImpl() {
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelPutRequesterImpl" << std::endl;
39 virtual std::string getRequesterName() {
41 if(!clientPut)
return string(
"clientPut is null");
42 return clientPut->getRequesterName();
45 virtual void message(std::string
const & message, MessageType messageType) {
47 if(!clientPut)
return;
48 clientPut->message(message,messageType);
51 virtual void channelPutConnect(
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,
64 PVStructurePtr
const & pvStructure,
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);
85 PVStructurePtr
const &pvRequest)
89 new ChannelPutRequesterImpl(clientPut,pvaClient));
94 PvaClientPut::PvaClientPut(
97 PVStructurePtr
const &pvRequest)
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()
141 return pvaClientChannel->getRequesterName();
144 void PvaClientPut::message(
string const & message,MessageType messageType)
146 pvaClientChannel->message(message,messageType);
149 void PvaClientPut::channelPutConnect(
150 const Status& status,
151 ChannelPut::shared_pointer
const & channelPut,
152 StructureConstPtr
const & structure)
154 if(PvaClient::getDebug()) {
155 cout <<
"PvaClientPut::channelPutConnect" 156 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
157 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
162 channelPutConnectStatus = status;
164 this->channelPut = channelPut;
165 connectState = connected;
166 pvaClientData = PvaClientPutData::create(structure);
167 pvaClientData->setMessagePrefix(channelPut->getChannel()->getChannelName());
169 waitForConnect.signal();
173 req->channelPutConnect(status,shared_from_this());
177 void PvaClientPut::getDone(
178 const Status& status,
179 ChannelPut::shared_pointer
const & channelPut,
180 PVStructurePtr
const & pvStructure,
181 BitSetPtr
const & bitSet)
183 if(PvaClient::getDebug()) {
184 cout <<
"PvaClientPut::getDone" 185 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
186 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
191 channelGetPutStatus = status;
193 PVStructurePtr pvs = pvaClientData->getPVStructure();
194 pvs->copyUnchecked(*pvStructure,*bitSet);
195 BitSetPtr bs = pvaClientData->getChangedBitSet();
199 putState = putComplete;
200 waitForGetPut.signal();
204 req->getDone(status,shared_from_this());
208 void PvaClientPut::putDone(
209 const Status& status,
210 ChannelPut::shared_pointer
const & channelPut)
212 if(PvaClient::getDebug()) {
213 cout <<
"PvaClientPut::putDone" 214 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
215 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
220 channelGetPutStatus = status;
221 putState = putComplete;
222 waitForGetPut.signal();
225 if(req) { req->putDone(status,shared_from_this());}
228 void PvaClientPut::connect()
230 if(PvaClient::getDebug()) {
231 cout <<
"PvaClientPut::connect" 232 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
236 Status status = waitConnect();
237 if(status.isOK())
return;
238 string message = string(
"channel ")
239 + pvaClientChannel->getChannel()->getChannelName()
240 +
" PvaClientPut::connect " 241 + status.getMessage();
242 throw std::runtime_error(message);
245 void PvaClientPut::issueConnect()
247 if(PvaClient::getDebug()) {
248 cout <<
"PvaClientPut::issueConnect" 249 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
252 if(connectState!=connectIdle) {
253 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
254 +
" pvaClientPut already connected ";
255 throw std::runtime_error(message);
257 connectState = connectActive;
258 channelPutConnectStatus = Status(Status::STATUSTYPE_ERROR,
"connect active");
259 channelPut = pvaClientChannel->getChannel()->createChannelPut(channelPutRequester,pvRequest);
263 Status PvaClientPut::waitConnect()
265 if(PvaClient::getDebug()) {
266 cout <<
"PvaClientPut::waitConnect" 267 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
270 waitForConnect.wait();
271 return channelPutConnectStatus;
274 void PvaClientPut::get()
276 if(PvaClient::getDebug()) {
277 cout <<
"PvaClientPut::get" 278 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
282 Status status = waitGet();
283 if(status.isOK())
return;
284 string message = string(
"channel ")
285 + pvaClientChannel->getChannel()->getChannelName()
286 +
" PvaClientPut::get " 287 + status.getMessage();
288 throw std::runtime_error(message);
291 void PvaClientPut::issueGet()
293 if(PvaClient::getDebug()) {
294 cout <<
"PvaClientPut::issueGet" 295 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
298 if(connectState==connectIdle) connect();
299 if(putState==getActive || putState==putActive) {
300 string message = string(
"channel ")
301 + pvaClientChannel->getChannel()->getChannelName()
302 +
"PvaClientPut::issueGet get or put aleady active ";
303 throw std::runtime_error(message);
305 putState = getActive;
309 Status PvaClientPut::waitGet()
311 if(PvaClient::getDebug()) {
312 cout <<
"PvaClientPut::waitGet" 313 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
316 waitForGetPut.wait();
317 putState = putComplete;
318 return channelGetPutStatus;
321 void PvaClientPut::put()
323 if(PvaClient::getDebug()) {
324 cout <<
"PvaClientPut::put" 325 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
329 Status status = waitPut();
330 if(status.isOK())
return;
331 string message = string(
"channel ")
332 + pvaClientChannel->getChannel()->getChannelName()
333 +
" PvaClientPut::put " 334 + status.getMessage();
335 throw std::runtime_error(message);
338 void PvaClientPut::issuePut()
340 if(PvaClient::getDebug()) {
341 cout <<
"PvaClientPut::issuePut" 342 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
343 <<
" pvStructure\n" << pvaClientData->getPVStructure()
344 <<
" bitSet " << *pvaClientData->getChangedBitSet() << endl
347 if(connectState==connectIdle) connect();
348 if(putState==getActive || putState==putActive) {
349 string message = string(
"channel ")
350 + pvaClientChannel->getChannel()->getChannelName()
351 +
" PvaClientPut::issuePut get or put aleady active ";
352 throw std::runtime_error(message);
354 putState = putActive;
355 channelPut->put(pvaClientData->getPVStructure(),pvaClientData->getChangedBitSet());
358 Status PvaClientPut::waitPut()
360 if(PvaClient::getDebug()) {
361 cout <<
"PvaClientPut::waitPut" 362 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
365 waitForGetPut.wait();
366 putState = putComplete;
367 if(channelGetPutStatus.isOK()) pvaClientData->getChangedBitSet()->clear();
368 return channelGetPutStatus;
373 if(PvaClient::getDebug()) {
374 cout<<
"PvaClientPut::getData" 375 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
379 if(putState==putIdle)
get();
380 return pvaClientData;
385 if(PvaClient::getDebug()) {
386 cout <<
"PvaClientPut::setRequester" 387 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
390 this->pvaClientPutRequester = pvaClientPutRequester;
395 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
std::tr1::shared_ptr< PvaClientPutRequester > PvaClientPutRequesterPtr
An easy to use alternative to ChannelPut.
std::tr1::shared_ptr< ChannelPutRequesterImpl > ChannelPutRequesterImplPtr
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr