0024059: Eliminate compiler warning C4701 in MSVC++ with warning level 4
[occt.git] / src / DDF / DDF_IOStream.cxx
CommitLineData
b311480e 1// Created by: DAUTRY Philippe
2// Copyright (c) 1997-1999 Matra Datavision
3// Copyright (c) 1999-2012 OPEN CASCADE SAS
4//
5// The content of this file is subject to the Open CASCADE Technology Public
6// License Version 6.5 (the "License"). You may not use the content of this file
7// except in compliance with the License. Please obtain a copy of the License
8// at http://www.opencascade.org and read it completely before using this file.
9//
10// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12//
13// The Original Code and all software distributed under the License is
14// distributed on an "AS IS" basis, without warranty of any kind, and the
15// Initial Developer hereby disclaims all such warranties, including without
16// limitation, any warranties of merchantability, fitness for a particular
17// purpose or non-infringement. Please see the License for the specific terms
18// and conditions governing the rights and limitations under the License.
19
7fd59977 20// ----------------
7fd59977 21
22// Version: 0.0
b311480e 23//Version Date Purpose
7fd59977 24// 0.0 Aug 22 1997 Creation
25
26#include <Standard_Stream.hxx>
27
28#include <DDF_IOStream.hxx>
29
30// This file has been written using FSD_File.cxx as template.
31// This is a specific adaptation for Draw use (save & restore commands).
32// It is not sure at all this code is portable on any other plateform than
33// SUN OS. Don't use it anywhere else.
34// Thanks for comprehension. (22 august 97)
35
36
37#include <Storage_StreamTypeMismatchError.hxx>
38#include <Storage_StreamFormatError.hxx>
39#include <Storage_StreamWriteError.hxx>
40#include <Storage_StreamExtCharParityError.hxx>
41
42#include <TCollection_AsciiString.hxx>
43#include <TCollection_ExtendedString.hxx>
44
45#include <TColStd_SequenceOfAsciiString.hxx>
46#include <TColStd_SequenceOfExtendedString.hxx>
47
48const Standard_CString MAGICNUMBER = "FSDFILE";
49
50
51//=======================================================================
52//function : DDF_IOStream
53//purpose :
54//=======================================================================
55
56DDF_IOStream::DDF_IOStream()
57{}
58
59//=======================================================================
60//function : Open
61//purpose :
62//=======================================================================
63
64Storage_Error DDF_IOStream::Open(const TCollection_AsciiString& aName,const Storage_OpenMode aMode)
65{
66 //myIStream = NULL;
67 //myOStream = NULL;
68 //return Storage_VSOk;
69
70 Storage_Error result = Storage_VSOk;
71
72 SetName(aName);
73
74 if (OpenMode() == Storage_VSNone) {
75 if (aMode == Storage_VSRead) {
76 if (myIStream != NULL) delete myIStream;
77 myIStream = new ifstream(aName.ToCString(),ios::in); // ios::nocreate is not portable
78 if (myIStream->fail()) {
79 result = Storage_VSOpenError;
80 }
81 else {
82 myIStream->precision(17);
91322f44 83 myIStream->imbue (std::locale::classic()); // always use C locale
7fd59977 84 SetOpenMode(aMode);
85 }
86 }
87 else if (aMode == Storage_VSWrite) {
88 if (myOStream != NULL) delete myOStream;
89 myOStream = new ofstream(aName.ToCString(),ios::out);
90 if (myOStream->fail()) {
91 result = Storage_VSOpenError;
92 }
93 else {
94 myOStream->precision(17);
91322f44 95 myOStream->imbue (std::locale::classic()); // make sure to always use C locale
7fd59977 96 SetOpenMode(aMode);
97 }
98 }
99 }
100 else {
101 result = Storage_VSAlreadyOpen;
102 }
103
104 return result;
105}
106
107//=======================================================================
108//function : Open
109//purpose : "Opens" an istream.
110//=======================================================================
111
112Storage_Error DDF_IOStream::Open(istream* anIStream)
113{
114 myOStream = NULL;
115 SetOpenMode(Storage_VSRead);
116 myIStream = anIStream;
117 myIStream->precision(17);
91322f44 118 myIStream->imbue (std::locale::classic()); // use always C locale
7fd59977 119 SetName("DDF_IOStream");
120 return Storage_VSOk; // ou Storage_VSAlreadyOpen ?
121}
122
123//=======================================================================
124//function : Open
125//purpose : "Opens" an ostream.
126//=======================================================================
127
128Storage_Error DDF_IOStream::Open(ostream* anOStream)
129{
130 myIStream = NULL;
131 SetOpenMode(Storage_VSWrite);
132 myOStream = anOStream;
133 myOStream->precision(17);
91322f44 134 myOStream->imbue (std::locale::classic()); // use always C locale
7fd59977 135 SetName("DDF_IOStream");
136 return Storage_VSOk; // ou Storage_VSAlreadyOpen ?
137}
138
139//=======================================================================
140//function : IsEnd
141//purpose :
142//=======================================================================
143
144Standard_Boolean DDF_IOStream::IsEnd()
145{
146 if (OpenMode() == Storage_VSRead) return myIStream->eof();
147 else return myOStream->eof();
148}
149
150//=======================================================================
151//function : Close
152//purpose :
153//=======================================================================
154
155Storage_Error DDF_IOStream::Close()
156{ return Storage_VSOk; }
157
158
159// ------------------ PROTECTED
160
161
162//=======================================================================
163//function : MagicNumber
164//purpose :
165//=======================================================================
166
167const Standard_CString DDF_IOStream::MagicNumber()
168{ return MAGICNUMBER; }
169
170//=======================================================================
171//function : FlushEndOfLine
172//purpose :
173//=======================================================================
174
175void DDF_IOStream::FlushEndOfLine()
176{
177 static char Buffer[8192];
178 char c;
179 Standard_Boolean IsEnd = Standard_False;
180
181 while (!IsEnd && !DDF_IOStream::IsEnd()) {
182 Buffer[0] = '\0';
183 myIStream->get(Buffer,8192,'\n');
184
185 if (myIStream->get(c) && c != '\n') {
186 }
187 else {
188 IsEnd = Standard_True;
189 }
190 }
191}
192
193//=======================================================================
194//function : ReadLine
195//purpose :
196//=======================================================================
197
198void DDF_IOStream::ReadLine(TCollection_AsciiString& buffer)
199{
200 static char Buffer[8193];
201 char c;
202 Standard_Boolean IsEnd = Standard_False;
203
204 buffer.Clear();
205
206 while (!IsEnd && !DDF_IOStream::IsEnd()) {
207 Buffer[0] = '\0';
208 myIStream->get(Buffer,8192,'\n');
209
210 if (myIStream->get(c) && c != '\n') {
211 buffer += Buffer;
212 buffer += c;
213 }
214 else {
215 buffer += Buffer;
216 IsEnd = Standard_True;
217 }
218 }
219}
220
221
222//=======================================================================
223//function : WriteExtendedLine
224//purpose :
225//=======================================================================
226
227void DDF_IOStream::WriteExtendedLine(const TCollection_ExtendedString& buffer)
228{
229 Standard_ExtString extBuffer;
230 Standard_Integer i,c,d;
231
232 extBuffer = buffer.ToExtString();
233
234 for (i = 0; i < buffer.Length(); i++) {
235 c = (extBuffer[i] & 0x0000FF00 ) >> 8 ;
236 d = extBuffer[i] & 0x000000FF;
237
238 *myOStream << (char)c << (char)d;
239 }
240
241 *myOStream << (char)0 << "\n";
242}
243
244//=======================================================================
245//function : ReadExtendedLine
246//purpose :
247//=======================================================================
248
249void DDF_IOStream::ReadExtendedLine(TCollection_ExtendedString& buffer)
250{
251 char c = '\0';
252 Standard_ExtCharacter i = 0,j,check = 0;
253 Standard_Boolean fin = Standard_False;
254
255 buffer.Clear();
256
257 while (!fin && !IsEnd()) {
258 myIStream->get(c);
259 check++;
260// if (!(check % 2)) Storage_StreamExtCharParityError::Raise();
261 i = 0; j = 0;
262 i += (Standard_ExtCharacter)c;
263 if (c == '\0') fin = Standard_True;
264 i = (i << 8);
265
266 myIStream->get(c);
267 check++;
268// if ((check % 2) != 0) Storage_StreamExtCharParityError::Raise();
269// cout << check << endl;
270 j += (Standard_ExtCharacter)c;
271 if (c != '\n') fin = Standard_False;
272 i |= (0x00FF & j);
273 buffer += (Standard_ExtCharacter)i;
274 }
275
276// if ((check % 2) != 0) Storage_StreamExtCharParityError::Raise();
277// cout << check << endl;
278}
279
280//=======================================================================
281//function : ReadChar
282//purpose :
283//=======================================================================
284
285void DDF_IOStream::ReadChar(TCollection_AsciiString& buffer, const Standard_Integer rsize)
286{
287 char c;
288 Standard_Integer ccount = 0;
289
290 buffer.Clear();
291
292 while (!IsEnd() && (ccount < rsize)) {
293 myIStream->get(c);
294 buffer += c;
295 ccount++;
296 }
297}
298
299//=======================================================================
300//function : ReadString
301//purpose :
302//=======================================================================
303
304void DDF_IOStream::ReadString(TCollection_AsciiString& buffer)
305{
1d47d8d0 306 char c = '\0';
7fd59977 307 Standard_Boolean IsEnd = Standard_False;
308
309 buffer.Clear();
310
311 while (!IsEnd && !DDF_IOStream::IsEnd()) {
312 myIStream->get(c);
313 if ((c != ' ') && (c != '\n')) IsEnd = Standard_True;
314 }
315
316 IsEnd = Standard_False;
317
318 while (!IsEnd && !DDF_IOStream::IsEnd()) {
319 buffer += c;
320 myIStream->get(c);
321 if (c == '\n') IsEnd = Standard_True;
322 }
323}
324
325//=======================================================================
326//function : ReadWord
327//purpose :
328//=======================================================================
329
330void DDF_IOStream::ReadWord(TCollection_AsciiString& buffer)
331{
1d47d8d0 332 char c = '\0';
7fd59977 333 Standard_Boolean IsEnd = Standard_False;
334
335 buffer.Clear();
336
337 while (!IsEnd && !DDF_IOStream::IsEnd()) {
338 myIStream->get(c);
339 if ((c != ' ') && (c != '\n')) IsEnd = Standard_True;
340 }
341
342 IsEnd = Standard_False;
343
344 while (!IsEnd && !DDF_IOStream::IsEnd()) {
345 buffer += c;
346 myIStream->get(c);
347 if ((c == '\n') || (c == ' ')) IsEnd = Standard_True;
348 }
349}
350
351//=======================================================================
352//function : FindTag
353//purpose :
354//=======================================================================
355
356Storage_Error DDF_IOStream::FindTag(const Standard_CString aTag)
357{
358 TCollection_AsciiString l;
359
360 ReadString(l);
361
362 while ((strcmp(l.ToCString(),aTag) != 0) && !IsEnd()) {
363 ReadString(l);
364 }
365
366 if (IsEnd()) {
367 return Storage_VSSectionNotFound;
368 }
369 else {
370 return Storage_VSOk;
371 }
372}
373
374//=======================================================================
375//function : SkipObject
376//purpose :
377//=======================================================================
378
379void DDF_IOStream::SkipObject()
380{
381 FlushEndOfLine();
382}
383
384
385// ---------------------- PUBLIC : PUT
386
387
388//=======================================================================
389//function : PutReference
390//purpose :
391//=======================================================================
392
393Storage_BaseDriver& DDF_IOStream::PutReference(const Standard_Integer aValue)
394{
395 *myOStream << aValue << " ";
396 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutReference");
397 return *this;
398}
399
400//=======================================================================
401//function : PutCharacter
402//purpose :
403//=======================================================================
404
405Storage_BaseDriver& DDF_IOStream::PutCharacter(const Standard_Character aValue)
406{
407 *myOStream << aValue << " ";
408 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutCharacter");
409 return *this;
410}
411
412//=======================================================================
413//function : PutExtCharacter
414//purpose :
415//=======================================================================
416
417Storage_BaseDriver& DDF_IOStream::PutExtCharacter(const Standard_ExtCharacter aValue)
418{
419 *myOStream << aValue << " ";
420 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutExtCharacter");
421 return *this;
422}
423
424//=======================================================================
425//function : PutInteger
426//purpose :
427//=======================================================================
428
429Storage_BaseDriver& DDF_IOStream::PutInteger(const Standard_Integer aValue)
430{
431 *myOStream << aValue << " ";
432 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutInteger");
433 return *this;
434}
435
436//=======================================================================
437//function : PutBoolean
438//purpose :
439//=======================================================================
440
441Storage_BaseDriver& DDF_IOStream::PutBoolean(const Standard_Boolean aValue)
442{
443 *myOStream << ((Standard_Integer)aValue) << " ";
444 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutBoolean");
445 return *this;
446}
447
448//=======================================================================
449//function : PutReal
450//purpose :
451//=======================================================================
452
453Storage_BaseDriver& DDF_IOStream::PutReal(const Standard_Real aValue)
454{
455 *myOStream << ((Standard_Real)aValue) << " ";
456 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutReal");
457 return *this;
458}
459
460//=======================================================================
461//function : PutShortReal
462//purpose :
463//=======================================================================
464
465Storage_BaseDriver& DDF_IOStream::PutShortReal(const Standard_ShortReal aValue)
466{
467 *myOStream << aValue << " ";
468 if (myOStream->bad()) Storage_StreamWriteError::Raise("PutShortReal");
469 return *this;
470}
471
472
473// ----------------- PUBLIC : GET
474
475
476//=======================================================================
477//function : GetReference
478//purpose :
479//=======================================================================
480
481Storage_BaseDriver& DDF_IOStream::GetReference(Standard_Integer& aValue)
482{
483 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetReference");
484 return *this;
485}
486
487//=======================================================================
488//function : GetCharacter
489//purpose :
490//=======================================================================
491
492Storage_BaseDriver& DDF_IOStream::GetCharacter(Standard_Character& aValue)
493{
494 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetCharacter");
495 return *this;
496}
497
498//=======================================================================
499//function : GetExtCharacter
500//purpose :
501//=======================================================================
502
503Storage_BaseDriver& DDF_IOStream::GetExtCharacter(Standard_ExtCharacter& aValue)
504{
505 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetExtCharacter");
506 return *this;
507}
508
509//=======================================================================
510//function : GetInteger
511//purpose :
512//=======================================================================
513
514Storage_BaseDriver& DDF_IOStream::GetInteger(Standard_Integer& aValue)
515{
516 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetInteger");
517 return *this;
518}
519
520//=======================================================================
521//function : GetBoolean
522//purpose :
523//=======================================================================
524
525Storage_BaseDriver& DDF_IOStream::GetBoolean(Standard_Boolean& aValue)
526{
527 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetBoolean");
528 return *this;
529}
530
531//=======================================================================
532//function : GetReal
533//purpose :
534//=======================================================================
535
536Storage_BaseDriver& DDF_IOStream::GetReal(Standard_Real& aValue)
537{
538 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetReal");
539 return *this;
540}
541
542//=======================================================================
543//function : GetShortReal
544//purpose :
545//=======================================================================
546
547Storage_BaseDriver& DDF_IOStream::GetShortReal(Standard_ShortReal& aValue)
548{
549 if (!(*myIStream >> aValue)) Storage_StreamTypeMismatchError::Raise("GetShortReal");
550 return *this;
551}
552
553// -------------------------- DESTROY
554
555//=======================================================================
556//function : Destroy
557//purpose :
558//=======================================================================
559
560void DDF_IOStream::Destroy()
561{
562 if (OpenMode() != Storage_VSNone) Close();
563}
564
565
566// -------------------------- INFO : WRITE
567
568
569//=======================================================================
570//function : BeginWriteInfoSection
571//purpose :
572//=======================================================================
573
574Storage_Error DDF_IOStream::BeginWriteInfoSection()
575{
576 *myOStream << DDF_IOStream::MagicNumber() << '\n';
577 *myOStream << "BEGIN_INFO_SECTION\n";
578 if (myOStream->bad()) Storage_StreamWriteError::Raise();
579
580 return Storage_VSOk;
581}
582
583//=======================================================================
584//function : WriteInfo
585//purpose :
586//=======================================================================
587
588void DDF_IOStream::WriteInfo(const Standard_Integer nbObj,
589 const TCollection_AsciiString& dbVersion,
590 const TCollection_AsciiString& date,
591 const TCollection_AsciiString& schemaName,
592 const TCollection_AsciiString& schemaVersion,
593 const TCollection_ExtendedString& appName,
594 const TCollection_AsciiString& appVersion,
595 const TCollection_ExtendedString& dataType,
596 const TColStd_SequenceOfAsciiString& userInfo)
597{
598 Standard_Integer i;
599// char *extBuffer;
600
601 *myOStream << nbObj;
602 *myOStream << "\n";
603 *myOStream << dbVersion.ToCString() << "\n";
604 *myOStream << date.ToCString() << "\n";
605 *myOStream << schemaName.ToCString() << "\n";
606 *myOStream << schemaVersion.ToCString() << "\n";
607 WriteExtendedLine(appName);
608 *myOStream << appVersion.ToCString() << "\n";
609 WriteExtendedLine(dataType);
610 *myOStream << userInfo.Length() << "\n";
611
612 if (myOStream->bad()) Storage_StreamWriteError::Raise();
613
614 for (i = 1; i <= userInfo.Length(); i++) {
615 *myOStream << userInfo.Value(i).ToCString() << "\n";
616 if (myOStream->bad()) Storage_StreamWriteError::Raise();
617 }
618}
619
620
621//=======================================================================
622//function : EndWriteInfoSection
623//purpose :
624//=======================================================================
625
626Storage_Error DDF_IOStream::EndWriteInfoSection()
627{
628 *myOStream << "END_INFO_SECTION\n";
629 if (myOStream->bad()) Storage_StreamWriteError::Raise();
630 return Storage_VSOk;
631}
632
633//=======================================================================
634//function : BeginReadInfoSection
635//purpose :
636//=======================================================================
637
638Storage_Error DDF_IOStream::BeginReadInfoSection()
639{
640 Storage_Error s;
641 TCollection_AsciiString l;
60be1f9b 642 Standard_Integer len = (Standard_Integer) strlen(DDF_IOStream::MagicNumber());
7fd59977 643
644 // Added because of Draw:
645 // It don't go to next line after reading its own header line information!
646 FlushEndOfLine();
647 ReadChar(l,len);
648
649 if (strncmp(DDF_IOStream::MagicNumber(),l.ToCString(),len) != 0) {
650#ifdef DEB
651 cout<<"BeginReadInfoSection: format error"<<endl;
652#endif
653 s = Storage_VSFormatError;
654 }
655 else {
656 s = FindTag("BEGIN_INFO_SECTION");
657 }
658
659 return s;
660}
661
662
663// ------------------- INFO : READ
664
665
666//=======================================================================
667//function : ReadInfo
668//purpose :
669//=======================================================================
670
671void DDF_IOStream::ReadInfo(Standard_Integer& nbObj,
672 TCollection_AsciiString& dbVersion,
673 TCollection_AsciiString& date,
674 TCollection_AsciiString& schemaName,
675 TCollection_AsciiString& schemaVersion,
676 TCollection_ExtendedString& appName,
677 TCollection_AsciiString& appVersion,
678 TCollection_ExtendedString& dataType,
679 TColStd_SequenceOfAsciiString& userInfo)
680{
681 if (!(*myIStream >> nbObj)) Storage_StreamTypeMismatchError::Raise("ReadInfo 1");
682
683 FlushEndOfLine();
684
685 ReadLine(dbVersion);
686 ReadLine(date);
687 ReadLine(schemaName);
688 ReadLine(schemaVersion);
689 ReadExtendedLine(appName);
690 ReadLine(appVersion);
691 ReadExtendedLine(dataType);
692
693 Standard_Integer i,len = 0;
694
695 if (!(*myIStream >> len)) Storage_StreamTypeMismatchError::Raise("ReadInfo 2");
696
697 FlushEndOfLine();
698
699 TCollection_AsciiString line;
700
701 for (i = 1; i <= len && !IsEnd(); i++) {
702 ReadLine(line);
703 userInfo.Append(line);
704 line.Clear();
705 }
706}
707
708//=======================================================================
709//function : EndReadInfoSection
710//purpose :
711//=======================================================================
712
713Storage_Error DDF_IOStream::EndReadInfoSection()
714{ return FindTag("END_INFO_SECTION"); }
715
716
717// ---------------- COMMENTS : WRITE
718
719
720//=======================================================================
721//function : BeginWriteCommentSection
722//purpose :
723//=======================================================================
724
725Storage_Error DDF_IOStream::BeginWriteCommentSection()
726{
727 *myOStream << "BEGIN_COMMENT_SECTION\n";
728 if (myOStream->bad()) Storage_StreamWriteError::Raise();
729 return Storage_VSOk;
730}
731
732//=======================================================================
733//function : WriteComment
734//purpose :
735//=======================================================================
736
737void DDF_IOStream::WriteComment(const TColStd_SequenceOfExtendedString& aCom)
738{
739 Standard_Integer i,aSize;
740
741 aSize = aCom.Length();
742 *myOStream << aSize << "\n";
743 if (myOStream->bad()) Storage_StreamWriteError::Raise();
744
745 for (i = 1; i <= aSize; i++) {
746 WriteExtendedLine(aCom.Value(i));
747 if (myOStream->bad()) Storage_StreamWriteError::Raise();
748 }
749}
750
751//=======================================================================
752//function : EndWriteCommentSection
753//purpose :
754//=======================================================================
755
756Storage_Error DDF_IOStream::EndWriteCommentSection()
757{
758 *myOStream << "END_COMMENT_SECTION\n";
759 if (myOStream->bad()) Storage_StreamWriteError::Raise();
760 return Storage_VSOk;
761}
762
763
764// ---------------- COMMENTS : READ
765
766
767//=======================================================================
768//function : BeginReadCommentSection
769//purpose :
770//=======================================================================
771
772Storage_Error DDF_IOStream::BeginReadCommentSection()
773{
774 return FindTag("BEGIN_COMMENT_SECTION");
775}
776
777//=======================================================================
778//function : ReadComment
779//purpose :
780//=======================================================================
781
782void DDF_IOStream::ReadComment(TColStd_SequenceOfExtendedString& aCom)
783{
784 TCollection_ExtendedString line;
785 Standard_Integer len,i;
786
787 if (!(*myIStream >> len)) Storage_StreamTypeMismatchError::Raise("ReadComment");
788
789 FlushEndOfLine();
790
791 for (i = 1; i <= len && !IsEnd(); i++) {
792 ReadExtendedLine(line);
793 aCom.Append(line);
794 line.Clear();
795 }
796}
797
798//=======================================================================
799//function : EndReadCommentSection
800//purpose :
801//=======================================================================
802
803Storage_Error DDF_IOStream::EndReadCommentSection()
804{ return FindTag("END_COMMENT_SECTION"); }
805
806
807// --------------- TYPE : WRITE
808
809
810//=======================================================================
811//function : BeginWriteTypeSection
812//purpose :
813//=======================================================================
814
815Storage_Error DDF_IOStream::BeginWriteTypeSection()
816{
817 *myOStream << "BEGIN_TYPE_SECTION\n";
818 if (myOStream->bad()) Storage_StreamWriteError::Raise();
819 return Storage_VSOk;
820}
821
822//=======================================================================
823//function : SetTypeSectionSize
824//purpose :
825//=======================================================================
826
827void DDF_IOStream::SetTypeSectionSize(const Standard_Integer aSize)
828{
829 *myOStream << aSize << "\n";
830 if (myOStream->bad()) Storage_StreamWriteError::Raise();
831}
832
833//=======================================================================
834//function : WriteTypeInformations
835//purpose :
836//=======================================================================
837
838void DDF_IOStream::WriteTypeInformations(const Standard_Integer typeNum,
839 const TCollection_AsciiString& typeName)
840{
841 *myOStream << typeNum << " " << typeName.ToCString() << "\n";
842 if (myOStream->bad()) Storage_StreamWriteError::Raise();
843}
844
845//=======================================================================
846//function : EndWriteTypeSection
847//purpose :
848//=======================================================================
849
850Storage_Error DDF_IOStream::EndWriteTypeSection()
851{
852 *myOStream << "END_TYPE_SECTION\n";
853 if (myOStream->bad()) Storage_StreamWriteError::Raise();
854 return Storage_VSOk;
855}
856
857
858// ------------------- TYPE : READ
859
860
861//=======================================================================
862//function : BeginReadTypeSection
863//purpose :
864//=======================================================================
865
866Storage_Error DDF_IOStream::BeginReadTypeSection()
867{ return FindTag("BEGIN_TYPE_SECTION"); }
868
869//=======================================================================
870//function : TypeSectionSize
871//purpose :
872//=======================================================================
873
874Standard_Integer DDF_IOStream::TypeSectionSize()
875{
876 Standard_Integer i;
877
878 if (!(*myIStream >> i)) Storage_StreamTypeMismatchError::Raise("TypeSectionSize");
879
880 FlushEndOfLine();
881
882 return i;
883}
884
885//=======================================================================
886//function : ReadTypeInformations
887//purpose :
888//=======================================================================
889
890void DDF_IOStream::ReadTypeInformations(Standard_Integer& typeNum,
891 TCollection_AsciiString& typeName)
892{
893 if (!(*myIStream >> typeNum)) Storage_StreamTypeMismatchError::Raise("ReadTypeInformations 1");
894 if (!(*myIStream >> typeName)) Storage_StreamTypeMismatchError::Raise("ReadTypeInformations 2");
895 FlushEndOfLine();
896}
897
898//=======================================================================
899//function : EndReadTypeSection
900//purpose :
901//=======================================================================
902
903Storage_Error DDF_IOStream::EndReadTypeSection()
904{
905 return FindTag("END_TYPE_SECTION");
906}
907
908
909// -------------------- ROOT : WRITE
910
911
912//=======================================================================
913//function : BeginWriteRootSection
914//purpose :
915//=======================================================================
916
917Storage_Error DDF_IOStream::BeginWriteRootSection()
918{
919 *myOStream << "BEGIN_ROOT_SECTION\n";
920 if (myOStream->bad()) Storage_StreamWriteError::Raise();
921 return Storage_VSOk;
922}
923
924//=======================================================================
925//function : SetRootSectionSize
926//purpose :
927//=======================================================================
928
929void DDF_IOStream::SetRootSectionSize(const Standard_Integer aSize)
930{
931 *myOStream << aSize << "\n";
932 if (myOStream->bad()) Storage_StreamWriteError::Raise();
933}
934
935//=======================================================================
936//function : WriteRoot
937//purpose :
938//=======================================================================
939
940void DDF_IOStream::WriteRoot(const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& rootType)
941{
942 *myOStream << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n";
943 if (myOStream->bad()) Storage_StreamWriteError::Raise();
944}
945
946//=======================================================================
947//function : EndWriteRootSection
948//purpose :
949//=======================================================================
950
951Storage_Error DDF_IOStream::EndWriteRootSection()
952{
953 *myOStream << "END_ROOT_SECTION\n";
954 if (myOStream->bad()) Storage_StreamWriteError::Raise();
955 return Storage_VSOk;
956}
957
958
959// ----------------------- ROOT : READ
960
961
962//=======================================================================
963//function : BeginReadRootSection
964//purpose :
965//=======================================================================
966
967Storage_Error DDF_IOStream::BeginReadRootSection()
968{ return FindTag("BEGIN_ROOT_SECTION"); }
969
970//=======================================================================
971//function : RootSectionSize
972//purpose :
973//=======================================================================
974
975Standard_Integer DDF_IOStream::RootSectionSize()
976{
977 Standard_Integer i;
978
979 if (!(*myIStream >> i)) Storage_StreamTypeMismatchError::Raise("RootSectionSize");
980
981 FlushEndOfLine();
982
983 return i;
984}
985
986//=======================================================================
987//function : ReadRoot
988//purpose :
989//=======================================================================
990
991void DDF_IOStream::ReadRoot(TCollection_AsciiString& rootName, Standard_Integer& aRef,TCollection_AsciiString& rootType)
992{
993 if (!(*myIStream >> aRef)) Storage_StreamTypeMismatchError::Raise("ReadRoot");
994 ReadWord(rootName);
995 ReadWord(rootType);
996}
997
998//=======================================================================
999//function : EndReadRootSection
1000//purpose :
1001//=======================================================================
1002
1003Storage_Error DDF_IOStream::EndReadRootSection()
1004{ return FindTag("END_ROOT_SECTION"); }
1005
1006
1007// -------------------------- REF : WRITE
1008
1009
1010//=======================================================================
1011//function : BeginWriteRefSection
1012//purpose :
1013//=======================================================================
1014
1015Storage_Error DDF_IOStream::BeginWriteRefSection()
1016{
1017 *myOStream << "BEGIN_REF_SECTION\n";
1018 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1019 return Storage_VSOk;
1020}
1021
1022//=======================================================================
1023//function : SetRefSectionSize
1024//purpose :
1025//=======================================================================
1026
1027void DDF_IOStream::SetRefSectionSize(const Standard_Integer aSize)
1028{
1029 *myOStream << aSize << "\n";
1030 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1031}
1032
1033//=======================================================================
1034//function : WriteReferenceType
1035//purpose :
1036//=======================================================================
1037
1038void DDF_IOStream::WriteReferenceType(const Standard_Integer reference,
1039 const Standard_Integer typeNum)
1040{
1041 *myOStream << reference << " " << typeNum << "\n";
1042 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1043}
1044
1045//=======================================================================
1046//function : EndWriteRefSection
1047//purpose :
1048//=======================================================================
1049
1050Storage_Error DDF_IOStream::EndWriteRefSection()
1051{
1052 *myOStream << "END_REF_SECTION\n";
1053 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1054 return Storage_VSOk;
1055}
1056
1057
1058// ----------------------- REF : READ
1059
1060
1061//=======================================================================
1062//function : BeginReadRefSection
1063//purpose :
1064//=======================================================================
1065
1066Storage_Error DDF_IOStream::BeginReadRefSection()
1067{ return FindTag("BEGIN_REF_SECTION"); }
1068
1069//=======================================================================
1070//function : RefSectionSize
1071//purpose :
1072//=======================================================================
1073
1074Standard_Integer DDF_IOStream::RefSectionSize()
1075{
1076 Standard_Integer i;
1077
1078 if (!(*myIStream >> i)) Storage_StreamTypeMismatchError::Raise("RefSectionSize");
1079 FlushEndOfLine();
1080
1081 return i;
1082}
1083
1084//=======================================================================
1085//function : ReadReferenceType
1086//purpose :
1087//=======================================================================
1088
1089void DDF_IOStream::ReadReferenceType(Standard_Integer& reference,
1090 Standard_Integer& typeNum)
1091{
1092 if (!(*myIStream >> reference)) Storage_StreamTypeMismatchError::Raise("ReadReferenceType 1");
1093 if (!(*myIStream >> typeNum)) Storage_StreamTypeMismatchError::Raise("ReadReferenceType 2");
1094 FlushEndOfLine();
1095}
1096
1097//=======================================================================
1098//function : EndReadRefSection
1099//purpose :
1100//=======================================================================
1101
1102Storage_Error DDF_IOStream::EndReadRefSection()
1103{
1104 return FindTag("END_REF_SECTION");
1105}
1106
1107
1108// -------------------- DATA : WRITE
1109
1110
1111//=======================================================================
1112//function : BeginWriteDataSection
1113//purpose :
1114//=======================================================================
1115
1116Storage_Error DDF_IOStream::BeginWriteDataSection()
1117{
1118 *myOStream << "BEGIN_DATA_SECTION";
1119 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1120 return Storage_VSOk;
1121}
1122
1123//=======================================================================
1124//function : WritePersistentObjectHeader
1125//purpose :
1126//=======================================================================
1127
1128void DDF_IOStream::WritePersistentObjectHeader(const Standard_Integer aRef,
1129 const Standard_Integer aType)
1130{
1131 *myOStream << "\n#" << aRef << "=%" << aType;
1132 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1133}
1134
1135//=======================================================================
1136//function : BeginWritePersistentObjectData
1137//purpose :
1138//=======================================================================
1139
1140void DDF_IOStream::BeginWritePersistentObjectData()
1141{
1142 *myOStream << "( ";
1143 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1144}
1145
1146//=======================================================================
1147//function : BeginWriteObjectData
1148//purpose :
1149//=======================================================================
1150
1151void DDF_IOStream::BeginWriteObjectData()
1152{
1153 *myOStream << "( ";
1154 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1155}
1156
1157//=======================================================================
1158//function : EndWriteObjectData
1159//purpose :
1160//=======================================================================
1161
1162void DDF_IOStream::EndWriteObjectData()
1163{
1164 *myOStream << ") ";
1165 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1166}
1167
1168//=======================================================================
1169//function : EndWritePersistentObjectData
1170//purpose :
1171//=======================================================================
1172
1173void DDF_IOStream::EndWritePersistentObjectData()
1174{
1175 *myOStream << ")";
1176 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1177}
1178
1179//=======================================================================
1180//function : EndWriteDataSection
1181//purpose :
1182//=======================================================================
1183
1184Storage_Error DDF_IOStream::EndWriteDataSection()
1185{
1186 *myOStream << "\nEND_DATA_SECTION\n";
1187 if (myOStream->bad()) Storage_StreamWriteError::Raise();
1188 return Storage_VSOk;
1189}
1190
1191
1192// ---------------------- DATA : READ
1193
1194
1195//=======================================================================
1196//function : BeginReadDataSection
1197//purpose :
1198//=======================================================================
1199
1200Storage_Error DDF_IOStream::BeginReadDataSection()
1201{ return FindTag("BEGIN_DATA_SECTION"); }
1202
1203//=======================================================================
1204//function : ReadPersistentObjectHeader
1205//purpose :
1206//=======================================================================
1207
1208void DDF_IOStream::ReadPersistentObjectHeader(Standard_Integer& aRef,
1209 Standard_Integer& aType)
1210{
1211 char c;
1212
1213 myIStream->get(c);
1214
1215 while (c != '#') {
1216 if (IsEnd() || (c != ' ') || (c == '\n')) {
1217 Storage_StreamFormatError::Raise();
1218 }
1219 myIStream->get(c);
1220 }
1221
1222 if (!(*myIStream >> aRef)) Storage_StreamTypeMismatchError::Raise("ReadPersistentObjectHeader 1");
1223 myIStream->get(c);
1224
1225 while (c != '=') {
1226 if (IsEnd() || (c != ' ') || (c == '\n')) {
1227 Storage_StreamFormatError::Raise();
1228 }
1229 myIStream->get(c);
1230 }
1231
1232 myIStream->get(c);
1233
1234 while (c != '%') {
1235 if (IsEnd() || (c != ' ') || (c == '\n')) {
1236 Storage_StreamFormatError::Raise();
1237 }
1238 myIStream->get(c);
1239 }
1240
1241 if (!(*myIStream >> aType)) Storage_StreamTypeMismatchError::Raise("ReadPersistentObjectHeader 2");
1242}
1243
1244//=======================================================================
1245//function : BeginReadPersistentObjectData
1246//purpose :
1247//=======================================================================
1248
1249void DDF_IOStream::BeginReadPersistentObjectData()
1250{
1251 char c;
1252 myIStream->get(c);
1253 while (c != '(') {
1254 if (IsEnd() || (c != ' ') || (c == '\n')) {
1255 Storage_StreamFormatError::Raise();
1256 }
1257 myIStream->get(c);
1258 }
1259}
1260
1261//=======================================================================
1262//function : BeginReadObjectData
1263//purpose :
1264//=======================================================================
1265
1266void DDF_IOStream::BeginReadObjectData()
1267{
1268 char c;
1269 myIStream->get(c);
1270 while (c != '(') {
1271 if (IsEnd() || (c != ' ') || (c == '\n')) {
1272 Storage_StreamFormatError::Raise("BeginReadObjectData");
1273 }
1274 myIStream->get(c);
1275 }
1276}
1277
1278//=======================================================================
1279//function : EndReadObjectData
1280//purpose :
1281//=======================================================================
1282
1283void DDF_IOStream::EndReadObjectData()
1284{
1285 char c;
1286 myIStream->get(c);
1287 while (c != ')') {
1288 if (IsEnd() || (c != ' ') || (c == '\n')) {
1289 Storage_StreamFormatError::Raise("EndReadObjectData");
1290 }
1291 myIStream->get(c);
1292 }
1293}
1294
1295//=======================================================================
1296//function : EndReadPersistentObjectData
1297//purpose :
1298//=======================================================================
1299
1300void DDF_IOStream::EndReadPersistentObjectData()
1301{
1302 char c;
1303
1304 myIStream->get(c);
1305 while (c != ')') {
1306 if (IsEnd() || (c != ' ') || (c == '\n')) {
1307 Storage_StreamFormatError::Raise("EndReadPersistentObjectData");
1308 }
1309 myIStream->get(c);
1310 }
1311
1312 myIStream->get(c);
1313 while (c != '\n') {
1314 if (IsEnd() || (c != ' ')) {
1315 Storage_StreamFormatError::Raise();
1316 }
1317 myIStream->get(c);
1318 }
1319}
1320
1321//=======================================================================
1322//function : EndReadDataSection
1323//purpose :
1324//=======================================================================
1325
1326Storage_Error DDF_IOStream::EndReadDataSection()
1327{ return FindTag("END_DATA_SECTION"); }
1328
1329//=======================================================================
1330//function : IsGoodFileType
1331//purpose :
1332//=======================================================================
1333
1334Storage_Error DDF_IOStream::IsGoodFileType(istream* anIStream)
1335{
1336 DDF_IOStream f;
1337 Storage_Error s;
1338
1339 s = f.Open(anIStream);
1340
1341 if (s == Storage_VSOk) {
1342 TCollection_AsciiString l;
60be1f9b 1343 Standard_Integer len = (Standard_Integer) strlen(DDF_IOStream::MagicNumber());
7fd59977 1344
1345 f.ReadChar(l,len);
1346
1347 f.Close();
1348
1349 if (strncmp(DDF_IOStream::MagicNumber(),l.ToCString(),len) != 0) {
1350#ifdef DEB
1351 cout<<"IsGoodFileType: format error"<<endl;
1352#endif
1353 s = Storage_VSFormatError;
1354 }
1355 }
1356
1357 return s;
1358}
1359