1 // File: XmlMDataStd_NamedDataDriver.cxx
2 // Created: Tue Jul 3 11:17:43 2007
3 // Author: Sergey ZARITCHNY
4 // <sergey.zaritchny@opencascade.com>
5 // Copyright: Open CasCade SA 2007
7 #include <XmlMDataStd_NamedDataDriver.ixx>
8 #include <XmlObjMgt.hxx>
9 #include <XmlObjMgt_Document.hxx>
10 #include <LDOM_MemManager.hxx>
11 #include <TCollection_ExtendedString.hxx>
12 #include <CDM_MessageDriver.hxx>
13 #include <TDataStd_NamedData.hxx>
14 #include <TColStd_HArray1OfReal.hxx>
15 #include <TColStd_HArray1OfInteger.hxx>
16 #include <TColStd_HArray1OfReal.hxx>
17 #include <TColStd_DataMapOfStringInteger.hxx>
18 #include <TDataStd_DataMapOfStringReal.hxx>
19 #include <TDataStd_DataMapOfStringString.hxx>
20 #include <TDataStd_DataMapOfStringByte.hxx>
21 #include <TDataStd_DataMapOfStringHArray1OfInteger.hxx>
22 #include <TDataStd_DataMapOfStringHArray1OfReal.hxx>
23 #include <TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx>
24 #include <TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx>
25 #include <TDataStd_DataMapIteratorOfDataMapOfStringString.hxx>
26 #include <TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx>
27 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx>
28 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx>
29 IMPLEMENT_DOMSTRING (FirstIntegerIndex, "firstI")
30 IMPLEMENT_DOMSTRING (LastIntegerIndex, "lastI")
31 IMPLEMENT_DOMSTRING (FirstRealIndex, "firstR")
32 IMPLEMENT_DOMSTRING (LastRealIndex, "lastR")
33 IMPLEMENT_DOMSTRING (FirstStringIndex, "firstS")
34 IMPLEMENT_DOMSTRING (LastStringIndex, "lastS")
35 IMPLEMENT_DOMSTRING (FirstByteIndex, "firstB")
36 IMPLEMENT_DOMSTRING (LastByteIndex, "lastB")
37 IMPLEMENT_DOMSTRING (FirstIntArrIndex, "firstIA")
38 IMPLEMENT_DOMSTRING (LastIntArrIndex, "lastIA")
39 IMPLEMENT_DOMSTRING (FirstRealArrIndex, "firstRA")
40 IMPLEMENT_DOMSTRING (LastRealArrIndex, "lastRA")
42 IMPLEMENT_DOMSTRING (ExtString, "string")
43 IMPLEMENT_DOMSTRING (Value, "value")
50 #define EXCEPTION Standard_Failure
52 //=======================================================================
53 //function : XmlMDataStd_NamedDataDriver
54 //purpose : Constructor
55 //=======================================================================
56 XmlMDataStd_NamedDataDriver::XmlMDataStd_NamedDataDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
57 : XmlMDF_ADriver (theMsgDriver, NULL)
62 //=======================================================================
65 //=======================================================================
66 Handle(TDF_Attribute) XmlMDataStd_NamedDataDriver::NewEmpty() const
68 return new TDataStd_NamedData();
71 //=======================================================================
72 static TCollection_ExtendedString SplitItemFromEnd(TCollection_ExtendedString& Key)
74 TCollection_ExtendedString aValue;
75 const Standard_Integer aPos = Key. SearchFromEnd (" ");
76 if(aPos == -1) return aValue;
77 aValue = Key.Split(aPos-1);
81 //=======================================================================
82 static TCollection_ExtendedString SplitItemFromStart(TCollection_ExtendedString& Key)
84 TCollection_ExtendedString aValue;
85 const Standard_Integer aPos = Key. Search (" ");
86 if(aPos == -1) return aValue;
87 aValue = Key.Split(aPos);
88 Key.Remove(Key.Length(),1);
91 //=======================================================================
92 Handle(TColStd_HArray1OfInteger) BuildIntArray(const TCollection_AsciiString& ValString,
93 const Standard_Integer theLen)
95 Handle(TColStd_HArray1OfInteger) anArr;
96 if(ValString.Length() == 0 || !theLen) return anArr;
97 anArr = new TColStd_HArray1OfInteger (1, theLen, 0);
98 for(Standard_Integer i = 1;i <= theLen;i++) {
99 const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
101 anArr->SetValue(i, aSVal.IntegerValue());
106 //=======================================================================
107 Handle(TColStd_HArray1OfReal) BuildRealArray(const TCollection_AsciiString& ValString,
108 const Standard_Integer theLen)
110 Handle(TColStd_HArray1OfReal) anArr;
111 if(ValString.Length() == 0 || !theLen) return anArr;
112 anArr = new TColStd_HArray1OfReal (1, theLen, .0);
113 for(Standard_Integer i = 1;i <= theLen;i++) {
114 const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
116 anArr->SetValue(i, aSVal.RealValue());
120 //=======================================================================
122 //purpose : persistent -> transient (retrieve)
123 //=======================================================================
124 Standard_Boolean XmlMDataStd_NamedDataDriver::Paste(const XmlObjMgt_Persistent& theSource,
125 const Handle(TDF_Attribute)& theTarget,
126 XmlObjMgt_RRelocationTable& ) const
128 Standard_Integer aFirstInd, aLastInd, ind;
129 const XmlObjMgt_Element& anElement = theSource;
131 //DataMapOfStringInteger: Read the FirstIndex; if the attribute is absent initialize to 1
132 XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIntegerIndex());
133 if (aFirstIndex == NULL)
135 else if (!aFirstIndex.GetInteger(aFirstInd))
137 TCollection_ExtendedString aMessageString =
138 TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
139 " attribute (DataMapOfStringInteger) as \"")
140 + aFirstIndex + "\"";
141 WriteMessage (aMessageString);
142 return Standard_False;
145 // Read the LastIndex;
146 XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIntegerIndex());
147 if(aLastIndex == NULL) {
150 } else if (!aLastIndex.GetInteger(aLastInd)) {
151 TCollection_ExtendedString aMessageString =
152 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
153 " attribute (DataMapOfStringInteger) as \"")
155 WriteMessage (aMessageString);
156 return Standard_False;
159 Handle(TDataStd_NamedData) T = Handle(TDataStd_NamedData)::DownCast(theTarget);
162 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
163 if ( !anElement.hasChildNodes() )
165 TCollection_ExtendedString aMessageString =
166 TCollection_ExtendedString("Cannot retrieve DataMapOfStringInteger");
167 WriteMessage (aMessageString);
168 return Standard_False;
170 aCurNode = anElement.getFirstChild();
171 LDOM_Element* aCurElement = (LDOM_Element*)&aCurNode;
172 TCollection_ExtendedString aValueStr, aKey;
173 TColStd_DataMapOfStringInteger aMap;
174 for (ind = aFirstInd; ind < aLastInd; ind++) {
175 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
176 aValueStr = SplitItemFromEnd(aKey);
177 if(aValueStr.Length() == 0) {
178 TCollection_ExtendedString aMessageString =
179 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
180 WriteMessage (aMessageString);
181 return Standard_False;
183 TCollection_AsciiString aVal(aValueStr,'?');
184 Standard_Integer aValue = aVal.IntegerValue();
185 aMap.Bind(aKey, aValue);
186 aCurNode = aCurElement->getNextSibling();
187 aCurElement = (LDOM_Element*)&aCurNode;
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 T->ChangeIntegers(aMap);
203 //DataMapOfStringReal
204 aFirstIndex = anElement.getAttribute(::FirstRealIndex());
205 if (aFirstIndex == NULL)
207 else if (!aFirstIndex.GetInteger(aFirstInd))
209 TCollection_ExtendedString aMessageString =
210 TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
211 "attribute (DataMapOfStringReal) as \"")
212 + aFirstIndex + "\"";
213 WriteMessage (aMessageString);
214 return Standard_False;
217 // Read the LastIndex;
218 aLastIndex = anElement.getAttribute(::LastRealIndex());
219 if(aLastIndex == NULL) {
222 } else if (!aLastIndex.GetInteger(aLastInd)) {
223 TCollection_ExtendedString aMessageString =
224 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
225 " attribute (DataMapOfStringReal) as \"")
227 WriteMessage (aMessageString);
228 return Standard_False;
231 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
232 if ( !anElement.hasChildNodes())
234 TCollection_ExtendedString aMessageString =
235 TCollection_ExtendedString("Cannot retrieve DataMapOfStringReal");
236 WriteMessage (aMessageString);
237 return Standard_False;
240 LDOM_Element* aCurElement;
241 if (aCurNode.isNull())
242 aCurNode = anElement.getFirstChild();
244 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
246 aCurElement = (LDOM_Element*)&aCurNode;
247 TCollection_ExtendedString aValueStr, aKey;
248 TDataStd_DataMapOfStringReal aMap;
249 for (ind = aFirstInd; ind < aLastInd; ind++) {
250 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
251 aValueStr = SplitItemFromEnd(aKey);
252 if(aValueStr.Length() == 0) {
253 TCollection_ExtendedString aMessageString =
254 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
255 WriteMessage (aMessageString);
256 return Standard_False;
258 TCollection_AsciiString aVal(aValueStr,'?');
259 Standard_Real aValue = aVal.RealValue();
260 aMap.Bind(aKey, aValue);
261 aCurNode = aCurElement->getNextSibling();
262 aCurElement = (LDOM_Element*)&aCurNode;
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 T->ChangeReals(aMap);
278 //DataMapOfStringString
279 aFirstIndex = anElement.getAttribute(::FirstStringIndex());
280 if (aFirstIndex == NULL)
282 else if (!aFirstIndex.GetInteger(aFirstInd))
284 TCollection_ExtendedString aMessageString =
285 TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
286 " attribute (DataMapOfStringString) as \"")
287 + aFirstIndex + "\"";
288 WriteMessage (aMessageString);
289 return Standard_False;
291 aLastIndex = anElement.getAttribute(::LastStringIndex());
292 if(aLastIndex == NULL) {
295 } else if (!aLastIndex.GetInteger(aLastInd)) {
296 TCollection_ExtendedString aMessageString =
297 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
298 " attribute (DataMapOfStringString) as \"")
300 WriteMessage (aMessageString);
301 return Standard_False;
304 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
305 if ( !anElement.hasChildNodes())
307 TCollection_ExtendedString aMessageString =
308 TCollection_ExtendedString("Cannot retrieve DataMapOfStringString");
309 WriteMessage (aMessageString);
310 return Standard_False;
312 LDOM_Element* aCurElement;
313 if (aCurNode.isNull())
314 aCurNode = anElement.getFirstChild();
316 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
318 aCurElement = (LDOM_Element*)&aCurNode;
319 TCollection_ExtendedString aValue, aKey;
320 TDataStd_DataMapOfStringString aMap;
321 for (ind = aFirstInd; ind < aLastInd; ind++) {
322 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
323 aValue = SplitItemFromStart(aKey); // ==>from start
324 if(aValue.Length() == 0) {
325 TCollection_ExtendedString aMessageString =
326 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
327 WriteMessage (aMessageString);
328 return Standard_False;
330 aMap.Bind(aKey, aValue);
331 aCurNode = aCurElement->getNextSibling();
332 aCurElement = (LDOM_Element*)&aCurNode;
334 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
335 aValue = SplitItemFromStart(aKey);
336 if(aValue.Length() == 0) {
337 TCollection_ExtendedString aMessageString =
338 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
339 WriteMessage (aMessageString);
340 return Standard_False;
343 aMap.Bind(aKey, aValue);
344 T->ChangeStrings(aMap);
347 //DataMapOfStringByte
348 aFirstIndex = anElement.getAttribute(::FirstByteIndex());
349 if (aFirstIndex == NULL)
351 else if (!aFirstIndex.GetInteger(aFirstInd))
353 TCollection_ExtendedString aMessageString =
354 TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
355 "attribute (DataMapOfStringByte) as \"")
356 + aFirstIndex + "\"";
357 WriteMessage (aMessageString);
358 return Standard_False;
361 // Read the LastIndex;
362 aLastIndex = anElement.getAttribute(::LastByteIndex());
363 if(aLastIndex == NULL) {
366 } else if (!aLastIndex.GetInteger(aLastInd)) {
367 TCollection_ExtendedString aMessageString =
368 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
369 " attribute (DataMapOfStringByte) as \"")
371 WriteMessage (aMessageString);
372 return Standard_False;
375 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
376 if ( !anElement.hasChildNodes())
378 TCollection_ExtendedString aMessageString =
379 TCollection_ExtendedString("Cannot retrieve DataMapOfStringByte");
380 WriteMessage (aMessageString);
381 return Standard_False;
384 LDOM_Element* aCurElement;
385 if (aCurNode.isNull())
386 aCurNode = anElement.getFirstChild();
388 aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
390 aCurElement = (LDOM_Element*)&aCurNode;
391 TCollection_ExtendedString aValueStr, aKey;
392 TDataStd_DataMapOfStringByte aMap;
393 for (ind = aFirstInd; ind < aLastInd; ind++) {
394 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
395 aValueStr = SplitItemFromEnd(aKey);
396 if(aValueStr.Length() == 0) {
397 TCollection_ExtendedString aMessageString =
398 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
399 WriteMessage (aMessageString);
400 return Standard_False;
403 TCollection_AsciiString aVal(aValueStr,'?');
404 Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
406 aMap.Bind(aKey, aValue);
407 aCurNode = aCurElement->getNextSibling();
408 aCurElement = (LDOM_Element*)&aCurNode;
410 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
411 aValueStr = SplitItemFromEnd(aKey);
412 if(aValueStr.Length() == 0) {
413 TCollection_ExtendedString aMessageString =
414 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
415 WriteMessage (aMessageString);
416 return Standard_False;
419 TCollection_AsciiString aVal(aValueStr,'?');
420 Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
421 aMap.Bind(aKey, aValue);
422 T->ChangeBytes(aMap);
425 //DataMapOfStringHArray1OfInteger
426 aFirstIndex = anElement.getAttribute(::FirstIntArrIndex());
427 if (aFirstIndex == NULL)
429 else if (!aFirstIndex.GetInteger(aFirstInd))
431 TCollection_ExtendedString aMessageString =
432 TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
433 "attribute (DataMapOfStringHArray1OfInteger) as \"")
434 + aFirstIndex + "\"";
435 WriteMessage (aMessageString);
436 return Standard_False;
439 // Read the LastIndex;
440 aLastIndex = anElement.getAttribute(::LastIntArrIndex());
441 if(aLastIndex == NULL) {
444 } else if (!aLastIndex.GetInteger(aLastInd)) {
445 TCollection_ExtendedString aMessageString =
446 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
447 " attribute (DataMapOfStringHArray1OfInteger) as \"")
449 WriteMessage (aMessageString);
450 return Standard_False;
453 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
454 if ( !anElement.hasChildNodes())
456 TCollection_ExtendedString aMessageString =
457 TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfInteger");
458 WriteMessage (aMessageString);
459 return Standard_False;
461 LDOM_Element* aCurElement;
462 if (aCurNode.isNull())
463 aCurNode = anElement.getFirstChild();
465 aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
467 aCurElement = (LDOM_Element*)&aCurNode;
468 TCollection_ExtendedString aKey, aValueStr;
469 TDataStd_DataMapOfStringHArray1OfInteger aMap;
471 for (ind = aFirstInd; ind < aLastInd; ind++) {
472 XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
473 aValueStr = SplitItemFromEnd(aKey);
474 if(aValueStr.Length() == 0) {
475 TCollection_ExtendedString aMessageString =
476 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
477 WriteMessage (aMessageString);
478 return Standard_False;
480 TCollection_AsciiString aVal(aValueStr,'?');
481 Standard_Integer aLen = aVal.IntegerValue();
484 // XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value());
485 // const char* aS = aValStr.GetString();
486 // cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " << aS << endl;
489 TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
490 Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
491 if(aValue.IsNull()) {
492 TCollection_ExtendedString aMessageString =
493 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
494 WriteMessage (aMessageString);
495 return Standard_False;
498 aMap.Bind(aKey, aValue);
499 aCurNode = aCurElement->getNextSibling();
500 aCurElement = (LDOM_Element*)&aCurNode;
503 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
504 aValueStr = SplitItemFromEnd(aKey);
505 if(aValueStr.Length() == 0) {
506 TCollection_ExtendedString aMessageString =
507 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
508 WriteMessage (aMessageString);
509 return Standard_False;
511 TCollection_AsciiString aVal(aValueStr,'?');
512 Standard_Integer aLen = aVal.IntegerValue();
514 // XmlObjMgt_DOMString aValStr = aCurElement->getAttribute(::Value());
515 // const char* aS = aValStr.GetString();
516 // cout << " Key = " << TCollection_AsciiString(aKey, '?') << " aValue = " <<aS<<endl;
518 TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
519 Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
520 if(aValue.IsNull()) {
521 TCollection_ExtendedString aMessageString =
522 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
523 WriteMessage (aMessageString);
524 return Standard_False;
526 aMap.Bind(aKey, aValue);
527 T->ChangeArraysOfIntegers(aMap);
530 //DataMapOfStringHArray1OfReal
531 aFirstIndex = anElement.getAttribute(::FirstRealArrIndex());
532 if (aFirstIndex == NULL)
534 else if (!aFirstIndex.GetInteger(aFirstInd))
536 TCollection_ExtendedString aMessageString =
537 TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
538 "attribute (DataMapOfStringHArray1OfReal) as \"")
539 + aFirstIndex + "\"";
540 WriteMessage (aMessageString);
541 return Standard_False;
544 // Read the LastIndex;
545 aLastIndex = anElement.getAttribute(::LastRealArrIndex());
546 if(aLastIndex == NULL) {
549 } else if (!aLastIndex.GetInteger(aLastInd)) {
550 TCollection_ExtendedString aMessageString =
551 TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
552 " attribute (DataMapOfStringHArray1OfReal) as \"")
554 WriteMessage (aMessageString);
555 return Standard_False;
558 if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
559 if ( !anElement.hasChildNodes())
561 TCollection_ExtendedString aMessageString =
562 TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfReal");
563 WriteMessage (aMessageString);
564 return Standard_False;
567 LDOM_Element* aCurElement;
568 if (aCurNode.isNull())
569 aCurNode = anElement.getFirstChild();
571 aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
573 aCurElement = (LDOM_Element*)&aCurNode;
574 TCollection_ExtendedString aKey, aValueStr;
575 TDataStd_DataMapOfStringHArray1OfReal aMap;
577 for (ind = aFirstInd; ind < aLastInd; ind++) {
578 XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
579 aValueStr = SplitItemFromEnd(aKey);
580 if(aValueStr.Length() == 0) {
581 TCollection_ExtendedString aMessageString =
582 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
583 WriteMessage (aMessageString);
584 return Standard_False;
586 TCollection_AsciiString aVal(aValueStr,'?');
587 Standard_Integer aLen = aVal.IntegerValue();
589 TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
590 Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
591 if(aValue.IsNull()) {
592 TCollection_ExtendedString aMessageString =
593 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
594 WriteMessage (aMessageString);
595 return Standard_False;
598 aMap.Bind(aKey, aValue);
599 aCurNode = aCurElement->getNextSibling();
600 aCurElement = (LDOM_Element*)&aCurNode;
603 XmlObjMgt::GetExtendedString( *aCurElement, aKey );
604 aValueStr = SplitItemFromEnd(aKey);
605 if(aValueStr.Length() == 0) {
606 TCollection_ExtendedString aMessageString =
607 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
608 WriteMessage (aMessageString);
609 return Standard_False;
611 TCollection_AsciiString aVal(aValueStr,'?');
612 Standard_Integer aLen = aVal.IntegerValue();
614 TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
615 Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
616 if(aValue.IsNull()) {
617 TCollection_ExtendedString aMessageString =
618 TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
619 WriteMessage (aMessageString);
620 return Standard_False;
623 aMap.Bind(aKey, aValue);
624 T->ChangeArraysOfReals(aMap);
626 } catch (EXCEPTION) {
627 TCollection_ExtendedString aMessageString =
628 TCollection_ExtendedString("Unknown exception during data retrieve in NamedDatDriver ");
629 WriteMessage (aMessageString);
630 return Standard_False;}
632 return Standard_True;
635 //=======================================================================
637 //purpose : transient -> persistent (store)
638 //=======================================================================
639 void XmlMDataStd_NamedDataDriver::Paste(const Handle(TDF_Attribute)& theSource,
640 XmlObjMgt_Persistent& theTarget,
641 XmlObjMgt_SRelocationTable& ) const
643 Handle(TDataStd_NamedData) S = Handle(TDataStd_NamedData)::DownCast(theSource);
645 WriteMessage ("NamedDataDriver:: The source attribute is Null.");
648 Standard_Integer i=0, up;
649 XmlObjMgt_Element& anElement = theTarget;
650 XmlObjMgt_Document aDoc = anElement.getOwnerDocument().Doc();
651 if(S->HasIntegers() && !S->GetIntegersContainer().IsEmpty()) {
652 // store a set of elements with string in each of them
653 up = S->GetIntegersContainer().Extent();
654 theTarget.Element().setAttribute(::LastIntegerIndex(), up);
656 TColStd_DataMapIteratorOfDataMapOfStringInteger itr(S->GetIntegersContainer());
657 for (i=1; itr.More(); itr.Next(),i++) {
658 const TCollection_ExtendedString aValueStr =
659 itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
660 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
661 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
662 anElement.appendChild( aCurTarget );
666 if(S->HasReals() && !S->GetRealsContainer().IsEmpty()) {
667 up = S->GetRealsContainer().Extent();
668 theTarget.Element().setAttribute(::LastRealIndex(), up);
669 TDataStd_DataMapIteratorOfDataMapOfStringReal itr(S->GetRealsContainer());
670 for (i=1; itr.More(); itr.Next(),i++) {
671 const TCollection_ExtendedString aValueStr =
672 itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
673 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
674 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
675 anElement.appendChild( aCurTarget );
679 if(S->HasStrings() && !S->GetStringsContainer().IsEmpty()) {
680 up = S->GetStringsContainer().Extent();
681 theTarget.Element().setAttribute(::LastStringIndex(), up);
682 TDataStd_DataMapIteratorOfDataMapOfStringString itr(S->GetStringsContainer());
683 for (i=1; itr.More(); itr.Next(),i++) {
684 const TCollection_ExtendedString aValueStr =
685 itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key(without blanks) - value;
686 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
687 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
688 anElement.appendChild( aCurTarget );
692 if(S->HasBytes() && !S->GetBytesContainer().IsEmpty()) {
693 up = S->GetBytesContainer().Extent();
694 theTarget.Element().setAttribute(::LastByteIndex(), up);
695 TDataStd_DataMapIteratorOfDataMapOfStringByte itr(S->GetBytesContainer());
696 for (i=1; itr.More(); itr.Next(),i++) {
697 const TCollection_ExtendedString aValueStr =
698 itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
699 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
700 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
701 anElement.appendChild( aCurTarget );
705 if(S->HasArraysOfIntegers() && !S->GetArraysOfIntegersContainer().IsEmpty()) {
706 up = S->GetArraysOfIntegersContainer().Extent();
707 theTarget.Element().setAttribute(::LastIntArrIndex(), up);
708 TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger itr(S->GetArraysOfIntegersContainer());
709 for (i=1; itr.More(); itr.Next(),i++) {
710 const TColStd_Array1OfInteger& anArr1 = itr.Value()->Array1();
711 const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
713 const TCollection_ExtendedString aValueStr =
714 itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
715 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
716 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr); //key
717 anElement.appendChild( aCurTarget );
720 TCollection_AsciiString aValueStr2;
721 Standard_Integer j = anArr1.Lower();
723 aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
724 if (j >= anArr1.Upper()) break;
729 aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
733 if(S->HasArraysOfReals() && !S->GetArraysOfRealsContainer().IsEmpty()) {
734 up = S->GetArraysOfRealsContainer().Extent();
735 theTarget.Element().setAttribute(::LastRealArrIndex(), up);
736 TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal itr(S->GetArraysOfRealsContainer());
737 for (i=1; itr.More(); itr.Next(),i++) {
738 const TColStd_Array1OfReal& anArr1 = itr.Value()->Array1();
739 const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
742 const TCollection_ExtendedString aValueStr =
743 itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
744 XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
745 XmlObjMgt::SetExtendedString( aCurTarget, aValueStr); //key
746 anElement.appendChild( aCurTarget );
749 TCollection_AsciiString aValueStr2;
750 Standard_Integer j = anArr1.Lower();
753 aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
756 sprintf(aValueChar, "%.15g", anArr1.Value(j));
757 TCollection_AsciiString aValueStr(aValueChar);
758 aValueStr2 += aValueStr;
760 if (j >= anArr1.Upper()) break;
764 aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());