void NTNDArrayConverter::fromAttributes (NDArray *src) { PVStructureArrayPtr dest(m_array->getAttribute()); NDAttributeList *srcList = src->pAttributeList; NDAttribute *attr = NULL; StructureConstPtr structure(dest->getStructureArray()->getStructure()); PVStructureArray::svector destVec(dest->reuse()); destVec.resize(srcList->count()); size_t i = 0; while((attr = srcList->next(attr))) { if(!destVec[i].get() || !destVec[i].unique()) destVec[i] = PVDC->createPVStructure(structure); PVStructurePtr pvAttr(destVec[i]); pvAttr->getSubField<PVString>("name")->put(attr->getName()); pvAttr->getSubField<PVString>("descriptor")->put(attr->getDescription()); pvAttr->getSubField<PVString>("source")->put(attr->getSource()); NDAttrSource_t sourceType; attr->getSourceInfo(&sourceType); pvAttr->getSubField<PVInt>("sourceType")->put(sourceType); switch(attr->getDataType()) { case NDAttrInt8: fromAttribute <PVByte, int8_t> (pvAttr, attr); break; case NDAttrUInt8: fromAttribute <PVUByte, uint8_t> (pvAttr, attr); break; case NDAttrInt16: fromAttribute <PVShort, int16_t> (pvAttr, attr); break; case NDAttrUInt16: fromAttribute <PVUShort, uint16_t>(pvAttr, attr); break; case NDAttrInt32: fromAttribute <PVInt, int32_t> (pvAttr, attr); break; case NDAttrUInt32: fromAttribute <PVUInt, uint32_t>(pvAttr, attr); break; case NDAttrFloat32: fromAttribute <PVFloat, float> (pvAttr, attr); break; case NDAttrFloat64: fromAttribute <PVDouble, double> (pvAttr, attr); break; case NDAttrString: fromStringAttribute(pvAttr, attr); break; case NDAttrUndefined: fromUndefinedAttribute(pvAttr); break; default: throw std::runtime_error("invalid attribute data type"); } ++i; } dest->replace(freeze(destVec)); }