0024830: Remove redundant keyword 'mutable' in CDL declarations
[occt.git] / src / XmlMNaming / XmlMNaming_NamingDriver.cxx
1 // Created on: 2001-08-31
2 // Created by: Julia DOROVSKIKH
3 // Copyright (c) 2001-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <XmlMNaming_NamingDriver.ixx>
17
18 #include <XmlObjMgt.hxx>
19 #include <XmlMNaming.hxx>
20 #include <TNaming_Name.hxx>
21 #include <TNaming_Naming.hxx>
22 #include <TNaming_NamedShape.hxx>
23 #include <TNaming_ListIteratorOfListOfNamedShape.hxx>
24 #include <TNaming_Iterator.hxx>
25 #include <TDF_Tool.hxx>
26
27 //=======================================================================
28 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString&);
29 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString&);
30
31 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum);
32 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType);
33
34 IMPLEMENT_DOMSTRING (IndexString,               "index")
35 IMPLEMENT_DOMSTRING (StopNamedShapeString,      "stopNS")
36 IMPLEMENT_DOMSTRING (TypeString,                "nametype")
37 IMPLEMENT_DOMSTRING (ShapeTypeString,           "shapetype")
38 IMPLEMENT_DOMSTRING (ArgumentsString,           "arguments")
39 IMPLEMENT_DOMSTRING (ContextLabelString,        "contextlabel")
40 IMPLEMENT_DOMSTRING (OrientString,              "orientation")
41
42 IMPLEMENT_DOMSTRING (NTUnknownString,           "unknown")
43 IMPLEMENT_DOMSTRING (NTIdentityString,          "identity")
44 IMPLEMENT_DOMSTRING (NTModifUntilString,        "modifuntil")
45 IMPLEMENT_DOMSTRING (NTGenerationString,        "generation")
46 IMPLEMENT_DOMSTRING (NTIntersectionString,      "intersection")
47 IMPLEMENT_DOMSTRING (NTUnionString,             "union")
48 IMPLEMENT_DOMSTRING (NTSubtractionString,       "subtraction")
49 IMPLEMENT_DOMSTRING (NTConstShapeString,        "constshape")
50 IMPLEMENT_DOMSTRING (NTFilterByNeighString,     "filterbyneigh")
51 IMPLEMENT_DOMSTRING (NTOrientationString,       "orientation")
52 IMPLEMENT_DOMSTRING (NTWireInString,            "wirein")
53 IMPLEMENT_DOMSTRING (NTShellInString,            "shellin")
54
55 IMPLEMENT_DOMSTRING (ShCompoundString,          "compound")
56 IMPLEMENT_DOMSTRING (ShCompsolidString,         "compsolid")
57 IMPLEMENT_DOMSTRING (ShSolidString,             "solid")
58 IMPLEMENT_DOMSTRING (ShShellString,             "shell")
59 IMPLEMENT_DOMSTRING (ShFaceString,              "face")
60 IMPLEMENT_DOMSTRING (ShWireString,              "wire")
61 IMPLEMENT_DOMSTRING (ShEdgeString,              "edge")
62 IMPLEMENT_DOMSTRING (ShVertexString,            "vertex")
63 IMPLEMENT_DOMSTRING (ShShapeString,             "shape")
64
65 //=======================================================================
66 //function : XmlMNaming_NamingDriver
67 //purpose  : Constructor
68 //=======================================================================
69 XmlMNaming_NamingDriver::XmlMNaming_NamingDriver
70                         (const Handle(CDM_MessageDriver)& theMsgDriver)
71       : XmlMDF_ADriver (theMsgDriver, NULL)
72 {}
73
74 //=======================================================================
75 //function : NewEmpty
76 //purpose  : 
77 //=======================================================================
78 Handle(TDF_Attribute) XmlMNaming_NamingDriver::NewEmpty() const
79 {
80   return (new TNaming_Naming());
81 }
82
83 //=======================================================================
84 //function : Paste
85 //purpose  : persistent -> transient (retrieve)
86 //=======================================================================
87 Standard_Boolean XmlMNaming_NamingDriver::Paste
88                         (const XmlObjMgt_Persistent&  theSource,
89                          const Handle(TDF_Attribute)& theTarget,
90                          XmlObjMgt_RRelocationTable&  theRelocTable) const
91 {
92   const XmlObjMgt_Element& anElem = theSource;
93   Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theTarget);  
94
95   TNaming_Name& aNgName = aNg->ChangeName();
96
97   // type and shape type
98   aNgName.Type     (NameTypeFromString (anElem.getAttribute(::TypeString())));
99   aNgName.ShapeType(ShapeEnumFromString(anElem.getAttribute(::ShapeTypeString())));
100
101   Standard_Integer aNb;
102   Handle(TNaming_NamedShape) NS;
103   TCollection_ExtendedString aMsgString;
104
105   XmlObjMgt_DOMString aDOMStr = anElem.getAttribute(::ArgumentsString());
106   if (aDOMStr != NULL)
107   {
108     Standard_CString aGs = Standard_CString(aDOMStr.GetString());
109
110     // first argument
111     if (!XmlObjMgt::GetInteger(aGs, aNb))
112     {
113       aMsgString = TCollection_ExtendedString
114         ("XmlMNaming_NamingDriver: Cannot retrieve reference "
115          "on first Argument from \"") + aDOMStr + "\"";
116       WriteMessage (aMsgString);
117       return Standard_False;
118     }
119     while (aNb > 0)
120     {
121       if (theRelocTable.IsBound(aNb))
122         NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
123       else
124       {
125         NS = new TNaming_NamedShape;
126         theRelocTable.Bind(aNb, NS);
127       }
128       aNgName.Append(NS);
129
130       // next argument
131       if (!XmlObjMgt::GetInteger(aGs, aNb)) aNb = 0;
132     }
133   }
134
135   // stop named shape
136   aDOMStr = anElem.getAttribute(::StopNamedShapeString());
137   if (aDOMStr != NULL)
138   {
139     if (!aDOMStr.GetInteger(aNb))
140     {
141       aMsgString = TCollection_ExtendedString
142         ("XmlMNaming_NamingDriver: Cannot retrieve reference "
143          "on StopNamedShape from \"") + aDOMStr + "\"";
144       WriteMessage (aMsgString);
145       return Standard_False;
146     }
147     if (aNb > 0)
148     {
149       if (theRelocTable.IsBound(aNb))
150         NS = Handle(TNaming_NamedShape)::DownCast(theRelocTable.Find(aNb));
151       else
152       {
153         NS = new TNaming_NamedShape;
154         theRelocTable.Bind(aNb, NS);
155       }
156       aNgName.StopNamedShape(NS);  
157     }
158   }
159
160   // index
161   aDOMStr = anElem.getAttribute(::IndexString());
162   if (!aDOMStr.GetInteger(aNb))
163   {
164     aMsgString = TCollection_ExtendedString
165       ("XmlMNaming_NamingDriver: Cannot retrieve "
166        "integer value of Index from \"") + aDOMStr + "\"";
167     WriteMessage (aMsgString);
168     return Standard_False;
169   }
170   aNgName.Index(aNb);
171 //
172 #ifdef DEB
173   //cout << "CurDocVersion = " << XmlMNaming::DocumentVersion() <<endl;
174 #endif
175   if(XmlMNaming::DocumentVersion() > 3) {
176     XmlObjMgt_DOMString aDomEntry = anElem.getAttribute(::ContextLabelString());
177     if (aDomEntry != NULL)
178       { 
179         TCollection_AsciiString anEntry;
180         if (XmlObjMgt::GetTagEntryString (aDomEntry, anEntry) == Standard_False)
181           {
182             TCollection_ExtendedString aMessage =
183               TCollection_ExtendedString ("Cannot retrieve Entry from \"")
184                 + aDomEntry + '\"';
185             WriteMessage (aMessage);
186             return Standard_False;
187           }
188     
189         // find label by entry
190         TDF_Label tLab; // Null label.
191         if (anEntry.Length() > 0) {
192           TDF_Tool::Label(aNg->Label().Data(), anEntry, tLab, Standard_True);
193             aNgName.ContextLabel(tLab);
194 #ifdef DEB
195             cout << "Retrieving Context Label = " << anEntry.ToCString() <<endl;
196 #endif
197           }
198       }
199 #ifdef DEB
200     else
201       cout << "Retrieving Context Label is NULL" <<endl;
202 #endif
203
204     if(XmlMNaming::DocumentVersion() > 4 && XmlMNaming::DocumentVersion() < 7) {
205           // Orientation processing - converting from old format
206           Handle(TNaming_NamedShape) aNS;
207           if (aNg->Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
208             //const TDF_Label& aLab = aNS->Label();
209             TNaming_Iterator itL (aNS);
210             for (; itL.More(); itL.Next()) {
211               const TopoDS_Shape& S = itL.NewShape();
212               if (S.IsNull()) continue;
213               if(aNS->Evolution() == TNaming_SELECTED) {
214                 if (itL.More() && itL.NewShape().ShapeType() != TopAbs_VERTEX &&
215                     !itL.OldShape().IsNull() && itL.OldShape().ShapeType() == TopAbs_VERTEX ) {//OR-N
216                   TopAbs_Orientation OrientationToApply = itL.OldShape().Orientation();
217                   aNgName.Orientation(OrientationToApply);
218                 }
219               }
220             }
221           }         
222         }
223     if(XmlMNaming::DocumentVersion() > 6) {
224        aDOMStr = anElem.getAttribute(::OrientString());
225        if (!aDOMStr.GetInteger(aNb))
226        {
227          aMsgString = TCollection_ExtendedString
228            ("XmlMNaming_NamingDriver: Cannot retrieve "
229             "integer value of orientation from \"") + aDOMStr + "\"";
230          WriteMessage (aMsgString);
231          return Standard_False;
232        }
233        aNgName.Orientation((TopAbs_Orientation)aNb);
234     }
235     // or. end
236   }
237 #ifdef DEB
238   else if(XmlMNaming::DocumentVersion() == -1)
239     cout << "Current DocVersion field is not initialized. "  <<endl;
240   else 
241     cout << "Current DocVersion = "  << XmlMNaming::DocumentVersion() <<endl;
242 #endif
243   return Standard_True;
244 }
245
246 //=======================================================================
247 //function : Paste
248 //purpose  : transient -> persistent (store)
249 //=======================================================================
250 void XmlMNaming_NamingDriver::Paste
251                         (const Handle(TDF_Attribute)& theSource,
252                          XmlObjMgt_Persistent&        theTarget,
253                          XmlObjMgt_SRelocationTable&  theRelocTable) const
254 {
255   Handle(TNaming_Naming) aNg = Handle(TNaming_Naming)::DownCast(theSource);
256   XmlObjMgt_Element& anElem = theTarget;
257   const TNaming_Name& aNgName = aNg->GetName();
258
259   // type and shape type
260   anElem.setAttribute(::TypeString(), NameTypeToString(aNgName.Type()));
261   anElem.setAttribute(::ShapeTypeString(), ShapeEnumToString(aNgName.ShapeType()));
262   
263   Standard_Integer aNb;
264
265   // arguments
266   Standard_Integer NbArgs = aNgName.Arguments().Extent();
267   if (NbArgs > 0)
268   {
269     TCollection_AsciiString anArgsStr;
270     for (TNaming_ListIteratorOfListOfNamedShape it (aNgName.Arguments()); it.More(); it.Next())
271     {
272       Handle(TNaming_NamedShape) anArg = it.Value();
273       aNb = 0;
274       if (!anArg.IsNull())
275       {
276         aNb = theRelocTable.FindIndex(anArg);
277         if (aNb == 0)
278         {
279           aNb = theRelocTable.Add(anArg);
280         }
281         anArgsStr += TCollection_AsciiString(aNb) + " ";
282       }
283       else anArgsStr += "0 ";
284     }
285     anElem.setAttribute(::ArgumentsString(), anArgsStr.ToCString());
286   }
287
288   // stop named shape
289   Handle(TNaming_NamedShape) aSNS = aNgName.StopNamedShape();
290   if (!aSNS.IsNull())
291   {
292     aNb = theRelocTable.FindIndex(aSNS);
293     if (aNb == 0)
294     {
295       aNb = theRelocTable.Add(aSNS);
296     }
297     anElem.setAttribute(::StopNamedShapeString(), aNb);
298   }
299
300   // index
301   anElem.setAttribute(::IndexString(), aNgName.Index());
302
303   // context label
304   TCollection_AsciiString anEntry;
305   if(!aNgName.ContextLabel().IsNull())
306     TDF_Tool::Entry(aNgName.ContextLabel(), anEntry);  
307   XmlObjMgt_DOMString aDOMString;
308   XmlObjMgt::SetTagEntryString (aDOMString, anEntry);
309   anElem.setAttribute(::ContextLabelString(), aDOMString);
310 #ifdef DEB
311   cout << "XmlMNaming_NamingDriver::Store: ContextLabel Entry = " << anEntry << endl;
312   if (aDOMString != NULL)
313   {
314     Standard_CString aStr = Standard_CString(aDOMString.GetString());
315     cout << "XmlMNaming_NamingDriver::Store: ContextLabel DOMString = " << aStr << endl;
316   } else
317     cout << "XmlMNaming_NamingDriver::Store: aDOMString is NULL" <<endl;
318 #endif
319
320   // orientation
321   anElem.setAttribute(::OrientString(), (Standard_Integer)aNgName.Orientation());
322
323 }
324
325 //=======================================================================
326 //function : ShapeEnumToString
327 //purpose  : 
328 //=======================================================================
329 static const XmlObjMgt_DOMString& ShapeEnumToString (const TopAbs_ShapeEnum theE)
330 {
331   switch (theE)
332   {
333   case TopAbs_COMPOUND  : return ::ShCompoundString();
334   case TopAbs_COMPSOLID : return ::ShCompsolidString();
335   case TopAbs_SOLID     : return ::ShSolidString();
336   case TopAbs_SHELL     : return ::ShShellString();
337   case TopAbs_FACE      : return ::ShFaceString();
338   case TopAbs_WIRE      : return ::ShWireString();
339   case TopAbs_EDGE      : return ::ShEdgeString();
340   case TopAbs_VERTEX    : return ::ShVertexString();
341   case TopAbs_SHAPE     : return ::ShShapeString();  
342   }
343   static XmlObjMgt_DOMString aNullString;
344   return aNullString; // To avoid compilation error message.
345 }
346
347 //=======================================================================
348 //function : NameTypeToString
349 //purpose  : 
350 //=======================================================================
351 static const XmlObjMgt_DOMString& NameTypeToString (const TNaming_NameType theE) 
352 {
353   switch (theE)
354   { 
355   case TNaming_UNKNOWN             : return ::NTUnknownString();  
356   case TNaming_IDENTITY            : return ::NTIdentityString();
357   case TNaming_MODIFUNTIL          : return ::NTModifUntilString();
358   case TNaming_GENERATION          : return ::NTGenerationString();
359   case TNaming_INTERSECTION        : return ::NTIntersectionString();
360   case TNaming_UNION               : return ::NTUnionString();
361   case TNaming_SUBSTRACTION        : return ::NTSubtractionString();
362   case TNaming_CONSTSHAPE          : return ::NTConstShapeString();
363   case TNaming_FILTERBYNEIGHBOURGS : return ::NTFilterByNeighString();
364   case TNaming_ORIENTATION         : return ::NTOrientationString();
365   case TNaming_WIREIN              : return ::NTWireInString();
366   case TNaming_SHELLIN             : return ::NTShellInString();
367   default:
368     Standard_DomainError::Raise("TNaming_NameType; enum term unknown ");
369   }
370   static XmlObjMgt_DOMString aNullString;
371   return aNullString; // To avoid compilation error message.
372 }
373
374 //=======================================================================
375 //function : ShapeEnumFromString
376 //purpose  : 
377 //=======================================================================
378 static TopAbs_ShapeEnum ShapeEnumFromString (const XmlObjMgt_DOMString& theString)
379 {
380   TopAbs_ShapeEnum aResult = TopAbs_SHAPE;
381   if (!theString.equals (::ShShapeString()))
382   {
383     if (theString.equals (::ShCompoundString()))
384       aResult = TopAbs_COMPOUND;
385     else if (theString.equals (::ShCompsolidString()))
386       aResult = TopAbs_COMPSOLID;
387     else if (theString.equals (::ShSolidString()))
388       aResult = TopAbs_SOLID;
389     else if (theString.equals (::ShShellString()))
390       aResult = TopAbs_SHELL;
391     else if (theString.equals (::ShFaceString()))
392       aResult = TopAbs_FACE;
393     else if (theString.equals (::ShWireString()))
394       aResult = TopAbs_WIRE;
395     else if (theString.equals (::ShEdgeString()))
396       aResult = TopAbs_EDGE;
397     else if (theString.equals (::ShVertexString()))
398       aResult = TopAbs_VERTEX;
399     else
400       Standard_DomainError::Raise
401         ("TopAbs_ShapeEnum; string value without enum term equivalence");
402   }
403   return aResult;
404 }
405
406 //=======================================================================
407 //function : NameTypeFromString
408 //purpose  : 
409 //=======================================================================
410 static TNaming_NameType NameTypeFromString (const XmlObjMgt_DOMString& theString) 
411 {
412   TNaming_NameType aResult = TNaming_UNKNOWN;
413   if (!theString.equals (::NTUnknownString()))
414   {
415     if (theString.equals (::NTIdentityString()))
416       aResult = TNaming_IDENTITY;
417     else if (theString.equals (::NTModifUntilString()))
418       aResult = TNaming_MODIFUNTIL;
419     else if (theString.equals (::NTGenerationString()))
420       aResult = TNaming_GENERATION;
421     else if (theString.equals (::NTIntersectionString()))
422       aResult = TNaming_INTERSECTION;
423     else if (theString.equals (::NTUnionString()))
424       aResult = TNaming_UNION;
425     else if (theString.equals (::NTSubtractionString()))
426       aResult = TNaming_SUBSTRACTION;
427     else if (theString.equals (::NTConstShapeString()))
428       aResult = TNaming_CONSTSHAPE;
429     else if (theString.equals (::NTFilterByNeighString()))
430       aResult = TNaming_FILTERBYNEIGHBOURGS;
431     else if (theString.equals (::NTOrientationString()))
432       aResult = TNaming_ORIENTATION;
433     else if (theString.equals (::NTWireInString()))
434       aResult = TNaming_WIREIN;
435     else if (theString.equals (::NTShellInString()))
436       aResult = TNaming_SHELLIN;
437     else
438       Standard_DomainError::Raise
439         ("TNaming_NameType; string value without enum term equivalence");
440   }
441   return aResult;
442 }