From af336de6fd7984b045b8e67c127c1d12f911cd66 Mon Sep 17 00:00:00 2001 From: Cirilo Bernardo Date: Sun, 5 Mar 2017 13:46:16 +1100 Subject: [PATCH] Hack code to provide UTF8 filename support in MinGW --- inc/FSD_CmpFile.hxx | 10 +- inc/FSD_File.hxx | 13 +- src/BRepTools/BRepTools.cxx | 14 +- src/FSD/FSD_CmpFile.cxx | 326 +++++++++++++++------------ src/FSD/FSD_File.cxx | 356 +++++++++++++++++------------- src/IGESControl/IGESControl_Writer.cxx | 7 +- src/IGESSelect/IGESSelect_WorkLibrary.cxx | 7 +- src/OSD/OSD_MAllocHook.cxx | 40 ++-- src/OSD/OSD_MAllocHook.hxx | 7 +- src/OSD/OSD_OpenFile.cxx | 169 +++++++++----- src/OSD/OSD_OpenFile.hxx | 65 +++--- src/StepSelect/StepSelect_WorkLibrary.cxx | 10 +- src/VrmlAPI/VrmlAPI_Writer.cxx | 6 +- 13 files changed, 601 insertions(+), 429 deletions(-) diff --git a/inc/FSD_CmpFile.hxx b/inc/FSD_CmpFile.hxx index 57453a341..1351a026a 100644 --- a/inc/FSD_CmpFile.hxx +++ b/inc/FSD_CmpFile.hxx @@ -6,6 +6,7 @@ #ifndef _FSD_CmpFile_HeaderFile #define _FSD_CmpFile_HeaderFile +#include #include #include #include @@ -34,6 +35,7 @@ class TColStd_SequenceOfAsciiString; class TColStd_SequenceOfExtendedString; class Storage_BaseDriver; class Standard_Type; +class STREAM_WRAPPER; @@ -236,10 +238,7 @@ public: Standard_EXPORT Storage_Error Close() ; Standard_EXPORT void Destroy() ; -~FSD_CmpFile() -{ - Destroy(); -} + ~FSD_CmpFile(); @@ -280,7 +279,8 @@ private: Standard_EXPORT void RaiseError (const Handle(Standard_Type)& theFailure) ; - FSD_FStream myStream; + STREAM_WRAPPER* m_wrapper; + std::iostream* myStream; }; diff --git a/inc/FSD_File.hxx b/inc/FSD_File.hxx index 7fc8f8788..b14a5fd37 100644 --- a/inc/FSD_File.hxx +++ b/inc/FSD_File.hxx @@ -6,6 +6,7 @@ #ifndef _FSD_File_HeaderFile #define _FSD_File_HeaderFile +#include #include #include #include @@ -32,7 +33,7 @@ class TCollection_ExtendedString; class TColStd_SequenceOfAsciiString; class TColStd_SequenceOfExtendedString; class Storage_BaseDriver; - +class STREAM_WRAPPER; //! A general driver which defines as a file, the @@ -253,10 +254,8 @@ public: Standard_EXPORT Storage_Error Close() ; Standard_EXPORT void Destroy() ; -~FSD_File() -{ - Destroy(); -} + + ~FSD_File(); @@ -295,8 +294,8 @@ private: Standard_EXPORT static Standard_CString MagicNumber() ; - FSD_FStream myStream; - + STREAM_WRAPPER* m_wrapper; + std::iostream* myStream; }; diff --git a/src/BRepTools/BRepTools.cxx b/src/BRepTools/BRepTools.cxx index ec467ee53..33f562676 100644 --- a/src/BRepTools/BRepTools.cxx +++ b/src/BRepTools/BRepTools.cxx @@ -611,9 +611,8 @@ Standard_Boolean BRepTools::Write(const TopoDS_Shape& Sh, const Standard_CString File, const Handle(Message_ProgressIndicator)& PR) { - ofstream os; - OSD_OpenStream(os, File, ios::out); - if (!os.rdbuf()->is_open()) return Standard_False; + OPEN_STREAM( os, File, ios::out ); + if( !IS_OPEN( os )) return Standard_False; Standard_Boolean isGood = (os.good() && !os.eof()); if(!isGood) @@ -632,7 +631,7 @@ Standard_Boolean BRepTools::Write(const TopoDS_Shape& Sh, isGood = os.good(); errno = 0; - os.close(); + CLOSE_STREAM( os ); isGood = os.good() && isGood && !errno; return isGood; @@ -648,10 +647,9 @@ Standard_Boolean BRepTools::Read(TopoDS_Shape& Sh, const BRep_Builder& B, const Handle(Message_ProgressIndicator)& PR) { - filebuf fic; - istream in(&fic); - OSD_OpenFileBuf(fic,File,ios::in); - if(!fic.is_open()) return Standard_False; + OPEN_ISTREAM( in, File ); + + if( !IS_OPEN( in ) ) return Standard_False; BRepTools_ShapeSet SS(B); SS.SetProgress(PR); diff --git a/src/FSD/FSD_CmpFile.cxx b/src/FSD/FSD_CmpFile.cxx index 102d0cc32..ecca0813f 100644 --- a/src/FSD/FSD_CmpFile.cxx +++ b/src/FSD/FSD_CmpFile.cxx @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -42,7 +43,13 @@ const Standard_CString MAGICNUMBER = "CMPFILE"; FSD_CmpFile::FSD_CmpFile() { + m_wrapper = new STREAM_WRAPPER; +} +FSD_CmpFile::~FSD_CmpFile() +{ + Destroy(); + delete m_wrapper; } //======================================================================= @@ -87,45 +94,22 @@ Storage_Error FSD_CmpFile::Open(const TCollection_AsciiString& aName,const Stora if (OpenMode() == Storage_VSNone) { -#if defined(_WNT32) - TCollection_ExtendedString aWName(aName); - if (aMode == Storage_VSRead) { - myStream.open((const wchar_t*)aWName.ToExtString(),ios::in|ios::binary); // ios::nocreate is not portable - } - else if (aMode == Storage_VSWrite) { - myStream.open((const wchar_t*)aWName.ToExtString(),ios::out|ios::binary); - } - else if (aMode == Storage_VSReadWrite) { - myStream.open((const wchar_t*)aWName.ToExtString(),ios::in|ios::out|ios::binary); - } -#elif !defined(IRIX) && !defined(DECOSF1) if (aMode == Storage_VSRead) { - myStream.open(aName.ToCString(),ios::in|ios::binary); // ios::nocreate is not portable + myStream = m_wrapper->Open( aName.ToCString(), ios::in|ios::binary); // ios::nocreate is not portable } else if (aMode == Storage_VSWrite) { - myStream.open(aName.ToCString(),ios::out|ios::binary); + myStream = m_wrapper->Open( aName.ToCString(), ios::out|ios::binary); // ios::nocreate is not portable } else if (aMode == Storage_VSReadWrite) { - myStream.open(aName.ToCString(),ios::in|ios::out|ios::binary); + myStream = m_wrapper->Open( aName.ToCString(), ios::in|ios::out|ios::binary); // ios::nocreate is not portable } -#else - if (aMode == Storage_VSRead) { - myStream.open(aName.ToCString(),ios::in); // ios::nocreate is not portable - } - else if (aMode == Storage_VSWrite) { - myStream.open(aName.ToCString(),ios::out); - } - else if (aMode == Storage_VSReadWrite) { - myStream.open(aName.ToCString(),ios::in|ios::out); - } -#endif - if (myStream.fail()) { + if ( !m_wrapper->IsOpen() ) { result = Storage_VSOpenError; } else { - myStream.precision(17); - myStream.imbue (std::locale::classic()); // use always C locale + myStream->precision(17); + myStream->imbue (std::locale::classic()); // use always C locale SetOpenMode(aMode); } } @@ -142,7 +126,10 @@ Storage_Error FSD_CmpFile::Open(const TCollection_AsciiString& aName,const Stora Standard_Boolean FSD_CmpFile::IsEnd() { - return myStream.eof(); + if( NULL == myStream ) + return true; + + return myStream->eof(); } //======================================================================= @@ -155,7 +142,8 @@ Storage_Error FSD_CmpFile::Close() Storage_Error result = Storage_VSOk; if (OpenMode() != Storage_VSNone) { - myStream.close(); + m_wrapper->Init(); + myStream = NULL; SetOpenMode(Storage_VSNone); } else { @@ -218,7 +206,7 @@ void FSD_CmpFile::ReadLine(TCollection_AsciiString& buffer) while (!IsEnd && !FSD_CmpFile::IsEnd()) { Buffer[0] = '\0'; //myStream.get(Buffer,8192,'\n'); - myStream.getline(Buffer,8192,'\n'); + myStream->getline(Buffer,8192,'\n'); for (Standard_Size lv = (strlen(Buffer)- 1); lv > 1 && (Buffer[lv] == '\r' || Buffer[lv] == '\n') ;lv--) { Buffer[lv] = '\0'; } @@ -256,6 +244,8 @@ void FSD_CmpFile::WriteExtendedLine(const TCollection_ExtendedString& buffer) myStream << (char)0 << "\n"; #endif + if( NULL == myStream ) return; + Standard_ExtString extBuffer; Standard_Integer i; @@ -265,7 +255,7 @@ void FSD_CmpFile::WriteExtendedLine(const TCollection_ExtendedString& buffer) PutExtCharacter(extBuffer[i]); } - myStream << "\n"; + (*myStream) << "\n"; } //======================================================================= @@ -301,7 +291,7 @@ void FSD_CmpFile::ReadChar(TCollection_AsciiString& buffer, const Standard_Size buffer.Clear(); while (!IsEnd() && (ccount < rsize)) { - myStream.get(c); + myStream->get(c); buffer += c; ccount++; } @@ -323,7 +313,7 @@ void FSD_CmpFile::ReadString(TCollection_AsciiString& buffer) while (!IsEnd && !FSD_CmpFile::IsEnd()) { Buffer[0] = '\0'; //myStream.get(Buffer,8192,'\n'); - myStream.getline(Buffer,8192,'\n'); + myStream->getline(Buffer,8192,'\n'); for (Standard_Size lv = (strlen(Buffer)- 1); lv > 1 && (Buffer[lv] == '\r' || Buffer[lv] == '\n') ;lv--) { Buffer[lv] = '\0'; } @@ -364,7 +354,7 @@ void FSD_CmpFile::ReadWord(TCollection_AsciiString& buffer) buffer.Clear(); while (!IsEnd && !FSD_CmpFile::IsEnd()) { - myStream.get(c); + myStream->get(c); if ((c != ' ') && (c != '\n')) IsEnd = Standard_True; } @@ -380,7 +370,7 @@ void FSD_CmpFile::ReadWord(TCollection_AsciiString& buffer) } *tmpb = c; tmpb++; i++; - myStream.get(c); + myStream->get(c); if ((c == '\n') || (c == ' ')) IsEnd = Standard_True; } @@ -427,8 +417,9 @@ void FSD_CmpFile::SkipObject() Storage_BaseDriver& FSD_CmpFile::PutReference(const Standard_Integer aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -439,11 +430,12 @@ Storage_BaseDriver& FSD_CmpFile::PutReference(const Standard_Integer aValue) Storage_BaseDriver& FSD_CmpFile::PutCharacter(const Standard_Character aValue) { + if( NULL == myStream ) Storage_StreamWriteError::Raise(); unsigned short i; i = aValue; - myStream << i << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << i << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -454,8 +446,9 @@ Storage_BaseDriver& FSD_CmpFile::PutCharacter(const Standard_Character aValue) Storage_BaseDriver& FSD_CmpFile::PutExtCharacter(const Standard_ExtCharacter aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -466,8 +459,9 @@ Storage_BaseDriver& FSD_CmpFile::PutExtCharacter(const Standard_ExtCharacter aVa Storage_BaseDriver& FSD_CmpFile::PutInteger(const Standard_Integer aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -478,8 +472,9 @@ Storage_BaseDriver& FSD_CmpFile::PutInteger(const Standard_Integer aValue) Storage_BaseDriver& FSD_CmpFile::PutBoolean(const Standard_Boolean aValue) { - myStream << ((Standard_Integer)aValue) << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ((Standard_Integer)aValue) << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -490,8 +485,9 @@ Storage_BaseDriver& FSD_CmpFile::PutBoolean(const Standard_Boolean aValue) Storage_BaseDriver& FSD_CmpFile::PutReal(const Standard_Real aValue) { - myStream << ((Standard_Real)aValue) << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ((Standard_Real)aValue) << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -502,8 +498,9 @@ Storage_BaseDriver& FSD_CmpFile::PutReal(const Standard_Real aValue) Storage_BaseDriver& FSD_CmpFile::PutShortReal(const Standard_ShortReal aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -514,7 +511,8 @@ Storage_BaseDriver& FSD_CmpFile::PutShortReal(const Standard_ShortReal aValue) Storage_BaseDriver& FSD_CmpFile::GetReference(Standard_Integer& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -526,13 +524,14 @@ Storage_BaseDriver& FSD_CmpFile::GetReference(Standard_Integer& aValue) Storage_BaseDriver& FSD_CmpFile::GetCharacter(Standard_Character& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); unsigned short i = 0; - if (!(myStream >> i)) { + if (!((*myStream) >> i)) { // SGI : donne une erreur mais a une bonne valeur pour les caracteres ecrits // signes (-80 fait ios::badbit, mais la variable i est initialisee) // if (i == 0) Storage_StreamTypeMismatchError::Raise(); - myStream.clear(ios::goodbit); + myStream->clear(ios::goodbit); } aValue = (char)i; @@ -546,7 +545,8 @@ Storage_BaseDriver& FSD_CmpFile::GetCharacter(Standard_Character& aValue) Storage_BaseDriver& FSD_CmpFile::GetExtCharacter(Standard_ExtCharacter& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -558,7 +558,8 @@ Storage_BaseDriver& FSD_CmpFile::GetExtCharacter(Standard_ExtCharacter& aValue) Storage_BaseDriver& FSD_CmpFile::GetInteger(Standard_Integer& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -570,7 +571,8 @@ Storage_BaseDriver& FSD_CmpFile::GetInteger(Standard_Integer& aValue) Storage_BaseDriver& FSD_CmpFile::GetBoolean(Standard_Boolean& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -582,11 +584,12 @@ Storage_BaseDriver& FSD_CmpFile::GetBoolean(Standard_Boolean& aValue) Storage_BaseDriver& FSD_CmpFile::GetReal(Standard_Real& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); #ifdef BUC60808 char realbuffer[100]; realbuffer[0] = '\0'; - if (!(myStream >> realbuffer)) { + if (!((*myStream) >> realbuffer)) { #ifdef OCCT_DEBUG cerr << "%%%ERROR: read error of double at offset " << myStream.tellg() << endl; cerr << "\t buffer is" << realbuffer<< endl; @@ -603,7 +606,7 @@ Storage_BaseDriver& FSD_CmpFile::GetReal(Standard_Real& aValue) return *this; #else - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; #endif @@ -616,12 +619,13 @@ Storage_BaseDriver& FSD_CmpFile::GetReal(Standard_Real& aValue) Storage_BaseDriver& FSD_CmpFile::GetShortReal(Standard_ShortReal& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); #ifdef BUC60808 char realbuffer[100]; Standard_Real r = 0.0; realbuffer[0] = '\0'; - if (!(myStream >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); if (!OSD::CStringToReal(realbuffer,r)) Storage_StreamTypeMismatchError::Raise(); @@ -629,7 +633,7 @@ Storage_BaseDriver& FSD_CmpFile::GetShortReal(Standard_ShortReal& aValue) return *this; #else - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; #endif } @@ -653,9 +657,10 @@ void FSD_CmpFile::Destroy() Storage_Error FSD_CmpFile::BeginWriteInfoSection() { - myStream << FSD_CmpFile::MagicNumber() << '\n'; - myStream << "BEGIN_INFO_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << FSD_CmpFile::MagicNumber() << '\n'; + (*myStream) << "BEGIN_INFO_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -675,24 +680,25 @@ void FSD_CmpFile::WriteInfo(const Standard_Integer nbObj, const TCollection_ExtendedString& dataType, const TColStd_SequenceOfAsciiString& userInfo) { + if( NULL == myStream ) Storage_StreamWriteError::Raise(); Standard_Integer i; - myStream << nbObj; - myStream << "\n"; - myStream << dbVersion.ToCString() << "\n"; - myStream << date.ToCString() << "\n"; - myStream << schemaName.ToCString() << "\n"; - myStream << schemaVersion.ToCString() << "\n"; + (*myStream) << nbObj; + (*myStream) << "\n"; + (*myStream) << dbVersion.ToCString() << "\n"; + (*myStream) << date.ToCString() << "\n"; + (*myStream) << schemaName.ToCString() << "\n"; + (*myStream) << schemaVersion.ToCString() << "\n"; WriteExtendedLine(appName); - myStream << appVersion.ToCString() << "\n"; + (*myStream) << appVersion.ToCString() << "\n"; WriteExtendedLine(dataType); - myStream << userInfo.Length() << "\n"; + (*myStream) << userInfo.Length() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); for (i = 1; i <= userInfo.Length(); i++) { - myStream << userInfo.Value(i).ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << userInfo.Value(i).ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } } @@ -703,8 +709,9 @@ void FSD_CmpFile::WriteInfo(const Standard_Integer nbObj, Storage_Error FSD_CmpFile::EndWriteInfoSection() { - myStream << "END_INFO_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_INFO_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -746,7 +753,8 @@ void FSD_CmpFile::ReadInfo(Standard_Integer& nbObj, TCollection_ExtendedString& dataType, TColStd_SequenceOfAsciiString& userInfo) { - if (!(myStream >> nbObj)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> nbObj)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -760,7 +768,7 @@ void FSD_CmpFile::ReadInfo(Standard_Integer& nbObj, Standard_Integer i,len = 0; - if (!(myStream >> len)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> len)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -791,8 +799,9 @@ Storage_Error FSD_CmpFile::EndReadInfoSection() Storage_Error FSD_CmpFile::BeginWriteCommentSection() { - myStream << "BEGIN_COMMENT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_COMMENT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -803,15 +812,16 @@ Storage_Error FSD_CmpFile::BeginWriteCommentSection() void FSD_CmpFile::WriteComment(const TColStd_SequenceOfExtendedString& aCom) { + if( NULL == myStream ) Storage_StreamWriteError::Raise(); Standard_Integer i,aSize; aSize = aCom.Length(); - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); for (i = 1; i <= aSize; i++) { WriteExtendedLine(aCom.Value(i)); - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } } @@ -822,8 +832,9 @@ void FSD_CmpFile::WriteComment(const TColStd_SequenceOfExtendedString& aCom) Storage_Error FSD_CmpFile::EndWriteCommentSection() { - myStream << "END_COMMENT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_COMMENT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -844,10 +855,11 @@ Storage_Error FSD_CmpFile::BeginReadCommentSection() void FSD_CmpFile::ReadComment(TColStd_SequenceOfExtendedString& aCom) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); TCollection_ExtendedString line; Standard_Integer len,i; - if (!(myStream >> len)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> len)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -875,8 +887,9 @@ Storage_Error FSD_CmpFile::EndReadCommentSection() Storage_Error FSD_CmpFile::BeginWriteTypeSection() { - myStream << "BEGIN_TYPE_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_TYPE_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -887,8 +900,9 @@ Storage_Error FSD_CmpFile::BeginWriteTypeSection() void FSD_CmpFile::SetTypeSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -899,8 +913,9 @@ void FSD_CmpFile::SetTypeSectionSize(const Standard_Integer aSize) void FSD_CmpFile::WriteTypeInformations(const Standard_Integer typeNum, const TCollection_AsciiString& typeName) { - myStream << typeNum << " " << typeName.ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << typeNum << " " << typeName.ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -910,8 +925,9 @@ void FSD_CmpFile::WriteTypeInformations(const Standard_Integer typeNum, Storage_Error FSD_CmpFile::EndWriteTypeSection() { - myStream << "END_TYPE_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_TYPE_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -932,9 +948,10 @@ Storage_Error FSD_CmpFile::BeginReadTypeSection() Standard_Integer FSD_CmpFile::TypeSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -949,8 +966,9 @@ Standard_Integer FSD_CmpFile::TypeSectionSize() void FSD_CmpFile::ReadTypeInformations(Standard_Integer& typeNum, TCollection_AsciiString& typeName) { - if (!(myStream >> typeNum)) Storage_StreamTypeMismatchError::Raise(); - if (!(myStream >> typeName)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeNum)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeName)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); } @@ -972,8 +990,9 @@ Storage_Error FSD_CmpFile::EndReadTypeSection() Storage_Error FSD_CmpFile::BeginWriteRootSection() { - myStream << "BEGIN_ROOT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_ROOT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -984,8 +1003,9 @@ Storage_Error FSD_CmpFile::BeginWriteRootSection() void FSD_CmpFile::SetRootSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -995,8 +1015,9 @@ void FSD_CmpFile::SetRootSectionSize(const Standard_Integer aSize) void FSD_CmpFile::WriteRoot(const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& rootType) { - myStream << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1006,8 +1027,9 @@ void FSD_CmpFile::WriteRoot(const TCollection_AsciiString& rootName, const Stand Storage_Error FSD_CmpFile::EndWriteRootSection() { - myStream << "END_ROOT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_ROOT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1028,9 +1050,10 @@ Storage_Error FSD_CmpFile::BeginReadRootSection() Standard_Integer FSD_CmpFile::RootSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -1044,7 +1067,8 @@ Standard_Integer FSD_CmpFile::RootSectionSize() void FSD_CmpFile::ReadRoot(TCollection_AsciiString& rootName, Standard_Integer& aRef,TCollection_AsciiString& rootType) { - if (!(myStream >> aRef)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aRef)) Storage_StreamTypeMismatchError::Raise(); ReadWord(rootName); ReadWord(rootType); } @@ -1067,8 +1091,9 @@ Storage_Error FSD_CmpFile::EndReadRootSection() Storage_Error FSD_CmpFile::BeginWriteRefSection() { - myStream << "BEGIN_REF_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_REF_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1079,8 +1104,9 @@ Storage_Error FSD_CmpFile::BeginWriteRefSection() void FSD_CmpFile::SetRefSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1091,8 +1117,9 @@ void FSD_CmpFile::SetRefSectionSize(const Standard_Integer aSize) void FSD_CmpFile::WriteReferenceType(const Standard_Integer reference, const Standard_Integer typeNum) { - myStream << reference << " " << typeNum << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << reference << " " << typeNum << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1102,8 +1129,9 @@ void FSD_CmpFile::WriteReferenceType(const Standard_Integer reference, Storage_Error FSD_CmpFile::EndWriteRefSection() { - myStream << "END_REF_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_REF_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1124,9 +1152,10 @@ Storage_Error FSD_CmpFile::BeginReadRefSection() Standard_Integer FSD_CmpFile::RefSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); return i; @@ -1140,8 +1169,9 @@ Standard_Integer FSD_CmpFile::RefSectionSize() void FSD_CmpFile::ReadReferenceType(Standard_Integer& reference, Standard_Integer& typeNum) { - if (!(myStream >> reference)) Storage_StreamTypeMismatchError::Raise(); - if (!(myStream >> typeNum)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> reference)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeNum)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); } @@ -1163,8 +1193,9 @@ Storage_Error FSD_CmpFile::EndReadRefSection() Storage_Error FSD_CmpFile::BeginWriteDataSection() { - myStream << "BEGIN_DATA_SECTION"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_DATA_SECTION"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1176,8 +1207,10 @@ Storage_Error FSD_CmpFile::BeginWriteDataSection() void FSD_CmpFile::WritePersistentObjectHeader(const Standard_Integer aRef, const Standard_Integer aType) { - myStream << "\n#" << aRef << "%" << aType << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + (*myStream) << "\n#" << aRef << "%" << aType << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1187,7 +1220,8 @@ void FSD_CmpFile::WritePersistentObjectHeader(const Standard_Integer aRef, void FSD_CmpFile::BeginWritePersistentObjectData() { - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1197,7 +1231,8 @@ void FSD_CmpFile::BeginWritePersistentObjectData() void FSD_CmpFile::BeginWriteObjectData() { - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1207,7 +1242,8 @@ void FSD_CmpFile::BeginWriteObjectData() void FSD_CmpFile::EndWriteObjectData() { - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1217,7 +1253,8 @@ void FSD_CmpFile::EndWriteObjectData() void FSD_CmpFile::EndWritePersistentObjectData() { - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1227,8 +1264,9 @@ void FSD_CmpFile::EndWritePersistentObjectData() Storage_Error FSD_CmpFile::EndWriteDataSection() { - myStream << "\nEND_DATA_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "\nEND_DATA_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1250,29 +1288,30 @@ Storage_Error FSD_CmpFile::BeginReadDataSection() void FSD_CmpFile::ReadPersistentObjectHeader(Standard_Integer& aRef, Standard_Integer& aType) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != '#') { if (IsEnd() || (c != ' ') || (c == '\r')|| (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - if (!(myStream >> aRef)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aRef)) Storage_StreamTypeMismatchError::Raise(); - myStream.get(c); + myStream->get(c); while (c != '%') { if (IsEnd() || (c != ' ') || (c == '\r')|| (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - if (!(myStream >> aType)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aType)) Storage_StreamTypeMismatchError::Raise(); // cout << "REF:" << aRef << " TYPE:"<< aType << endl; } @@ -1313,17 +1352,18 @@ void FSD_CmpFile::EndReadObjectData() void FSD_CmpFile::EndReadPersistentObjectData() { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != '\n' && (c != '\r')) { if (IsEnd() || (c != ' ')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } if (c == '\r') { - myStream.get(c); + myStream->get(c); } // cout << "EndReadPersistentObjectData" << endl; } @@ -1345,14 +1385,16 @@ Storage_Error FSD_CmpFile::EndReadDataSection() Storage_Position FSD_CmpFile::Tell() { + if( NULL == myStream ) return -1; + switch (OpenMode()) { case Storage_VSRead: - return (Storage_Position) myStream.tellp(); + return (Storage_Position) myStream->tellp(); case Storage_VSWrite: - return (Storage_Position) myStream.tellg(); + return (Storage_Position) myStream->tellg(); case Storage_VSReadWrite: { - Storage_Position aPosR = (Storage_Position) myStream.tellp(); - Storage_Position aPosW = (Storage_Position) myStream.tellg(); + Storage_Position aPosR = (Storage_Position) myStream->tellp(); + Storage_Position aPosW = (Storage_Position) myStream->tellg(); if (aPosR < aPosW) return aPosW; else diff --git a/src/FSD/FSD_File.cxx b/src/FSD/FSD_File.cxx index 393fed9ca..47f6e5db3 100644 --- a/src/FSD/FSD_File.cxx +++ b/src/FSD/FSD_File.cxx @@ -14,6 +14,7 @@ #include #include +#include const Standard_CString MAGICNUMBER = "FSDFILE"; const Standard_CString ENDOFNORMALEXTENDEDSECTION = "BEGIN_REF_SECTION"; @@ -28,7 +29,14 @@ const Standard_Integer SIZEOFNORMALEXTENDEDSECTION = 16; FSD_File::FSD_File() { + m_wrapper = new STREAM_WRAPPER; + myStream = NULL; +} +FSD_File::~FSD_File() +{ + Destroy(); + delete m_wrapper; } //======================================================================= @@ -73,34 +81,22 @@ Storage_Error FSD_File::Open(const TCollection_AsciiString& aName,const Storage_ if (OpenMode() == Storage_VSNone) { -#ifdef _MSC_VER - TCollection_ExtendedString aWName(aName); if (aMode == Storage_VSRead) { - myStream.open( (const wchar_t*) aWName.ToExtString(),ios::in); // ios::nocreate is not portable + myStream = m_wrapper->Open( aName.ToCString(), ios::in); // ios::nocreate is not portable } else if (aMode == Storage_VSWrite) { - myStream.open( (const wchar_t*) aWName.ToExtString(),ios::out); + myStream = m_wrapper->Open( aName.ToCString(), ios::out); // ios::nocreate is not portable } else if (aMode == Storage_VSReadWrite) { - myStream.open( (const wchar_t*) aWName.ToExtString(),ios::in|ios::out); -#else - if (aMode == Storage_VSRead) { - myStream.open(aName.ToCString(),ios::in); // ios::nocreate is not portable - } - else if (aMode == Storage_VSWrite) { - myStream.open(aName.ToCString(),ios::out); - } - else if (aMode == Storage_VSReadWrite) { - myStream.open(aName.ToCString(),ios::in|ios::out); -#endif + myStream = m_wrapper->Open( aName.ToCString(), ios::in|ios::out); // ios::nocreate is not portable } - if (myStream.fail()) { + if ( !m_wrapper->IsOpen() ) { result = Storage_VSOpenError; } else { - myStream.precision(17); - myStream.imbue (std::locale::classic()); // use always C locale + myStream->precision(17); + myStream->imbue (std::locale::classic()); // use always C locale SetOpenMode(aMode); } } @@ -118,7 +114,10 @@ Storage_Error FSD_File::Open(const TCollection_AsciiString& aName,const Storage_ Standard_Boolean FSD_File::IsEnd() { - return myStream.eof(); + if( NULL == myStream ) + return true; + + return myStream->eof(); } //======================================================================= @@ -131,7 +130,8 @@ Storage_Error FSD_File::Close() Storage_Error result = Storage_VSOk; if (OpenMode() != Storage_VSNone) { - myStream.close(); + m_wrapper->Init(); + myStream = NULL; SetOpenMode(Storage_VSNone); } else { @@ -190,7 +190,7 @@ void FSD_File::ReadLine(TCollection_AsciiString& buffer) while (!IsEnd && !FSD_File::IsEnd()) { Buffer[0] = '\0'; - myStream.getline(Buffer,8192,'\n'); + myStream->getline(Buffer,8192,'\n'); // char c; // if (myStream.get(c) && c != '\n') { @@ -211,6 +211,8 @@ void FSD_File::ReadLine(TCollection_AsciiString& buffer) void FSD_File::WriteExtendedLine(const TCollection_ExtendedString& buffer) { + if( NULL == myStream ) return; + Standard_ExtString extBuffer; Standard_Integer i,c,d; @@ -220,10 +222,10 @@ void FSD_File::WriteExtendedLine(const TCollection_ExtendedString& buffer) c = (extBuffer[i] & 0x0000FF00 ) >> 8 ; d = extBuffer[i] & 0x000000FF; - myStream << (char)c << (char)d; + (*myStream) << (char)c << (char)d; } - myStream << (char)0 << "\n"; + (*myStream) << (char)0 << "\n"; } //======================================================================= @@ -233,6 +235,8 @@ void FSD_File::WriteExtendedLine(const TCollection_ExtendedString& buffer) void FSD_File::ReadExtendedLine(TCollection_ExtendedString& buffer) { + if( NULL == myStream ) return; + char c = '\0'; Standard_ExtCharacter i = 0,j,count = 0; Standard_Boolean fin = Standard_False; @@ -241,7 +245,7 @@ void FSD_File::ReadExtendedLine(TCollection_ExtendedString& buffer) buffer.Clear(); while (!fin && !IsEnd()) { - myStream.get(c); + myStream->get(c); if (c == tg[count]) count++; else count = 0; @@ -251,7 +255,7 @@ void FSD_File::ReadExtendedLine(TCollection_ExtendedString& buffer) if (c == '\0') fin = Standard_True; i = (i << 8); - myStream.get(c); + myStream->get(c); if (c == tg[count]) count++; else count = 0; if (count < SIZEOFNORMALEXTENDEDSECTION) { @@ -285,7 +289,7 @@ void FSD_File::ReadChar(TCollection_AsciiString& buffer, const Standard_Size rsi buffer.Clear(); while (!IsEnd() && (ccount < rsize)) { - myStream.get(c); + myStream->get(c); buffer += c; ccount++; } @@ -306,7 +310,7 @@ void FSD_File::ReadString(TCollection_AsciiString& buffer) while (!IsEnd && !FSD_File::IsEnd()) { Buffer[0] = '\0'; - myStream.getline(Buffer,8192,'\n'); + myStream->getline(Buffer,8192,'\n'); bpos = Buffer; // LeftAdjust @@ -345,7 +349,7 @@ void FSD_File::ReadWord(TCollection_AsciiString& buffer) buffer.Clear(); while (!IsEnd && !FSD_File::IsEnd()) { - myStream.get(c); + myStream->get(c); if ((c != ' ') && (c != '\n')) IsEnd = Standard_True; } @@ -361,7 +365,7 @@ void FSD_File::ReadWord(TCollection_AsciiString& buffer) } *tmpb = c; tmpb++; i++; - myStream.get(c); + myStream->get(c); if ((c == '\n') || (c == ' ')) IsEnd = Standard_True; } @@ -408,8 +412,9 @@ void FSD_File::SkipObject() Storage_BaseDriver& FSD_File::PutReference(const Standard_Integer aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -420,11 +425,12 @@ Storage_BaseDriver& FSD_File::PutReference(const Standard_Integer aValue) Storage_BaseDriver& FSD_File::PutCharacter(const Standard_Character aValue) { - unsigned short i; + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + unsigned short i; i = aValue; - myStream << i << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << i << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -435,8 +441,10 @@ Storage_BaseDriver& FSD_File::PutCharacter(const Standard_Character aValue) Storage_BaseDriver& FSD_File::PutExtCharacter(const Standard_ExtCharacter aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -447,8 +455,9 @@ Storage_BaseDriver& FSD_File::PutExtCharacter(const Standard_ExtCharacter aValue Storage_BaseDriver& FSD_File::PutInteger(const Standard_Integer aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -459,8 +468,9 @@ Storage_BaseDriver& FSD_File::PutInteger(const Standard_Integer aValue) Storage_BaseDriver& FSD_File::PutBoolean(const Standard_Boolean aValue) { - myStream << ((Standard_Integer)aValue) << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ((Standard_Integer)aValue) << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -471,8 +481,9 @@ Storage_BaseDriver& FSD_File::PutBoolean(const Standard_Boolean aValue) Storage_BaseDriver& FSD_File::PutReal(const Standard_Real aValue) { - myStream << ((Standard_Real)aValue) << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ((Standard_Real)aValue) << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -483,8 +494,9 @@ Storage_BaseDriver& FSD_File::PutReal(const Standard_Real aValue) Storage_BaseDriver& FSD_File::PutShortReal(const Standard_ShortReal aValue) { - myStream << aValue << " "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aValue << " "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return *this; } @@ -495,7 +507,8 @@ Storage_BaseDriver& FSD_File::PutShortReal(const Standard_ShortReal aValue) Storage_BaseDriver& FSD_File::GetReference(Standard_Integer& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -507,13 +520,14 @@ Storage_BaseDriver& FSD_File::GetReference(Standard_Integer& aValue) Storage_BaseDriver& FSD_File::GetCharacter(Standard_Character& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); unsigned short i = 0; - if (!(myStream >> i)) { + if (!((*myStream) >> i)) { // SGI : donne une erreur mais a une bonne valeur pour les caracteres ecrits // signes (-80 fait ios::badbit, mais la variable i est initialisee) // if (i == 0) Storage_StreamTypeMismatchError::Raise(); - myStream.clear(ios::goodbit); // .clear(0) is not portable + myStream->clear(ios::goodbit); // .clear(0) is not portable } aValue = (char)i; @@ -527,7 +541,8 @@ Storage_BaseDriver& FSD_File::GetCharacter(Standard_Character& aValue) Storage_BaseDriver& FSD_File::GetExtCharacter(Standard_ExtCharacter& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -539,7 +554,8 @@ Storage_BaseDriver& FSD_File::GetExtCharacter(Standard_ExtCharacter& aValue) Storage_BaseDriver& FSD_File::GetInteger(Standard_Integer& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -551,7 +567,8 @@ Storage_BaseDriver& FSD_File::GetInteger(Standard_Integer& aValue) Storage_BaseDriver& FSD_File::GetBoolean(Standard_Boolean& aValue) { - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; } @@ -563,16 +580,17 @@ Storage_BaseDriver& FSD_File::GetBoolean(Standard_Boolean& aValue) Storage_BaseDriver& FSD_File::GetReal(Standard_Real& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); #ifdef USEOSDREAL char realbuffer[100]; realbuffer[0] = '\0'; - if (!(myStream >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); if (!OSD::CStringToReal(realbuffer,aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; #else - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; #endif @@ -585,19 +603,20 @@ Storage_BaseDriver& FSD_File::GetReal(Standard_Real& aValue) Storage_BaseDriver& FSD_File::GetShortReal(Standard_ShortReal& aValue) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); #ifdef USEOSDREAL char realbuffer[100]; Standard_Real r = 0.0; realbuffer[0] = '\0'; - if (!(myStream >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> realbuffer)) Storage_StreamTypeMismatchError::Raise(); if (!OSD::CStringToReal(realbuffer,r)) Storage_StreamTypeMismatchError::Raise(); aValue = r; return *this; #else - if (!(myStream >> aValue)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aValue)) Storage_StreamTypeMismatchError::Raise(); return *this; #endif } @@ -621,9 +640,11 @@ void FSD_File::Destroy() Storage_Error FSD_File::BeginWriteInfoSection() { - myStream << FSD_File::MagicNumber() << '\n'; - myStream << "BEGIN_INFO_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + + (*myStream) << FSD_File::MagicNumber() << '\n'; + (*myStream) << "BEGIN_INFO_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -643,24 +664,25 @@ void FSD_File::WriteInfo(const Standard_Integer nbObj, const TCollection_ExtendedString& dataType, const TColStd_SequenceOfAsciiString& userInfo) { + if( NULL == myStream ) Storage_StreamWriteError::Raise(); Standard_Integer i; - myStream << nbObj; - myStream << "\n"; - myStream << dbVersion.ToCString() << "\n"; - myStream << date.ToCString() << "\n"; - myStream << schemaName.ToCString() << "\n"; - myStream << schemaVersion.ToCString() << "\n"; + (*myStream) << nbObj; + (*myStream) << "\n"; + (*myStream) << dbVersion.ToCString() << "\n"; + (*myStream) << date.ToCString() << "\n"; + (*myStream) << schemaName.ToCString() << "\n"; + (*myStream) << schemaVersion.ToCString() << "\n"; WriteExtendedLine(appName); - myStream << appVersion.ToCString() << "\n"; + (*myStream) << appVersion.ToCString() << "\n"; WriteExtendedLine(dataType); - myStream << userInfo.Length() << "\n"; + (*myStream) << userInfo.Length() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); for (i = 1; i <= userInfo.Length(); i++) { - myStream << userInfo.Value(i).ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << userInfo.Value(i).ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } } @@ -671,8 +693,9 @@ void FSD_File::WriteInfo(const Standard_Integer nbObj, Storage_Error FSD_File::EndWriteInfoSection() { - myStream << "END_INFO_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_INFO_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -714,7 +737,8 @@ void FSD_File::ReadInfo(Standard_Integer& nbObj, TCollection_ExtendedString& dataType, TColStd_SequenceOfAsciiString& userInfo) { - if (!(myStream >> nbObj)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> nbObj)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -728,7 +752,7 @@ void FSD_File::ReadInfo(Standard_Integer& nbObj, Standard_Integer i,len = 0; - if (!(myStream >> len)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> len)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -759,8 +783,9 @@ Storage_Error FSD_File::EndReadInfoSection() Storage_Error FSD_File::BeginWriteCommentSection() { - myStream << "BEGIN_COMMENT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_COMMENT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -771,15 +796,16 @@ Storage_Error FSD_File::BeginWriteCommentSection() void FSD_File::WriteComment(const TColStd_SequenceOfExtendedString& aCom) { + if( NULL == myStream ) Storage_StreamWriteError::Raise(); Standard_Integer i,aSize; aSize = aCom.Length(); - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); for (i = 1; i <= aSize; i++) { WriteExtendedLine(aCom.Value(i)); - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if (myStream->bad()) Storage_StreamWriteError::Raise(); } } @@ -790,8 +816,9 @@ void FSD_File::WriteComment(const TColStd_SequenceOfExtendedString& aCom) Storage_Error FSD_File::EndWriteCommentSection() { - myStream << "END_COMMENT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_COMMENT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -812,10 +839,11 @@ Storage_Error FSD_File::BeginReadCommentSection() void FSD_File::ReadComment(TColStd_SequenceOfExtendedString& aCom) { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); TCollection_ExtendedString line; Standard_Integer len,i; - if (!(myStream >> len)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> len)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -843,8 +871,9 @@ Storage_Error FSD_File::EndReadCommentSection() Storage_Error FSD_File::BeginWriteTypeSection() { - myStream << "BEGIN_TYPE_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_TYPE_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -855,8 +884,9 @@ Storage_Error FSD_File::BeginWriteTypeSection() void FSD_File::SetTypeSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -867,8 +897,9 @@ void FSD_File::SetTypeSectionSize(const Standard_Integer aSize) void FSD_File::WriteTypeInformations(const Standard_Integer typeNum, const TCollection_AsciiString& typeName) { - myStream << typeNum << " " << typeName.ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << typeNum << " " << typeName.ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -878,8 +909,9 @@ void FSD_File::WriteTypeInformations(const Standard_Integer typeNum, Storage_Error FSD_File::EndWriteTypeSection() { - myStream << "END_TYPE_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_TYPE_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -900,9 +932,10 @@ Storage_Error FSD_File::BeginReadTypeSection() Standard_Integer FSD_File::TypeSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -917,8 +950,9 @@ Standard_Integer FSD_File::TypeSectionSize() void FSD_File::ReadTypeInformations(Standard_Integer& typeNum, TCollection_AsciiString& typeName) { - if (!(myStream >> typeNum)) Storage_StreamTypeMismatchError::Raise(); - if (!(myStream >> typeName)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeNum)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeName)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); } @@ -940,8 +974,9 @@ Storage_Error FSD_File::EndReadTypeSection() Storage_Error FSD_File::BeginWriteRootSection() { - myStream << "BEGIN_ROOT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_ROOT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -952,8 +987,9 @@ Storage_Error FSD_File::BeginWriteRootSection() void FSD_File::SetRootSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -963,8 +999,9 @@ void FSD_File::SetRootSectionSize(const Standard_Integer aSize) void FSD_File::WriteRoot(const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& rootType) { - myStream << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -974,8 +1011,9 @@ void FSD_File::WriteRoot(const TCollection_AsciiString& rootName, const Standard Storage_Error FSD_File::EndWriteRootSection() { - myStream << "END_ROOT_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_ROOT_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -996,9 +1034,10 @@ Storage_Error FSD_File::BeginReadRootSection() Standard_Integer FSD_File::RootSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); @@ -1012,7 +1051,8 @@ Standard_Integer FSD_File::RootSectionSize() void FSD_File::ReadRoot(TCollection_AsciiString& rootName, Standard_Integer& aRef,TCollection_AsciiString& rootType) { - if (!(myStream >> aRef)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aRef)) Storage_StreamTypeMismatchError::Raise(); ReadWord(rootName); ReadWord(rootType); } @@ -1035,8 +1075,9 @@ Storage_Error FSD_File::EndReadRootSection() Storage_Error FSD_File::BeginWriteRefSection() { - myStream << "BEGIN_REF_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_REF_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1047,8 +1088,9 @@ Storage_Error FSD_File::BeginWriteRefSection() void FSD_File::SetRefSectionSize(const Standard_Integer aSize) { - myStream << aSize << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << aSize << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1059,8 +1101,9 @@ void FSD_File::SetRefSectionSize(const Standard_Integer aSize) void FSD_File::WriteReferenceType(const Standard_Integer reference, const Standard_Integer typeNum) { - myStream << reference << " " << typeNum << "\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << reference << " " << typeNum << "\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1070,8 +1113,9 @@ void FSD_File::WriteReferenceType(const Standard_Integer reference, Storage_Error FSD_File::EndWriteRefSection() { - myStream << "END_REF_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "END_REF_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1092,9 +1136,10 @@ Storage_Error FSD_File::BeginReadRefSection() Standard_Integer FSD_File::RefSectionSize() { + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); Standard_Integer i; - if (!(myStream >> i)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> i)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); return i; @@ -1108,8 +1153,9 @@ Standard_Integer FSD_File::RefSectionSize() void FSD_File::ReadReferenceType(Standard_Integer& reference, Standard_Integer& typeNum) { - if (!(myStream >> reference)) Storage_StreamTypeMismatchError::Raise(); - if (!(myStream >> typeNum)) Storage_StreamTypeMismatchError::Raise(); + if( NULL == myStream ) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> reference)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> typeNum)) Storage_StreamTypeMismatchError::Raise(); FlushEndOfLine(); } @@ -1131,8 +1177,9 @@ Storage_Error FSD_File::EndReadRefSection() Storage_Error FSD_File::BeginWriteDataSection() { - myStream << "BEGIN_DATA_SECTION"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "BEGIN_DATA_SECTION"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1144,8 +1191,9 @@ Storage_Error FSD_File::BeginWriteDataSection() void FSD_File::WritePersistentObjectHeader(const Standard_Integer aRef, const Standard_Integer aType) { - myStream << "\n#" << aRef << "=%" << aType; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "\n#" << aRef << "=%" << aType; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1155,8 +1203,9 @@ void FSD_File::WritePersistentObjectHeader(const Standard_Integer aRef, void FSD_File::BeginWritePersistentObjectData() { - myStream << "( "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "( "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1166,8 +1215,9 @@ void FSD_File::BeginWritePersistentObjectData() void FSD_File::BeginWriteObjectData() { - myStream << "( "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "( "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1177,8 +1227,9 @@ void FSD_File::BeginWriteObjectData() void FSD_File::EndWriteObjectData() { - myStream << ") "; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ") "; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1188,8 +1239,9 @@ void FSD_File::EndWriteObjectData() void FSD_File::EndWritePersistentObjectData() { - myStream << ")"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << ")"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); } //======================================================================= @@ -1199,8 +1251,9 @@ void FSD_File::EndWritePersistentObjectData() Storage_Error FSD_File::EndWriteDataSection() { - myStream << "\nEND_DATA_SECTION\n"; - if (myStream.bad()) Storage_StreamWriteError::Raise(); + if( NULL == myStream ) Storage_StreamWriteError::Raise(); + (*myStream) << "\nEND_DATA_SECTION\n"; + if (myStream->bad()) Storage_StreamWriteError::Raise(); return Storage_VSOk; } @@ -1222,39 +1275,40 @@ Storage_Error FSD_File::BeginReadDataSection() void FSD_File::ReadPersistentObjectHeader(Standard_Integer& aRef, Standard_Integer& aType) { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != '#') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - if (!(myStream >> aRef)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aRef)) Storage_StreamTypeMismatchError::Raise(); - myStream.get(c); + myStream->get(c); while (c != '=') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - myStream.get(c); + myStream->get(c); while (c != '%') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - if (!(myStream >> aType)) Storage_StreamTypeMismatchError::Raise(); + if (!((*myStream) >> aType)) Storage_StreamTypeMismatchError::Raise(); // cout << "REF:" << aRef << " TYPE:"<< aType << endl; } @@ -1265,13 +1319,14 @@ void FSD_File::ReadPersistentObjectHeader(Standard_Integer& aRef, void FSD_File::BeginReadPersistentObjectData() { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != '(') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } //cout << "BeginReadPersistentObjectData" << endl; @@ -1284,14 +1339,15 @@ void FSD_File::BeginReadPersistentObjectData() void FSD_File::BeginReadObjectData() { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != '(') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } // cout << "BeginReadObjectData" << endl; @@ -1304,14 +1360,15 @@ void FSD_File::BeginReadObjectData() void FSD_File::EndReadObjectData() { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != ')') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } // cout << "EndReadObjectData" << endl; @@ -1324,23 +1381,24 @@ void FSD_File::EndReadObjectData() void FSD_File::EndReadPersistentObjectData() { + if( NULL == myStream ) Storage_StreamFormatError::Raise(); char c; - myStream.get(c); + myStream->get(c); while (c != ')') { if (IsEnd() || (c != ' ') || (c == '\n')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } - myStream.get(c); + myStream->get(c); while (c != '\n') { if (IsEnd() || (c != ' ')) { Storage_StreamFormatError::Raise(); } - myStream.get(c); + myStream->get(c); } // cout << "EndReadPersistentObjectData" << endl; } @@ -1362,14 +1420,16 @@ Storage_Error FSD_File::EndReadDataSection() Storage_Position FSD_File::Tell() { + if( NULL == myStream ) return -1; + switch (OpenMode()) { case Storage_VSRead: - return (Storage_Position) myStream.tellp(); + return (Storage_Position) myStream->tellp(); case Storage_VSWrite: - return (Storage_Position) myStream.tellg(); + return (Storage_Position) myStream->tellg(); case Storage_VSReadWrite: { - Storage_Position aPosR = (Storage_Position) myStream.tellp(); - Storage_Position aPosW = (Storage_Position) myStream.tellg(); + Storage_Position aPosR = (Storage_Position) myStream->tellp(); + Storage_Position aPosW = (Storage_Position) myStream->tellg(); if (aPosR < aPosW) return aPosW; else diff --git a/src/IGESControl/IGESControl_Writer.cxx b/src/IGESControl/IGESControl_Writer.cxx index 99ef6ddc6..f58a069ed 100644 --- a/src/IGESControl/IGESControl_Writer.cxx +++ b/src/IGESControl/IGESControl_Writer.cxx @@ -268,16 +268,15 @@ Standard_Boolean IGESControl_Writer::Write Standard_Boolean IGESControl_Writer::Write (const Standard_CString file, const Standard_Boolean fnes) { - ofstream fout; - OSD_OpenStream(fout,file,ios::out); - if (!fout) return Standard_False; + OPEN_OSTREAM( fout, file ); + if( !IS_OPEN( fout ) ) return Standard_False; #ifdef OCCT_DEBUG cout<<" Ecriture fichier ("<< (fnes ? "fnes" : "IGES") <<"): "<AddFail("IGES File could not be created"); sout<<" - IGES File could not be created : " << ctx.FileName() << endl; return 0; } @@ -127,7 +126,7 @@ static Handle(IGESData_FileProtocol) IGESProto; Standard_Boolean status = VW.Print(fout); sout<<" Done"< +#include #if !defined(WNT) || defined(__MINGW32__) || defined(__BORLANDC__) #if !defined __STDC_LIMIT_MACROS @@ -205,7 +206,8 @@ void OSD_MAllocHook::SetCallback(Callback* theCB) OSD_MAllocHook::LogFileHandler::LogFileHandler() : myBreakSize(0) { - myLogFile.imbue (std::locale ("C")); + myLogFile = NULL; + m_wrapper = new STREAM_WRAPPER; } //======================================================================= @@ -216,6 +218,7 @@ OSD_MAllocHook::LogFileHandler::LogFileHandler() OSD_MAllocHook::LogFileHandler::~LogFileHandler() { Close(); + delete m_wrapper; } //======================================================================= @@ -226,13 +229,15 @@ OSD_MAllocHook::LogFileHandler::~LogFileHandler() Standard_Boolean OSD_MAllocHook::LogFileHandler::Open(const char* theFileName) { Close(); - myLogFile.open (theFileName); - if (!myLogFile.is_open()) + myLogFile = m_wrapper->Open( theFileName, ios::out ); + + if (!m_wrapper->IsOpen()) { return Standard_False; } - myLogFile << "Operation type; Request Number; Block Size\n" + myLogFile->imbue (std::locale ("C")); + (*myLogFile) << "Operation type; Request Number; Block Size\n" "------------------------------------------\n"; return Standard_True; } @@ -244,9 +249,10 @@ Standard_Boolean OSD_MAllocHook::LogFileHandler::Open(const char* theFileName) void OSD_MAllocHook::LogFileHandler::Close() { - if (myLogFile.is_open()) + if ( m_wrapper->IsOpen() ) { - myLogFile.close(); + m_wrapper->Init(); + myLogFile = NULL; } } @@ -371,11 +377,13 @@ Standard_Boolean OSD_MAllocHook::LogFileHandler::MakeReport fclose(aLogFile); // print the report - std::ofstream aRepFile (theOutFile); - if(!aRepFile.is_open()) + OPEN_STREAM( aRepFile, theOutFile, ios::out ); + + if( !IS_OPEN( aRepFile ) ) { return Standard_False; } + aRepFile.imbue (std::locale ("C")); aRepFile << std::setw(20) << "BlockSize " @@ -424,7 +432,7 @@ Standard_Boolean OSD_MAllocHook::LogFileHandler::MakeReport << std::setw(20) << aTotalLeftSize << ' ' << std::setw(20) << aTotalPeakSize << std::endl; - aRepFile.close(); + CLOSE_STREAM( aRepFile ); return Standard_True; } @@ -437,10 +445,10 @@ void OSD_MAllocHook::LogFileHandler::AllocEvent (size_t theSize, long theRequestNum) { - if (myLogFile.is_open()) + if ( m_wrapper->IsOpen()) { myMutex.Lock(); - myLogFile << "alloc "<< std::setw(10) << theRequestNum + (*myLogFile) << "alloc "<< std::setw(10) << theRequestNum << std::setw(20) << theSize << std::endl; if (myBreakSize == theSize) place_for_breakpoint(); @@ -458,10 +466,10 @@ void OSD_MAllocHook::LogFileHandler::FreeEvent size_t theSize, long theRequestNum) { - if (myLogFile.is_open()) + if (m_wrapper->IsOpen()) { myMutex.Lock(); - myLogFile << "free " << std::setw(20) << theRequestNum + (*myLogFile) << "free " << std::setw(20) << theRequestNum << std::setw(20) << theSize << std::endl; myMutex.Unlock(); } @@ -528,8 +536,8 @@ void OSD_MAllocHook::CollectBySize::Reset() Standard_Boolean OSD_MAllocHook::CollectBySize::MakeReport(const char* theOutFile) { // print the report - std::ofstream aRepFile(theOutFile); - if (!aRepFile.is_open()) + OPEN_STREAM( aRepFile, theOutFile, ios::out ); + if( !IS_OPEN( aRepFile ) ) return Standard_False; std::locale aCLoc("C"); aRepFile.imbue(aCLoc); @@ -575,7 +583,7 @@ Standard_Boolean OSD_MAllocHook::CollectBySize::MakeReport(const char* theOutFil << std::setw(20) << aTotAlloc << ' ' << std::setw(20) << myTotalLeftSize << ' ' << std::setw(20) << myTotalPeakSize << std::endl; - aRepFile.close(); + CLOSE_STREAM( aRepFile ); return Standard_True; } diff --git a/src/OSD/OSD_MAllocHook.hxx b/src/OSD/OSD_MAllocHook.hxx index 175a58857..fd1840a7d 100644 --- a/src/OSD/OSD_MAllocHook.hxx +++ b/src/OSD/OSD_MAllocHook.hxx @@ -19,7 +19,9 @@ #include #include #include -#include +#include + +class STREAM_WRAPPER; /** * This class provides the possibility to set callback for memory @@ -101,7 +103,8 @@ public: Standard_EXPORT virtual void FreeEvent(void*, size_t, long); private: - std::ofstream myLogFile; + STREAM_WRAPPER* m_wrapper; + std::ostream* myLogFile; Standard_Mutex myMutex; size_t myBreakSize; }; diff --git a/src/OSD/OSD_OpenFile.cxx b/src/OSD/OSD_OpenFile.cxx index 32e5ccd07..1530afccf 100644 --- a/src/OSD/OSD_OpenFile.cxx +++ b/src/OSD/OSD_OpenFile.cxx @@ -11,6 +11,7 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include @@ -23,7 +24,7 @@ FILE* OSD_OpenFile(const char* theName, const char* theMode) { FILE* aFile = 0; -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) +#if defined(_WIN32) // file name is treated as UTF-8 string and converted to UTF-16 one const TCollection_ExtendedString aFileNameW (theName, Standard_True); const TCollection_ExtendedString aFileModeW (theMode, Standard_True); @@ -43,7 +44,7 @@ FILE* OSD_OpenFile(const TCollection_ExtendedString& theName, const char* theMode) { FILE* aFile = 0; -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) +#if defined(_WIN32) const TCollection_ExtendedString aFileModeW (theMode, Standard_True); aFile = ::_wfopen ((const wchar_t* )theName.ToExtString(), (const wchar_t* )aFileModeW.ToExtString()); @@ -55,71 +56,123 @@ FILE* OSD_OpenFile(const TCollection_ExtendedString& theName, return aFile; } -// ============================================== -// function : OSD_OpenFileBuf -// purpose : Opens file buffer -// ============================================== -void OSD_OpenFileBuf(std::filebuf& theBuff, - const char* theName, - const std::ios_base::openmode theMode) +#include +#include +#include +#include + + +STREAM_WRAPPER::STREAM_WRAPPER() { -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) - // file name is treated as UTF-8 string and converted to UTF-16 one - const TCollection_ExtendedString aFileNameW (theName, Standard_True); - theBuff.open ((const wchar_t* )aFileNameW.ToExtString(), theMode); -#else - theBuff.open (theName, theMode); -#endif + m_buf = NULL; + m_stream = NULL; + return; } -// ============================================== -// function : OSD_OpenFileBuf -// purpose : Opens file buffer -// ============================================== -void OSD_OpenFileBuf(std::filebuf& theBuff, - const TCollection_ExtendedString& theName, - const std::ios_base::openmode theMode) + +STREAM_WRAPPER::~STREAM_WRAPPER() { -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) - theBuff.open ((const wchar_t* )theName.ToExtString(), theMode); -#else - // conversion in UTF-8 for linux - NCollection_Utf8String aString((const Standard_Utf16Char*)theName.ToExtString()); - theBuff.open (aString.ToCString(),theMode); -#endif + if( NULL != m_stream ) + delete m_stream; + + if( NULL != m_buf ) + { + m_buf->close(); // ensure file is closed regardless of m_buf's destructor + delete m_buf; + } + + return; } -// ============================================== -// function : OSD_OpenStream -// purpose : Opens file stream -// ============================================== -void OSD_OpenStream(std::ofstream& theStream, - const char* theName, - const std::ios_base::openmode theMode) + +std::iostream* STREAM_WRAPPER::Open( const char* aFileName, std::ios_base::openmode aMode ) { -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) - // file name is treated as UTF-8 string and converted to UTF-16 one - const TCollection_ExtendedString aFileNameW (theName, Standard_True); - theStream.open ((const wchar_t* )aFileNameW.ToExtString(), theMode); -#else - theStream.open (theName, theMode); -#endif + if( NULL != m_stream ) + { + delete m_stream; + m_stream = NULL; + } + + if( NULL != m_buf ) + { + m_buf->close(); + delete m_buf; + } + + int flags = 0; + + if( aMode & std::ios_base::app ) + flags |= _O_APPEND; + + if( aMode & std::ios_base::out && aMode & std::ios_base::in ) + flags |= _O_RDWR; + else if( aMode & std::ios_base::out ) + flags |= _O_WRONLY; + else if( aMode & std::ios_base::in ) + flags |= _O_RDONLY; + + if( aMode & std::ios_base::binary ) + flags |= _O_BINARY; + + if( aMode & std::ios_base::out && aMode & std::ios_base::trunc + && !( aMode & std::ios_base::app ) && !( aMode & std::ios_base::ate ) ) + flags |= _O_TRUNC; + + if( aMode & std::ios_base::out ) + flags |= _O_CREAT; + + // convert from UTF8 to wchar_t + const TCollection_ExtendedString aFileNameW( aFileName, Standard_True); + + int fd = _wopen( (const wchar_t* )aFileNameW.ToExtString(), flags, _S_IREAD | _S_IWRITE ); + + if( fd >= 0 && aMode & std::ios_base::ate ) + lseek( fd, 0, SEEK_END ); + + m_buf = new __gnu_cxx::stdio_filebuf( fd, aMode ); + + m_stream = new std::iostream( m_buf ); + + return m_stream; } -// ============================================== -// function : OSD_OpenStream -// purpose : Opens file stream -// ============================================== -void OSD_OpenStream(std::ofstream& theStream, - const TCollection_ExtendedString& theName, - const std::ios_base::openmode theMode) + +void STREAM_WRAPPER::Close( void ) { -#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__) - theStream.open ((const wchar_t* )theName.ToExtString(), theMode); -#else - // conversion in UTF-8 for linux - NCollection_Utf8String aString((const Standard_Utf16Char*)theName.ToExtString()); - theStream.open (aString.ToCString(),theMode); -#endif + if( m_buf ) + m_buf->close(); + + return; +} + + +void STREAM_WRAPPER::Init( void ) +{ + if( m_stream ) + { + delete m_stream; + m_stream = NULL; + } + + if( m_buf ) + { + m_buf->close(); + delete m_buf; + m_buf = NULL; + } +} + + +std::iostream* STREAM_WRAPPER::GetStream( void ) +{ + return m_stream; } + +bool STREAM_WRAPPER::IsOpen( void ) +{ + if( NULL == m_buf ) + return false; + + return m_buf->is_open(); +} diff --git a/src/OSD/OSD_OpenFile.hxx b/src/OSD/OSD_OpenFile.hxx index 5c4a70aaf..bc9c13339 100644 --- a/src/OSD/OSD_OpenFile.hxx +++ b/src/OSD/OSD_OpenFile.hxx @@ -23,39 +23,48 @@ #include #include +#include -//! Function opens the file stream. -//! @param theStream stream to open -//! @param theName name of file encoded in UTF-8 -//! @param theMode opening mode -__Standard_API void OSD_OpenStream (std::ofstream& theStream, - const char* theName, - const std::ios_base::openmode theMode); -//! Function opens the file stream. -//! @param theStream stream to open -//! @param theName name of file encoded in UTF-16 -//! @param theMode opening mode -__Standard_API void OSD_OpenStream (std::ofstream& theStream, - const TCollection_ExtendedString& theName, - const std::ios_base::openmode theMode); +#define OPEN_OSTREAM( var, name ) \ + STREAM_WRAPPER var ## _BUF_; \ + std::ostream& var = *var ## _BUF_.Open( name, std::ios_base::out | std::ios_base::trunc | std::ios_base::binary ) -//! Function opens the file buffer. -//! @param theBuff file buffer to open -//! @param theName name of file encoded in UTF-8 -//! @param theMode opening mode -__Standard_API void OSD_OpenFileBuf (std::filebuf& theBuff, - const char* theName, - const std::ios_base::openmode theMode); +#define OPEN_ISTREAM( var, name ) \ + STREAM_WRAPPER var ## _BUF_; \ + std::istream& var = *var ## _BUF_.Open( name, std::ios_base::in | std::ios_base::binary ) -//! Function opens the file buffer. -//! @param theBuff file buffer to open -//! @param theName name of file encoded in UTF-16 -//! @param theMode opening mode -__Standard_API void OSD_OpenFileBuf (std::filebuf& theBuff, - const TCollection_ExtendedString& theName, - const std::ios_base::openmode theMode); +#define OPEN_IOSTREAM( var, name ) \ + STREAM_WRAPPER var ## _BUF_; \ + std::iostream& var = *var ## _BUF_.Open( name, std::ios_base::out | std::ios_base::in | std::ios_base::binary ) + +#define OPEN_STREAM( var, name, mode ) \ + STREAM_WRAPPER var ## _BUF_; \ + std::iostream& var = *var ## _BUF_.Open( name, mode ) + +#define IS_OPEN( var ) var ## _BUF_.IsOpen() + +#define CLOSE_STREAM( var ) var ## _BUF_.Close() + +class STREAM_WRAPPER +{ +private: + __gnu_cxx::stdio_filebuf* m_buf; + std::iostream* m_stream; + +public: + STREAM_WRAPPER(); + virtual ~STREAM_WRAPPER(); + + std::iostream* Open( const char* aFileName, std::ios_base::openmode aMode ); + void Close( void ); + + std::iostream* GetStream( void ); + + bool IsOpen( void ); + void Init( void ); +}; //! Function opens the file. //! @param theName name of file encoded in UTF-16 diff --git a/src/StepSelect/StepSelect_WorkLibrary.cxx b/src/StepSelect/StepSelect_WorkLibrary.cxx index 5ff57af96..e822cbef1 100644 --- a/src/StepSelect/StepSelect_WorkLibrary.cxx +++ b/src/StepSelect/StepSelect_WorkLibrary.cxx @@ -12,6 +12,7 @@ // commercial license or contractual agreement. #include +#include #include #include @@ -84,10 +85,11 @@ Standard_Boolean StepSelect_WorkLibrary::WriteFile DeclareAndCast(StepData_Protocol,stepro,ctx.Protocol()); if (stepmodel.IsNull() || stepro.IsNull()) return Standard_False; - ofstream fout; - OSD_OpenStream(fout,ctx.FileName(),ios::out|ios::trunc); + OPEN_OSTREAM( fout, ctx.FileName() ); + // XXX - ofstream fout; + // XXX - OSD_OpenStream(fout,ctx.FileName(),ios::out|ios::trunc); - if (!fout || !fout.rdbuf()->is_open()) { + if (!IS_OPEN(fout)) { ctx.CCheck(0)->AddFail("Step File could not be created"); sout<<" Step File could not be created : " << ctx.FileName() << endl; return 0; } @@ -118,7 +120,7 @@ Standard_Boolean StepSelect_WorkLibrary::WriteFile sout<<" Done"<SetMaterial(myUisoMaterial); @@ -315,6 +314,7 @@ void VrmlAPI_Writer::Write(const TopoDS_Shape& aShape,const Standard_CString aFi Group2.Print(outfile); } S2.Print(outfile); - S1.Print(outfile); + S1.Print(outfile); + CLOSE_STREAM( outfile ); } -- 2.11.0