diff --git a/testApp/remote/rpcServiceExample.cpp b/testApp/remote/rpcServiceExample.cpp index cab6dbe..e92bc12 100644 --- a/testApp/remote/rpcServiceExample.cpp +++ b/testApp/remote/rpcServiceExample.cpp @@ -10,33 +10,46 @@ using namespace epics::pvData; using namespace epics::pvAccess; - - -static StructureConstPtr createResultField() -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - - StringArray fieldNames; - fieldNames.push_back("c"); - FieldConstPtrArray fields; - fields.push_back(fieldCreate->createScalar(pvDouble)); - return fieldCreate->createStructure(fieldNames, fields); -} - -static StructureConstPtr resultStructure = createResultField(); +static Structure::const_shared_pointer resultStructure = + getFieldCreate()->createFieldBuilder()-> + add("c", pvDouble)-> + createStructure(); class SumServiceImpl : public RPCService { - PVStructure::shared_pointer request(PVStructure::shared_pointer const & args) + PVStructure::shared_pointer request(PVStructure::shared_pointer const & pvArguments) throw (RPCRequestException) { - // TODO error handling - double a = atof(args->getStringField("a")->get().c_str()); - double b = atof(args->getStringField("b")->get().c_str()); + // NTURI support + PVStructure::shared_pointer args( + (pvArguments->getStructure()->getID() == "uri:ev4:nt/2012/pwd:NTURI") ? + pvArguments->getStructureField("query") : + pvArguments + ); + // get fields and check their existence + PVScalar::shared_pointer af = args->getSubField("a"); + PVScalar::shared_pointer bf = args->getSubField("b"); + if (!af || !bf) + throw RPCRequestException(Status::STATUSTYPE_ERROR, "scalar 'a' and 'b' fields are required"); + + // get the numbers (and convert if neccessary) + double a, b; + try + { + a = af->getAs(); + b = bf->getAs(); + } + catch (std::exception &e) + { + throw RPCRequestException(Status::STATUSTYPE_ERROR, + std::string("failed to convert arguments to double: ") + e.what()); + } + + // create return structure and set data PVStructure::shared_pointer result = getPVDataCreate()->createPVStructure(resultStructure); - result->getDoubleField("c")->put(a+b); + result->getSubField("c")->put(a+b); return result; } };