15 #define epicsExportSharedSymbols 24 # define TRACE(msg) std::cerr<<"TRACE: "<<CURRENT_FUNCTION<<" : "<< msg <<"\n" 32 namespace epics{
namespace pvAccess{
39 ChannelRPC::shared_pointer
op;
46 :conn_status(
pvd::
Status::error(
"Never connected"))
47 ,resp_status(
pvd::
Status::error(
"Never connected"))
57 ChannelRPC::shared_pointer
const &
operation)
60 pvd::PVStructure::shared_pointer args;
63 TRACE(
"status="<<status);
70 TRACE(
"request deferred: "<<args);
73 TRACE(
"request deferred: "<<args);
75 operation->lastRequest();
76 operation->request(args);
83 ChannelRPC::shared_pointer
const &
operation,
84 pvd::PVStructure::shared_pointer
const & pvResponse)
86 TRACE(
"status="<<status<<
" response:\n"<<pvResponse<<
"\n");
90 std::cerr<<
"pva provider give RPC requestDone() when no request in progress\n";
93 last_data = pvResponse;
105 TRACE(
"destroy="<<destroy);
119 pvd::PVStructure::shared_pointer
const & pvRequest,
120 const ChannelProvider::shared_pointer &provider,
121 const std::string &address)
122 : m_serviceName(serviceName)
123 , m_provider(provider)
130 throw std::logic_error(
"Unknown Provider");
137 throw std::logic_error(
"provider createChannel() succeeds w/ NULL Channel");
140 m_rpc = m_channel->createChannelRPC(m_rpc_requester, m_pvRequest);
142 throw std::logic_error(
"channel createChannelRPC() NULL");
149 m_channel->destroy();
172 TRACE(
"timeout="<<timeout);
173 while(!m_rpc_requester->conn_status.isSuccess()) {
175 if(!m_rpc_requester->event.wait(timeout)) {
188 pvd::PVStructure::shared_pointer
const & pvArgument,
202 pvd::PVStructure::shared_pointer
const & pvArgument,
207 TRACE(
"conn_status="<<m_rpc_requester->conn_status
208 <<
" resp_status="<<m_rpc_requester->resp_status
209 <<
" args:\n"<<pvArgument);
210 if(m_rpc_requester->inprogress)
211 throw std::logic_error(
"Request already in progress");
212 m_rpc_requester->inprogress =
true;
214 if(!m_rpc_requester->conn_status.isSuccess()) {
216 m_rpc_requester->last = lastRequest;
217 m_rpc_requester->next_args = pvArgument;
220 TRACE(
"request args: "<<pvArgument);
223 m_rpc->lastRequest();
224 m_rpc->request(pvArgument);
230 TRACE(
"timeout="<<timeout);
232 while(m_rpc_requester->inprogress)
235 if(!m_rpc_requester->event.wait(timeout)) {
241 TRACE(
"Complete: conn_status="<<m_rpc_requester->conn_status
242 <<
" resp_status="<<m_rpc_requester->resp_status
243 <<
" data:\n"<<m_rpc_requester->last_data);
245 if(!m_rpc_requester->conn_status.isSuccess())
248 if(!m_rpc_requester->resp_status.isSuccess())
252 pvd::PVStructure::shared_pointer data;
253 data.swap(m_rpc_requester->last_data);
256 throw std::logic_error(
"No request in progress");
260 pvd::PVStructure::shared_pointer ret(
pvd::getPVDataCreate()->createPVStructure(data->getStructure()));
261 ret->copyUnchecked(*data);
267 pvd::PVStructure::shared_pointer
const & pvRequest)
269 return RPCClient::shared_pointer(
new RPCClient(serviceName, pvRequest));
RPCClient(const std::string &serviceName, epics::pvData::PVStructure::shared_pointer const &pvRequest, const ChannelProvider::shared_pointer &provider=ChannelProvider::shared_pointer(), const std::string &address=std::string())
virtual void channelRPCConnect(const pvd::Status &status, ChannelRPC::shared_pointer const &operation)
static Status error(const std::string &m)
virtual void requestDone(const pvd::Status &status, ChannelRPC::shared_pointer const &operation, pvd::PVStructure::shared_pointer const &pvResponse)
TODO only here because of the Lockable.
A lock for multithreading.
PVStructure::shared_pointer createRequest(std::string const &request)
const std::tr1::weak_ptr< Process2PutProxy > operation
virtual std::string getRequesterName()
bool connect(double timeout=RPCCLIENT_DEFAULT_TIMEOUT)
epics::pvData::PVStructure::shared_pointer last_data
epics::pvData::PVStructure::shared_pointer request(epics::pvData::PVStructure::shared_pointer const &pvArgument, double timeout=RPCCLIENT_DEFAULT_TIMEOUT, bool lastRequest=false)
static ChannelProviderRegistry::shared_pointer clients()
virtual void channelDisconnect(bool destroy)
APIs for the epicsEvent binary semaphore.
bool waitConnect(double timeout=RPCCLIENT_DEFAULT_TIMEOUT)
epics::pvData::PVStructure::shared_pointer waitResponse(double timeout=RPCCLIENT_DEFAULT_TIMEOUT)
epics::pvData::PVStructure::shared_pointer next_args
ChannelRPC::shared_pointer op
POINTER_DEFINITIONS(RPCRequester)
static const short PRIORITY_DEFAULT
void issueRequest(epics::pvData::PVStructure::shared_pointer const &pvArgument, bool lastRequest=false)
static ChannelRequester::shared_pointer build()
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
static shared_pointer create(const std::string &serviceName, epics::pvData::PVStructure::shared_pointer const &pvRequest=epics::pvData::PVStructure::shared_pointer())