14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
24 class ChannelGetRequesterImpl :
public ChannelGetRequester
26 PvaClientGet::weak_pointer pvaClientGet;
27 PvaClient::weak_pointer pvaClient;
29 ChannelGetRequesterImpl(
32 : pvaClientGet(pvaClientGet),
35 virtual ~ChannelGetRequesterImpl() {
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelGetRequesterImpl" << std::endl;
39 virtual std::string getRequesterName() {
41 if(!clientGet)
return string(
"clientGet is null");
42 return clientGet->getRequesterName();
45 virtual void message(std::string
const & message, MessageType messageType) {
47 if(!clientGet)
return;
48 clientGet->message(message,messageType);
51 virtual void channelGetConnect(
53 ChannelGet::shared_pointer
const & channelGet,
54 Structure::const_shared_pointer
const & structure)
57 if(!clientGet)
return;
58 clientGet->channelGetConnect(status,channelGet,structure);
63 ChannelGet::shared_pointer
const & channelGet,
64 PVStructurePtr
const & pvStructure,
65 BitSet::shared_pointer
const & bitSet)
68 if(!clientGet)
return;
69 clientGet->getDone(status,channelGet,pvStructure,bitSet);
76 PVStructurePtr
const &pvRequest)
78 if(PvaClient::getDebug()) {
79 cout<<
"PvaClientGet::create(pvaClient,channelName,pvRequest)\n" 80 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
81 <<
" pvRequest " << pvRequest
86 new ChannelGetRequesterImpl(clientGet,pvaClient));
90 PvaClientGet::PvaClientGet(
93 PVStructurePtr
const &pvRequest)
94 : pvaClient(pvaClient),
95 pvaClientChannel(pvaClientChannel),
97 connectState(connectIdle),
100 if(PvaClient::getDebug()) {
101 cout <<
"PvaClientGet::PvaClientGet channelName " 102 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
106 PvaClientGet::~PvaClientGet()
108 if(PvaClient::getDebug()) {
109 cout<<
"PvaClientGet::~PvaClientGet channelName " 110 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
115 void PvaClientGet::checkConnectState()
117 if(PvaClient::getDebug()) {
118 cout <<
"PvaClientGet::checkConnectState channelName " 119 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
121 if(!pvaClientChannel->getChannel()->isConnected()) {
122 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
123 +
" PvaClientGet::checkConnectState channel not connected ";
124 throw std::runtime_error(message);
126 if(connectState==connectIdle) {
129 if(connectState==connectActive){
130 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
132 + channelGetConnectStatus.getMessage();
133 throw std::runtime_error(message);
137 string PvaClientGet::getRequesterName()
139 return pvaClientChannel->getRequesterName();
142 void PvaClientGet::message(
string const & message,MessageType messageType)
144 pvaClientChannel->message(message,messageType);
147 void PvaClientGet::channelGetConnect(
148 const Status& status,
149 ChannelGet::shared_pointer
const & channelGet,
150 StructureConstPtr
const & structure)
152 if(PvaClient::getDebug()) {
153 cout <<
"PvaClientGet::channelGetConnect channelName " 154 << pvaClientChannel->getChannel()->getChannelName()
155 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
160 channelGetConnectStatus = status;
162 this->channelGet = channelGet;
163 connectState = connected;
164 pvaClientData = PvaClientGetData::create(structure);
165 pvaClientData->setMessagePrefix(channelGet->getChannel()->getChannelName());
167 waitForConnect.signal();
171 req->channelGetConnect(status,shared_from_this());
175 void PvaClientGet::getDone(
176 const Status& status,
177 ChannelGet::shared_pointer
const & channelGet,
178 PVStructurePtr
const & pvStructure,
179 BitSetPtr
const & bitSet)
181 if(PvaClient::getDebug()) {
182 cout <<
"PvaClientGet::getDone channelName " 183 << pvaClientChannel->getChannel()->getChannelName()
184 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
189 channelGetStatus = status;
191 pvaClientData->setData(pvStructure,bitSet);
193 getState = getComplete;
198 req->getDone(status,shared_from_this());
202 void PvaClientGet::connect()
204 if(PvaClient::getDebug()) {
205 cout <<
"PvaClientGet::connect channelName " 206 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
209 Status status = waitConnect();
210 if(status.isOK())
return;
211 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
212 +
" PvaClientGet::connect " + status.getMessage();
213 throw std::runtime_error(message);
216 void PvaClientGet::issueConnect()
218 if(PvaClient::getDebug()) {
219 cout <<
"PvaClientGet::issueConnect channelName " 220 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
222 if(connectState!=connectIdle) {
223 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
224 +
" pvaClientGet already connected ";
225 throw std::runtime_error(message);
227 connectState = connectActive;
228 channelGetConnectStatus = Status(Status::STATUSTYPE_ERROR,
"connect active");
229 channelGet = pvaClientChannel->getChannel()->createChannelGet(channelGetRequester,pvRequest);
232 Status PvaClientGet::waitConnect()
234 if(PvaClient::getDebug()) {
235 cout <<
"PvaClientGet::waitConnect channelName " 236 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
238 waitForConnect.wait();
239 return channelGetConnectStatus;
242 void PvaClientGet::get()
244 if(PvaClient::getDebug()) {
245 cout <<
"PvaClientGet::get channelName " 246 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
249 Status status = waitGet();
250 if(status.isOK())
return;
251 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
252 +
" PvaClientGet::get " + status.getMessage();
253 throw std::runtime_error(message);
256 void PvaClientGet::issueGet()
258 if(PvaClient::getDebug()) {
259 cout <<
"PvaClientGet::issueGet channelName " 260 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
262 if(connectState==connectIdle) connect();
263 if(getState==getActive) {
264 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
265 +
" PvaClientGet::issueGet get aleady active ";
266 throw std::runtime_error(message);
268 getState = getActive;
272 Status PvaClientGet::waitGet()
274 if(PvaClient::getDebug()) {
275 cout <<
"PvaClientGet::waitGet channelName " 276 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
279 return channelGetStatus;
283 if(PvaClient::getDebug()) {
284 cout<<
"PvaClientGet::getData channelName " 285 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
288 if(getState==getIdle)
get();
289 return pvaClientData;
294 if(PvaClient::getDebug()) {
295 cout <<
"PvaClientGet::setRequester channelName " 296 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
298 this->pvaClientGetRequester = pvaClientGetRequester;
303 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< ChannelGetRequesterImpl > ChannelGetRequesterImplPtr
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
An easy to use alternative to ChannelGet.
std::tr1::shared_ptr< PvaClientGetRequester > PvaClientGetRequesterPtr