diff --git a/pvDataApp/factory/Convert.cpp b/pvDataApp/factory/Convert.cpp index 0a96da4..1d32416 100644 --- a/pvDataApp/factory/Convert.cpp +++ b/pvDataApp/factory/Convert.cpp @@ -124,6 +124,44 @@ void Convert::getString(StringBuilder buf,PVField * pvField) convertToString(buf,pvField,0); } +int Convert::fromString(PVStructure *pvStructure, std::vector& from, int fromStartIndex) +{ + int processed = 0; + + PVFieldPtrArray fieldsData = pvStructure->getPVFields(); + if (fieldsData != 0) { + int length = pvStructure->getStructure()->getNumberFields(); + for(int i=0; igetField()->getType(); + if(type==structure) { + int count = fromString(static_cast(fieldField), from, fromStartIndex); + processed += count; + fromStartIndex += count; + } + else if(type==scalarArray) { + int count = fromString(static_cast(fieldField), from.at(fromStartIndex)); + processed += count; + fromStartIndex += count; + } + else if(type==scalar) { + fromString(static_cast(fieldField), from.at(fromStartIndex++)); + processed++; + } + else { + // structureArray not supported + String message("Convert::fromString unsupported fieldType "); + TypeFunc::toString(&message,type); + throw std::logic_error(message); + } + } + } + + return processed; +} + + void Convert::fromString(PVScalar *pvScalar, String from) { ScalarConstPtr scalar = pvScalar->getScalar(); diff --git a/pvDataApp/pv/convert.h b/pvDataApp/pv/convert.h index 0155462..53c9878 100644 --- a/pvDataApp/pv/convert.h +++ b/pvDataApp/pv/convert.h @@ -11,6 +11,7 @@ #include "pvIntrospect.h" #include "pvData.h" +#include namespace epics { namespace pvData { @@ -46,6 +47,7 @@ public: bool equals(PVField &a,PVField &b); void getString(StringBuilder buf,PVField * pvField,int indentLevel); void getString(StringBuilder buf,PVField *pvField); + int fromString(PVStructure *pv, std::vector& from, int fromStartIndex = 0); void fromString(PVScalar *pv, String from); int fromString(PVScalarArray *pv, String from); int fromStringArray(PVScalarArray *pv, int offset, int length,