0022898: IGES import fails in german environment
[occt.git] / src / XmlMDataStd / XmlMDataStd_NamedDataDriver.cxx
1 // Created on: 2007-07-03
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2007-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20
21 #include <XmlMDataStd_NamedDataDriver.ixx>
22 #include <XmlObjMgt.hxx>
23 #include <XmlObjMgt_Document.hxx>
24 #include <LDOM_MemManager.hxx>
25 #include <TCollection_ExtendedString.hxx>
26 #include <CDM_MessageDriver.hxx>
27 #include <TDataStd_NamedData.hxx>
28 #include <TColStd_HArray1OfReal.hxx>
29 #include <TColStd_HArray1OfInteger.hxx>
30 #include <TColStd_HArray1OfReal.hxx>
31 #include <TColStd_DataMapOfStringInteger.hxx>
32 #include <TDataStd_DataMapOfStringReal.hxx>
33 #include <TDataStd_DataMapOfStringString.hxx>
34 #include <TDataStd_DataMapOfStringByte.hxx>
35 #include <TDataStd_DataMapOfStringHArray1OfInteger.hxx>
36 #include <TDataStd_DataMapOfStringHArray1OfReal.hxx>
37 #include <TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx>
38 #include <TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx>
39 #include <TDataStd_DataMapIteratorOfDataMapOfStringString.hxx>
40 #include <TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx>
41 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx>
42 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx>
43 IMPLEMENT_DOMSTRING (FirstIntegerIndex, "firstI")
44 IMPLEMENT_DOMSTRING (LastIntegerIndex,  "lastI")
45 IMPLEMENT_DOMSTRING (FirstRealIndex,    "firstR")
46 IMPLEMENT_DOMSTRING (LastRealIndex,     "lastR")
47 IMPLEMENT_DOMSTRING (FirstStringIndex,  "firstS")
48 IMPLEMENT_DOMSTRING (LastStringIndex,   "lastS")
49 IMPLEMENT_DOMSTRING (FirstByteIndex,    "firstB")
50 IMPLEMENT_DOMSTRING (LastByteIndex,     "lastB")
51 IMPLEMENT_DOMSTRING (FirstIntArrIndex,  "firstIA")
52 IMPLEMENT_DOMSTRING (LastIntArrIndex,   "lastIA")
53 IMPLEMENT_DOMSTRING (FirstRealArrIndex, "firstRA")
54 IMPLEMENT_DOMSTRING (LastRealArrIndex,   "lastRA")
55
56 IMPLEMENT_DOMSTRING (ExtString, "string")
57 IMPLEMENT_DOMSTRING (Value,     "value")
58
59 #define OCC6010
60
61 #ifdef WNT
62 #define EXCEPTION ...
63 #else
64 #define EXCEPTION Standard_Failure
65 #endif
66 //=======================================================================
67 //function : XmlMDataStd_NamedDataDriver
68 //purpose  : Constructor
69 //=======================================================================
70 XmlMDataStd_NamedDataDriver::XmlMDataStd_NamedDataDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
71      : XmlMDF_ADriver (theMsgDriver, NULL)
72 {
73
74 }
75
76 //=======================================================================
77 //function : NewEmpty
78 //purpose  : 
79 //=======================================================================
80 Handle(TDF_Attribute) XmlMDataStd_NamedDataDriver::NewEmpty() const
81 {
82   return new TDataStd_NamedData();
83 }
84
85 //=======================================================================
86 static TCollection_ExtendedString SplitItemFromEnd(TCollection_ExtendedString& Key) 
87 {
88   TCollection_ExtendedString aValue;
89   const Standard_Integer aPos = Key. SearchFromEnd (" ");
90   if(aPos == -1) return aValue;
91   aValue = Key.Split(aPos-1);
92   aValue.Remove(1,1);
93   return aValue;
94 }
95 //=======================================================================
96 static TCollection_ExtendedString SplitItemFromStart(TCollection_ExtendedString& Key) 
97 {
98   TCollection_ExtendedString aValue;
99   const Standard_Integer aPos = Key. Search (" ");
100   if(aPos == -1) return aValue;
101   aValue = Key.Split(aPos);
102   Key.Remove(Key.Length(),1);
103   return aValue;
104 }
105 //=======================================================================
106 Handle(TColStd_HArray1OfInteger) BuildIntArray(const TCollection_AsciiString& ValString, 
107                                                const Standard_Integer theLen) 
108 {
109   Handle(TColStd_HArray1OfInteger) anArr;
110   if(ValString.Length() == 0 || !theLen) return anArr;
111   anArr = new TColStd_HArray1OfInteger (1, theLen, 0);
112   for(Standard_Integer i = 1;i <= theLen;i++) {
113     const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
114     if(aSVal.Length())
115       anArr->SetValue(i, aSVal.IntegerValue());      
116   }
117   return anArr;
118 }
119
120 //=======================================================================
121 Handle(TColStd_HArray1OfReal) BuildRealArray(const TCollection_AsciiString& ValString, 
122                                              const Standard_Integer theLen) 
123 {
124   Handle(TColStd_HArray1OfReal) anArr;
125   if(ValString.Length() == 0 || !theLen) return anArr;
126   anArr = new TColStd_HArray1OfReal (1, theLen, .0);
127   for(Standard_Integer i = 1;i <= theLen;i++) {
128     const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
129     if(aSVal.Length())
130       anArr->SetValue(i, aSVal.RealValue());      
131   }
132   return anArr;
133 }
134 //=======================================================================
135 //function : Paste
136 //purpose  : persistent -> transient (retrieve)
137 //=======================================================================
138 Standard_Boolean XmlMDataStd_NamedDataDriver::Paste(const XmlObjMgt_Persistent&  theSource,
139                                                       const Handle(TDF_Attribute)& theTarget,
140                                                       XmlObjMgt_RRelocationTable&  ) const
141 {
142   Standard_Integer aFirstInd, aLastInd, ind;
143   const XmlObjMgt_Element& anElement = theSource;
144
145   //DataMapOfStringInteger: Read the FirstIndex; if the attribute is absent initialize to 1
146   XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIntegerIndex());
147   if (aFirstIndex == NULL)
148     aFirstInd = 1;
149   else if (!aFirstIndex.GetInteger(aFirstInd)) 
150   {
151     TCollection_ExtendedString aMessageString =
152       TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
153                                  " attribute (DataMapOfStringInteger) as \"")
154         + aFirstIndex + "\"";
155     WriteMessage (aMessageString);
156     return Standard_False;
157   }
158
159   // Read the LastIndex;
160   XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIntegerIndex());
161   if(aLastIndex == NULL) {
162     aFirstInd = 0;
163     aLastInd  = 0;
164   } else if (!aLastIndex.GetInteger(aLastInd)) {
165     TCollection_ExtendedString aMessageString =
166       TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
167                                  " attribute (DataMapOfStringInteger) as \"")
168         + aLastIndex + "\"";
169     WriteMessage (aMessageString);
170     return Standard_False;
171   }
172   try {
173     Handle(TDataStd_NamedData) T = Handle(TDataStd_NamedData)::DownCast(theTarget);
174     LDOM_Node aCurNode;
175
176     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
177       if ( !anElement.hasChildNodes() )
178         {
179           TCollection_ExtendedString aMessageString =
180             TCollection_ExtendedString("Cannot retrieve DataMapOfStringInteger");
181           WriteMessage (aMessageString);
182           return Standard_False;
183         }
184       aCurNode = anElement.getFirstChild();
185       LDOM_Element* aCurElement = (LDOM_Element*)&aCurNode;
186       TCollection_ExtendedString aValueStr, aKey;
187       TColStd_DataMapOfStringInteger aMap;
188       for (ind = aFirstInd; ind < aLastInd; ind++) {
189         XmlObjMgt::GetExtendedString( *aCurElement, aKey );
190         aValueStr = SplitItemFromEnd(aKey);
191         if(aValueStr.Length() == 0) {
192           TCollection_ExtendedString aMessageString =
193             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
194           WriteMessage (aMessageString);
195           return Standard_False;
196         }
197         TCollection_AsciiString aVal(aValueStr,'?');
198         Standard_Integer aValue = aVal.IntegerValue();
199         aMap.Bind(aKey, aValue);
200         aCurNode = aCurElement->getNextSibling();
201         aCurElement = (LDOM_Element*)&aCurNode;
202       }
203       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
204       aValueStr = SplitItemFromEnd(aKey);
205       if(aValueStr.Length() == 0) {
206         TCollection_ExtendedString aMessageString =
207           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
208         WriteMessage (aMessageString);
209         return Standard_False;
210       }
211       TCollection_AsciiString aVal(aValueStr,'?');
212       Standard_Integer aValue = aVal.IntegerValue();
213       aMap.Bind(aKey, aValue);
214       T->ChangeIntegers(aMap);
215     }
216
217 //DataMapOfStringReal
218     aFirstIndex = anElement.getAttribute(::FirstRealIndex());
219     if (aFirstIndex == NULL)
220       aFirstInd = 1;
221     else if (!aFirstIndex.GetInteger(aFirstInd)) 
222       {
223         TCollection_ExtendedString aMessageString =
224           TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
225                                      "attribute (DataMapOfStringReal) as \"")
226             + aFirstIndex + "\"";
227         WriteMessage (aMessageString);
228         return Standard_False;
229       }
230
231   // Read the LastIndex;
232     aLastIndex = anElement.getAttribute(::LastRealIndex());
233     if(aLastIndex == NULL) {
234       aFirstInd = 0;
235       aLastInd  = 0;
236     } else if (!aLastIndex.GetInteger(aLastInd)) {
237       TCollection_ExtendedString aMessageString =
238         TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
239                                    " attribute (DataMapOfStringReal) as \"")
240           + aLastIndex + "\"";
241       WriteMessage (aMessageString);
242       return Standard_False;
243     }
244
245     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) { 
246       if ( !anElement.hasChildNodes())
247         {
248           TCollection_ExtendedString aMessageString =
249             TCollection_ExtendedString("Cannot retrieve DataMapOfStringReal");
250           WriteMessage (aMessageString);
251           return Standard_False;
252         }
253       
254       LDOM_Element* aCurElement; 
255       if (aCurNode.isNull())
256             aCurNode = anElement.getFirstChild();
257       else    
258         aCurNode    = ((LDOM_Element*)&aCurNode)->getNextSibling();
259           
260       aCurElement = (LDOM_Element*)&aCurNode;
261       TCollection_ExtendedString aValueStr, aKey;
262       TDataStd_DataMapOfStringReal aMap;
263       for (ind = aFirstInd; ind < aLastInd; ind++) {
264         XmlObjMgt::GetExtendedString( *aCurElement, aKey );
265         aValueStr = SplitItemFromEnd(aKey);
266         if(aValueStr.Length() == 0) {
267           TCollection_ExtendedString aMessageString =
268             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
269           WriteMessage (aMessageString);
270           return Standard_False;
271         }
272         TCollection_AsciiString aVal(aValueStr,'?');
273         Standard_Real aValue = aVal.RealValue();
274         aMap.Bind(aKey, aValue);
275         aCurNode = aCurElement->getNextSibling();
276         aCurElement = (LDOM_Element*)&aCurNode;
277       }
278       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
279       aValueStr = SplitItemFromEnd(aKey);
280       if(aValueStr.Length() == 0) {
281         TCollection_ExtendedString aMessageString =
282           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
283         WriteMessage (aMessageString);
284         return Standard_False;
285       }
286       TCollection_AsciiString aVal(aValueStr,'?');
287       Standard_Real aValue = aVal.RealValue();
288       aMap.Bind(aKey, aValue);
289       T->ChangeReals(aMap);
290     }
291
292 //DataMapOfStringString
293     aFirstIndex = anElement.getAttribute(::FirstStringIndex());
294     if (aFirstIndex == NULL)
295       aFirstInd = 1;
296     else if (!aFirstIndex.GetInteger(aFirstInd)) 
297       {
298         TCollection_ExtendedString aMessageString =
299           TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
300                                      " attribute (DataMapOfStringString) as \"")
301             + aFirstIndex + "\"";
302         WriteMessage (aMessageString);
303         return Standard_False;
304       }
305     aLastIndex = anElement.getAttribute(::LastStringIndex());
306     if(aLastIndex == NULL) {
307       aFirstInd = 0;
308       aLastInd  = 0;
309     } else if (!aLastIndex.GetInteger(aLastInd)) {
310       TCollection_ExtendedString aMessageString =
311         TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
312                                    " attribute (DataMapOfStringString) as \"")
313           + aLastIndex + "\"";
314       WriteMessage (aMessageString);
315       return Standard_False;
316     }
317     
318     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
319       if ( !anElement.hasChildNodes())
320         {
321           TCollection_ExtendedString aMessageString =
322             TCollection_ExtendedString("Cannot retrieve DataMapOfStringString");
323           WriteMessage (aMessageString);
324           return Standard_False;
325         }
326       LDOM_Element* aCurElement;
327       if (aCurNode.isNull())
328             aCurNode = anElement.getFirstChild();
329       else 
330             aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
331       
332       aCurElement = (LDOM_Element*)&aCurNode;
333       TCollection_ExtendedString aValue, aKey;
334       TDataStd_DataMapOfStringString aMap;
335       for (ind = aFirstInd; ind < aLastInd; ind++) {
336         XmlObjMgt::GetExtendedString( *aCurElement, aKey );
337         aValue = SplitItemFromStart(aKey); // ==>from start
338         if(aValue.Length() == 0) {
339           TCollection_ExtendedString aMessageString =
340             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
341           WriteMessage (aMessageString);
342           return Standard_False;
343         }
344         aMap.Bind(aKey, aValue);
345         aCurNode = aCurElement->getNextSibling();
346         aCurElement = (LDOM_Element*)&aCurNode;
347       }
348       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
349       aValue = SplitItemFromStart(aKey);
350       if(aValue.Length() == 0) {
351         TCollection_ExtendedString aMessageString =
352           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
353         WriteMessage (aMessageString);
354         return Standard_False;
355       }
356       
357       aMap.Bind(aKey, aValue);
358       T->ChangeStrings(aMap);
359     }
360
361 //DataMapOfStringByte
362     aFirstIndex = anElement.getAttribute(::FirstByteIndex());
363     if (aFirstIndex == NULL)
364       aFirstInd = 1;
365     else if (!aFirstIndex.GetInteger(aFirstInd)) 
366       {
367         TCollection_ExtendedString aMessageString =
368           TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
369                                      "attribute (DataMapOfStringByte) as \"")
370             + aFirstIndex + "\"";
371         WriteMessage (aMessageString);
372         return Standard_False;
373       }
374
375   // Read the LastIndex;
376     aLastIndex = anElement.getAttribute(::LastByteIndex());
377     if(aLastIndex == NULL) {
378       aFirstInd = 0;
379       aLastInd  = 0;
380     } else if (!aLastIndex.GetInteger(aLastInd)) {
381       TCollection_ExtendedString aMessageString =
382         TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
383                                    " attribute (DataMapOfStringByte) as \"")
384           + aLastIndex + "\"";
385       WriteMessage (aMessageString);
386       return Standard_False;
387     }
388     
389     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) { 
390       if ( !anElement.hasChildNodes())
391         {
392           TCollection_ExtendedString aMessageString =
393             TCollection_ExtendedString("Cannot retrieve DataMapOfStringByte");
394           WriteMessage (aMessageString);
395           return Standard_False;
396         }
397       
398       LDOM_Element* aCurElement;
399       if (aCurNode.isNull())
400             aCurNode = anElement.getFirstChild();
401       else 
402             aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
403       
404       aCurElement = (LDOM_Element*)&aCurNode;
405       TCollection_ExtendedString aValueStr, aKey;
406       TDataStd_DataMapOfStringByte aMap;
407       for (ind = aFirstInd; ind < aLastInd; ind++) {
408         XmlObjMgt::GetExtendedString( *aCurElement, aKey );
409         aValueStr = SplitItemFromEnd(aKey);
410         if(aValueStr.Length() == 0) {
411           TCollection_ExtendedString aMessageString =
412             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
413           WriteMessage (aMessageString);
414           return Standard_False;
415         }
416         
417         TCollection_AsciiString aVal(aValueStr,'?');
418         Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
419         
420         aMap.Bind(aKey, aValue);
421         aCurNode = aCurElement->getNextSibling();
422         aCurElement = (LDOM_Element*)&aCurNode;
423       }
424       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
425       aValueStr = SplitItemFromEnd(aKey);
426       if(aValueStr.Length() == 0) {
427         TCollection_ExtendedString aMessageString =
428           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
429         WriteMessage (aMessageString);
430         return Standard_False;
431       }
432       
433       TCollection_AsciiString aVal(aValueStr,'?');
434       Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
435       aMap.Bind(aKey, aValue);
436       T->ChangeBytes(aMap);
437     }
438     
439 //DataMapOfStringHArray1OfInteger
440     aFirstIndex = anElement.getAttribute(::FirstIntArrIndex());
441     if (aFirstIndex == NULL)
442       aFirstInd = 1;
443     else if (!aFirstIndex.GetInteger(aFirstInd)) 
444       {
445         TCollection_ExtendedString aMessageString =
446           TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
447                                      "attribute (DataMapOfStringHArray1OfInteger) as \"")
448             + aFirstIndex + "\"";
449         WriteMessage (aMessageString);
450         return Standard_False;
451       }
452     
453   // Read the LastIndex;
454     aLastIndex = anElement.getAttribute(::LastIntArrIndex());
455     if(aLastIndex == NULL) {
456       aFirstInd = 0;
457       aLastInd  = 0;
458     } else if (!aLastIndex.GetInteger(aLastInd)) {
459       TCollection_ExtendedString aMessageString =
460         TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
461                                    " attribute (DataMapOfStringHArray1OfInteger) as \"")
462           + aLastIndex + "\"";
463       WriteMessage (aMessageString);
464       return Standard_False;
465     }
466     
467     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) { 
468       if ( !anElement.hasChildNodes())
469         {
470           TCollection_ExtendedString aMessageString =
471             TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfInteger");
472           WriteMessage (aMessageString);
473           return Standard_False;
474         }
475       LDOM_Element* aCurElement;
476       if (aCurNode.isNull())
477             aCurNode = anElement.getFirstChild();
478       else 
479             aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
480       
481       aCurElement = (LDOM_Element*)&aCurNode;
482       TCollection_ExtendedString aKey, aValueStr;
483       TDataStd_DataMapOfStringHArray1OfInteger aMap;
484       
485       for (ind = aFirstInd; ind < aLastInd; ind++) {
486         XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
487         aValueStr = SplitItemFromEnd(aKey);
488         if(aValueStr.Length() == 0) {
489           TCollection_ExtendedString aMessageString =
490             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
491           WriteMessage (aMessageString);
492           return Standard_False;
493         }
494         TCollection_AsciiString aVal(aValueStr,'?');
495         Standard_Integer aLen = aVal.IntegerValue();
496         
497 #ifdef DEB
498 //      XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value()); 
499 //      const char* aS = aValStr.GetString();
500 //      cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " << aS <<  endl;
501 #endif      
502         
503         TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value()); 
504         Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
505         if(aValue.IsNull()) {
506           TCollection_ExtendedString aMessageString =
507             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
508           WriteMessage (aMessageString);
509           return Standard_False;
510         }
511         
512         aMap.Bind(aKey, aValue);
513         aCurNode = aCurElement->getNextSibling();
514         aCurElement = (LDOM_Element*)&aCurNode;
515       }
516       
517       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
518       aValueStr = SplitItemFromEnd(aKey);
519       if(aValueStr.Length() == 0) {
520         TCollection_ExtendedString aMessageString =
521           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
522         WriteMessage (aMessageString);
523         return Standard_False;
524       }
525       TCollection_AsciiString aVal(aValueStr,'?');
526       Standard_Integer aLen = aVal.IntegerValue();
527 #ifdef DEB
528 //    XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value());  
529 //    const char* aS = aValStr.GetString();
530 //    cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " <<aS<<endl;
531 #endif
532       TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
533       Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
534       if(aValue.IsNull()) {
535         TCollection_ExtendedString aMessageString =
536           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
537         WriteMessage (aMessageString);
538         return Standard_False;
539       }
540       aMap.Bind(aKey, aValue);
541       T->ChangeArraysOfIntegers(aMap);
542     }
543
544 //DataMapOfStringHArray1OfReal
545     aFirstIndex = anElement.getAttribute(::FirstRealArrIndex());
546     if (aFirstIndex == NULL)
547       aFirstInd = 1;
548     else if (!aFirstIndex.GetInteger(aFirstInd)) 
549       {
550         TCollection_ExtendedString aMessageString =
551           TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
552                                      "attribute (DataMapOfStringHArray1OfReal) as \"")
553             + aFirstIndex + "\"";
554         WriteMessage (aMessageString);
555         return Standard_False;
556       }
557     
558   // Read the LastIndex;
559     aLastIndex = anElement.getAttribute(::LastRealArrIndex());
560     if(aLastIndex == NULL) {
561       aFirstInd = 0;
562       aLastInd  = 0;
563     } else if (!aLastIndex.GetInteger(aLastInd)) {
564       TCollection_ExtendedString aMessageString =
565         TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
566                                  " attribute (DataMapOfStringHArray1OfReal) as \"")
567           + aLastIndex + "\"";
568       WriteMessage (aMessageString);
569       return Standard_False;
570     }
571     
572     if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) { 
573       if ( !anElement.hasChildNodes())
574         {
575           TCollection_ExtendedString aMessageString =
576             TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfReal");
577           WriteMessage (aMessageString);
578           return Standard_False;
579         }
580       
581       LDOM_Element* aCurElement;
582       if (aCurNode.isNull())
583             aCurNode = anElement.getFirstChild();
584       else 
585             aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
586       
587       aCurElement = (LDOM_Element*)&aCurNode;
588       TCollection_ExtendedString aKey, aValueStr;
589       TDataStd_DataMapOfStringHArray1OfReal aMap;
590       
591       for (ind = aFirstInd; ind < aLastInd; ind++) {
592         XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
593         aValueStr = SplitItemFromEnd(aKey);
594         if(aValueStr.Length() == 0) {
595           TCollection_ExtendedString aMessageString =
596           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
597           WriteMessage (aMessageString);
598           return Standard_False;
599         }
600         TCollection_AsciiString aVal(aValueStr,'?');
601         Standard_Integer aLen = aVal.IntegerValue();      
602         
603         TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
604         Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
605         if(aValue.IsNull()) {
606           TCollection_ExtendedString aMessageString =
607             TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
608           WriteMessage (aMessageString);
609           return Standard_False;
610         }
611         
612         aMap.Bind(aKey, aValue);
613         aCurNode = aCurElement->getNextSibling();
614         aCurElement = (LDOM_Element*)&aCurNode;
615       }
616       
617       XmlObjMgt::GetExtendedString( *aCurElement, aKey );
618       aValueStr = SplitItemFromEnd(aKey);
619       if(aValueStr.Length() == 0) {
620         TCollection_ExtendedString aMessageString =
621           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
622         WriteMessage (aMessageString);
623         return Standard_False;
624       }
625       TCollection_AsciiString aVal(aValueStr,'?');
626       Standard_Integer aLen = aVal.IntegerValue();
627       
628       TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
629       Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
630       if(aValue.IsNull()) {
631         TCollection_ExtendedString aMessageString =
632           TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
633         WriteMessage (aMessageString);
634         return Standard_False;
635       }
636       
637       aMap.Bind(aKey, aValue);
638     T->ChangeArraysOfReals(aMap);
639     } 
640   } catch (EXCEPTION) {
641     TCollection_ExtendedString aMessageString =
642       TCollection_ExtendedString("Unknown exception during data retrieve in NamedDatDriver ");
643     WriteMessage (aMessageString);
644       return Standard_False;} 
645   
646   return Standard_True;
647 }
648
649 //=======================================================================
650 //function : Paste
651 //purpose  : transient -> persistent (store)
652 //=======================================================================
653 void XmlMDataStd_NamedDataDriver::Paste(const Handle(TDF_Attribute)& theSource,
654                                         XmlObjMgt_Persistent&        theTarget,
655                                         XmlObjMgt_SRelocationTable&  ) const
656 {
657   Handle(TDataStd_NamedData) S = Handle(TDataStd_NamedData)::DownCast(theSource);
658   if(S.IsNull()) {
659     WriteMessage ("NamedDataDriver:: The source attribute is Null.");
660     return;}
661
662   Standard_Integer i=0, up;
663   XmlObjMgt_Element& anElement = theTarget;
664   XmlObjMgt_Document aDoc = anElement.getOwnerDocument().Doc();
665   if(S->HasIntegers() && !S->GetIntegersContainer().IsEmpty()) {
666     // store a set of elements with string in each of them
667     up = S->GetIntegersContainer().Extent();
668     theTarget.Element().setAttribute(::LastIntegerIndex(), up);
669
670     TColStd_DataMapIteratorOfDataMapOfStringInteger itr(S->GetIntegersContainer());
671     for (i=1; itr.More(); itr.Next(),i++) {
672       const TCollection_ExtendedString aValueStr = 
673         itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
674       XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
675       XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
676       anElement.appendChild( aCurTarget );
677     }
678   }
679
680   if(S->HasReals() && !S->GetRealsContainer().IsEmpty()) {
681     up = S->GetRealsContainer().Extent();
682     theTarget.Element().setAttribute(::LastRealIndex(), up);
683     TDataStd_DataMapIteratorOfDataMapOfStringReal itr(S->GetRealsContainer());
684     for (i=1; itr.More(); itr.Next(),i++) {
685      const TCollection_ExtendedString aValueStr = 
686         itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
687      XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
688      XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
689      anElement.appendChild( aCurTarget );
690     }
691   } 
692
693   if(S->HasStrings() && !S->GetStringsContainer().IsEmpty()) {
694     up = S->GetStringsContainer().Extent();
695     theTarget.Element().setAttribute(::LastStringIndex(), up);
696     TDataStd_DataMapIteratorOfDataMapOfStringString itr(S->GetStringsContainer());
697     for (i=1; itr.More(); itr.Next(),i++) {
698       const TCollection_ExtendedString aValueStr = 
699         itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key(without blanks) - value;
700       XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
701       XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
702       anElement.appendChild( aCurTarget );
703     }
704   } 
705
706   if(S->HasBytes() && !S->GetBytesContainer().IsEmpty()) {
707     up = S->GetBytesContainer().Extent();
708     theTarget.Element().setAttribute(::LastByteIndex(), up);
709     TDataStd_DataMapIteratorOfDataMapOfStringByte itr(S->GetBytesContainer());
710     for (i=1; itr.More(); itr.Next(),i++) {
711       const TCollection_ExtendedString aValueStr = 
712         itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
713       XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
714       XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
715       anElement.appendChild( aCurTarget );
716     }
717   } 
718
719   if(S->HasArraysOfIntegers() && !S->GetArraysOfIntegersContainer().IsEmpty()) {
720     up = S->GetArraysOfIntegersContainer().Extent();
721     theTarget.Element().setAttribute(::LastIntArrIndex(), up);
722     TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger itr(S->GetArraysOfIntegersContainer());
723     for (i=1; itr.More(); itr.Next(),i++) {
724       const TColStd_Array1OfInteger& anArr1 = itr.Value()->Array1();
725       const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
726
727       const TCollection_ExtendedString aValueStr = 
728         itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
729       XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
730       XmlObjMgt::SetExtendedString( aCurTarget,  aValueStr); //key
731       anElement.appendChild( aCurTarget );
732
733       //Value = Array
734       TCollection_AsciiString aValueStr2;
735       Standard_Integer j = anArr1.Lower();
736        while (1) {
737          aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
738          if (j >= anArr1.Upper()) break;
739          aValueStr2 += ' ';
740          j++;
741        }
742
743       aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
744     }
745   }
746
747   if(S->HasArraysOfReals() && !S->GetArraysOfRealsContainer().IsEmpty()) {
748     up = S->GetArraysOfRealsContainer().Extent();
749     theTarget.Element().setAttribute(::LastRealArrIndex(), up);
750     TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal itr(S->GetArraysOfRealsContainer());
751     for (i=1; itr.More(); itr.Next(),i++) {
752       const TColStd_Array1OfReal& anArr1 = itr.Value()->Array1();
753       const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
754
755       //key
756       const TCollection_ExtendedString aValueStr = 
757         itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
758       XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
759       XmlObjMgt::SetExtendedString( aCurTarget,  aValueStr); //key
760       anElement.appendChild( aCurTarget );
761
762       //Value = Array
763       TCollection_AsciiString aValueStr2;
764       Standard_Integer j = anArr1.Lower();
765       while (1) {
766 #ifndef OCC6010
767         aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
768 #else
769         char aValueChar[32];
770         Sprintf(aValueChar, "%.15g", anArr1.Value(j));
771         TCollection_AsciiString aValueStr(aValueChar);
772         aValueStr2 += aValueStr;
773 #endif
774         if (j >= anArr1.Upper()) break;
775         aValueStr2 += ' ';
776         j++;
777       }
778       aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
779
780     }
781   }
782 }