1 // Created on: 2007-07-03
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2007-2012 OPEN CASCADE SAS
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.
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.
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.
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")
56 IMPLEMENT_DOMSTRING (ExtString, "string")
57 IMPLEMENT_DOMSTRING (Value, "value")
64 #define EXCEPTION Standard_Failure
66 //=======================================================================
67 //function : XmlMDataStd_NamedDataDriver
68 //purpose : Constructor
69 //=======================================================================
70 XmlMDataStd_NamedDataDriver::XmlMDataStd_NamedDataDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
71 : XmlMDF_ADriver (theMsgDriver, NULL)
76 //=======================================================================
79 //=======================================================================
80 Handle(TDF_Attribute) XmlMDataStd_NamedDataDriver::NewEmpty() const
82 return new TDataStd_NamedData();
85 //=======================================================================
86 static TCollection_ExtendedString SplitItemFromEnd(TCollection_ExtendedString& Key)
88 TCollection_ExtendedString aValue;
89 const Standard_Integer aPos = Key. SearchFromEnd (" ");
90 if(aPos == -1) return aValue;
91 aValue = Key.Split(aPos-1);
95 //=======================================================================
96 static TCollection_ExtendedString SplitItemFromStart(TCollection_ExtendedString& Key)
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);
105 //=======================================================================
106 Handle(TColStd_HArray1OfInteger) BuildIntArray(const TCollection_AsciiString& ValString,
107 const Standard_Integer theLen)
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);
115 anArr->SetValue(i, aSVal.IntegerValue());
120 //=======================================================================
121 Handle(TColStd_HArray1OfReal) BuildRealArray(const TCollection_AsciiString& ValString,
122 const Standard_Integer theLen)
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);
130 anArr->SetValue(i, aSVal.RealValue());
134 //=======================================================================
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
142 Standard_Integer aFirstInd, aLastInd, ind;
143 const XmlObjMgt_Element& anElement = theSource;
145 //DataMapOfStringInteger: Read the FirstIndex; if the attribute is absent initialize to 1
146 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIntegerIndex());
147 if (aFirstIndex == NULL)
149 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
159 // Read the LastIndex;
160 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIntegerIndex());
161 if(aLastIndex == NULL) {
164 } else if (!aLastIndex.GetInteger(aLastInd)) {
165 TCollection_ExtendedString aMessageString =
166 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
167 " attribute (DataMapOfStringInteger) as \"")
169 WriteMessage (aMessageString);
170 return Standard_False;
173 Handle(TDataStd_NamedData) T = Handle(TDataStd_NamedData)::DownCast(theTarget);
176 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
177 if ( !anElement.hasChildNodes() )
179 TCollection_ExtendedString aMessageString =
180 TCollection_ExtendedString("Cannot retrieve DataMapOfStringInteger");
181 WriteMessage (aMessageString);
182 return Standard_False;
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;
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;
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;
211 TCollection_AsciiString aVal(aValueStr,'?');
212 Standard_Integer aValue = aVal.IntegerValue();
213 aMap.Bind(aKey, aValue);
214 T->ChangeIntegers(aMap);
217 //DataMapOfStringReal
218 aFirstIndex = anElement.getAttribute(::FirstRealIndex());
219 if (aFirstIndex == NULL)
221 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
231 // Read the LastIndex;
232 aLastIndex = anElement.getAttribute(::LastRealIndex());
233 if(aLastIndex == NULL) {
236 } else if (!aLastIndex.GetInteger(aLastInd)) {
237 TCollection_ExtendedString aMessageString =
238 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
239 " attribute (DataMapOfStringReal) as \"")
241 WriteMessage (aMessageString);
242 return Standard_False;
245 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
246 if ( !anElement.hasChildNodes())
248 TCollection_ExtendedString aMessageString =
249 TCollection_ExtendedString("Cannot retrieve DataMapOfStringReal");
250 WriteMessage (aMessageString);
251 return Standard_False;
254 LDOM_Element* aCurElement;
255 if (aCurNode.isNull())
256 aCurNode = anElement.getFirstChild();
258 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
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;
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;
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;
286 TCollection_AsciiString aVal(aValueStr,'?');
287 Standard_Real aValue = aVal.RealValue();
288 aMap.Bind(aKey, aValue);
289 T->ChangeReals(aMap);
292 //DataMapOfStringString
293 aFirstIndex = anElement.getAttribute(::FirstStringIndex());
294 if (aFirstIndex == NULL)
296 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
305 aLastIndex = anElement.getAttribute(::LastStringIndex());
306 if(aLastIndex == NULL) {
309 } else if (!aLastIndex.GetInteger(aLastInd)) {
310 TCollection_ExtendedString aMessageString =
311 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
312 " attribute (DataMapOfStringString) as \"")
314 WriteMessage (aMessageString);
315 return Standard_False;
318 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
319 if ( !anElement.hasChildNodes())
321 TCollection_ExtendedString aMessageString =
322 TCollection_ExtendedString("Cannot retrieve DataMapOfStringString");
323 WriteMessage (aMessageString);
324 return Standard_False;
326 LDOM_Element* aCurElement;
327 if (aCurNode.isNull())
328 aCurNode = anElement.getFirstChild();
330 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
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;
344 aMap.Bind(aKey, aValue);
345 aCurNode = aCurElement->getNextSibling();
346 aCurElement = (LDOM_Element*)&aCurNode;
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;
357 aMap.Bind(aKey, aValue);
358 T->ChangeStrings(aMap);
361 //DataMapOfStringByte
362 aFirstIndex = anElement.getAttribute(::FirstByteIndex());
363 if (aFirstIndex == NULL)
365 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
375 // Read the LastIndex;
376 aLastIndex = anElement.getAttribute(::LastByteIndex());
377 if(aLastIndex == NULL) {
380 } else if (!aLastIndex.GetInteger(aLastInd)) {
381 TCollection_ExtendedString aMessageString =
382 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
383 " attribute (DataMapOfStringByte) as \"")
385 WriteMessage (aMessageString);
386 return Standard_False;
389 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
390 if ( !anElement.hasChildNodes())
392 TCollection_ExtendedString aMessageString =
393 TCollection_ExtendedString("Cannot retrieve DataMapOfStringByte");
394 WriteMessage (aMessageString);
395 return Standard_False;
398 LDOM_Element* aCurElement;
399 if (aCurNode.isNull())
400 aCurNode = anElement.getFirstChild();
402 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
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;
417 TCollection_AsciiString aVal(aValueStr,'?');
418 Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
420 aMap.Bind(aKey, aValue);
421 aCurNode = aCurElement->getNextSibling();
422 aCurElement = (LDOM_Element*)&aCurNode;
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;
433 TCollection_AsciiString aVal(aValueStr,'?');
434 Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
435 aMap.Bind(aKey, aValue);
436 T->ChangeBytes(aMap);
439 //DataMapOfStringHArray1OfInteger
440 aFirstIndex = anElement.getAttribute(::FirstIntArrIndex());
441 if (aFirstIndex == NULL)
443 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
453 // Read the LastIndex;
454 aLastIndex = anElement.getAttribute(::LastIntArrIndex());
455 if(aLastIndex == NULL) {
458 } else if (!aLastIndex.GetInteger(aLastInd)) {
459 TCollection_ExtendedString aMessageString =
460 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
461 " attribute (DataMapOfStringHArray1OfInteger) as \"")
463 WriteMessage (aMessageString);
464 return Standard_False;
467 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
468 if ( !anElement.hasChildNodes())
470 TCollection_ExtendedString aMessageString =
471 TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfInteger");
472 WriteMessage (aMessageString);
473 return Standard_False;
475 LDOM_Element* aCurElement;
476 if (aCurNode.isNull())
477 aCurNode = anElement.getFirstChild();
479 aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
481 aCurElement = (LDOM_Element*)&aCurNode;
482 TCollection_ExtendedString aKey, aValueStr;
483 TDataStd_DataMapOfStringHArray1OfInteger aMap;
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;
494 TCollection_AsciiString aVal(aValueStr,'?');
495 Standard_Integer aLen = aVal.IntegerValue();
498 // XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value());
499 // const char* aS = aValStr.GetString();
500 // cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " << aS << endl;
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;
512 aMap.Bind(aKey, aValue);
513 aCurNode = aCurElement->getNextSibling();
514 aCurElement = (LDOM_Element*)&aCurNode;
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;
525 TCollection_AsciiString aVal(aValueStr,'?');
526 Standard_Integer aLen = aVal.IntegerValue();
528 // XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value());
529 // const char* aS = aValStr.GetString();
530 // cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " <<aS<<endl;
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;
540 aMap.Bind(aKey, aValue);
541 T->ChangeArraysOfIntegers(aMap);
544 //DataMapOfStringHArray1OfReal
545 aFirstIndex = anElement.getAttribute(::FirstRealArrIndex());
546 if (aFirstIndex == NULL)
548 else if (!aFirstIndex.GetInteger(aFirstInd))
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;
558 // Read the LastIndex;
559 aLastIndex = anElement.getAttribute(::LastRealArrIndex());
560 if(aLastIndex == NULL) {
563 } else if (!aLastIndex.GetInteger(aLastInd)) {
564 TCollection_ExtendedString aMessageString =
565 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
566 " attribute (DataMapOfStringHArray1OfReal) as \"")
568 WriteMessage (aMessageString);
569 return Standard_False;
572 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
573 if ( !anElement.hasChildNodes())
575 TCollection_ExtendedString aMessageString =
576 TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfReal");
577 WriteMessage (aMessageString);
578 return Standard_False;
581 LDOM_Element* aCurElement;
582 if (aCurNode.isNull())
583 aCurNode = anElement.getFirstChild();
585 aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
587 aCurElement = (LDOM_Element*)&aCurNode;
588 TCollection_ExtendedString aKey, aValueStr;
589 TDataStd_DataMapOfStringHArray1OfReal aMap;
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;
600 TCollection_AsciiString aVal(aValueStr,'?');
601 Standard_Integer aLen = aVal.IntegerValue();
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;
612 aMap.Bind(aKey, aValue);
613 aCurNode = aCurElement->getNextSibling();
614 aCurElement = (LDOM_Element*)&aCurNode;
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;
625 TCollection_AsciiString aVal(aValueStr,'?');
626 Standard_Integer aLen = aVal.IntegerValue();
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;
637 aMap.Bind(aKey, aValue);
638 T->ChangeArraysOfReals(aMap);
640 } catch (EXCEPTION) {
641 TCollection_ExtendedString aMessageString =
642 TCollection_ExtendedString("Unknown exception during data retrieve in NamedDatDriver ");
643 WriteMessage (aMessageString);
644 return Standard_False;}
646 return Standard_True;
649 //=======================================================================
651 //purpose : transient -> persistent (store)
652 //=======================================================================
653 void XmlMDataStd_NamedDataDriver::Paste(const Handle(TDF_Attribute)& theSource,
654 XmlObjMgt_Persistent& theTarget,
655 XmlObjMgt_SRelocationTable& ) const
657 Handle(TDataStd_NamedData) S = Handle(TDataStd_NamedData)::DownCast(theSource);
659 WriteMessage ("NamedDataDriver:: The source attribute is Null.");
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);
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 );
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 );
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 );
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 );
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;
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 );
734 TCollection_AsciiString aValueStr2;
735 Standard_Integer j = anArr1.Lower();
737 aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
738 if (j >= anArr1.Upper()) break;
743 aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
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;
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 );
763 TCollection_AsciiString aValueStr2;
764 Standard_Integer j = anArr1.Lower();
767 aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
770 Sprintf(aValueChar, "%.15g", anArr1.Value(j));
771 TCollection_AsciiString aValueStr(aValueChar);
772 aValueStr2 += aValueStr;
774 if (j >= anArr1.Upper()) break;
778 aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());