14 #define epicsExportSharedSymbols 22 namespace epics {
namespace pvaClient {
24 class ChannelProcessRequesterImpl :
public ChannelProcessRequester
26 PvaClientProcess::weak_pointer pvaClientProcess;
27 PvaClient::weak_pointer pvaClient;
29 ChannelProcessRequesterImpl(
32 : pvaClientProcess(pvaClientProcess),
35 virtual ~ChannelProcessRequesterImpl() {
36 if(PvaClient::getDebug()) std::cout <<
"~ChannelProcessRequesterImpl" << std::endl;
39 virtual std::string getRequesterName() {
41 if(!clientProcess)
return string(
"clientProcess is null");
42 return clientProcess->getRequesterName();
45 virtual void message(std::string
const & message, MessageType messageType) {
47 if(!clientProcess)
return;
48 clientProcess->message(message,messageType);
51 virtual void channelProcessConnect(
53 ChannelProcess::shared_pointer
const & channelProcess)
56 if(!clientProcess)
return;
57 clientProcess->channelProcessConnect(status,channelProcess);
60 virtual void processDone(
62 ChannelProcess::shared_pointer
const & ChannelProcess)
65 if(!clientProcess)
return;
66 clientProcess->processDone(status,ChannelProcess);
73 PVStructurePtr
const &pvRequest)
75 if(PvaClient::getDebug()) {
76 cout<<
"PvaClientProcess::create(pvaClient,channelName,pvRequest)\n" 77 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
78 <<
" pvRequest " << pvRequest
83 new ChannelProcessRequesterImpl(channelProcess,pvaClient));
84 return channelProcess;
88 PvaClientProcess::PvaClientProcess(
91 PVStructurePtr
const &pvRequest)
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()
114 string PvaClientProcess::getRequesterName()
116 return pvaClientChannel->getRequesterName();
119 void PvaClientProcess::message(
string const & message,MessageType messageType)
121 pvaClientChannel->message(message,messageType);
124 void PvaClientProcess::channelProcessConnect(
125 const Status& status,
126 ChannelProcess::shared_pointer
const & channelProcess)
128 if(PvaClient::getDebug()) {
129 cout <<
"PvaClientProcess::channelProcessConnect" 130 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
131 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
136 channelProcessConnectStatus = status;
138 this->channelProcess = channelProcess;
139 connectState = connected;
141 waitForConnect.signal();
145 req->channelProcessConnect(status,shared_from_this());
149 void PvaClientProcess::processDone(
150 const Status& status,
151 ChannelProcess::shared_pointer
const & channelProcess)
153 if(PvaClient::getDebug()) {
154 cout <<
"PvaClientProcess::processDone" 155 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
156 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
161 channelProcessStatus = status;
162 processState = processComplete;
163 waitForProcess.signal();
167 req->processDone(status,shared_from_this());
171 void PvaClientProcess::connect()
173 if(PvaClient::getDebug()) {
174 cout <<
"PvaClientProcess::connect" 175 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
179 Status status = waitConnect();
180 if(status.isOK())
return;
181 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
182 +
" PvaClientProcess::connect " + status.getMessage();
183 throw std::runtime_error(message);
186 void PvaClientProcess::issueConnect()
188 if(PvaClient::getDebug()) {
189 cout <<
"PvaClientProcess::issueConnect" 190 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
193 if(connectState!=connectIdle) {
194 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
195 +
" pvaClientProcess already connected ";
196 throw std::runtime_error(message);
198 connectState = connectActive;
199 channelProcessConnectStatus = Status(Status::STATUSTYPE_ERROR,
"connect active");
200 channelProcess = pvaClientChannel->getChannel()->createChannelProcess(channelProcessRequester,pvRequest);
203 Status PvaClientProcess::waitConnect()
205 if(PvaClient::getDebug()) {
206 cout <<
"PvaClientProcess::waitConnect" 207 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
210 waitForConnect.wait();
211 return channelProcessConnectStatus;
214 void PvaClientProcess::process()
216 if(PvaClient::getDebug()) {
217 cout <<
"PvaClientProcess::process" 218 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
222 Status status = waitProcess();
223 if(status.isOK())
return;
224 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
225 +
" PvaClientProcess::process" + status.getMessage();
226 throw std::runtime_error(message);
229 void PvaClientProcess::issueProcess()
231 if(PvaClient::getDebug()) {
232 cout <<
"PvaClientProcess::issueProcess" 233 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
236 if(connectState==connectIdle) connect();
237 if(processState==processActive) {
238 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
239 +
" PvaClientProcess::issueProcess process aleady active ";
240 throw std::runtime_error(message);
242 processState = processActive;
243 channelProcess->process();
246 Status PvaClientProcess::waitProcess()
248 if(PvaClient::getDebug()) {
249 cout <<
"PvaClientProcess::waitProcess" 250 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
253 waitForProcess.wait();
254 processState = processComplete;
255 return channelProcessStatus;
260 if(PvaClient::getDebug()) {
261 cout <<
"PvaClientProcess::setRequester" 262 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
265 this->pvaClientProcessRequester = pvaClientProcessRequester;
270 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
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientProcess > PvaClientProcessPtr