0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BinMXCAFDoc / BinMXCAFDoc_GraphNodeDriver.cxx
1 // Created on: 2005-05-17
2 // Created by: Eugeny NAPALKOV
3 // Copyright (c) 2005-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 <BinMXCAFDoc_GraphNodeDriver.hxx>
18 #include <BinObjMgt_Persistent.hxx>
19 #include <CDM_MessageDriver.hxx>
20 #include <Standard_Type.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <XCAFDoc_GraphNode.hxx>
23
24 //=======================================================================
25 //function :
26 //purpose  : 
27 //=======================================================================
28 BinMXCAFDoc_GraphNodeDriver::BinMXCAFDoc_GraphNodeDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
29      : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_GraphNode)->Name()) {
30 }
31
32 //=======================================================================
33 //function :
34 //purpose  : 
35 //=======================================================================
36 Handle(TDF_Attribute) BinMXCAFDoc_GraphNodeDriver::NewEmpty() const {
37   return new XCAFDoc_GraphNode();
38 }
39
40 //=======================================================================
41 //function :
42 //purpose  : 
43 //=======================================================================
44 Standard_Boolean BinMXCAFDoc_GraphNodeDriver::Paste(const BinObjMgt_Persistent& theSource,
45                                                     const Handle(TDF_Attribute)& theTarget,
46                                                     BinObjMgt_RRelocationTable& theRelocTable) const
47 {
48   Handle(XCAFDoc_GraphNode) aT = Handle(XCAFDoc_GraphNode)::DownCast(theTarget);
49   Standard_Integer anID;
50
51   // Read Fathers
52   if (! (theSource >> anID))
53     return Standard_False;
54   while(anID != -1) {
55     Handle(XCAFDoc_GraphNode) aNode;
56     if(theRelocTable.IsBound(anID)) {
57       aNode = Handle(XCAFDoc_GraphNode)::DownCast(theRelocTable.Find(anID));
58     } else {
59       aNode = Handle(XCAFDoc_GraphNode)::DownCast(aT->NewEmpty());
60       theRelocTable.Bind(anID, aNode);
61     }
62     aT->SetFather(aNode);
63
64     if (! (theSource >> anID))
65       return Standard_False;    
66   }
67
68   // Read Children
69   if (! (theSource >> anID))
70     return Standard_False;
71   while(anID != -1) {
72     Handle(XCAFDoc_GraphNode) aNode;
73     if(theRelocTable.IsBound(anID)) {
74       aNode = Handle(XCAFDoc_GraphNode)::DownCast(theRelocTable.Find(anID));
75     } else {
76       aNode = Handle(XCAFDoc_GraphNode)::DownCast(aT->NewEmpty());
77       theRelocTable.Bind(anID, aNode);
78     }
79     aT->SetChild(aNode);
80
81     if (! (theSource >> anID))
82       return Standard_False;    
83   }
84
85   // Graph id
86   Standard_GUID aGUID;
87   if (! (theSource >> aGUID))
88     return Standard_False;
89   aT->SetGraphID(aGUID);
90
91
92   return Standard_True;
93 }
94
95 //=======================================================================
96 //function :
97 //purpose  : 
98 //=======================================================================
99 void BinMXCAFDoc_GraphNodeDriver::Paste(const Handle(TDF_Attribute)& theSource,
100                                         BinObjMgt_Persistent& theTarget,
101                                         BinObjMgt_SRelocationTable& theRelocTable) const
102 {
103   Handle(XCAFDoc_GraphNode) aS = Handle(XCAFDoc_GraphNode)::DownCast(theSource);
104   Standard_Integer i, aNb, anID;
105
106   // Write fathers
107   aNb = aS->NbFathers();
108   for(i = 1; i <= aNb; i++) {
109     Handle(XCAFDoc_GraphNode) aNode = aS->GetFather(i);
110     anID = theRelocTable.Add(aNode);
111     theTarget << anID;
112   }
113   theTarget.PutInteger(-1);
114
115   // Write children
116   aNb = aS->NbChildren();
117   for(i = 1; i <= aNb; i++) {
118     Handle(XCAFDoc_GraphNode) aNode = aS->GetChild(i);
119     anID = theRelocTable.Add(aNode);
120     theTarget << anID;
121   }
122   theTarget.PutInteger(-1);
123
124   // Graph id
125   theTarget << aS->ID();
126 }
127