14#define epicsExportSharedSymbols
18using namespace epics::pvData;
19using namespace epics::pvAccess;
22namespace epics {
namespace pvaClient {
24class ChannelPutRequesterImpl :
public ChannelPutRequester
26 PvaClientPut::weak_pointer pvaClientPut;
27 PvaClient::weak_pointer pvaClient;
29 ChannelPutRequesterImpl(
32 : pvaClientPut(pvaClientPut),
35 virtual ~ChannelPutRequesterImpl() {
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)
94PvaClientPut::PvaClientPut(
97 PVStructurePtr
const &pvRequest)
98: pvaClient(pvaClient),
99 pvaClientChannel(pvaClientChannel),
100 pvRequest(pvRequest),
101 connectState(connectIdle),
105 cout<<
"PvaClientPut::PvaClientPut"
106 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
114 cout<<
"PvaClientPut::~PvaClientPut"
115 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
121void PvaClientPut::checkConnectState()
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);
139string PvaClientPut::getRequesterName()
141 return pvaClientChannel->getRequesterName();
144void PvaClientPut::message(
string const & message,MessageType messageType)
146 pvaClientChannel->message(message,messageType);
149void PvaClientPut::channelPutConnect(
150 const Status& status,
151 ChannelPut::shared_pointer
const & channelPut,
152 StructureConstPtr
const & structure)
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;
167 pvaClientData->setMessagePrefix(channelPut->getChannel()->getChannelName());
169 waitForConnect.signal();
173 req->channelPutConnect(status,shared_from_this());
177void PvaClientPut::getDone(
178 const Status& status,
179 ChannelPut::shared_pointer
const & channelPut,
180 PVStructurePtr
const & pvStructure,
181 BitSetPtr
const & bitSet)
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());
208void PvaClientPut::putDone(
209 const Status& status,
210 ChannelPut::shared_pointer
const & channelPut)
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());}
231 cout <<
"PvaClientPut::connect"
232 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
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);
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);
266 cout <<
"PvaClientPut::waitConnect"
267 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
270 waitForConnect.wait();
271 return channelPutConnectStatus;
277 cout <<
"PvaClientPut::get"
278 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
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);
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;
312 cout <<
"PvaClientPut::waitGet"
313 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
316 waitForGetPut.wait();
317 putState = putComplete;
318 return channelGetPutStatus;
324 cout <<
"PvaClientPut::put"
325 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
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);
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());
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;
374 cout<<
"PvaClientPut::getData"
375 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
379 if(putState==putIdle)
get();
380 return pvaClientData;
386 cout <<
"PvaClientPut::setRequester"
387 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
390 this->pvaClientPutRequester = pvaClientPutRequester;
395 return pvaClientChannel;
static PvaClientPutDataPtr create(epics::pvData::StructureConstPtr const &structure)
An easy to use alternative to ChannelPut.
void connect()
Call issueConnect and then waitConnect.
~PvaClientPut()
Destructor.
void issueConnect()
Issue the channelPut connection to the channel.
friend class ChannelPutRequesterImpl
PvaClientPutDataPtr getData()
Get the data/.
static PvaClientPutPtr create(PvaClientPtr const &pvaClient, PvaClientChannelPtr const &pvaClientChannel, epics::pvData::PVStructurePtr const &pvRequest)
Create a PvaClientPut.
void issueGet()
Issue a get and return immediately.
void issuePut()
Issue a put and return immediately.
epics::pvData::Status waitPut()
Wait until put completes.
PvaClientChannelPtr getPvaClientChannel()
Get the PvaClientChannel;.
void setRequester(PvaClientPutRequesterPtr const &pvaClientPutRequester)
Set a user callback.
epics::pvData::Status waitGet()
Wait until get completes.
void get()
Call issueGet and then waitGet.
void put()
Call issuePut and then waitPut. An exception is thrown if get fails.
epics::pvData::Status waitConnect()
Wait until the channelPut connection to the channel is complete.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientPutRequester > PvaClientPutRequesterPtr
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr
std::tr1::shared_ptr< ChannelPutRequesterImpl > ChannelPutRequesterImplPtr
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr