diff --git a/src/pvaClientData.cpp b/src/pvaClientData.cpp index 7f14e5a..8cb06e7 100644 --- a/src/pvaClientData.cpp +++ b/src/pvaClientData.cpp @@ -290,19 +290,16 @@ shared_vector PvaClientData::getDoubleArray() shared_vector PvaClientData::getStringArray() { if(PvaClient::getDebug()) cout << "PvaClientData::getStringArray\n"; - PVStringArrayPtr pvStringArray; + PVScalarArrayPtr pvScalarArray; PVStructurePtr pvStructure = getPVStructure(); PVFieldPtr pvValue = pvStructure->getSubField("value"); if(pvValue) { Type type = pvValue->getField()->getType(); if(type==scalarArray) { - PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvValue); - if(pvScalarArray->getScalarArray()->getElementType()==pvString) { - pvStringArray = static_pointer_cast(pvValue); - } + pvScalarArray = static_pointer_cast(pvValue); } } - if(!pvStringArray) { + if(!pvScalarArray) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { @@ -314,7 +311,7 @@ shared_vector PvaClientData::getStringArray() if(type==scalarArray) { PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); if(pvScalarArray->getScalarArray()->getElementType()==pvString) { - pvStringArray = static_pointer_cast(pvField); + pvScalarArray = static_pointer_cast(pvField); break; } } @@ -322,14 +319,15 @@ shared_vector PvaClientData::getStringArray() pvStructure = static_pointer_cast(pvField); } } - if(!pvStringArray) { + if(!pvScalarArray) { throw std::logic_error( "PvaClientData::getStringArray() did not find a scalarArray field"); } - return pvStringArray->view(); + shared_vector retValue; + pvScalarArray->getAs(retValue); + return retValue; } - Alarm PvaClientData::getAlarm() { if(PvaClient::getDebug()) cout << "PvaClientData::getAlarm\n"; diff --git a/src/pvaClientPutData.cpp b/src/pvaClientPutData.cpp index 8698622..e1fe8ce 100644 --- a/src/pvaClientPutData.cpp +++ b/src/pvaClientPutData.cpp @@ -194,31 +194,28 @@ void PvaClientPutData::putDoubleArray(shared_vector const & value) void PvaClientPutData::putStringArray(shared_vector const & value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putStringArray\n"; - PVStringArrayPtr pvStringArray; + PVScalarArrayPtr pvScalarArray; PVStructurePtr pvStructure = getPVStructure(); PVFieldPtr pvValue = pvStructure->getSubField("value"); if(pvValue) { Type type = pvValue->getField()->getType(); if(type==scalarArray) { - PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvValue); - if(pvScalarArray->getScalarArray()->getElementType()==pvString) { - pvStringArray = static_pointer_cast(pvValue); - } + pvScalarArray = static_pointer_cast(pvValue); } } - if(!pvStringArray) { + if(!pvScalarArray) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { throw std::logic_error( - "PvaClientData::getStringArray() pvRequest for multiple fields"); + "PvaClientData::putStringArray() pvRequest for multiple fields"); } PVFieldPtr pvField(fieldPtrArray[0]); Type type = pvField->getField()->getType(); if(type==scalarArray) { PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); if(pvScalarArray->getScalarArray()->getElementType()==pvString) { - pvStringArray = static_pointer_cast(pvField); + pvScalarArray = static_pointer_cast(pvField); break; } } @@ -226,45 +223,21 @@ void PvaClientPutData::putStringArray(shared_vector const & v pvStructure = static_pointer_cast(pvField); } } - if(!pvStringArray) { + if(!pvScalarArray) { throw std::logic_error( - "PvaClientData::getStringArray() did not find a scalarArray field"); + "PvaClientData::putStringArray() did not find a scalarArray field"); } - pvStringArray->replace(value); + pvScalarArray->putFrom(value); + return; } -void PvaClientPutData::putStringArray(std::vector const & value) +void PvaClientPutData::putStringArray(std::vector const & value) { - if(PvaClient::getDebug()) cout << "PvaClientPutData::putStringArray\n"; - PVScalarArrayPtr pvScalarArray; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalarArray) pvScalarArray = static_pointer_cast(pvValue); - } - if(!pvScalarArray) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::getStringArray() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalarArray) { - throw std::logic_error( - "PvaClientData::getStringArray() did not find a scalarArray field"); - } - convert->fromStringArray(pvScalarArray,0,value.size(),value,0); + size_t length = value.size(); + shared_vector val(length); + for(size_t i=0; i < length; ++i) val[i] = value[i]; + putStringArray(freeze(val)); + return; } void PvaClientPutData::postPut(size_t fieldNumber)