diff --git a/pvtoolsSrc/pvlist.cpp b/pvtoolsSrc/pvlist.cpp index 88258b9..7b36907 100644 --- a/pvtoolsSrc/pvlist.cpp +++ b/pvtoolsSrc/pvlist.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -39,6 +40,8 @@ using namespace std; using namespace epics::pvData; using namespace epics::pvAccess; +namespace { + /// Byte to hexchar mapping. static const char lookup[] = { '0', '1', '2', '3', '4', '5', '6', '7', @@ -461,6 +464,7 @@ void usage (void) , DEFAULT_TIMEOUT); } +}//namespace /*+************************************************************************** * @@ -656,32 +660,53 @@ int main (int argc, char *argv[]) } } - // TODO for now we call eget utility - // TODO timeOut - string cmd = "eget -"; - if (debug) - cmd += 'd'; - if (quiet) - cmd += 'q'; - if (printInfo) - cmd += 'N'; - cmd += "s pva://" + serverAddress + "/server?op="; - if (printInfo) - cmd += "info"; - else - cmd += "channels"; + StructureConstPtr argstype(getFieldCreate()->createFieldBuilder() + ->setId("epics:nt/NTURI:1.0") + ->add("scheme", pvString) + ->add("path", pvString) + ->addNestedStructure("query") + ->add("op", pvString) + ->endNested() + ->createStructure()); - FILE* egetpipe = popen (cmd.c_str(), "w"); - if (!egetpipe) - { - char errStr[64]; - epicsSocketConvertErrnoToString(errStr, sizeof(errStr)); - fprintf(stderr, "Failed to exec 'eget': %s\n", errStr); - allOK = false; + PVStructure::shared_pointer args(getPVDataCreate()->createPVStructure(argstype)); + + args->getSubFieldT("scheme")->put("pva"); + args->getSubFieldT("path")->put("server"); + args->getSubFieldT("query.op")->put(printInfo ? "info" : "channels"); + + if(debug) { + std::cerr<<"Query to "<getSubField("value")); + + PVStringArray::const_svector val(pvs->view()); + + std::copy(val.begin(), + val.end(), + std::ostream_iterator(std::cout, "\n")); + + return allOK ? 0 : 1; + } + + std::cout<getProvider("pva")); - if(!provider) + if(!m_provider) + m_provider = ChannelProviderRegistry::clients()->getProvider("pva"); + if(!m_provider) throw std::logic_error("Unknown Provider"); - construct(provider, serviceName, pvRequest); -} -RPCClient::RPCClient(const ChannelProvider::shared_pointer& provider, - const std::string & serviceName, - epics::pvData::PVStructure::shared_pointer const & pvRequest) -{ - construct(provider, serviceName, pvRequest); -} + m_channel = m_provider->createChannel(serviceName, DefaultChannelRequester::build(), + ChannelProvider::PRIORITY_DEFAULT, + address); -void RPCClient::construct(const ChannelProvider::shared_pointer& provider, - const std::string & serviceName, - epics::pvData::PVStructure::shared_pointer const & pvRequest) -{ - assert(provider); - - DummyChannelRequester::shared_pointer dummy(new DummyChannelRequester); - m_channel = provider->createChannel(serviceName, dummy); - { - pvd::Lock L(dummy->mutex); - if(!dummy->status.isSuccess()) - throw std::runtime_error(dummy->status.getMessage()); - } if(!m_channel) throw std::logic_error("provider createChannel() succeeds w/ NULL Channel"); @@ -189,7 +142,6 @@ void RPCClient::construct(const ChannelProvider::shared_pointer& provider, throw std::logic_error("channel createChannelRPC() NULL"); } - void RPCClient::destroy() { if (m_channel) @@ -328,7 +280,4 @@ pvd::PVStructure::shared_pointer RPCClient::sendRequest(const std::string & serv } -} - -} - +}}// namespace epics::pvAccess