1 // Created on: 2001-08-24
2 // Created by: Alexnder GRIGORIEV
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 //AGV 150202: Changed prototype XmlObjMgt::SetStringValue()
18 #include <XmlMDataStd_IntegerArrayDriver.ixx>
19 #include <TDataStd_IntegerArray.hxx>
20 #include <NCollection_LocalArray.hxx>
21 #include <XmlObjMgt.hxx>
22 #include <XmlMDataStd.hxx>
24 IMPLEMENT_DOMSTRING (FirstIndexString, "first")
25 IMPLEMENT_DOMSTRING (LastIndexString, "last")
26 IMPLEMENT_DOMSTRING (IsDeltaOn, "delta")
27 //=======================================================================
28 //function : XmlMDataStd_IntegerArrayDriver
29 //purpose : Constructor
30 //=======================================================================
32 XmlMDataStd_IntegerArrayDriver::XmlMDataStd_IntegerArrayDriver
33 (const Handle(CDM_MessageDriver)& theMsgDriver)
34 : XmlMDF_ADriver (theMsgDriver, NULL)
37 //=======================================================================
40 //=======================================================================
41 Handle(TDF_Attribute) XmlMDataStd_IntegerArrayDriver::NewEmpty() const
43 return (new TDataStd_IntegerArray());
46 //=======================================================================
48 //purpose : persistent -> transient (retrieve)
49 //=======================================================================
50 Standard_Boolean XmlMDataStd_IntegerArrayDriver::Paste
51 (const XmlObjMgt_Persistent& theSource,
52 const Handle(TDF_Attribute)& theTarget,
53 XmlObjMgt_RRelocationTable& ) const
55 Standard_Integer aFirstInd, aLastInd, aValue, ind;
56 const XmlObjMgt_Element& anElement = theSource;
58 // Read the FirstIndex; if the attribute is absent initialize to 1
59 XmlObjMgt_DOMString aFirstIndex= anElement.getAttribute(::FirstIndexString());
60 if (aFirstIndex == NULL)
62 else if (!aFirstIndex.GetInteger(aFirstInd)) {
63 TCollection_ExtendedString aMessageString =
64 TCollection_ExtendedString("Cannot retrieve the first index"
65 " for IntegerArray attribute as \"")
67 WriteMessage (aMessageString);
68 return Standard_False;
71 // Read the LastIndex; the attribute should be present
72 if (!anElement.getAttribute(::LastIndexString()).GetInteger(aLastInd)) {
73 TCollection_ExtendedString aMessageString =
74 TCollection_ExtendedString("Cannot retrieve the last index"
75 " for IntegerArray attribute as \"")
77 WriteMessage (aMessageString);
78 return Standard_False;
81 Handle(TDataStd_IntegerArray) anIntArray =
82 Handle(TDataStd_IntegerArray)::DownCast(theTarget);
83 anIntArray->Init(aFirstInd, aLastInd);
85 if(aFirstInd == aLastInd) {
86 Standard_Integer anInteger;
87 if(!XmlObjMgt::GetStringValue(anElement).GetInteger( anInteger)) {
88 TCollection_ExtendedString aMessageString =
89 TCollection_ExtendedString("Cannot retrieve integer member"
90 " for IntegerArray attribute as \"");
91 WriteMessage (aMessageString);
92 return Standard_False;
94 anIntArray->SetValue(aFirstInd, anInteger);
98 // Warning: check implementation of XmlObjMgt_DOMString !! For LDOM this is OK
99 Standard_CString aValueStr =
100 Standard_CString(XmlObjMgt::GetStringValue(anElement).GetString());
102 for (ind = aFirstInd; ind <= aLastInd; ind++)
104 if (!XmlObjMgt::GetInteger(aValueStr, aValue)) {
105 TCollection_ExtendedString aMessageString =
106 TCollection_ExtendedString("Cannot retrieve integer member"
107 " for IntegerArray attribute as \"")
109 WriteMessage (aMessageString);
110 return Standard_False;
112 anIntArray->SetValue(ind, aValue);
115 Standard_Boolean aDelta(Standard_False);
117 if(XmlMDataStd::DocumentVersion() > 2) {
118 Standard_Integer aDeltaValue;
119 if (!anElement.getAttribute(::IsDeltaOn()).GetInteger(aDeltaValue))
121 TCollection_ExtendedString aMessageString =
122 TCollection_ExtendedString("Cannot retrieve the isDelta value"
123 " for IntegerArray attribute as \"")
124 + aDeltaValue + "\"";
125 WriteMessage (aMessageString);
126 return Standard_False;
129 aDelta = (Standard_Boolean)aDeltaValue;
132 else if(XmlMDataStd::DocumentVersion() == -1)
133 cout << "Current DocVersion field is not initialized. " <<endl;
135 anIntArray->SetDelta(aDelta);
137 return Standard_True;
140 //=======================================================================
142 //purpose : transient -> persistent (store)
143 //=======================================================================
144 void XmlMDataStd_IntegerArrayDriver::Paste
145 (const Handle(TDF_Attribute)& theSource,
146 XmlObjMgt_Persistent& theTarget,
147 XmlObjMgt_SRelocationTable& ) const
149 Handle(TDataStd_IntegerArray) anIntArray =
150 Handle(TDataStd_IntegerArray)::DownCast(theSource);
151 const Handle(TColStd_HArray1OfInteger)& hIntArray = anIntArray->Array();
152 const TColStd_Array1OfInteger& intArray = hIntArray->Array1();
153 Standard_Integer aL = intArray.Lower(), anU = intArray.Upper();
156 theTarget.Element().setAttribute(::FirstIndexString(), aL);
157 theTarget.Element().setAttribute(::LastIndexString(), anU);
158 theTarget.Element().setAttribute(::IsDeltaOn(), anIntArray->GetDelta());
160 // Allocation of 12 chars for each integer including the space.
161 // An example: -2 147 483 648
162 Standard_Integer iChar = 0;
163 NCollection_LocalArray<Standard_Character> str;
164 if (intArray.Length())
165 str.Allocate(12 * intArray.Length() + 1);
167 Standard_Integer i = aL;
170 iChar += Sprintf(&(str[iChar]), "%d ", intArray.Value(i));
176 if (intArray.Length())
178 // No occurrence of '&', '<' and other irregular XML characters
179 str[iChar - 1] = '\0';
180 XmlObjMgt::SetStringValue (theTarget, (Standard_Character*)str, Standard_True);