14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
26 PvaClientProcess::weak_pointer pvaClientProcess;
27 PvaClient::weak_pointer pvaClient;
32 : pvaClientProcess(pvaClientProcess),
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelProcessRequesterImpl" << std::endl;
41 if(!clientProcess)
return string(
"clientProcess is null");
42 return clientProcess->getRequesterName();
47 if(!clientProcess)
return;
48 clientProcess->message(message,messageType);
53 ChannelProcess::shared_pointer
const & channelProcess)
56 if(!clientProcess)
return;
57 clientProcess->channelProcessConnect(status,channelProcess);
65 if(!clientProcess)
return;
66 clientProcess->processDone(status,ChannelProcess);
75 if(PvaClient::getDebug()) {
76 cout<<
"PvaClientProcess::create(pvaClient,channelName,pvRequest)\n" 77 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
78 <<
" pvRequest " << pvRequest
84 return channelProcess;
88 PvaClientProcess::PvaClientProcess(
92 : pvaClient(pvaClient),
93 pvaClientChannel(pvaClientChannel),
95 connectState(connectIdle),
96 processState(processIdle)
98 if(PvaClient::getDebug()) {
99 cout<<
"PvaClientProcess::PvaClientProcess()" 100 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
105 PvaClientProcess::~PvaClientProcess()
107 if(PvaClient::getDebug()) {
108 cout<<
"PvaClientProcess::~PvaClientProcess()" 109 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
115 string PvaClientProcess::getRequesterName()
118 if(!yyy)
throw std::runtime_error(
"pvaClient was destroyed");
119 return yyy->getRequesterName();
122 void PvaClientProcess::message(
string const & message,
MessageType messageType)
125 if(!yyy)
throw std::runtime_error(
"pvaClient was destroyed");
126 yyy->message(message, messageType);
129 void PvaClientProcess::channelProcessConnect(
131 ChannelProcess::shared_pointer
const & channelProcess)
133 if(PvaClient::getDebug()) {
134 cout <<
"PvaClientProcess::channelProcessConnect" 135 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
136 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
141 this->channelProcess = channelProcess;
143 channelProcessConnectStatus =
status;
144 connectState = connected;
148 string message = string(
"PvaClientProcess::channelProcessConnect")
149 +
"\npvRequest\n" + ss.str()
156 req->channelProcessConnect(status,shared_from_this());
158 waitForConnect.signal();
162 void PvaClientProcess::processDone(
164 ChannelProcess::shared_pointer
const & channelProcess)
166 if(PvaClient::getDebug()) {
167 cout <<
"PvaClientProcess::processDone" 168 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
169 <<
" status.isOK " << (status.
isOK() ?
"true" :
"false")
174 channelProcessStatus =
status;
175 processState = processComplete;
180 req->processDone(status,shared_from_this());
182 waitForProcess.signal();
185 void PvaClientProcess::connect()
187 if(PvaClient::getDebug()) {
188 cout <<
"PvaClientProcess::connect" 189 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
193 Status status = waitConnect();
194 if(status.
isOK())
return;
195 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
196 +
" PvaClientProcess::connect " + status.
getMessage();
197 throw std::runtime_error(message);
200 void PvaClientProcess::issueConnect()
202 if(PvaClient::getDebug()) {
203 cout <<
"PvaClientProcess::issueConnect" 204 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
207 if(connectState!=connectIdle) {
208 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
209 +
" pvaClientProcess already connected ";
210 throw std::runtime_error(message);
212 connectState = connectActive;
214 channelProcess = pvaClientChannel->getChannel()->createChannelProcess(channelProcessRequester,pvRequest);
219 if(PvaClient::getDebug()) {
220 cout <<
"PvaClientProcess::waitConnect" 221 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
224 if(connectState==connected) {
225 if(!channelProcessConnectStatus.isOK()) connectState = connectIdle;
226 return channelProcessConnectStatus;
228 if(connectState!=connectActive) {
229 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
230 +
" pvaClientProcess illegal connect state ";
231 throw std::runtime_error(message);
233 waitForConnect.wait();
234 if(!channelProcessConnectStatus.isOK()) connectState = connectIdle;
235 return channelProcessConnectStatus;
238 void PvaClientProcess::process()
240 if(PvaClient::getDebug()) {
241 cout <<
"PvaClientProcess::process" 242 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
246 Status status = waitProcess();
247 if(status.
isOK())
return;
248 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
249 +
" PvaClientProcess::process" + status.
getMessage();
250 throw std::runtime_error(message);
253 void PvaClientProcess::issueProcess()
255 if(PvaClient::getDebug()) {
256 cout <<
"PvaClientProcess::issueProcess" 257 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
260 if(connectState==connectIdle) connect();
261 if(processState==processActive) {
262 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
263 +
" PvaClientProcess::issueProcess process aleady active ";
264 throw std::runtime_error(message);
266 processState = processActive;
267 channelProcess->process();
272 if(PvaClient::getDebug()) {
273 cout <<
"PvaClientProcess::waitProcess" 274 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
279 if(processState==processComplete) {
280 processState = processIdle;
281 return channelProcessStatus;
283 if(processState!=processActive){
284 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
285 +
" PvaClientProcess::waitProcess llegal process state";
286 throw std::runtime_error(message);
289 waitForProcess.wait();
290 processState = processComplete;
291 return channelProcessStatus;
296 if(PvaClient::getDebug()) {
297 cout <<
"PvaClientProcess::setRequester" 298 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
301 this->pvaClientProcessRequester = pvaClientProcessRequester;
306 return pvaClientChannel;
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientProcessRequester > PvaClientProcessRequesterPtr
An easy to use alternative to ChannelProcess.
std::tr1::shared_ptr< ChannelProcessRequesterImpl > ChannelProcessRequesterImplPtr
virtual void processDone(const Status &status, ChannelProcess::shared_pointer const &ChannelProcess)
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
TODO only here because of the Lockable.
A lock for multithreading.
const std::string & getMessage() const
virtual ~ChannelProcessRequesterImpl()
virtual void channelProcessConnect(const Status &status, ChannelProcess::shared_pointer const &channelProcess)
ChannelProcessRequesterImpl(PvaClientProcessPtr const &pvaClientProcess, PvaClientPtr const &pvaClient)
virtual void message(std::string const &message, epics::pvData::MessageType messageType)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PvaClientProcess > PvaClientProcessPtr
virtual std::string getRequesterName()