0031918: Application Framework - New binary format for fast reading part of OCAF...
[occt.git] / src / BinDrivers / BinDrivers_DocumentStorageDriver.cxx
1 // Created on: 2002-10-29
2 // Created by: Michael SAZONOV
3 // Copyright (c) 2002-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 <BinDrivers_DocumentStorageDriver.hxx>
17
18 #include <BinDrivers.hxx>
19 #include <BinLDrivers_DocumentSection.hxx>
20 #include <BinMDF_ADriver.hxx>
21 #include <BinMDF_ADriverTable.hxx>
22 #include <BinMNaming_NamedShapeDriver.hxx>
23 #include <Message_Messenger.hxx>
24 #include <Standard_ErrorHandler.hxx>
25 #include <Standard_NotImplemented.hxx>
26 #include <Standard_Type.hxx>
27 #include <TCollection_AsciiString.hxx>
28 #include <TNaming_NamedShape.hxx>
29
30 IMPLEMENT_STANDARD_RTTIEXT(BinDrivers_DocumentStorageDriver,BinLDrivers_DocumentStorageDriver)
31
32 //=======================================================================
33 //function : BinDrivers_DocumentStorageDriver
34 //purpose  : Constructor
35 //=======================================================================
36 BinDrivers_DocumentStorageDriver::BinDrivers_DocumentStorageDriver()
37 {
38 }
39
40 //=======================================================================
41 //function : AttributeDrivers
42 //purpose  :
43 //=======================================================================
44
45 Handle(BinMDF_ADriverTable) BinDrivers_DocumentStorageDriver::AttributeDrivers
46        (const Handle(Message_Messenger)& theMessageDriver)
47 {
48   return BinDrivers::AttributeDrivers (theMessageDriver);
49 }
50
51 //=======================================================================
52 //function : IsWithTriangles
53 //purpose  :
54 //=======================================================================
55 Standard_Boolean BinDrivers_DocumentStorageDriver::IsWithTriangles() const
56 {
57   if (myDrivers.IsNull())
58   {
59     return Standard_False;
60   }
61
62   Handle(BinMDF_ADriver) aDriver;
63   myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver);
64   Handle(BinMNaming_NamedShapeDriver) aShapesDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
65   return !aShapesDriver.IsNull()
66        && aShapesDriver->IsWithTriangles();
67 }
68
69 //=======================================================================
70 //function : SetWithTriangles
71 //purpose  :
72 //=======================================================================
73 void BinDrivers_DocumentStorageDriver::SetWithTriangles (const Handle(Message_Messenger)& theMessageDriver,
74                                                          const Standard_Boolean theWithTriangulation)
75 {
76   if (myDrivers.IsNull())
77   {
78     myDrivers = AttributeDrivers (theMessageDriver);
79   }
80   if (myDrivers.IsNull())
81   {
82     return;
83   }
84
85   Handle(BinMDF_ADriver) aDriver;
86   myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver);
87   Handle(BinMNaming_NamedShapeDriver) aShapesDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
88   if (aShapesDriver.IsNull())
89   {
90     throw Standard_NotImplemented ("Internal Error - TNaming_NamedShape is not found!");
91   }
92
93   aShapesDriver->SetWithTriangles (theWithTriangulation);
94 }
95
96 void BinDrivers_DocumentStorageDriver::EnableQuickPartWriting (const Handle(Message_Messenger)& theMessageDriver,
97                                                                const Standard_Boolean theValue)
98 {
99   if (myDrivers.IsNull())
100   {
101     myDrivers = AttributeDrivers (theMessageDriver);
102   }
103   if (myDrivers.IsNull())
104   {
105     return;
106   }
107
108   Handle(BinMDF_ADriver) aDriver;
109   myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver);
110   Handle(BinMNaming_NamedShapeDriver) aShapesDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
111   if (aShapesDriver.IsNull())
112   {
113     throw Standard_NotImplemented ("Internal Error - TNaming_NamedShape is not found!");
114   }
115
116   aShapesDriver->EnableQuickPart (theValue);
117 }
118
119 //=======================================================================
120 //function : Clear
121 //purpose  : 
122 //=======================================================================
123 void BinDrivers_DocumentStorageDriver::Clear()
124 {
125   // Clear NamedShape driver
126   Handle(BinMDF_ADriver) aDriver;
127   if (myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver))
128   {
129     Handle(BinMNaming_NamedShapeDriver) aNamedShapeDriver =
130       Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
131     aNamedShapeDriver->Clear();
132   }
133   BinLDrivers_DocumentStorageDriver::Clear();
134 }
135
136 //=======================================================================
137 //function : IsWithNormals
138 //purpose  :
139 //=======================================================================
140 Standard_Boolean BinDrivers_DocumentStorageDriver::IsWithNormals() const
141 {
142   if (myDrivers.IsNull())
143   {
144     return Standard_False;
145   }
146
147   Handle(BinMDF_ADriver) aDriver;
148   myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver);
149   Handle(BinMNaming_NamedShapeDriver) aShapesDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
150   return !aShapesDriver.IsNull()
151     && aShapesDriver->IsWithNormals();
152 }
153
154 //=======================================================================
155 //function : SetWithNormals
156 //purpose  :
157 //=======================================================================
158 void BinDrivers_DocumentStorageDriver::SetWithNormals (const Handle(Message_Messenger)& theMessageDriver,
159   const Standard_Boolean theWithNormals)
160 {
161   if (myDrivers.IsNull())
162   {
163     myDrivers = AttributeDrivers (theMessageDriver);
164   }
165   if (myDrivers.IsNull())
166   {
167     return;
168   }
169
170   Handle(BinMDF_ADriver) aDriver;
171   myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver);
172   Handle(BinMNaming_NamedShapeDriver) aShapesDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
173   if (aShapesDriver.IsNull())
174   {
175     throw Standard_NotImplemented ("Internal Error - TNaming_NamedShape is not found!");
176   }
177
178   aShapesDriver->SetWithNormals (theWithNormals);
179 }
180
181 //=======================================================================
182 //function : WriteShapeSection
183 //purpose  : Implements WriteShapeSection
184 //=======================================================================
185 void BinDrivers_DocumentStorageDriver::WriteShapeSection
186                                (BinLDrivers_DocumentSection&   theSection,
187                                 Standard_OStream&              theOS,
188                                 const TDocStd_FormatVersion    theDocVer,
189                                 const Message_ProgressRange&   theRange)
190 {
191   const Standard_Size aShapesSectionOffset = (Standard_Size) theOS.tellp();
192   
193   Handle(BinMDF_ADriver) aDriver;
194   if (myDrivers->GetDriver (STANDARD_TYPE(TNaming_NamedShape), aDriver))
195   {
196     try { 
197       OCC_CATCH_SIGNALS
198       Handle(BinMNaming_NamedShapeDriver) aNamedShapeDriver =
199         Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver);
200       aNamedShapeDriver->WriteShapeSection (theOS, theDocVer, theRange);
201     }
202     catch (Standard_Failure const& anException) {
203       TCollection_ExtendedString anErrorStr ("BinDrivers_DocumentStorageDriver, Shape Section :");
204       myMsgDriver->Send (anErrorStr  + anException.GetMessageString(), Message_Fail);
205     }
206   }
207    
208   // Write the section info in the TOC.
209   theSection.Write (theOS, aShapesSectionOffset, theDocVer);
210 }