PVStructure::shared_pointer PvaClientRPC::request(PVStructure::shared_pointer const & pvArgument) { checkRPCState(); { Lock xx(mutex); if(rpcState!=rpcIdle) { Channel::shared_pointer chan(channel.lock()); string channelName("disconnected"); if(chan) channelName = chan->getChannelName(); string message = "channel " + channelName + " PvaClientRPC::request request aleady active "; throw std::runtime_error(message); } rpcState = rpcActive; } channelRPC->request(pvArgument); if(responseTimeout>0.0) { waitForDone.wait(responseTimeout); } else { waitForDone.wait(); } Lock xx(mutex); if(rpcState!=rpcComplete) { Channel::shared_pointer chan(channel.lock()); string channelName("disconnected"); if(chan) channelName = chan->getChannelName(); string message = "channel " + channelName + " PvaClientRPC::request request timeout "; throw RPCRequestException(Status::STATUSTYPE_ERROR,message); } rpcState = rpcIdle; if(requestStatus.isOK()) return pvResponse; Channel::shared_pointer chan(channel.lock()); string channelName("disconnected"); if(chan) channelName = chan->getChannelName(); string message = "channel " + channelName + " PvaClientRPC::request status "; message += requestStatus.getMessage(); throw RPCRequestException(Status::STATUSTYPE_ERROR,message); }
PVStructurePtr ExampleHelloRPC::request(PVStructurePtr const &pvArgument) throw (RPCRequestException) { PVStringPtr pvFrom = pvArgument->getSubField<PVString>("value"); if(!pvFrom) { stringstream ss; ss << " expected string subfield named value. got\n" << pvArgument; throw RPCRequestException( Status::STATUSTYPE_ERROR,ss.str()); } PVStringPtr pvTo = pvResult->getSubField<PVString>("value"); pvTo->put("Hello " + pvFrom->get()); return pvResult; }
void PvaClientRPC::connect() { if(PvaClient::getDebug()) cout << "PvaClientRPC::connect\n"; issueConnect(); Status status = waitConnect(); if(status.isOK()) return; Channel::shared_pointer chan(channel.lock()); string channelName("disconnected"); if(chan) channelName = chan->getChannelName(); string message = string("channel ") + channelName + " PvaClientRPC::connect " + status.getMessage(); throw RPCRequestException(Status::STATUSTYPE_ERROR,message); }