14#define epicsExportSharedSymbols
18using namespace epics::pvData;
19using namespace epics::pvAccess;
22namespace epics {
namespace pvaClient {
24class ChannelProcessRequesterImpl :
public ChannelProcessRequester
26 PvaClientProcess::weak_pointer pvaClientProcess;
27 PvaClient::weak_pointer pvaClient;
29 ChannelProcessRequesterImpl(
32 : pvaClientProcess(pvaClientProcess),
35 virtual ~ChannelProcessRequesterImpl() {
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)
76 cout<<
"PvaClientProcess::create(pvaClient,channelName,pvRequest)\n"
77 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
78 <<
" pvRequest " << pvRequest
84 return channelProcess;
88PvaClientProcess::PvaClientProcess(
91 PVStructurePtr
const &pvRequest)
92: pvaClient(pvaClient),
93 pvaClientChannel(pvaClientChannel),
95 connectState(connectIdle),
96 processState(processIdle)
99 cout<<
"PvaClientProcess::PvaClientProcess()"
100 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
108 cout<<
"PvaClientProcess::~PvaClientProcess()"
109 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
114string PvaClientProcess::getRequesterName()
116 return pvaClientChannel->getRequesterName();
119void PvaClientProcess::message(
string const & message,MessageType messageType)
121 pvaClientChannel->message(message,messageType);
124void PvaClientProcess::channelProcessConnect(
125 const Status& status,
126 ChannelProcess::shared_pointer
const & channelProcess)
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());
149void PvaClientProcess::processDone(
150 const Status& status,
151 ChannelProcess::shared_pointer
const & channelProcess)
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());
174 cout <<
"PvaClientProcess::connect"
175 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
180 if(status.isOK())
return;
181 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
182 +
" PvaClientProcess::connect " + status.getMessage();
183 throw std::runtime_error(message);
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);
206 cout <<
"PvaClientProcess::waitConnect"
207 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
210 waitForConnect.wait();
211 return channelProcessConnectStatus;
217 cout <<
"PvaClientProcess::process"
218 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
223 if(status.isOK())
return;
224 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
225 +
" PvaClientProcess::process" + status.getMessage();
226 throw std::runtime_error(message);
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();
249 cout <<
"PvaClientProcess::waitProcess"
250 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
253 waitForProcess.wait();
254 processState = processComplete;
255 return channelProcessStatus;
261 cout <<
"PvaClientProcess::setRequester"
262 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
265 this->pvaClientProcessRequester = pvaClientProcessRequester;
270 return pvaClientChannel;
An easy to use alternative to ChannelProcess.
epics::pvData::Status waitConnect()
Wait until the channelProcess connection to the channel is complete.
void connect()
Call issueConnect and then waitConnect.
epics::pvData::Status waitProcess()
Wait until process completes.
void issueProcess()
Issue a process request and return immediately.
void setRequester(PvaClientProcessRequesterPtr const &pvaClientProcessRequester)
Set a user callback.
static PvaClientProcessPtr create(PvaClientPtr const &pvaClient, PvaClientChannelPtr const &pvaClientChannel, epics::pvData::PVStructurePtr const &pvRequest)
Create a PvaClientProcess.
void issueConnect()
Issue the channelProcess connection to the channel.
~PvaClientProcess()
Destructor.
void process()
Call issueProcess and then waitProcess.
friend class ChannelProcessRequesterImpl
PvaClientChannelPtr getPvaClientChannel()
Get the PvaClientChannel;.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientProcess > PvaClientProcessPtr
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientProcessRequester > PvaClientProcessRequesterPtr
std::tr1::shared_ptr< ChannelProcessRequesterImpl > ChannelProcessRequesterImplPtr