static PyObject * _getColumn(PyObject *willbenull, PyObject *args) { PyObject *pcapsule = 0; const char *name = 0; if(!PyArg_ParseTuple(args,"Os:nttablePy", &pcapsule, &name)) { PyErr_SetString(PyExc_SyntaxError, "Bad argument. Expected (pvt,index)"); return NULL; } void *pvoid = PyCapsule_GetPointer(pcapsule,"nttablePvt"); if(pvoid==0) { PyErr_SetString(PyExc_SyntaxError, "first arg must be return from _init"); return NULL; } NTTablePvt *pvt = static_cast<NTTablePvt *>(pvoid); PVFieldPtr pvField = pvt->nttable->getColumn(name); Type type = pvField->getField()->getType(); if(type!=scalarArray) { PyErr_SetString(PyExc_SyntaxError, "logic error. Why is a column not a scalarArray?"); return NULL; } PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField); return getScalarArrayValue(pvScalarArray); }
std::ostream& PVStructure::dumpValue(std::ostream& o) const { o << format::indent() << getStructure()->getID() << ' ' << getFieldName(); String extendsName = getExtendsStructureName(); if(extendsName.length()>0) { o << " extends " << extendsName; } o << std::endl; { format::indent_scope s(o); PVFieldPtrArray const & fieldsData = getPVFields(); if (fieldsData.size() != 0) { size_t length = getStructure()->getNumberFields(); for(size_t i=0; i<length; i++) { PVFieldPtr fieldField = fieldsData[i]; Type type = fieldField->getField()->getType(); if (type == scalar || type == scalarArray) o << format::indent() << fieldField->getField()->getID() << ' ' << fieldField->getFieldName() << ' ' << *(fieldField.get()) << std::endl; else o << *(fieldField.get()); } } } return o; }
void PVStructure::deserialize(ByteBuffer *pbuffer, DeserializableControl *pcontrol, BitSet *pbitSet) { size_t offset = getFieldOffset(); size_t numberFields = getNumberFields(); int32 next = pbitSet->nextSetBit(offset); // no more changes or no changes in this structure if(next<0||next>=static_cast<int32>(offset+numberFields)) return; // entire structure if(static_cast<int32>(offset)==next) { deserialize(pbuffer, pcontrol); return; } size_t fieldsSize = pvFields.size(); for(size_t i = 0; i<fieldsSize; i++) { PVFieldPtr pvField = pvFields[i]; offset = pvField->getFieldOffset(); int32 inumberFields = pvField->getNumberFields(); next = pbitSet->nextSetBit(offset); // no more changes if(next<0) return; // no change in this pvField if(next>=static_cast<int32>(offset+inumberFields)) continue; // deserialize field or fields if(inumberFields==1) { pvField->deserialize(pbuffer, pcontrol); } else { PVStructurePtr pvStructure = std::tr1::static_pointer_cast<PVStructure>(pvField); pvStructure->deserialize(pbuffer, pcontrol, pbitSet); } } }
static PVFieldPtr findSubField( String const & fieldName, PVStructure const *pvStructure) { if( fieldName.length()<1) return PVFieldPtr(); String::size_type index = fieldName.find('.'); String name = fieldName; String restOfName = String(); if(index>0) { name = fieldName.substr(0, index); if(fieldName.length()>index) { restOfName = fieldName.substr(index+1); } } PVFieldPtrArray pvFields = pvStructure->getPVFields(); PVFieldPtr pvField; size_t numFields = pvStructure->getStructure()->getNumberFields(); for(size_t i=0; i<numFields; i++) { pvField = pvFields[i]; size_t result = pvField->getFieldName().compare(name); if(result==0) { if(restOfName.length()==0) return pvFields[i]; if(pvField->getField()->getType()!=structure) return PVFieldPtr(); PVStructurePtr pvStructure = std::tr1::static_pointer_cast<PVStructure>(pvField); return findSubField(restOfName,pvStructure.get()); } } return PVFieldPtr(); }
bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure) { if(!pvStructure) return false; PVUnionArrayPtr pvValue = pvStructure->getSubField<PVUnionArray>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("severity"); if(pvField && !pvStructure->getSubField<PVIntArray>("severity")) return false; pvField = pvStructure->getSubField("status"); if(pvField && !pvStructure->getSubField<PVIntArray>("status")) return false; pvField = pvStructure->getSubField("message"); if(pvField && !pvStructure->getSubField<PVStringArray>("message")) return false; pvField = pvStructure->getSubField("secondsPastEpoch"); if(pvField && !pvStructure->getSubField<PVLongArray>("secondsPastEpoch")) return false; pvField = pvStructure->getSubField("nanoseconds"); if(pvField && !pvStructure->getSubField<PVIntArray>("nanoseconds")) return false; pvField = pvStructure->getSubField("userTag"); if(pvField && !pvStructure->getSubField<PVIntArray>("userTag")) return false; return true; }
PVScalarArrayPtr PVStructure::getScalarArrayField( String const &fieldName,ScalarType elementType) { PVFieldPtr pvField = findSubField(fieldName,this); if(pvField.get()==NULL) { String message("fieldName "); message += fieldName + " does not exist"; this->message(message, errorMessage); return nullPVScalarArray; } FieldConstPtr field = pvField->getField(); Type type = field->getType(); if(type!=scalarArray) { String message("fieldName "); message += fieldName + " does not have type array "; this->message(message, errorMessage); return nullPVScalarArray; } ScalarArrayConstPtr pscalarArray = static_pointer_cast<const ScalarArray>(pvField->getField()); if(pscalarArray->getElementType()!=elementType) { String message("fieldName "); message += fieldName + " is array but does not have elementType "; ScalarTypeFunc::toString(&message,elementType); this->message(message, errorMessage); return nullPVScalarArray; } return std::tr1::static_pointer_cast<PVScalarArray>(pvField); }
void PVRecordStructure::init() { PVRecordField::init(); const PVFieldPtrArray & pvFields = pvStructure.lock()->getPVFields(); size_t numFields = pvFields.size(); pvRecordFields->reserve( numFields); PVRecordStructurePtr self = static_pointer_cast<PVRecordStructure>(shared_from_this()); PVRecordPtr pvRecord = getPVRecord(); for(size_t i=0; i<numFields; i++) { PVFieldPtr pvField = pvFields[i]; if(pvField->getField()->getType()==structure) { PVStructurePtr xxx = static_pointer_cast<PVStructure>(pvField); PVRecordStructurePtr pvRecordStructure( new PVRecordStructure(xxx,self,pvRecord)); pvRecordFields->push_back(pvRecordStructure); pvRecordStructure->init(); } else { PVRecordFieldPtr pvRecordField( new PVRecordField(pvField,self,pvRecord)); pvRecordFields->push_back(pvRecordField); pvRecordField->init(); } } }
string PvaClientData::getString() { if(PvaClient::getDebug()) cout << "PvaClientData::getString\n"; PVScalarPtr pvScalar; PVStructurePtr pvStructure = getPVStructure(); PVFieldPtr pvValue = pvStructure->getSubField("value"); if(pvValue) { Type type = pvValue->getField()->getType(); if(type==scalar) pvScalar = static_pointer_cast<PVScalar>(pvValue); } if(!pvScalar) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { throw std::logic_error( "PvaClientData::getString() pvRequest for multiple fields"); } PVFieldPtr pvField(fieldPtrArray[0]); Type type = pvField->getField()->getType(); if(type==scalar) { pvScalar = static_pointer_cast<PVScalar>(pvField); break; } if(pvField->getField()->getType()!=epics::pvData::structure) break; pvStructure = static_pointer_cast<PVStructure>(pvField); } } if(!pvScalar) { throw std::logic_error( "PvaClientData::getString() did not find a scalar field"); } return convert->toString(pvScalar); }
void PVStructure::setImmutable() { size_t numFields = pvFields.size(); for(size_t i=0; i<numFields; i++) { PVFieldPtr pvField = pvFields[i]; pvField->setImmutable(); } PVField::setImmutable(); }
bool NTTable::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVFieldPtr pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; PVStringArrayPtr pvLabel = pvStructure->getSubField<PVStringArray>("labels"); if(!pvLabel) return false; return true; }
static bool checkBitSetPVField( PVFieldPtr const &pvField,BitSetPtr const &bitSet,int32 initialOffset) { int32 offset = initialOffset; int32 nbits = static_cast<int32>(pvField->getNumberFields()); if(nbits==1) return bitSet->get(offset); int32 nextSetBit = bitSet->nextSetBit(offset); if(nextSetBit>=(offset+nbits)) return false; if(nextSetBit<0) return false; if(bitSet->get(offset)) { if(nbits>1) { for(int32 i=offset+1; i<offset+nbits; i++) bitSet->clear(i); } return true; } bool atLeastOneBitSet = false; bool allBitsSet = true; PVStructurePtr pvStructure = static_pointer_cast<PVStructure>(pvField); offset = static_cast<int32>(pvStructure->getFieldOffset()) + 1; while(offset<initialOffset + nbits) { PVFieldPtr pvSubField = pvStructure->getSubField(offset); int32 nbitsNow = static_cast<int32>(pvSubField->getNumberFields()); if(nbitsNow==1) { if(bitSet->get(offset)) { atLeastOneBitSet = true; } else { allBitsSet = false; } offset++; } else { bool result = checkBitSetPVField(pvSubField,bitSet,offset); if(result) { atLeastOneBitSet = true; if(!bitSet->get(offset)) { allBitsSet = false; } } else { allBitsSet = false; } offset += static_cast<int32>(pvSubField->getNumberFields()); } } if(allBitsSet) { if(nbits>1) { for(int32 i=initialOffset+1; i<initialOffset+nbits; i++) { bitSet->clear(i); } } bitSet->set(initialOffset); } return atLeastOneBitSet; }
static void testRequest() { StringArray nullNames; FieldConstPtrArray nullFields; StringArray optionNames(1); FieldConstPtrArray optionFields(1); optionNames[0] = "process"; optionFields[0] = fieldCreate->createScalar(pvString); StringArray recordNames(1); FieldConstPtrArray recordFields(1); recordNames[0] = "_options"; recordFields[0] = fieldCreate->createStructure(optionNames,optionFields); StringArray fieldNames(2); FieldConstPtrArray fieldFields(2); fieldNames[0] = "alarm"; fieldFields[0] = fieldCreate->createStructure(nullNames,nullFields); fieldNames[1] = "timeStamp"; fieldFields[1] = fieldCreate->createStructure(nullNames,nullFields); StringArray topNames(2); FieldConstPtrArray topFields(2); topNames[0] = "record"; topFields[0] = fieldCreate->createStructure(recordNames,recordFields); topNames[1] = "field"; topFields[1] = fieldCreate->createStructure(fieldNames,fieldFields); StructureConstPtr topStructure = fieldCreate->createStructure( topNames,topFields); cout << *topStructure << endl; PVStructurePtr pvTop = pvDataCreate->createPVStructure(topStructure); cout << *pvTop << endl; cout << *pvTop->getStructure() << endl; PVStructurePtr xxx = pvTop->getSubField<PVStructure>("record"); cout << *xxx << endl; xxx = pvTop->getSubField<PVStructure>("field"); cout << *xxx << endl; PVStringPtr pvString = pvTop->getSubField<PVString>("record._options.process"); pvString->put("true"); cout << *pvTop << endl; string subName("record._options.process"); PVFieldPtr pvField = pvTop->getSubField<PVString>(subName); string fieldName = pvField->getFieldName(); string fullName = pvField->getFullName(); cout << "fieldName " << fieldName << " fullName " << fullName << endl; testOk1(fieldName.compare("process")==0); testOk1(fullName.compare(subName)==0); }
Status PvValue::getAlarm(Alarm &alarm) { if(pvGetStructure.get()==NULL) { return Status(Status::STATUSTYPE_ERROR, "no alarm field"); } PVAlarm pvAlarm; PVFieldPtr pvField = pvGetStructure->getSubField("alarm"); if(pvField.get()==NULL) { return Status(Status::STATUSTYPE_ERROR, "no alarm field"); } if(!pvAlarm.attach(pvField)) { return Status(Status::STATUSTYPE_ERROR, "no alarm field"); } pvAlarm.get(alarm); return Status::Ok; }
Status PvValue::getTimeStamp(TimeStamp &timeStamp) { if(pvGetStructure.get()==NULL) { return Status(Status::STATUSTYPE_ERROR, "no timeStamp field"); } PVTimeStamp pvTimeStamp; PVFieldPtr pvField = pvGetStructure->getSubField("timeStamp"); if(pvField.get()==NULL) { return Status(Status::STATUSTYPE_ERROR, "no timeStamp field"); } if(!pvTimeStamp.attach(pvField)) { return Status(Status::STATUSTYPE_ERROR, "no timeStamp field"); } pvTimeStamp.get(timeStamp); return Status::Ok; }
std::ostream & PvaClientPutData::showChanged(std::ostream & out) { size_t nextSet = bitSet->nextSetBit(0); PVFieldPtr pvField; while(nextSet!=string::npos) { if(nextSet==0) { pvField = pvStructure; } else { pvField = pvStructure->getSubField(nextSet); } string name = pvField->getFullName(); out << name << " = " << pvField << endl; nextSet = bitSet->nextSetBit(nextSet+1); } return out; }
bool NTScalar::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVScalarPtr pvValue = pvStructure->getSubField<PVScalar>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("display"); if(pvField && !ntField->isDisplay(pvField->getField())) return false; pvField = pvStructure->getSubField("control"); if(pvField && !ntField->isControl(pvField->getField())) return false; return true; }
PVStructurePtr PVStructure::getStructureField(String const &fieldName) { PVFieldPtr pvField = findSubField(fieldName,this); if(pvField.get()==NULL) { String message("fieldName "); message += fieldName + " does not exist"; this->message(message, errorMessage); return nullPVStructure; } if(pvField->getField()->getType()==structure) { return std::tr1::static_pointer_cast<PVStructure>(pvField); } String message("fieldName "); message += fieldName + " does not have type structure "; this->message(message, errorMessage); return nullPVStructure; }
void PvValue::channelGetConnect( const Status& status, ChannelGet::shared_pointer const & channelGet, PVStructure::shared_pointer const & pvStructure, BitSet::shared_pointer const & bitSet) { if(!status.isOK()) { this->status = status; } else { this->status = Status::Ok; this->channelGet = channelGet; pvGetStructure = pvStructure; PVFieldPtr pvValue = pvGetStructure->getSubField("value"); PVFieldPtr pvAlarm = pvGetStructure->getSubField("alarm"); PVFieldPtr pvTimeStamp = pvGetStructure->getSubField("timeStamp"); bool allGood = true; if(pvValue.get()==NULL) allGood = false; if(!allGood) { string builder("channel "); builder += channelName; if(pvValue.get()==NULL) builder += " no value field "; if(pvAlarm.get()==NULL) builder += " no alarm field "; if(pvTimeStamp.get()==NULL) builder += " no timeStamp field "; this->status = Status(Status::STATUSTYPE_ERROR,builder); builder.clear(); pvGetStructure->toString(&builder); printf("channel %s pvGetStructure\n%s\n", channelName.c_str(),builder.c_str()); } } event.signal(); }
PVFieldPtr PVStructure::getSubField(size_t fieldOffset) const { if(fieldOffset<=getFieldOffset()) { return nullPVField; } if(fieldOffset>getNextFieldOffset()) return nullPVField; size_t numFields = pvFields.size(); for(size_t i=0; i<numFields; i++) { PVFieldPtr pvField = pvFields[i]; if(pvField->getFieldOffset()==fieldOffset) return pvFields[i]; if(pvField->getNextFieldOffset()<=fieldOffset) continue; if(pvField->getField()->getType()==structure) { PVStructure *pvStructure = static_cast<PVStructure *>(pvField.get()); return pvStructure->getSubField(fieldOffset); } } throw std::logic_error("PVStructure.getSubField: Logic error"); }
PVRecordField::PVRecordField( PVFieldPtr const & pvField, PVRecordStructurePtr const &parent, PVRecordPtr const & pvRecord) : pvField(pvField), isStructure(pvField->getField()->getType()==structure ? true : false), parent(parent), pvRecord(pvRecord) { }
void ChannelLocal::getField(GetFieldRequester::shared_pointer const &requester, string const &subField) { if(subField.size()<1) { StructureConstPtr structure = pvRecord->getPVRecordStructure()->getPVStructure()->getStructure(); requester->getDone(Status::Ok,structure); return; } PVFieldPtr pvField = pvRecord->getPVRecordStructure()->getPVStructure()->getSubField(subField); if(pvField) { requester->getDone(Status::Ok,pvField->getField()); return; } Status status(Status::STATUSTYPE_ERROR, "client asked for illegal field"); requester->getDone(status,FieldConstPtr()); }
shared_vector<const double> PvaClientData::getDoubleArray() { if(PvaClient::getDebug()) cout << "PvaClientData::getDoubleArray\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<PVScalarArray>(pvValue); } } if(!pvScalarArray) { while(true) { const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); if(fieldPtrArray.size()!=1) { throw std::logic_error( "PvaClientData::getDoubleArray() pvRequest for multiple fields"); } PVFieldPtr pvField(fieldPtrArray[0]); Type type = pvField->getField()->getType(); if(type==scalarArray) { pvScalarArray = static_pointer_cast<PVScalarArray>(pvField); break; } if(pvField->getField()->getType()!=epics::pvData::structure) break; pvStructure = static_pointer_cast<PVStructure>(pvField); } } if(!pvScalarArray) { throw std::logic_error( "PvaClientData::getDoubleArray() did not find a scalarArray field"); } ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType(); if(!ScalarTypeFunc::isNumeric(scalarType)) { throw std::logic_error( "PvaClientData::getDoubleArray() did not find a numeric scalarArray field"); } shared_vector<const double> retValue; pvScalarArray->getAs<const double>(retValue); return retValue; }
PVStringPtr PVStructure::getStringField(String const &fieldName) { PVFieldPtr pvField = findSubField(fieldName,this); if(pvField.get()==NULL) { String message("fieldName "); message += fieldName + " does not exist"; this->message(message, errorMessage); return nullPVString; } if(pvField->getField()->getType()==scalar) { ScalarConstPtr pscalar = static_pointer_cast<const Scalar>( pvField->getField()); if(pscalar->getScalarType()==pvString) { return std::tr1::static_pointer_cast<PVString>(pvField); } } String message("fieldName "); message += fieldName + " does not have type string "; this->message(message, errorMessage); return nullPVString; }
PvaClientPutData::PvaClientPutData(StructureConstPtr const & structure) : structure(structure), pvStructure(getPVDataCreate()->createPVStructure(structure)), bitSet(BitSetPtr(new BitSet(pvStructure->getNumberFields()))) { messagePrefix = ""; size_t nfields = pvStructure->getNumberFields(); postHandler.resize(nfields); PVFieldPtr pvField; for(size_t i =0; i<nfields; ++i) { postHandler[i] = PostHandlerPtr(new PvaClientPostHandlerPvt(this, i)); if(i==0) { pvField = pvStructure; } else { pvField = pvStructure->getSubField(i); } pvField->setPostHandler(postHandler[i]); } pvValue = pvStructure->getSubField("value"); }
bool RecordListRecord::init() { initPVRecord(); PVStructurePtr pvStructure = getPVStructure(); database = pvStructure->getStringField("argument.database"); if(database.get()==NULL) return false; regularExpression = pvStructure->getStringField( "argument.regularExpression"); if(regularExpression.get()==NULL) return false; status = pvStructure->getStringField("result.status"); if(status.get()==NULL) return false; PVFieldPtr pvField = pvStructure->getSubField("result.names"); if(pvField.get()==NULL) { std::cerr << "no result.names" << std::endl; return false; } name = static_pointer_cast<PVStringArray>( pvStructure->getScalarArrayField("result.names",pvString)); if(name.get()==NULL) return false; return true; }
PVRecordFieldPtr PVRecord::findPVRecordField( PVRecordStructurePtr const & pvrs, PVFieldPtr const & pvField) { size_t desiredOffset = pvField->getFieldOffset(); PVFieldPtr pvf = pvrs->getPVField(); size_t offset = pvf->getFieldOffset(); if(offset==desiredOffset) return pvrs; PVRecordFieldPtrArrayPtr pvrfpap = pvrs->getPVRecordFields(); PVRecordFieldPtrArray::iterator iter; for (iter = pvrfpap.get()->begin(); iter!=pvrfpap.get()->end(); iter++ ) { PVRecordFieldPtr pvrf = *iter; pvf = pvrf->getPVField(); offset = pvf->getFieldOffset(); if(offset==desiredOffset) return pvrf; size_t nextOffset = pvf->getNextFieldOffset(); if(nextOffset<=desiredOffset) continue; return findPVRecordField( static_pointer_cast<PVRecordStructure>(pvrf), pvField); } throw std::logic_error( recordName + " pvField " + pvField->getFieldName() + " not in PVRecord"); }
static void testScalarArrayCommon(string /*fieldName*/,ScalarType stype) { PVStructurePtr pvStructure = standardPVField->scalarArray( stype,alarmTimeStamp); PVScalarArrayPtr scalarArray = pvStructure->getSubField<PVScalarArray>("value"); testOk1(scalarArray.get()!=0); if(stype==pvBoolean) { StringArray values(3); values[0] = "true"; values[1] = "false"; values[2] = "true"; convert->fromStringArray(scalarArray, 0,3,values,0); } else { StringArray values(3); values[0] = "0"; values[1] = "1"; values[2] = "2"; convert->fromStringArray(scalarArray, 0,3,values,0); } PVFieldPtr pvField = pvStructure->getSubField<PVInt>("alarm.status"); testOk1(pvField.get()!=0); }
size_t Convert::fromString(PVStructurePtr const &pvStructure, StringArray const & from, size_t fromStartIndex) { size_t processed = 0; PVFieldPtrArray const & fieldsData = pvStructure->getPVFields(); if (fieldsData.size() != 0) { size_t length = pvStructure->getStructure()->getNumberFields(); for(size_t i=0; i<length; i++) { PVFieldPtr fieldField = fieldsData[i]; Type type = fieldField->getField()->getType(); if(type==structure) { PVStructurePtr pv = static_pointer_cast<PVStructure>(fieldField); size_t count = fromString(pv, from, fromStartIndex); processed += count; fromStartIndex += count; } else if(type==scalarArray) { PVScalarArrayPtr pv = static_pointer_cast<PVScalarArray>(fieldField); size_t count = fromString(pv, from[fromStartIndex]); processed += count; fromStartIndex += count; } else if(type==scalar) { PVScalarPtr pv = static_pointer_cast<PVScalar>(fieldField); fromString(pv, from[fromStartIndex++]); processed++; } else { // union, structureArray, unionArray not supported std::ostringstream oss; oss << "Convert::fromString unsupported fieldType " << type; throw std::logic_error(oss.str()); } } } return processed; }
bool PVEnumerated::attach(PVFieldPtr const & pvField) { if(pvField->getField()->getType()!=structure) return false; PVStructurePtr pvStructure = static_pointer_cast<PVStructure>(pvField); pvIndex = pvStructure->getSubField<PVInt>("index"); if(pvIndex.get()==NULL) return false; PVStringArrayPtr pvStringArray = pvStructure->getSubField<PVStringArray>("choices"); if(pvStringArray.get()==NULL) { pvIndex.reset(); return false; } pvChoices = pvStringArray; return true; }
PVFieldPtr PVDataCreate::createPVField(PVFieldPtr const & fieldToClone) { switch(fieldToClone->getField()->getType()) { case scalar: { PVScalarPtr pvScalar = static_pointer_cast<PVScalar>(fieldToClone); return createPVScalar(pvScalar); } case scalarArray: { PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(fieldToClone); return createPVScalarArray(pvScalarArray); } case structure: { PVStructurePtr pvStructure = static_pointer_cast<PVStructure>(fieldToClone); StringArray const & fieldNames = pvStructure->getStructure()->getFieldNames(); PVFieldPtrArray const & pvFieldPtrArray = pvStructure->getPVFields(); return createPVStructure(fieldNames,pvFieldPtrArray); } case structureArray: { PVStructureArrayPtr from = static_pointer_cast<PVStructureArray>(fieldToClone); StructureArrayConstPtr structureArray = from->getStructureArray(); PVStructureArrayPtr to = createPVStructureArray( structureArray); to->copyUnchecked(*from); return to; } case union_: { PVUnionPtr pvUnion = static_pointer_cast<PVUnion>(fieldToClone); return createPVUnion(pvUnion); } case unionArray: { PVUnionArrayPtr from = static_pointer_cast<PVUnionArray>(fieldToClone); UnionArrayConstPtr unionArray = from->getUnionArray(); PVUnionArrayPtr to = createPVUnionArray(unionArray); to->copyUnchecked(*from); return to; } } throw std::logic_error("PVDataCreate::createPVField should never get here"); }