1 // File: BinMDataStd_NamedDataDriver.cxx
2 // Created: Mon Jul 2 10:19:20 2007
3 // Author: Sergey ZARITCHNY
4 // <szy@popox.nnov.matra-dtv.fr>
5 // Copyright: Open CasCade SA 2007
7 #include <BinMDataStd_NamedDataDriver.ixx>
8 #include <TCollection_ExtendedString.hxx>
9 #include <CDM_MessageDriver.hxx>
10 #include <TDataStd_NamedData.hxx>
11 #include <TColStd_HArray1OfReal.hxx>
12 #include <TColStd_HArray1OfInteger.hxx>
13 #include <TColStd_HArray1OfReal.hxx>
14 #include <TColStd_DataMapOfStringInteger.hxx>
15 #include <TDataStd_DataMapOfStringReal.hxx>
16 #include <TDataStd_DataMapOfStringString.hxx>
17 #include <TDataStd_DataMapOfStringByte.hxx>
18 #include <TDataStd_DataMapOfStringHArray1OfInteger.hxx>
19 #include <TDataStd_DataMapOfStringHArray1OfReal.hxx>
20 #include <TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx>
21 #include <TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx>
22 #include <TDataStd_DataMapIteratorOfDataMapOfStringString.hxx>
23 #include <TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx>
24 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx>
25 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx>
28 //=======================================================================
29 //function : BinMDataStd_NamedDataDriver
30 //purpose : Constructor
31 //=======================================================================
32 BinMDataStd_NamedDataDriver::BinMDataStd_NamedDataDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
33 : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_NamedData)->Name())
38 //=======================================================================
41 //=======================================================================
42 Handle(TDF_Attribute) BinMDataStd_NamedDataDriver::NewEmpty() const
44 return new TDataStd_NamedData();
47 //=======================================================================
49 //purpose : persistent -> transient (retrieve)
50 //=======================================================================
51 Standard_Boolean BinMDataStd_NamedDataDriver::Paste(const BinObjMgt_Persistent& theSource,
52 const Handle(TDF_Attribute)& theTarget,
53 BinObjMgt_RRelocationTable& ) const
56 Handle(TDataStd_NamedData) T = Handle(TDataStd_NamedData)::DownCast(theTarget);
57 if(T.IsNull()) return Standard_False;
58 Standard_Integer aLower, anUpper,i;
59 if (! (theSource >> aLower >> anUpper))
60 return Standard_False;
61 // const Standard_Integer aLength = anUpper - aLower + 1;
62 if (anUpper < aLower) return Standard_False;
63 if(anUpper | aLower) {
64 TColStd_DataMapOfStringInteger anIntegers;
65 for (i=aLower; i<=anUpper; i++) {
66 TCollection_ExtendedString aKey;
67 Standard_Integer aValue;
68 if (! (theSource >> aKey >> aValue))
69 return Standard_False;
70 anIntegers.Bind(aKey, aValue);
72 T->ChangeIntegers(anIntegers);
75 if (! (theSource >> aLower >> anUpper))
76 return Standard_False;
77 if (anUpper < aLower) return Standard_False;
78 if(anUpper | aLower) {
79 TDataStd_DataMapOfStringReal aReals;
80 for (i=aLower; i<=anUpper; i++) {
81 TCollection_ExtendedString aKey;
83 if (! (theSource >> aKey >> aValue))
84 return Standard_False;
85 aReals.Bind(aKey, aValue);
87 T->ChangeReals(aReals);
91 if (! (theSource >> aLower >> anUpper))
92 return Standard_False;
93 if (anUpper < aLower) return Standard_False;
94 if(anUpper | aLower) {
95 TDataStd_DataMapOfStringString aStrings;
96 for (i=aLower; i<=anUpper; i++) {
97 TCollection_ExtendedString aKey;
98 TCollection_ExtendedString aValue;
99 if (! (theSource >> aKey >> aValue))
100 return Standard_False;
101 aStrings.Bind(aKey, aValue);
103 T->ChangeStrings(aStrings);
107 if (! (theSource >> aLower >> anUpper))
108 return Standard_False;
109 if (anUpper < aLower) return Standard_False;
110 if(anUpper | aLower) {
111 TDataStd_DataMapOfStringByte aBytes;
112 for (i=aLower; i<=anUpper; i++) {
113 TCollection_ExtendedString aKey;
114 Standard_Byte aValue;
115 if (! (theSource >> aKey >> aValue))
116 return Standard_False;
117 aBytes.Bind(aKey, (Standard_Byte)aValue);
119 T->ChangeBytes(aBytes);
122 // arrays of integers
123 if (! (theSource >> aLower >> anUpper))
124 return Standard_False;
125 if (anUpper < aLower) return Standard_False;
126 Standard_Boolean aResult = Standard_False;
127 if(anUpper | aLower) {
128 TDataStd_DataMapOfStringHArray1OfInteger anIntArrays;
129 for (i=aLower; i<=anUpper; i++) {
130 TCollection_ExtendedString aKey;
131 if (! (theSource >> aKey))
132 return Standard_False;
133 Standard_Integer low, up;
134 if (! (theSource >> low >> up))
135 return Standard_False;
137 return Standard_False;
139 Handle(TColStd_HArray1OfInteger) aTargetArray = new TColStd_HArray1OfInteger (low, up);
140 if(!theSource.GetIntArray (&(aTargetArray->ChangeArray1())(low), up-low+1))
141 return Standard_False;
143 Standard_Boolean Ok = anIntArrays.Bind(aKey, aTargetArray);
148 T->ChangeArraysOfIntegers(anIntArrays);
152 if (! (theSource >> aLower >> anUpper))
153 return Standard_False;
154 if (anUpper < aLower) return Standard_False;
155 aResult = Standard_False;
156 if(anUpper | aLower) {
157 TDataStd_DataMapOfStringHArray1OfReal aRealArrays;
158 for (i=aLower; i<=anUpper; i++) {
159 TCollection_ExtendedString aKey;
160 if (! (theSource >> aKey))
161 return Standard_False;
162 Standard_Integer low, up;
163 if (! (theSource >> low >> up))
164 return Standard_False;
165 if(up < low) Standard_False;
167 Handle(TColStd_HArray1OfReal) aTargetArray =
168 new TColStd_HArray1OfReal(low, up);
169 if(!theSource.GetRealArray (&(aTargetArray->ChangeArray1())(low), up-low+1))
170 return Standard_False;
171 Standard_Boolean Ok = aRealArrays.Bind(aKey, aTargetArray);
176 T->ChangeArraysOfReals(aRealArrays);
178 return Standard_True;
181 //=======================================================================
183 //purpose : transient -> persistent (store)
184 //=======================================================================
185 void BinMDataStd_NamedDataDriver::Paste(const Handle(TDF_Attribute)& theSource,
186 BinObjMgt_Persistent& theTarget,
187 BinObjMgt_SRelocationTable& ) const
189 Handle(TDataStd_NamedData) S = Handle(TDataStd_NamedData)::DownCast (theSource);
190 if(S.IsNull()) return;
191 // Standard_Integer i=0;
193 if(S->HasIntegers() && !S->GetIntegersContainer().IsEmpty()) {
194 theTarget.PutInteger(1) << S->GetIntegersContainer().Extent(); //dim
195 TColStd_DataMapIteratorOfDataMapOfStringInteger itr(S->GetIntegersContainer());
196 for (; itr.More(); itr.Next()) {
197 theTarget << itr.Key() << itr.Value(); // key - value;
200 theTarget.PutInteger(0).PutInteger(0);
203 if(S->HasReals() && !S->GetRealsContainer().IsEmpty()) {
204 theTarget.PutInteger(1) << S->GetRealsContainer().Extent();
205 TDataStd_DataMapIteratorOfDataMapOfStringReal itr(S->GetRealsContainer());
206 for (; itr.More(); itr.Next()) {
207 theTarget << itr.Key() << itr.Value();
210 theTarget.PutInteger(0).PutInteger(0);
213 if(S->HasStrings() && !S->GetStringsContainer().IsEmpty()) {
214 theTarget.PutInteger(1) << S->GetStringsContainer().Extent();
215 TDataStd_DataMapIteratorOfDataMapOfStringString itr(S->GetStringsContainer());
216 for (; itr.More(); itr.Next()) {
217 theTarget << itr.Key() << itr.Value();
220 theTarget.PutInteger(0).PutInteger(0);
223 if(S->HasBytes() && !S->GetBytesContainer().IsEmpty()) {
224 theTarget.PutInteger(1) << S->GetBytesContainer().Extent();
225 TDataStd_DataMapIteratorOfDataMapOfStringByte itr(S->GetBytesContainer());
226 for (; itr.More(); itr.Next()) {
227 theTarget << itr.Key() << (Standard_Byte) itr.Value();
230 theTarget.PutInteger(0).PutInteger(0);
233 if(S->HasArraysOfIntegers() && !S->GetArraysOfIntegersContainer().IsEmpty()) {
234 theTarget.PutInteger(1) << S->GetArraysOfIntegersContainer().Extent();
235 TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger
236 itr(S->GetArraysOfIntegersContainer());
237 for (; itr.More(); itr.Next()) {
238 theTarget << itr.Key(); //key
239 const TColStd_Array1OfInteger& anArr1 = itr.Value()->Array1();
240 theTarget << anArr1.Lower() <<anArr1.Upper(); // value Arr1 dimensions
241 Standard_Integer *aPtr = (Standard_Integer *) &anArr1(anArr1.Lower());
242 theTarget.PutIntArray(aPtr, anArr1.Length());
245 theTarget.PutInteger(0).PutInteger(0);
248 if(S->HasArraysOfReals() && !S->GetArraysOfRealsContainer().IsEmpty()) {
249 theTarget.PutInteger(1) << S->GetArraysOfRealsContainer().Extent(); //dim
250 TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal
251 itr(S->GetArraysOfRealsContainer());
252 for (; itr.More(); itr.Next()) {
253 theTarget << itr.Key();//key
254 const TColStd_Array1OfReal& anArr1 = itr.Value()->Array1();
255 theTarget << anArr1.Lower() <<anArr1.Upper(); // value Arr1 dimensions
256 Standard_Real *aPtr = (Standard_Real *) &anArr1(anArr1.Lower());
257 theTarget.PutRealArray(aPtr, anArr1.Length());
260 theTarget.PutInteger(0).PutInteger(0);