0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / XmlMDF / XmlMDF_ADriverTable.cxx
CommitLineData
b311480e 1// Created on: 2001-09-26
2// Created by: Julia DOROVSKIKH
973c2be1 3// Copyright (c) 2001-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
c99ad5d7 16#include <XmlMDF_ADriverTable.hxx>
42cf5bc1 17
c99ad5d7 18#include <Message_Messenger.hxx>
c99ad5d7 19#include <TDF_AttributeList.hxx>
42cf5bc1 20#include <XmlMDF_ADriver.hxx>
c99ad5d7 21#include <XmlMDF_DerivedDriver.hxx>
7fd59977 22
25e59720 23IMPLEMENT_STANDARD_RTTIEXT(XmlMDF_ADriverTable,Standard_Transient)
92efcf78 24
7fd59977 25//=======================================================================
26//function : MDF_ADriverTable
27//purpose :
28//=======================================================================
29XmlMDF_ADriverTable::XmlMDF_ADriverTable()
30{}
31
32//=======================================================================
33//function : AddDriver
34//purpose :
35//=======================================================================
36void XmlMDF_ADriverTable::AddDriver (const Handle(XmlMDF_ADriver)& anHDriver)
37{
38 const Handle(Standard_Type)& type = anHDriver->SourceType();
39
40 // to make possible for applications to redefine standard attribute drivers
41 myMap.UnBind(type);
42
43 myMap.Bind(type,anHDriver);
44}
45
46//=======================================================================
c99ad5d7 47//function : AddDerivedDriver
48//purpose :
49//=======================================================================
50void XmlMDF_ADriverTable::AddDerivedDriver (const Handle(TDF_Attribute)& theInstance)
51{
52 const Handle(Standard_Type)& anInstanceType = theInstance->DynamicType();
53 if (!myMap.IsBound (anInstanceType)) // no direct driver, use a derived one
54 {
55 for (Handle(Standard_Type) aType = anInstanceType->Parent(); !aType.IsNull(); aType = aType->Parent())
56 {
57 if (myMap.IsBound (aType))
58 {
59 Handle(XmlMDF_ADriver) aDriver = new XmlMDF_DerivedDriver (theInstance, myMap (aType));
60 myMap.Bind (anInstanceType, aDriver);
61 return;
62 }
63 }
64 }
65}
66
7fd59977 67//=======================================================================
c99ad5d7 68//function : AddDerivedDriver
69//purpose :
70//=======================================================================
71const Handle(Standard_Type)& XmlMDF_ADriverTable::AddDerivedDriver (Standard_CString theDerivedType)
7fd59977 72{
c99ad5d7 73 if (Handle(TDF_Attribute) anInstance = TDF_DerivedAttribute::Attribute (theDerivedType))
74 {
75 AddDerivedDriver (anInstance);
76 return anInstance->DynamicType();
77 }
78 static const Handle(Standard_Type) aNullType;
79 return aNullType;
7fd59977 80}
81
82//=======================================================================
83//function : GetDriver
84//purpose :
85//=======================================================================
86Standard_Boolean XmlMDF_ADriverTable::GetDriver
87 (const Handle(Standard_Type)& aType,
c99ad5d7 88 Handle(XmlMDF_ADriver)& anHDriver)
7fd59977 89{
c99ad5d7 90 if (!myMap.IsBound (aType)) // try to assign driver for derived type
91 {
92 AddDerivedDriver (aType->Name());
93 }
7fd59977 94 if (myMap.IsBound(aType))
95 {
96 anHDriver = myMap.Find(aType);
97 return Standard_True;
98 }
99 return Standard_False;
100}
c99ad5d7 101
102//=======================================================================
103//function : CreateDrvMap
104//purpose :
105//=======================================================================
106void XmlMDF_ADriverTable::CreateDrvMap (XmlMDF_MapOfDriver& theDriverMap)
107{
108 // add derived drivers not yet registered in the map
109 TDF_AttributeList aDerived;
110 TDF_DerivedAttribute::Attributes (aDerived);
111 for (TDF_AttributeList::Iterator aDerIter (aDerived); aDerIter.More(); aDerIter.Next())
112 {
113 if (!myMap.IsBound (aDerIter.Value()->DynamicType()))
114 {
115 AddDerivedDriver (aDerIter.Value());
116 }
117 }
118
119 // put everything to the map
120 for (XmlMDF_DataMapIteratorOfTypeADriverMap anIter (myMap); anIter.More(); anIter.Next())
121 {
122 const Handle(XmlMDF_ADriver)& aDriver = anIter.Value();
123 const TCollection_AsciiString aTypeName = aDriver->TypeName();
124 if (!theDriverMap.IsBound (aTypeName))
125 {
126 theDriverMap.Bind (aTypeName, aDriver);
127 }
128 else
129 {
130 aDriver->MessageDriver()->Send (TCollection_AsciiString ("Warning: skipped driver name: \"")
131 + aTypeName + "\"", Message_Warning);
132 }
133 }
134}