7fd59977 |
1 | // File: XmlMDataStd_RealArrayDriver.cxx |
2 | // Created: Fri Aug 24 20:46:58 2001 |
3 | // Author: Alexnder GRIGORIEV |
4 | // Copyright: Open Cascade 2001-2002 |
5 | // History: AGV 150202: Changed prototype XmlObjMgt::SetStringValue() |
6 | |
7 | #define OCC6010 // vro 01.06.2004 |
8 | |
9 | # include <stdio.h> |
10 | #include <XmlMDataStd_RealArrayDriver.ixx> |
11 | #include <TDataStd_RealArray.hxx> |
12 | #include <XmlObjMgt.hxx> |
13 | #include <XmlMDataStd.hxx> |
14 | |
15 | IMPLEMENT_DOMSTRING (FirstIndexString, "first") |
16 | IMPLEMENT_DOMSTRING (LastIndexString, "last") |
17 | IMPLEMENT_DOMSTRING (IsDeltaOn, "delta") |
18 | |
19 | //======================================================================= |
20 | //function : XmlMDataStd_RealArrayDriver |
21 | //purpose : Constructor |
22 | //======================================================================= |
23 | |
24 | XmlMDataStd_RealArrayDriver::XmlMDataStd_RealArrayDriver |
25 | (const Handle(CDM_MessageDriver)& theMsgDriver) |
26 | : XmlMDF_ADriver (theMsgDriver, NULL) |
27 | {} |
28 | |
29 | //======================================================================= |
30 | //function : NewEmpty |
31 | //purpose : |
32 | //======================================================================= |
33 | Handle(TDF_Attribute) XmlMDataStd_RealArrayDriver::NewEmpty() const |
34 | { |
35 | return (new TDataStd_RealArray()); |
36 | } |
37 | |
38 | //======================================================================= |
39 | //function : Paste |
40 | //purpose : persistent -> transient (retrieve) |
41 | //======================================================================= |
42 | Standard_Boolean XmlMDataStd_RealArrayDriver::Paste |
43 | (const XmlObjMgt_Persistent& theSource, |
44 | const Handle(TDF_Attribute)& theTarget, |
45 | XmlObjMgt_RRelocationTable& ) const |
46 | { |
47 | Standard_Integer aFirstInd, aLastInd, ind; |
48 | Standard_Real aValue; |
49 | const XmlObjMgt_Element& anElement = theSource; |
50 | |
51 | // Read the FirstIndex; if the attribute is absent initialize to 1 |
52 | XmlObjMgt_DOMString aFirstIndex= anElement.getAttribute(::FirstIndexString()); |
53 | if (aFirstIndex == NULL) |
54 | aFirstInd = 1; |
55 | else if (!aFirstIndex.GetInteger(aFirstInd)) { |
56 | TCollection_ExtendedString aMessageString = |
57 | TCollection_ExtendedString("Cannot retrieve the first index" |
58 | " for RealArray attribute as \"") |
59 | + aFirstIndex + "\""; |
60 | WriteMessage (aMessageString); |
61 | return Standard_False; |
62 | } |
63 | |
64 | // Read LastIndex; the attribute should be present |
65 | if (!anElement.getAttribute(::LastIndexString()).GetInteger(aLastInd)) { |
66 | TCollection_ExtendedString aMessageString = |
67 | TCollection_ExtendedString("Cannot retrieve the last index" |
68 | " for RealArray attribute as \"") |
69 | + aFirstIndex + "\""; |
70 | WriteMessage (aMessageString); |
71 | return Standard_False; |
72 | } |
73 | |
74 | Handle(TDataStd_RealArray) aRealArray = |
75 | Handle(TDataStd_RealArray)::DownCast(theTarget); |
76 | aRealArray->Init(aFirstInd, aLastInd); |
77 | |
78 | // Check the type of LDOMString |
79 | const XmlObjMgt_DOMString& aString = XmlObjMgt::GetStringValue(anElement); |
80 | if (aString.Type() == LDOMBasicString::LDOM_Integer) { |
81 | if (aFirstInd == aLastInd) { |
82 | Standard_Integer anIntValue; |
83 | if (aString.GetInteger(anIntValue)) |
84 | aRealArray -> SetValue (aFirstInd, Standard_Real(anIntValue)); |
85 | } else { |
86 | TCollection_ExtendedString aMessageString = |
87 | TCollection_ExtendedString("Cannot retrieve array of real members" |
88 | " for RealArray attribute from Integer \"") |
89 | + aString + "\""; |
90 | WriteMessage (aMessageString); |
91 | return Standard_False; |
92 | } |
93 | } else { |
94 | Standard_CString aValueStr = Standard_CString(aString.GetString()); |
95 | for (ind = aFirstInd; ind <= aLastInd; ind++) |
96 | { |
97 | if (!XmlObjMgt::GetReal(aValueStr, aValue)) { |
98 | TCollection_ExtendedString aMessageString = |
99 | TCollection_ExtendedString("Cannot retrieve real member" |
100 | " for RealArray attribute as \"") |
101 | + aValueStr + "\""; |
102 | WriteMessage (aMessageString); |
103 | return Standard_False; |
104 | } |
105 | aRealArray->SetValue(ind, aValue); |
106 | } |
107 | } |
108 | #ifdef DEB |
109 | //cout << "CurDocVersion = " << XmlMDataStd::DocumentVersion() <<endl; |
110 | #endif |
111 | Standard_Boolean aDelta(Standard_False); |
112 | |
113 | if(XmlMDataStd::DocumentVersion() > 2) { |
114 | Standard_Integer aDeltaValue; |
115 | if (!anElement.getAttribute(::IsDeltaOn()).GetInteger(aDeltaValue)) |
116 | { |
117 | TCollection_ExtendedString aMessageString = |
118 | TCollection_ExtendedString("Cannot retrieve the isDelta value" |
119 | " for RealArray attribute as \"") |
120 | + aDeltaValue + "\""; |
121 | WriteMessage (aMessageString); |
122 | return Standard_False; |
123 | } |
124 | else |
125 | aDelta = (Standard_Boolean)aDeltaValue; |
126 | } |
127 | #ifdef DEB |
128 | else if(XmlMDataStd::DocumentVersion() == -1) |
129 | cout << "Current DocVersion field is not initialized. " <<endl; |
130 | #endif |
131 | aRealArray->SetDelta(aDelta); |
132 | |
133 | return Standard_True; |
134 | } |
135 | |
136 | //======================================================================= |
137 | //function : Paste |
138 | //purpose : transient -> persistent (store) |
139 | //======================================================================= |
140 | void XmlMDataStd_RealArrayDriver::Paste (const Handle(TDF_Attribute)& theSource, |
141 | XmlObjMgt_Persistent& theTarget, |
142 | XmlObjMgt_SRelocationTable& ) const |
143 | { |
144 | Handle(TDataStd_RealArray) aRealArray = |
145 | Handle(TDataStd_RealArray)::DownCast(theSource); |
146 | |
147 | Standard_Integer aL = aRealArray->Lower(), anU = aRealArray->Upper(); |
148 | TCollection_AsciiString aValueStr; |
149 | |
150 | if (aL != 1) theTarget.Element().setAttribute(::FirstIndexString(), aL); |
151 | theTarget.Element().setAttribute(::LastIndexString(), anU); |
152 | theTarget.Element().setAttribute(::IsDeltaOn(), aRealArray->GetDelta()); |
153 | |
154 | Standard_Integer i = aL; |
155 | while (1) { |
156 | #ifndef OCC6010 |
157 | aValueStr += TCollection_AsciiString(aRealArray->Value(i)); |
158 | #else |
159 | char aValueChar[32]; |
160 | sprintf(aValueChar, "%.15g", aRealArray->Value(i)); |
161 | aValueStr += aValueChar; |
162 | #endif |
163 | if (i >= anU) break; |
164 | aValueStr += ' '; |
165 | ++i; |
166 | } |
167 | // No occurrence of '&', '<' and other irregular XML characters |
168 | XmlObjMgt::SetStringValue (theTarget, aValueStr.ToCString(), Standard_True); |
169 | } |