diff --git a/pvDataApp/factory/PVField.cpp b/pvDataApp/factory/PVField.cpp index 3b35602..26d7659 100644 --- a/pvDataApp/factory/PVField.cpp +++ b/pvDataApp/factory/PVField.cpp @@ -60,16 +60,7 @@ void PVField::message(String message,MessageType messageType) String PVField::getFieldName() { - if(parent==NULL) return fieldName; - PVFieldPtrArray pvFields = parent->getPVFields(); - StringArray const & fieldNames = parent->getStructure()->getFieldNames(); - for(size_t i=0; irenameField(i,newName); + fieldName = newName; return; } } @@ -174,9 +166,10 @@ void PVField::setPostHandler(PostHandler *postHandler) postHandler = postHandler; } -void PVField::setParent(PVStructure * xxx) +void PVField::setParentAndName(PVStructure * xxx,String & name) { parent = xxx; + fieldName = name; } bool PVField::equals(PVField &pv) diff --git a/pvDataApp/factory/PVStructure.cpp b/pvDataApp/factory/PVStructure.cpp index 1d645f6..83516a2 100644 --- a/pvDataApp/factory/PVStructure.cpp +++ b/pvDataApp/factory/PVStructure.cpp @@ -47,13 +47,14 @@ PVStructure::PVStructure(StructureConstPtr& structurePtr) { size_t numberFields = structurePtr->getNumberFields(); FieldConstPtrArray fields = structurePtr->getFields(); + StringArray fieldNames = structurePtr->getFieldNames(); pvFields.reserve(numberFields); PVDataCreatePtr pvDataCreate = getPVDataCreate(); for(size_t i=0; icreatePVField(fields[i])); } for(size_t i=0; isetParent(this); + pvFields[i]->setParentAndName(this,fieldNames[i]); } } @@ -65,9 +66,10 @@ PVStructure::PVStructure(StructureConstPtr structurePtr, extendsStructureName("") { size_t numberFields = structurePtr->getNumberFields(); + StringArray fieldNames = structurePtr->getFieldNames(); pvFields = pvs; for(size_t i=0; isetParent(this); + pvFields[i]->setParentAndName(this,fieldNames[i]); } } @@ -124,7 +126,10 @@ void PVStructure::appendPVField(String fieldName,PVFieldPtr & pvField ) FieldConstPtr field = getFieldCreate()->appendField(structurePtr,fieldName,pvField->getField()); replaceField(field); structurePtr = static_pointer_cast(field); - for(size_t i=0; isetParent(this); + StringArray fieldNames = structurePtr->getFieldNames(); + for(size_t i=0; isetParentAndName(this,fieldNames[i]); + } } void PVStructure::appendPVFields(StringArray &fieldNames,PVFieldPtrArray &pvFields) @@ -148,7 +153,10 @@ void PVStructure::appendPVFields(StringArray &fieldNames,PVFieldPtrArray &pvFiel FieldConstPtr field = getFieldCreate()->appendFields(structurePtr,fieldNames,fields); replaceField(field); structurePtr = static_pointer_cast(field); - for(size_t i=0; isetParent(this); + StringArray names = structurePtr->getFieldNames(); + for(size_t i=0; isetParentAndName(this,names[i]); + } } void PVStructure::removePVField(String fieldName) @@ -181,7 +189,10 @@ void PVStructure::removePVField(String fieldName) FieldConstPtr field = getFieldCreate()->createStructure(newFieldNames,fields); replaceField(field); structurePtr = static_pointer_cast(field); - for(size_t i=0; isetParent(this); + StringArray fieldNames = structurePtr->getFieldNames(); + for(size_t i=0; isetParentAndName(this,fieldNames[i]); + } } PVBooleanPtr PVStructure::getBooleanField(String fieldName) @@ -629,9 +640,14 @@ static PVFieldPtr &findSubField(String fieldName,PVStructure *pvStructure) { pvField = pvFields[i]; size_t result = pvField->getFieldName().compare(name); if(result==0) { - if(restOfName.length()==0) return pvFields[i]; + if(restOfName.length()==0) { + PVFieldPtr & xxx = pvFields[i]; +printf("%p %p\n",pvFields[i].get(),xxx.get()); + return pvFields[i]; + } if(pvField->getField()->getType()!=structure) return nullPVField; - PVStructurePtr pvStructure = std::tr1::static_pointer_cast(pvField); + PVStructurePtr pvStructure = + std::tr1::static_pointer_cast(pvField); return findSubField(restOfName,pvStructure.get()); } } diff --git a/pvDataApp/pv/pvData.h b/pvDataApp/pv/pvData.h index 9014735..6364844 100644 --- a/pvDataApp/pv/pvData.h +++ b/pvDataApp/pv/pvData.h @@ -254,7 +254,7 @@ public: virtual void toString(StringBuilder buf,int indentLevel) ; protected: PVField(FieldConstPtr field); - void setParent(PVStructure *parent); + void setParentAndName(PVStructure *parent, String & fieldName); void replaceField(FieldConstPtr &field); private: void message(String fieldName,String message,MessageType messageType); diff --git a/testApp/pv/testPVAppend.cpp b/testApp/pv/testPVAppend.cpp index 8240939..c4fda6e 100644 --- a/testApp/pv/testPVAppend.cpp +++ b/testApp/pv/testPVAppend.cpp @@ -24,6 +24,7 @@ using namespace epics::pvData; using std::tr1::static_pointer_cast; +using std::size_t; static FieldCreatePtr fieldCreate; static PVDataCreatePtr pvDataCreate; @@ -35,6 +36,34 @@ static String alarmTimeStamp("alarm,timeStamp"); static String alarmTimeStampValueAlarm("alarm,timeStamp,valueAlarm"); static String allProperties("alarm,timeStamp,display,control,valueAlarm"); +static void checkNameAndParent( + FILE *fd,PVStructurePtr & pvStructure, int indentLevel) +{ + builder.clear(); +// convert->newLine(&builder,indentLevel); +// fprintf(fd,"%s this %p indentLevel %d", +// builder.c_str(),pvStructure.get(),indentLevel); + PVFieldPtrArray pvFields = pvStructure->getPVFields(); + StringArray fieldNames = pvStructure->getStructure()->getFieldNames(); + for(size_t i = 0; igetParent()==pvStructure.get()); + assert(pvField->getFieldName().compare(fieldNames[i])==0); + // builder.clear(); + // convert->newLine(&builder,indentLevel); + // fprintf(fd,"%s this %p name %s parent %p", + // builder.c_str(), + // pvField.get(), + // pvField->getFieldName().c_str(), + // pvField->getParent()); + if(pvField->getField()->getType()==structure) { + PVStructurePtr xxx = static_pointer_cast(pvField); + checkNameAndParent(fd,xxx,indentLevel+1); + } + } + builder.clear(); +} + static void testAppendSimple(FILE * fd) { PVFieldPtrArray fields; @@ -79,6 +108,7 @@ static void testAppendMore(FILE * fd) builder.clear(); pvStructure->toString(&builder); fprintf(fd,"%s\n",builder.c_str()); + checkNameAndParent(fd,pvStructure,0); } static void append2(PVStructurePtr pvStructure, @@ -124,8 +154,10 @@ static void testAppends(FILE * fd) builder.clear(); pvStructure->toString(&builder); fprintf(fd,"%s\n",builder.c_str()); + checkNameAndParent(fd,pvStructure,0); PVFieldPtr pvField = pvStructure->getSubField("child2.Bill"); - assert(pvField.get()!=0); +printf("pvField %p\n",pvField.get()); + assert(pvField.get()!=NULL); pvField->renameField("Joe"); builder.clear(); pvStructure->toString(&builder); @@ -134,6 +166,7 @@ static void testAppends(FILE * fd) builder.clear(); pvStructure->toString(&builder); fprintf(fd,"%s\n",builder.c_str()); + checkNameAndParent(fd,pvStructure,0); } int main(int argc,char *argv[])