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