diff --git a/src/copy/createRequest.cpp b/src/copy/createRequest.cpp index 15daee6..1857e1b 100644 --- a/src/copy/createRequest.cpp +++ b/src/copy/createRequest.cpp @@ -22,13 +22,13 @@ using std::endl; using std::string; using std::vector; -namespace epics { namespace pvData { +namespace { +using namespace epics::pvData; static PVDataCreatePtr pvDataCreate = getPVDataCreate(); static FieldCreatePtr fieldCreate = getFieldCreate(); -class CreateRequestImpl : public CreateRequest { -private: +struct CreateRequestImpl { struct Node { @@ -54,12 +54,7 @@ private: string fullFieldName; -public: - CreateRequestImpl() - { - fullFieldName = ""; - } -private: + CreateRequestImpl() {} void removeBlanks(string& str) @@ -75,8 +70,7 @@ private: size_t openBrace = request.find('{', index+1); size_t closeBrace = request.find('}', index+1); if(openBrace == string::npos && closeBrace == string::npos){ - message = request + " mismatched {}"; - throw std::logic_error("message"); + throw std::logic_error(request + " mismatched {}"); } if (openBrace != string::npos && openBrace!=0) { if(openBrace top; try { @@ -379,9 +366,8 @@ public: size_t openBracket = request.find('[', offsetRecord); size_t closeBracket = request.find(']', openBracket); if(closeBracket==string::npos) { - message = request.substr(offsetRecord) + - "record[ does not have matching ]"; - return PVStructurePtr(); + throw std::logic_error(request.substr(offsetRecord) + + "record[ does not have matching ]"); } if(closeBracket-openBracket > 3) { Node node("record"); @@ -397,9 +383,8 @@ public: size_t openParan = request.find('(', offsetField); size_t closeParan = request.find(')', openParan); if(closeParan==string::npos) { - message = request.substr(offsetField) - + " field( does not have matching )"; - return PVStructurePtr(); + throw std::logic_error(request.substr(offsetField) + + " field( does not have matching )"); } if(closeParan>openParan+1) { createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); @@ -412,9 +397,8 @@ public: size_t openParan = request.find('(', offsetGetField); size_t closeParan = request.find(')', openParan); if(closeParan==string::npos) { - message = request.substr(offsetField) - + " getField( does not have matching )"; - return PVStructurePtr(); + throw std::logic_error(request.substr(offsetField) + + " getField( does not have matching )"); } if(closeParan>openParan+1) { createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); @@ -427,9 +411,8 @@ public: size_t openParan = request.find('(', offsetPutField); size_t closeParan = request.find(')', openParan); if(closeParan==string::npos) { - message = request.substr(offsetField) - + " putField( does not have matching )"; - return PVStructurePtr(); + throw std::logic_error(request.substr(offsetField) + + " putField( does not have matching )"); } if(closeParan>openParan+1) { createSubNode(node,request.substr(openParan+1,closeParan-openParan-1)); @@ -437,9 +420,7 @@ public: top.push_back(node); } } catch (std::exception &e) { - string xxx = e.what(); - message = "while creating Structure exception " + xxx; - return PVStructurePtr(); + throw std::logic_error(std::string("while creating Structure exception ")+e.what()); } size_t num = top.size(); StringArray names(num); @@ -467,20 +448,38 @@ public: } optionList.clear(); return pvStructure; - } catch (std::exception &e) { - message = e.what(); - return PVStructurePtr(); } } }; +} // namespace + +namespace epics {namespace pvData { + CreateRequest::shared_pointer CreateRequest::create() { - CreateRequest::shared_pointer createRequest(new CreateRequestImpl()); + CreateRequest::shared_pointer createRequest(new CreateRequest()); return createRequest; } -}} +PVStructure::shared_pointer CreateRequest::createRequest(std::string const & request) +{ + try { + return ::createRequest(request); + } catch(std::exception& e) { + message = e.what(); + return PVStructure::shared_pointer(); + } +} + +PVStructure::shared_pointer createRequest(std::string const & request) +{ + CreateRequestImpl I; + return I.createRequest(request); +} + + +}} // namespace diff --git a/src/copy/pv/createRequest.h b/src/copy/pv/createRequest.h index 1bc0d1d..0d47f53 100644 --- a/src/copy/pv/createRequest.h +++ b/src/copy/pv/createRequest.h @@ -32,7 +32,7 @@ class epicsShareClass CreateRequest { * @returns A shared pointer to the new instance. */ static CreateRequest::shared_pointer create(); - virtual ~CreateRequest() {}; + ~CreateRequest() {}; /** * Create a request structure for the create calls in Channel. * See the package overview documentation for details. @@ -41,7 +41,7 @@ class epicsShareClass CreateRequest { * If a NULL PVStructure is returned then getMessage will return * the reason. */ - virtual PVStructure::shared_pointer createRequest(std::string const & request) = 0; + PVStructure::shared_pointer createRequest(std::string const & request); /** * Get the error message of createRequest returns NULL * return the error message @@ -52,6 +52,14 @@ protected: std::string message; }; +/** Parse and build pvRequest structure. + * + @params request the Request string to be parsed. eg. "field(value)" + @returns The resulting strucuture. Never NULL + @throws std::exception for various parsing errors + */ +epicsShareExtern +PVStructure::shared_pointer createRequest(std::string const & request); }}