1 // File: XmlMDataStd_ReferenceListDriver.cxx
2 // Created: May 29 11:40:00 2007
3 // Author: Vlad Romashko
4 // <vladislav.romashko@opencascade.com>
5 // Copyright: Open CASCADE
7 #include <XmlMDataStd_ReferenceListDriver.ixx>
8 #include <XmlObjMgt.hxx>
9 #include <XmlObjMgt_Document.hxx>
10 #include <LDOM_MemManager.hxx>
12 #include <TDF_Tool.hxx>
13 #include <TDF_Label.hxx>
14 #include <TDataStd_ReferenceList.hxx>
15 #include <TDF_ListIteratorOfLabelList.hxx>
17 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
18 IMPLEMENT_DOMSTRING (LastIndexString, "last")
19 IMPLEMENT_DOMSTRING (ExtString, "string")
21 //=======================================================================
22 //function : XmlMDataStd_ReferenceListDriver
23 //purpose : Constructor
24 //=======================================================================
25 XmlMDataStd_ReferenceListDriver::XmlMDataStd_ReferenceListDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
26 : XmlMDF_ADriver (theMsgDriver, NULL)
31 //=======================================================================
34 //=======================================================================
35 Handle(TDF_Attribute) XmlMDataStd_ReferenceListDriver::NewEmpty() const
37 return new TDataStd_ReferenceList();
40 //=======================================================================
42 //purpose : persistent -> transient (retrieve)
43 //=======================================================================
44 Standard_Boolean XmlMDataStd_ReferenceListDriver::Paste(const XmlObjMgt_Persistent& theSource,
45 const Handle(TDF_Attribute)& theTarget,
46 XmlObjMgt_RRelocationTable& ) const
48 Standard_Integer aFirstInd, aLastInd;
49 const XmlObjMgt_Element& anElement = theSource;
51 // Read the FirstIndex; if the attribute is absent initialize to 1
52 XmlObjMgt_DOMString aFirstIndex= anElement.getAttribute(::FirstIndexString());
53 if (aFirstIndex == NULL)
55 else if (!aFirstIndex.GetInteger(aFirstInd))
57 TCollection_ExtendedString aMessageString =
58 TCollection_ExtendedString("Cannot retrieve the first index"
59 " for ReferenceList attribute as \"")
61 WriteMessage (aMessageString);
62 return Standard_False;
65 // Read the LastIndex; the attribute should present
66 if (!anElement.getAttribute(::LastIndexString()).GetInteger(aLastInd))
68 TCollection_ExtendedString aMessageString =
69 TCollection_ExtendedString("Cannot retrieve the last index"
70 " for ReferenceList attribute as \"")
72 WriteMessage (aMessageString);
73 return Standard_False;
76 Handle(TDataStd_ReferenceList) aReferenceList = Handle(TDataStd_ReferenceList)::DownCast(theTarget);
78 if (!anElement.hasChildNodes())
80 TCollection_ExtendedString aMessageString =
81 TCollection_ExtendedString("Cannot retrieve a list of reference");
82 WriteMessage (aMessageString);
83 return Standard_False;
86 LDOM_Node aCurNode = anElement.getFirstChild();
87 LDOM_Element* aCurElement = (LDOM_Element*)&aCurNode;
88 XmlObjMgt_DOMString aValueStr;
89 while (*aCurElement != anElement.getLastChild())
91 aValueStr = XmlObjMgt::GetStringValue( *aCurElement );
92 if (aValueStr == NULL)
94 WriteMessage ("Cannot retrieve reference string from element");
95 return Standard_False;
97 TCollection_AsciiString anEntry;
98 if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False)
100 TCollection_ExtendedString aMessage =
101 TCollection_ExtendedString ("Cannot retrieve reference from \"")
103 WriteMessage (aMessage);
104 return Standard_False;
106 // Find label by entry
107 TDF_Label tLab; // Null label.
108 if (anEntry.Length() > 0)
110 TDF_Tool::Label(aReferenceList->Label().Data(), anEntry, tLab, Standard_True);
112 aReferenceList->Append(tLab);
113 aCurNode = aCurElement->getNextSibling();
114 aCurElement = (LDOM_Element*)&aCurNode;
118 aValueStr = XmlObjMgt::GetStringValue( *aCurElement );
119 if (aValueStr == NULL)
121 WriteMessage ("Cannot retrieve reference string from element");
122 return Standard_False;
124 TCollection_AsciiString anEntry;
125 if (XmlObjMgt::GetTagEntryString (aValueStr, anEntry) == Standard_False)
127 TCollection_ExtendedString aMessage =
128 TCollection_ExtendedString ("Cannot retrieve reference from \"")
130 WriteMessage (aMessage);
131 return Standard_False;
133 // Find label by entry
134 TDF_Label tLab; // Null label.
135 if (anEntry.Length() > 0)
137 TDF_Tool::Label(aReferenceList->Label().Data(), anEntry, tLab, Standard_True);
139 aReferenceList->Append(tLab);
141 return Standard_True;
144 //=======================================================================
146 //purpose : transient -> persistent (store)
147 //=======================================================================
148 void XmlMDataStd_ReferenceListDriver::Paste(const Handle(TDF_Attribute)& theSource,
149 XmlObjMgt_Persistent& theTarget,
150 XmlObjMgt_SRelocationTable& ) const
152 Handle(TDataStd_ReferenceList) aReferenceList = Handle(TDataStd_ReferenceList)::DownCast(theSource);
153 TDF_Label L = aReferenceList->Label();
156 WriteMessage ("Label of a ReferenceList is Null.");
160 Standard_Integer anU = aReferenceList->Extent();
161 XmlObjMgt_Element& anElement = theTarget;
162 anElement.setAttribute(::LastIndexString(), anU);
164 XmlObjMgt_Document aDoc = anElement.getOwnerDocument().Doc();
166 TDF_ListIteratorOfLabelList itr(aReferenceList->List());
167 for (; itr.More(); itr.Next())
169 if (L.IsDescendant(itr.Value().Root()))
171 // Internal reference
172 TCollection_AsciiString anEntry;
173 TDF_Tool::Entry(itr.Value(), anEntry);
175 XmlObjMgt_DOMString aDOMString;
176 XmlObjMgt::SetTagEntryString (aDOMString, anEntry);
177 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
178 XmlObjMgt::SetStringValue (aCurTarget, aDOMString, Standard_True);
179 anElement.appendChild( aCurTarget );