1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-04 18:06:22 +03:00
occt/src/XmlMDataStd/XmlMDataStd_NamedDataDriver.cxx
abv 92efcf78a6 0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
Automatic restore of IMPLEMENT_STANDARD_RTTIEXT macro (upgrade -rtti)
2015-12-04 14:15:06 +03:00

766 lines
28 KiB
C++

// Created on: 2007-07-03
// Created by: Sergey ZARITCHNY
// Copyright (c) 2007-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <CDM_MessageDriver.hxx>
#include <LDOM_MemManager.hxx>
#include <Standard_Type.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx>
#include <TColStd_DataMapOfStringInteger.hxx>
#include <TColStd_HArray1OfInteger.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx>
#include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx>
#include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx>
#include <TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx>
#include <TDataStd_DataMapIteratorOfDataMapOfStringString.hxx>
#include <TDataStd_DataMapOfStringByte.hxx>
#include <TDataStd_DataMapOfStringHArray1OfInteger.hxx>
#include <TDataStd_DataMapOfStringHArray1OfReal.hxx>
#include <TDataStd_DataMapOfStringReal.hxx>
#include <TDataStd_DataMapOfStringString.hxx>
#include <TDataStd_NamedData.hxx>
#include <TDF_Attribute.hxx>
#include <XmlMDataStd_NamedDataDriver.hxx>
#include <XmlObjMgt.hxx>
#include <XmlObjMgt_Document.hxx>
#include <XmlObjMgt_Persistent.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XmlMDataStd_NamedDataDriver,XmlMDF_ADriver)
IMPLEMENT_DOMSTRING (FirstIntegerIndex, "firstI")
IMPLEMENT_DOMSTRING (LastIntegerIndex, "lastI")
IMPLEMENT_DOMSTRING (FirstRealIndex, "firstR")
IMPLEMENT_DOMSTRING (LastRealIndex, "lastR")
IMPLEMENT_DOMSTRING (FirstStringIndex, "firstS")
IMPLEMENT_DOMSTRING (LastStringIndex, "lastS")
IMPLEMENT_DOMSTRING (FirstByteIndex, "firstB")
IMPLEMENT_DOMSTRING (LastByteIndex, "lastB")
IMPLEMENT_DOMSTRING (FirstIntArrIndex, "firstIA")
IMPLEMENT_DOMSTRING (LastIntArrIndex, "lastIA")
IMPLEMENT_DOMSTRING (FirstRealArrIndex, "firstRA")
IMPLEMENT_DOMSTRING (LastRealArrIndex, "lastRA")
IMPLEMENT_DOMSTRING (ExtString, "string")
IMPLEMENT_DOMSTRING (Value, "value")
#ifdef _WIN32
#define EXCEPTION ...
#else
#define EXCEPTION Standard_Failure
#endif
//=======================================================================
//function : XmlMDataStd_NamedDataDriver
//purpose : Constructor
//=======================================================================
XmlMDataStd_NamedDataDriver::XmlMDataStd_NamedDataDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
: XmlMDF_ADriver (theMsgDriver, NULL)
{
}
//=======================================================================
//function : NewEmpty
//purpose :
//=======================================================================
Handle(TDF_Attribute) XmlMDataStd_NamedDataDriver::NewEmpty() const
{
return new TDataStd_NamedData();
}
//=======================================================================
static TCollection_ExtendedString SplitItemFromEnd(TCollection_ExtendedString& Key)
{
TCollection_ExtendedString aValue;
const Standard_Integer aPos = Key. SearchFromEnd (" ");
if(aPos == -1) return aValue;
aValue = Key.Split(aPos-1);
aValue.Remove(1,1);
return aValue;
}
//=======================================================================
static TCollection_ExtendedString SplitItemFromStart(TCollection_ExtendedString& Key)
{
TCollection_ExtendedString aValue;
const Standard_Integer aPos = Key. Search (" ");
if(aPos == -1) return aValue;
aValue = Key.Split(aPos);
Key.Remove(Key.Length(),1);
return aValue;
}
//=======================================================================
Handle(TColStd_HArray1OfInteger) BuildIntArray(const TCollection_AsciiString& ValString,
const Standard_Integer theLen)
{
Handle(TColStd_HArray1OfInteger) anArr;
if(ValString.Length() == 0 || !theLen) return anArr;
anArr = new TColStd_HArray1OfInteger (1, theLen, 0);
for(Standard_Integer i = 1;i <= theLen;i++) {
const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
if(aSVal.Length())
anArr->SetValue(i, aSVal.IntegerValue());
}
return anArr;
}
//=======================================================================
Handle(TColStd_HArray1OfReal) BuildRealArray(const TCollection_AsciiString& ValString,
const Standard_Integer theLen)
{
Handle(TColStd_HArray1OfReal) anArr;
if(ValString.Length() == 0 || !theLen) return anArr;
anArr = new TColStd_HArray1OfReal (1, theLen, .0);
for(Standard_Integer i = 1;i <= theLen;i++) {
const TCollection_AsciiString& aSVal = ValString.Token(" ",i);
if(aSVal.Length())
anArr->SetValue(i, aSVal.RealValue());
}
return anArr;
}
//=======================================================================
//function : Paste
//purpose : persistent -> transient (retrieve)
//=======================================================================
Standard_Boolean XmlMDataStd_NamedDataDriver::Paste(const XmlObjMgt_Persistent& theSource,
const Handle(TDF_Attribute)& theTarget,
XmlObjMgt_RRelocationTable& ) const
{
Standard_Integer aFirstInd, aLastInd, ind;
const XmlObjMgt_Element& anElement = theSource;
//DataMapOfStringInteger: Read the FirstIndex; if the attribute is absent initialize to 1
XmlObjMgt_DOMString aFirstIndex = anElement.getAttribute(::FirstIntegerIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
" attribute (DataMapOfStringInteger) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
// Read the LastIndex;
XmlObjMgt_DOMString aLastIndex = anElement.getAttribute(::LastIntegerIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringInteger) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
try {
Handle(TDataStd_NamedData) T = Handle(TDataStd_NamedData)::DownCast(theTarget);
LDOM_Node aCurNode;
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes() )
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringInteger");
WriteMessage (aMessageString);
return Standard_False;
}
aCurNode = anElement.getFirstChild();
LDOM_Element* aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aValueStr, aKey;
TColStd_DataMapOfStringInteger aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aValue = aVal.IntegerValue();
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aValue = aVal.IntegerValue();
aMap.Bind(aKey, aValue);
T->ChangeIntegers(aMap);
}
//DataMapOfStringReal
aFirstIndex = anElement.getAttribute(::FirstRealIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
"attribute (DataMapOfStringReal) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
// Read the LastIndex;
aLastIndex = anElement.getAttribute(::LastRealIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringReal) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes())
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringReal");
WriteMessage (aMessageString);
return Standard_False;
}
LDOM_Element* aCurElement;
if (aCurNode.isNull())
aCurNode = anElement.getFirstChild();
else
aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aValueStr, aKey;
TDataStd_DataMapOfStringReal aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Real aValue = aVal.RealValue();
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Real aValue = aVal.RealValue();
aMap.Bind(aKey, aValue);
T->ChangeReals(aMap);
}
//DataMapOfStringString
aFirstIndex = anElement.getAttribute(::FirstStringIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData"
" attribute (DataMapOfStringString) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
aLastIndex = anElement.getAttribute(::LastStringIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringString) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes())
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringString");
WriteMessage (aMessageString);
return Standard_False;
}
LDOM_Element* aCurElement;
if (aCurNode.isNull())
aCurNode = anElement.getFirstChild();
else
aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aValue, aKey;
TDataStd_DataMapOfStringString aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValue = SplitItemFromStart(aKey); // ==>from start
if(aValue.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValue = SplitItemFromStart(aKey);
if(aValue.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
T->ChangeStrings(aMap);
}
//DataMapOfStringByte
aFirstIndex = anElement.getAttribute(::FirstByteIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
"attribute (DataMapOfStringByte) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
// Read the LastIndex;
aLastIndex = anElement.getAttribute(::LastByteIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringByte) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes())
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringByte");
WriteMessage (aMessageString);
return Standard_False;
}
LDOM_Element* aCurElement;
if (aCurNode.isNull())
aCurNode = anElement.getFirstChild();
else
aCurNode = ((LDOM_Element*)&aCurNode)->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aValueStr, aKey;
TDataStd_DataMapOfStringByte aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Byte aValue = (Standard_Byte)aVal.IntegerValue();
aMap.Bind(aKey, aValue);
T->ChangeBytes(aMap);
}
//DataMapOfStringHArray1OfInteger
aFirstIndex = anElement.getAttribute(::FirstIntArrIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
"attribute (DataMapOfStringHArray1OfInteger) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
// Read the LastIndex;
aLastIndex = anElement.getAttribute(::LastIntArrIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringHArray1OfInteger) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes())
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfInteger");
WriteMessage (aMessageString);
return Standard_False;
}
LDOM_Element* aCurElement;
if (aCurNode.isNull())
aCurNode = anElement.getFirstChild();
else
aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aKey, aValueStr;
TDataStd_DataMapOfStringHArray1OfInteger aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aLen = aVal.IntegerValue();
TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
if(aValue.IsNull()) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aLen = aVal.IntegerValue();
TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
Handle(TColStd_HArray1OfInteger) aValue = BuildIntArray(aValueString, aLen);
if(aValue.IsNull()) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
T->ChangeArraysOfIntegers(aMap);
}
//DataMapOfStringHArray1OfReal
aFirstIndex = anElement.getAttribute(::FirstRealArrIndex());
if (aFirstIndex == NULL)
aFirstInd = 1;
else if (!aFirstIndex.GetInteger(aFirstInd))
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the first index for NamedData "
"attribute (DataMapOfStringHArray1OfReal) as \"")
+ aFirstIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
// Read the LastIndex;
aLastIndex = anElement.getAttribute(::LastRealArrIndex());
if(aLastIndex == NULL) {
aFirstInd = 0;
aLastInd = 0;
} else if (!aLastIndex.GetInteger(aLastInd)) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve the last index for NamedData"
" attribute (DataMapOfStringHArray1OfReal) as \"")
+ aLastIndex + "\"";
WriteMessage (aMessageString);
return Standard_False;
}
if((aFirstInd | aLastInd) && aLastInd >= aFirstInd) {
if ( !anElement.hasChildNodes())
{
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve DataMapOfStringHArray1OfReal");
WriteMessage (aMessageString);
return Standard_False;
}
LDOM_Element* aCurElement;
if (aCurNode.isNull())
aCurNode = anElement.getFirstChild();
else
aCurNode =((LDOM_Element*)&aCurNode)->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
TCollection_ExtendedString aKey, aValueStr;
TDataStd_DataMapOfStringHArray1OfReal aMap;
for (ind = aFirstInd; ind < aLastInd; ind++) {
XmlObjMgt::GetExtendedString( *aCurElement, aKey );// Len - at the end
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aLen = aVal.IntegerValue();
TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
if(aValue.IsNull()) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
aCurNode = aCurElement->getNextSibling();
aCurElement = (LDOM_Element*)&aCurNode;
}
XmlObjMgt::GetExtendedString( *aCurElement, aKey );
aValueStr = SplitItemFromEnd(aKey);
if(aValueStr.Length() == 0) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
TCollection_AsciiString aVal(aValueStr,'?');
Standard_Integer aLen = aVal.IntegerValue();
TCollection_AsciiString aValueString = aCurElement->getAttribute(::Value());
Handle(TColStd_HArray1OfReal) aValue = BuildRealArray(aValueString, aLen);
if(aValue.IsNull()) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Cannot retrieve a value from item = ") + aKey;
WriteMessage (aMessageString);
return Standard_False;
}
aMap.Bind(aKey, aValue);
T->ChangeArraysOfReals(aMap);
}
} catch (EXCEPTION) {
TCollection_ExtendedString aMessageString =
TCollection_ExtendedString("Unknown exception during data retrieve in NamedDatDriver ");
WriteMessage (aMessageString);
return Standard_False;}
return Standard_True;
}
//=======================================================================
//function : Paste
//purpose : transient -> persistent (store)
//=======================================================================
void XmlMDataStd_NamedDataDriver::Paste(const Handle(TDF_Attribute)& theSource,
XmlObjMgt_Persistent& theTarget,
XmlObjMgt_SRelocationTable& ) const
{
Handle(TDataStd_NamedData) S = Handle(TDataStd_NamedData)::DownCast(theSource);
if(S.IsNull()) {
WriteMessage ("NamedDataDriver:: The source attribute is Null.");
return;}
Standard_Integer i=0, up;
XmlObjMgt_Element& anElement = theTarget;
XmlObjMgt_Document aDoc (anElement.getOwnerDocument());
if(S->HasIntegers() && !S->GetIntegersContainer().IsEmpty()) {
// store a set of elements with string in each of them
up = S->GetIntegersContainer().Extent();
theTarget.Element().setAttribute(::LastIntegerIndex(), up);
TColStd_DataMapIteratorOfDataMapOfStringInteger itr(S->GetIntegersContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
anElement.appendChild( aCurTarget );
}
}
if(S->HasReals() && !S->GetRealsContainer().IsEmpty()) {
up = S->GetRealsContainer().Extent();
theTarget.Element().setAttribute(::LastRealIndex(), up);
TDataStd_DataMapIteratorOfDataMapOfStringReal itr(S->GetRealsContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
anElement.appendChild( aCurTarget );
}
}
if(S->HasStrings() && !S->GetStringsContainer().IsEmpty()) {
up = S->GetStringsContainer().Extent();
theTarget.Element().setAttribute(::LastStringIndex(), up);
TDataStd_DataMapIteratorOfDataMapOfStringString itr(S->GetStringsContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key(without blanks) - value;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
anElement.appendChild( aCurTarget );
}
}
if(S->HasBytes() && !S->GetBytesContainer().IsEmpty()) {
up = S->GetBytesContainer().Extent();
theTarget.Element().setAttribute(::LastByteIndex(), up);
TDataStd_DataMapIteratorOfDataMapOfStringByte itr(S->GetBytesContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(itr.Value());// key - value;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr );
anElement.appendChild( aCurTarget );
}
}
if(S->HasArraysOfIntegers() && !S->GetArraysOfIntegersContainer().IsEmpty()) {
up = S->GetArraysOfIntegersContainer().Extent();
theTarget.Element().setAttribute(::LastIntArrIndex(), up);
TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger itr(S->GetArraysOfIntegersContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TColStd_Array1OfInteger& anArr1 = itr.Value()->Array1();
const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr); //key
anElement.appendChild( aCurTarget );
//Value = Array
TCollection_AsciiString aValueStr2;
Standard_Integer j = anArr1.Lower();
for(;;) {
aValueStr2 += TCollection_AsciiString(anArr1.Value(j));
if (j >= anArr1.Upper()) break;
aValueStr2 += ' ';
j++;
}
aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
}
}
if(S->HasArraysOfReals() && !S->GetArraysOfRealsContainer().IsEmpty()) {
up = S->GetArraysOfRealsContainer().Extent();
theTarget.Element().setAttribute(::LastRealArrIndex(), up);
TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal itr(S->GetArraysOfRealsContainer());
for (i=1; itr.More(); itr.Next(),i++) {
const TColStd_Array1OfReal& anArr1 = itr.Value()->Array1();
const Standard_Integer aLen = anArr1.Upper() - anArr1.Lower() +1;
//key
const TCollection_ExtendedString aValueStr =
itr.Key() + ' ' + TCollection_ExtendedString(aLen);// key - Num_of_Arr_elements;
XmlObjMgt_Element aCurTarget = aDoc.createElement( ::ExtString() );
XmlObjMgt::SetExtendedString( aCurTarget, aValueStr); //key
anElement.appendChild( aCurTarget );
//Value = Array
TCollection_AsciiString aValueStr2;
Standard_Integer j = anArr1.Lower();
for(;;) {
char aValueChar[32];
Sprintf(aValueChar, "%.15g", anArr1.Value(j));
TCollection_AsciiString aValueStr3(aValueChar);
aValueStr2 += aValueStr3;
if (j >= anArr1.Upper()) break;
aValueStr2 += ' ';
j++;
}
aCurTarget.setAttribute(::Value(), aValueStr2.ToCString());
}
}
}