1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00

0031310: Application Framework - A document with a reference array attribute crashes on attempt to save on disk

This commit is contained in:
vro 2020-01-21 11:46:45 +03:00 committed by abv
parent dbab9c538c
commit 59e11a2f75

View File

@ -117,15 +117,16 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
if (aValueStr == NULL) if (aValueStr == NULL)
{ {
myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail); myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail);
return Standard_False;
} }
else
{
TCollection_AsciiString anEntry; TCollection_AsciiString anEntry;
if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False) if (XmlObjMgt::GetTagEntryString(aValueStr, anEntry) == Standard_False)
{ {
TCollection_ExtendedString aMessage = TCollection_ExtendedString aMessage =
TCollection_ExtendedString ("Cannot retrieve reference from \"") TCollection_ExtendedString("Cannot retrieve reference from \"")
+ aValueStr + '\"'; + aValueStr + '\"';
myMessageDriver->Send (aMessage, Message_Fail); myMessageDriver->Send(aMessage, Message_Fail);
return Standard_False; return Standard_False;
} }
// Find label by entry // Find label by entry
@ -138,21 +139,23 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
aCurNode = aCurElement->getNextSibling(); aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode; aCurElement = (LDOM_Element*)&aCurNode;
} }
}
// Last reference // Last reference
aValueStr = XmlObjMgt::GetStringValue( *aCurElement ); aValueStr = XmlObjMgt::GetStringValue( *aCurElement );
if (aValueStr == NULL) if (aValueStr == NULL)
{ {
myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail); myMessageDriver->Send ("Cannot retrieve reference string from element", Message_Fail);
return Standard_False;
} }
else
{
TCollection_AsciiString anEntry; TCollection_AsciiString anEntry;
if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False) if (XmlObjMgt::GetTagEntryString(aValueStr, anEntry) == Standard_False)
{ {
TCollection_ExtendedString aMessage = TCollection_ExtendedString aMessage =
TCollection_ExtendedString ("Cannot retrieve reference from \"") TCollection_ExtendedString("Cannot retrieve reference from \"")
+ aValueStr + '\"'; + aValueStr + '\"';
myMessageDriver->Send (aMessage, Message_Fail); myMessageDriver->Send(aMessage, Message_Fail);
return Standard_False; return Standard_False;
} }
// Find label by entry // Find label by entry
@ -162,6 +165,7 @@ Standard_Boolean XmlMDataStd_ReferenceArrayDriver::Paste(const XmlObjMgt_Persist
TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True); TDF_Tool::Label(aReferenceArray->Label().Data(), anEntry, tLab, Standard_True);
} }
aReferenceArray->SetValue(i, tLab); aReferenceArray->SetValue(i, tLab);
}
return Standard_True; return Standard_True;
} }
@ -192,11 +196,12 @@ void XmlMDataStd_ReferenceArrayDriver::Paste(const Handle(TDF_Attribute)& theSou
for (Standard_Integer i = aL; i <= anU; i++) for (Standard_Integer i = aL; i <= anU; i++)
{ {
if (L.IsDescendant(aReferenceArray->Value(i).Root())) const TDF_Label& label = aReferenceArray->Value(i);
if (!label.IsNull() && L.IsDescendant(label.Root()))
{ {
// Internal reference // Internal reference
TCollection_AsciiString anEntry; TCollection_AsciiString anEntry;
TDF_Tool::Entry(aReferenceArray->Value(i), anEntry); TDF_Tool::Entry(label, anEntry);
XmlObjMgt_DOMString aDOMString; XmlObjMgt_DOMString aDOMString;
XmlObjMgt::SetTagEntryString (aDOMString, anEntry); XmlObjMgt::SetTagEntryString (aDOMString, anEntry);