0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / BinTools / BinTools.cxx
1 // Created on: 2004-05-18
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2004-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 <BinTools.hxx>
18 #include <BinTools_ShapeSet.hxx>
19 #include <FSD_FileHeader.hxx>
20 #include <Message_ProgressIndicator.hxx>
21 #include <OSD_OpenFile.hxx>
22 #include <Storage_StreamTypeMismatchError.hxx>
23
24 //=======================================================================
25 //function : PutBool
26 //purpose  : 
27 //=======================================================================
28 Standard_OStream& BinTools::PutBool(Standard_OStream& OS, const Standard_Boolean aValue)
29 {
30   OS.put((Standard_Byte)(aValue ? 1 : 0));
31   return OS;
32 }
33
34
35 //=======================================================================
36 //function : PutInteger
37 //purpose  : 
38 //=======================================================================
39
40 Standard_OStream& BinTools::PutInteger(Standard_OStream& OS, const Standard_Integer aValue)
41 {
42   Standard_Integer anIntValue = aValue;
43 #if DO_INVERSE
44       anIntValue = InverseInt (aValue);
45 #endif
46   OS.write((char*)&anIntValue, sizeof(Standard_Integer));  
47   return OS;
48 }
49
50
51 //=======================================================================
52 //function : PutReal
53 //purpose  :
54 //=======================================================================
55 Standard_OStream& BinTools::PutReal (Standard_OStream& theOS,
56                                      const Standard_Real& theValue)
57 {
58 #if DO_INVERSE
59   const Standard_Real aRValue = InverseReal (theValue);
60   theOS.write((char*)&aRValue, sizeof(Standard_Real));
61 #else
62   theOS.write((char*)&theValue, sizeof(Standard_Real));
63 #endif
64   return theOS;
65 }
66
67 //=======================================================================
68 //function : PutShortReal
69 //purpose  :
70 //=======================================================================
71 Standard_OStream& BinTools::PutShortReal (Standard_OStream& theOS,
72                                           const Standard_ShortReal& theValue)
73 {
74 #if DO_INVERSE
75   const Standard_ShortReal aValue = InverseShortReal (theValue);
76   theOS.write ((char*)&aValue, sizeof(Standard_ShortReal));
77 #else
78   theOS.write ((char*)&theValue, sizeof(Standard_ShortReal));
79 #endif
80   return theOS;
81 }
82
83 //=======================================================================
84 //function : PutExtChar
85 //purpose  : 
86 //=======================================================================
87
88 Standard_OStream& BinTools::PutExtChar(Standard_OStream& OS, const Standard_ExtCharacter aValue)
89 {
90   Standard_ExtCharacter aSValue = aValue;
91 #if DO_INVERSE
92       aSValue = InverseExtChar (aValue);
93 #endif
94   OS.write((char*)&aSValue, sizeof(Standard_ExtCharacter));  
95   return OS;
96 }
97
98 //=======================================================================
99 //function : GetReal
100 //purpose  :
101 //=======================================================================
102 Standard_IStream& BinTools::GetReal (Standard_IStream& theIS,
103                                      Standard_Real& theValue)
104 {
105   if (!theIS.read ((char*)&theValue, sizeof(Standard_Real)))
106   {
107     throw Storage_StreamTypeMismatchError();
108   }
109 #if DO_INVERSE
110   theValue = InverseReal (theValue);
111 #endif
112   return theIS;
113 }
114
115 //=======================================================================
116 //function : GetShortReal
117 //purpose  :
118 //=======================================================================
119 Standard_IStream& BinTools::GetShortReal (Standard_IStream& theIS,
120                                           Standard_ShortReal& theValue)
121 {
122   if (!theIS.read ((char*)&theValue, sizeof(Standard_ShortReal)))
123   {
124     throw Storage_StreamTypeMismatchError();
125   }
126 #if DO_INVERSE
127   theValue = InverseShortReal (theValue);
128 #endif
129   return theIS;
130 }
131
132 //=======================================================================
133 //function : GetInteger
134 //purpose  : 
135 //=======================================================================
136
137 Standard_IStream& BinTools::GetInteger(Standard_IStream& IS, Standard_Integer& aValue)
138 {
139   if(!IS.read ((char*)&aValue, sizeof(Standard_Integer)))
140     throw Storage_StreamTypeMismatchError();
141 #if DO_INVERSE
142   aValue = InverseInt (aValue);
143 #endif
144   return IS;
145 }
146
147 //=======================================================================
148 //function : GetExtChar
149 //purpose  : 
150 //=======================================================================
151
152 Standard_IStream& BinTools::GetExtChar(Standard_IStream& IS, Standard_ExtCharacter& theValue)
153 {
154   if(!IS.read ((char*)&theValue, sizeof(Standard_ExtCharacter)))
155     throw Storage_StreamTypeMismatchError();
156 #if DO_INVERSE
157   theValue = InverseExtChar (theValue);
158 #endif
159   return IS;
160 }
161
162 //=======================================================================
163 //function : GetBool
164 //purpose  : 
165 //=======================================================================
166
167 Standard_IStream& BinTools::GetBool(Standard_IStream& IS, Standard_Boolean& aValue)
168 {
169   aValue = (IS.get() != 0);
170   return IS;
171 }
172
173 //=======================================================================
174 //function : Write
175 //purpose  : 
176 //=======================================================================
177
178 void BinTools::Write (const TopoDS_Shape& theShape, Standard_OStream& theStream,
179                       const Handle(Message_ProgressIndicator)& theProgress)
180 {
181   BinTools_ShapeSet aShapeSet(Standard_True);
182   aShapeSet.SetFormatNb (3);
183   aShapeSet.Add (theShape);
184   aShapeSet.Write (theStream, theProgress);
185   aShapeSet.Write (theShape, theStream);
186 }
187
188 //=======================================================================
189 //function : Read
190 //purpose  : 
191 //=======================================================================
192
193 void BinTools::Read (TopoDS_Shape& theShape, Standard_IStream& theStream,
194                      const Handle(Message_ProgressIndicator)& theProgress)
195 {
196   BinTools_ShapeSet aShapeSet(Standard_True);
197   aShapeSet.Read (theStream, theProgress);
198   aShapeSet.Read (theShape, theStream, aShapeSet.NbShapes());
199 }
200
201 //=======================================================================
202 //function : Write
203 //purpose  : 
204 //=======================================================================
205
206 Standard_Boolean BinTools::Write (const TopoDS_Shape& theShape, const Standard_CString theFile,
207                                   const Handle(Message_ProgressIndicator)& theProgress)
208 {
209   std::ofstream aStream;
210   aStream.precision (15);
211   OSD_OpenStream (aStream, theFile, std::ios::out | std::ios::binary);
212   if (!aStream.good())
213     return Standard_False;
214
215   Write (theShape, aStream, theProgress);
216   aStream.close();
217   return aStream.good();
218 }
219
220 //=======================================================================
221 //function : Read
222 //purpose  : 
223 //=======================================================================
224
225 Standard_Boolean BinTools::Read (TopoDS_Shape& theShape, const Standard_CString theFile,
226                                  const Handle(Message_ProgressIndicator)& theProgress)
227 {
228   std::filebuf aBuf;
229   OSD_OpenStream (aBuf, theFile, std::ios::in | std::ios::binary);
230   if (!aBuf.is_open())
231     return Standard_False;
232
233   Standard_IStream aStream (&aBuf);
234   Read (theShape, aStream, theProgress);
235   return aStream.good();
236 }