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