1 // File: XmlMDataStd_BooleanArrayDriver.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_BooleanArrayDriver.ixx>
8 #include <TDataStd_BooleanArray.hxx>
9 #include <TColStd_HArray1OfByte.hxx>
10 #include <XmlObjMgt.hxx>
12 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
13 IMPLEMENT_DOMSTRING (LastIndexString, "last")
15 //=======================================================================
16 //function : XmlMDataStd_BooleanArrayDriver
17 //purpose : Constructor
18 //=======================================================================
19 XmlMDataStd_BooleanArrayDriver::XmlMDataStd_BooleanArrayDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
20 : XmlMDF_ADriver (theMsgDriver, NULL)
25 //=======================================================================
28 //=======================================================================
29 Handle(TDF_Attribute) XmlMDataStd_BooleanArrayDriver::NewEmpty() const
31 return new TDataStd_BooleanArray();
34 //=======================================================================
36 //purpose : persistent -> transient (retrieve)
37 //=======================================================================
38 Standard_Boolean XmlMDataStd_BooleanArrayDriver::Paste(const XmlObjMgt_Persistent& theSource,
39 const Handle(TDF_Attribute)& theTarget,
40 XmlObjMgt_RRelocationTable& ) const
42 Standard_Integer aFirstInd, aLastInd, aValue;
43 const XmlObjMgt_Element& anElement = theSource;
45 // Read the FirstIndex; if the attribute is absent initialize to 1
46 XmlObjMgt_DOMString aFirstIndex= anElement.getAttribute(::FirstIndexString());
47 if (aFirstIndex == NULL)
49 else if (!aFirstIndex.GetInteger(aFirstInd))
51 TCollection_ExtendedString aMessageString =
52 TCollection_ExtendedString("Cannot retrieve the first index"
53 " for BooleanArray attribute as \"")
55 WriteMessage (aMessageString);
56 return Standard_False;
59 // Read the LastIndex; the attribute should be present
60 if (!anElement.getAttribute(::LastIndexString()).GetInteger(aLastInd))
62 TCollection_ExtendedString aMessageString =
63 TCollection_ExtendedString("Cannot retrieve the last index"
64 " for BooleanArray attribute as \"")
66 WriteMessage (aMessageString);
67 return Standard_False;
70 if (aFirstInd > aLastInd)
72 TCollection_ExtendedString aMessageString =
73 TCollection_ExtendedString("The last index is greater than the first index"
74 " for BooleanArray attribute \"");
75 WriteMessage (aMessageString);
76 return Standard_False;
79 Handle(TDataStd_BooleanArray) aBooleanArray = Handle(TDataStd_BooleanArray)::DownCast(theTarget);
80 aBooleanArray->Init(aFirstInd, aLastInd);
81 Standard_Integer length = aLastInd - aFirstInd + 1;
82 Handle(TColStd_HArray1OfByte) array = new TColStd_HArray1OfByte(0, length >> 3);
84 Standard_Integer i = 0, upper = array->Upper();
85 Standard_CString aValueStr = Standard_CString(XmlObjMgt::GetStringValue(anElement).GetString());
86 for (; i <= upper; i++)
88 if (!XmlObjMgt::GetInteger(aValueStr, aValue))
90 TCollection_ExtendedString aMessageString =
91 TCollection_ExtendedString("Cannot retrieve integer member"
92 " for BooleanArray attribute as \"")
94 WriteMessage (aMessageString);
95 return Standard_False;
97 array->SetValue(i, (Standard_Byte) aValue);
99 aBooleanArray->SetInternalArray(array);
101 return Standard_True;
104 //=======================================================================
106 //purpose : transient -> persistent (store)
107 //=======================================================================
108 void XmlMDataStd_BooleanArrayDriver::Paste(const Handle(TDF_Attribute)& theSource,
109 XmlObjMgt_Persistent& theTarget,
110 XmlObjMgt_SRelocationTable& ) const
112 Handle(TDataStd_BooleanArray) aBooleanArray = Handle(TDataStd_BooleanArray)::DownCast(theSource);
114 Standard_Integer aL = aBooleanArray->Lower();
115 Standard_Integer anU = aBooleanArray->Upper();
116 TCollection_AsciiString aValueStr;
118 theTarget.Element().setAttribute(::FirstIndexString(), aL);
119 theTarget.Element().setAttribute(::LastIndexString(), anU);
121 const Handle(TColStd_HArray1OfByte)& array = aBooleanArray->InternalArray();
122 Standard_Integer lower = array->Lower(), i = lower, upper = array->Upper();
123 for (; i <= upper; i++)
125 aValueStr += TCollection_AsciiString((Standard_Integer) array->Value(i));
128 XmlObjMgt::SetStringValue (theTarget, aValueStr.ToCString(), Standard_True);