← Back to team overview

kicad-developers team mailing list archive

PATCH: [OCE] hack to support UTF8 filenames on MinGW

 

This patch is not really part of kicad, but it hacks OCE0.17.3
to provide UTF8 filename support under MinGW.

I say it's a hack because it breaks all builds except under
MinGW so it should not be applied except to the MinGW
build.

I used the latest in the 0.17 series of OCE and did not test
against the earlier version (0.17.2).  OCE 0.18 does not build
cleanly under Windows yet but when we get to that point
I'll update the hack. Until the underlying issues are fixed in
OCCT (and later OCE), this is the best I can do.

If we can get this hack incorporated with the nightly Windows
build that would be great. I did some testing and STEP models
with non-ASCII characters in the filename now appear in the
3D viewer.  More users testing would be welcome; I'd like to
have some certainly that I didn't introduce and unwanted
side-effects.

The tool kicad2step will require a little tweaking to get it
working since I didn't fix its UTF8 issues when I fixed
the problem in the rest of kicad. I'll send a patch for that
soon.

- Cirilo
From 0a2197e54116c71cfe690d816dab8a025556f65c Mon Sep 17 00:00:00 2001
From: Thomas Paviot <tpaviot@xxxxxxxxx>
Date: Mon, 27 Feb 2017 07:22:33 +0100
Subject: [PATCH 1/5] Bumped version number to 0.17.3

---
 CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0e82815ac..74493b8c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,7 +23,7 @@ set(OCE_VERSION_MAJOR 0)
 set(OCE_VERSION_MINOR 17)
 # OCE_VERSION_PATCH is used for bugfixes releases only
 # (uncomment following line)
-set(OCE_VERSION_PATCH 2)
+set(OCE_VERSION_PATCH 3)
 #  Empty for official releases, set to -dev, -rc1, etc for development releases
 set(OCE_VERSION_DEVEL)
 
-- 
2.11.0


From 77737d8fd0af9968c61af2b913faef2f6f56143d Mon Sep 17 00:00:00 2001
From: Thomas Paviot <tpaviot@xxxxxxxxx>
Date: Mon, 27 Feb 2017 14:27:44 +0100
Subject: [PATCH 2/5] gcc warning fix: uninitialized variable

---
 src/BRepOffset/BRepOffset_MakeOffset.cxx           |  2 +-
 src/Dico/Dico_Dictionary.gxx                       | 26 +++++++++++-----------
 src/IntCurve/IntCurve_IntConicConic_1.cxx          |  2 +-
 src/IntPatch/IntPatch_ImpImpIntersection_0.gxx     |  2 +-
 src/IntTools/IntTools_EdgeEdge.cxx                 |  2 +-
 src/TopOpeBRep/TopOpeBRep_vprdeg.cxx               |  2 +-
 .../TopOpeBRepTool_makeTransition.cxx              |  4 ++--
 7 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx
index 2e0819acf..2ddfaf232 100644
--- a/src/BRepOffset/BRepOffset_MakeOffset.cxx
+++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx
@@ -884,7 +884,7 @@ static void TrimEdge (TopoDS_Edge&                  NE,
   Standard_Real aSameParTol = Precision::Confusion();
   
   TopoDS_Vertex V1,V2;
-  Standard_Real U;
+  Standard_Real U=0.;
   Standard_Real UMin =  Precision::Infinite();
   Standard_Real UMax = -UMin;
 
diff --git a/src/Dico/Dico_Dictionary.gxx b/src/Dico/Dico_Dictionary.gxx
index 4878e279b..1358dc394 100644
--- a/src/Dico/Dico_Dictionary.gxx
+++ b/src/Dico/Dico_Dictionary.gxx
@@ -49,7 +49,7 @@ Dico_Dictionary::Dico_Dictionary ()
   (const Standard_CString name, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name,strlen(name),name[0],1, acell,reslev,stat);
   if (stat != 0 || reslev != 0) return Standard_False;
@@ -62,7 +62,7 @@ Dico_Dictionary::Dico_Dictionary ()
   (const TCollection_AsciiString& name, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name.ToCString(),name.Length(),name.Value(1),1, acell,reslev,stat);
   if (stat != 0 || reslev != 0) return Standard_False;
@@ -77,7 +77,7 @@ Dico_Dictionary::Dico_Dictionary ()
   (const Standard_CString name, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name,strlen(name),name[0],1, acell,reslev,stat);
   if (stat != 0 || reslev != 0)
@@ -92,7 +92,7 @@ Dico_Dictionary::Dico_Dictionary ()
   (const TCollection_AsciiString& name, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name.ToCString(),name.Length(),name.Value(1),1, acell,reslev,stat);
   if (stat != 0 || reslev != 0)
@@ -110,7 +110,7 @@ Dico_Dictionary::Dico_Dictionary ()
    TheItem& anitem, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name,strlen(name),name[0],1, acell,reslev,stat);
   if (stat != 0 || reslev != 0) return Standard_False;
@@ -125,7 +125,7 @@ Dico_Dictionary::Dico_Dictionary ()
    TheItem& anitem, const Standard_Boolean exact) const
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name.ToCString(),name.Length(),name.Value(1),1, acell,reslev,stat);
   if (stat != 0 || reslev != 0) return Standard_False;
@@ -142,7 +142,7 @@ Dico_Dictionary::Dico_Dictionary ()
    const TheItem& anitem, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   Standard_Size namlen = strlen(name);
   SearchCell (name,namlen,name[0],1, acell,reslev,stat);
@@ -159,7 +159,7 @@ Dico_Dictionary::Dico_Dictionary ()
    const TheItem& anitem, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   Standard_CString namval = name.ToCString();
   Standard_Integer namlen = name.Length();
@@ -179,7 +179,7 @@ Dico_Dictionary::Dico_Dictionary ()
    Standard_Boolean& isvalued, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   Standard_Size namlen = strlen(name);
   SearchCell (name,namlen,name[0],1, acell,reslev,stat);
@@ -205,7 +205,7 @@ Dico_Dictionary::Dico_Dictionary ()
    Standard_Boolean& isvalued, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   Standard_Integer namlen = name.Length();
   Standard_CString namval = name.ToCString();
@@ -233,7 +233,7 @@ Dico_Dictionary::Dico_Dictionary ()
    const Standard_Boolean cln, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name,strlen(name),name[0],1, acell,reslev,stat);
 //  if (stat != 0) { cout<<"Dictionary : RemoveItem not found"<<endl; return; }
@@ -250,7 +250,7 @@ Dico_Dictionary::Dico_Dictionary ()
    const Standard_Boolean cln, const Standard_Boolean exact)
 {
   Handle(Dico_Dictionary) acell;
-  Standard_Integer stat;
+  Standard_Integer stat=0;
   Standard_Size reslev;
   SearchCell (name.ToCString(),name.Length(),name.Value(1),1, acell,reslev,stat);
 //  if (stat != 0) { cout<<"Dictionary : RemoveItem not found"<<endl; return; }
@@ -356,7 +356,7 @@ Dico_Dictionary::Dico_Dictionary ()
     if (thecars[3] == '\0')     {  acell = this;  stat   =  1;    return;  }
     else {                                      // ici, HasNext
       if (thecars[3] > car)     {  acell = this;  stat   =  1;    return;  }
-      Standard_Integer stat2;
+      Standard_Integer stat2=0;
       Standard_Size lev2;
       thenext->SearchCell (name,lmax,car,level,acell,lev2,stat2);
       if (stat2 < 0)            {  acell = this;  stat   =  1;    return;  }
diff --git a/src/IntCurve/IntCurve_IntConicConic_1.cxx b/src/IntCurve/IntCurve_IntConicConic_1.cxx
index 825d0ff2b..40bc036e7 100644
--- a/src/IntCurve/IntCurve_IntConicConic_1.cxx
+++ b/src/IntCurve/IntCurve_IntConicConic_1.cxx
@@ -1641,7 +1641,7 @@ void IntCurve_IntConicConic::Perform(const gp_Lin2d& L1
       //--
       Standard_Integer ResHasFirstPoint=0;    
       Standard_Integer ResHasLastPoint=0;
-      Standard_Real ParamStart = 0.,ParamStart2,ParamEnd = 0.,ParamEnd2;
+      Standard_Real ParamStart = 0.,ParamStart2 = 0.,ParamEnd = 0.,ParamEnd2 = 0.;
       Standard_Real Org2SurL1=ElCLib::Parameter(L1,L2.Location());
       //== 3 : L1 et L2 bornent
       //== 2 :       L2 borne
diff --git a/src/IntPatch/IntPatch_ImpImpIntersection_0.gxx b/src/IntPatch/IntPatch_ImpImpIntersection_0.gxx
index ddd7227a4..71b93b511 100644
--- a/src/IntPatch/IntPatch_ImpImpIntersection_0.gxx
+++ b/src/IntPatch/IntPatch_ImpImpIntersection_0.gxx
@@ -372,7 +372,7 @@ void PutPointsOnLine(const Handle(Adaptor3d_HSurface)& S1,
   //
   Standard_Integer i,k;
   Standard_Integer linenumber;
-  Standard_Real paraint,currentparameter,tolerance;
+  Standard_Real paraint=0.,currentparameter,tolerance;
   Standard_Real U1,V1,U2,V2;
   Standard_Boolean goon;
   
diff --git a/src/IntTools/IntTools_EdgeEdge.cxx b/src/IntTools/IntTools_EdgeEdge.cxx
index f7ce4a694..fcd1839b8 100644
--- a/src/IntTools/IntTools_EdgeEdge.cxx
+++ b/src/IntTools/IntTools_EdgeEdge.cxx
@@ -686,7 +686,7 @@ void IntTools_EdgeEdge::FindBestSolution(const Standard_Real aT11,
 {
   Standard_Integer i, aNbS, iErr;
   Standard_Real aDMin, aD, aCrit, aRes1;
-  Standard_Real aT1x, aT2x, aT1p, aT2p;
+  Standard_Real aT1x, aT2x, aT1p=0., aT2p=0.;
   GeomAPI_ProjectPointOnCurve aProj;
   IntTools_SequenceOfRanges aSeg1;
   //
diff --git a/src/TopOpeBRep/TopOpeBRep_vprdeg.cxx b/src/TopOpeBRep/TopOpeBRep_vprdeg.cxx
index 2176094ec..19d456715 100644
--- a/src/TopOpeBRep/TopOpeBRep_vprdeg.cxx
+++ b/src/TopOpeBRep/TopOpeBRep_vprdeg.cxx
@@ -1136,7 +1136,7 @@ Standard_Boolean TopOpeBRep_FacesFiller::ProcessVPondgE
   Standard_Boolean hasOOEi=Standard_False; TopoDS_Edge OOEi; Standard_Real parOOEi; 
   TopOpeBRepDS_Transition T1ondg, T2ondg; 
   Standard_Integer rankdg=0, Iiondg=0; 
-  Standard_Real par1ondg, par2ondg;  
+  Standard_Real par1ondg=0., par2ondg=0.;  
   Standard_Boolean hasdgdata = !myDataforDegenEd.IsEmpty();
   if (!hasdgdata) {
     return Standard_False; 
diff --git a/src/TopOpeBRepTool/TopOpeBRepTool_makeTransition.cxx b/src/TopOpeBRepTool/TopOpeBRepTool_makeTransition.cxx
index 76aca09b9..63581ceb8 100644
--- a/src/TopOpeBRepTool/TopOpeBRepTool_makeTransition.cxx
+++ b/src/TopOpeBRepTool/TopOpeBRepTool_makeTransition.cxx
@@ -200,7 +200,7 @@ static Standard_Boolean FUN_tg(const TopoDS_Edge& e,const Standard_Real par,cons
   st = BEFORE;
   for (Standard_Integer nite = 1; nite <= 2; nite++) {
     if (nite == 2) st = AFTER;    
-    Standard_Real pn; Standard_Boolean mkp = FUN_getnearpar(e,par,f,l,factor,st,pn);
+    Standard_Real pn=0.; Standard_Boolean mkp = FUN_getnearpar(e,par,f,l,factor,st,pn);
     if (!mkp) continue;
     gp_Vec tmp; Standard_Boolean ok = TopOpeBRepTool_TOOL::TggeomE(pn,e,tmp);
     if (!ok) continue;
@@ -473,7 +473,7 @@ static Standard_Boolean FUN_staproj(const TopoDS_Edge& e,const Standard_Real pf,
 		       const Standard_Real factor, const Standard_Integer st, const TopoDS_Face& f, 
 		       TopAbs_State& sta)
 {
-  Standard_Real par;Standard_Boolean ok = FUN_getnearpar(e,pe,pf,pl,factor,st, par);
+  Standard_Real par=0.;Standard_Boolean ok = FUN_getnearpar(e,pe,pf,pl,factor,st, par);
   if (!ok) return Standard_False;
   gp_Pnt pt;  ok = FUN_tool_value(par,e, pt);
   if (!ok) return Standard_False;
-- 
2.11.0


From 5cac8bd8ece44ad51bd94b462cd4079c1a1f5a40 Mon Sep 17 00:00:00 2001
From: tpaviot <tpaviot@xxxxxxxxx>
Date: Tue, 28 Feb 2017 18:25:08 +0100
Subject: [PATCH 3/5] Win32 fix in CMakeLists.txt - Find dbg library for
 gl2ps/freeimage/tbb

---
 CMakeLists.txt | 48 ++++++++++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 74493b8c5..e633add54 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1140,7 +1140,9 @@ if (OCE_AUTOINSTALL_DEPENDENT_LIBS)
 
 	if (OCE_VISU_DEP AND OCE_WITH_GL2PS)
 		get_filename_component(GL2PS_BIN_DIR ${GL2PS_LIBRARY} PATH)
-		get_filename_component(GL2PS_BIN_DIR_DBG ${GL2PS_LIBRARY_DEBUG} PATH)
+		if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+		 	get_filename_component(GL2PS_BIN_DIR_DBG ${GL2PS_LIBRARY_DEBUG} PATH)
+		endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		install(FILES ${GL2PS_BIN_DIR_DBG}/${CMAKE_SHARED_LIBRARY_PREFIX}gl2psd.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
     	install(FILES ${GL2PS_BIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}gl2ps.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
     	install(FILES ${GL2PS_BIN_DIR_DBG}/${CMAKE_STATIC_LIBRARY_PREFIX}gl2psd.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
@@ -1153,16 +1155,18 @@ if (OCE_AUTOINSTALL_DEPENDENT_LIBS)
 
 	if (OCE_VISU_DEP AND OCE_WITH_FREEIMAGE)
 		get_filename_component(FREEIMAGE_BIN_DIR ${FREEIMAGE_LIBRARY} PATH)
-		get_filename_component(FREEIMAGE_BIN_DIR_DBG ${FREEIMAGE_LIBRARY_DEBUG} PATH)
 		get_filename_component(FREEIMAGEPLUS_BIN_DIR ${FREEIMAGE_LIBRARY} PATH)
-		get_filename_component(FREEIMAGEPLUS_BIN_DIR_DBG ${FREEIMAGE_LIBRARY_DEBUG} PATH)
-		install(FILES ${FREEIMAGE_BIN_DIR_DBG}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimaged.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
-    	install(FILES ${FREEIMAGE_BIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimage.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
+		if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+			get_filename_component(FREEIMAGE_BIN_DIR_DBG ${FREEIMAGE_LIBRARY_DEBUG} PATH)
+			get_filename_component(FREEIMAGEPLUS_BIN_DIR_DBG ${FREEIMAGE_LIBRARY_DEBUG} PATH)
+			install(FILES ${FREEIMAGE_BIN_DIR_DBG}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimaged.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
+			install(FILES ${FREEIMAGEPLUS_BIN_DIR_DBG}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimageplusd.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
+			install(FILES ${FREEIMAGEPLUS_BIN_DIR_DBG}/${CMAKE_STATIC_LIBRARY_PREFIX}freeimageplusd.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+		install(FILES ${FREEIMAGE_BIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimage.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
     	install(FILES ${FREEIMAGE_BIN_DIR_DBG}/${CMAKE_STATIC_LIBRARY_PREFIX}freeimaged.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
     	install(FILES ${FREEIMAGE_BIN_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}freeimage.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
-		install(FILES ${FREEIMAGEPLUS_BIN_DIR_DBG}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimageplusd.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
-    	install(FILES ${FREEIMAGEPLUS_BIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimageplus.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
-    	install(FILES ${FREEIMAGEPLUS_BIN_DIR_DBG}/${CMAKE_STATIC_LIBRARY_PREFIX}freeimageplusd.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		install(FILES ${FREEIMAGEPLUS_BIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}freeimageplus.dll DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
     	install(FILES ${FREEIMAGEPLUS_BIN_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}freeimageplus.${OCE_LIB_EXTENSION} DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
 
     	if(OCE_INSTALL_PDB_FILES)
@@ -1185,15 +1189,19 @@ if (OCE_AUTOINSTALL_DEPENDENT_LIBS)
 	if(OCE_MULTITHREAD_LIBRARY STREQUAL "TBB")
 		IF(NOT DEFINED TBB_BIN_DIR)
 			get_filename_component(TBB_BIN_DIR ${TBB_LIBRARY} PATH)
-			get_filename_component(TBB_BIN_DIR_DBG ${TBB_LIBRARY_DEBUG} PATH)
+			if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+				get_filename_component(TBB_BIN_DIR_DBG ${TBB_LIBRARY_DEBUG} PATH)
+			endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		ENDIF()
 		if(NOT OCE_BUILD_SHARED_LIB)
 			set(tbb_prefix "_static")
 		endif()
 		install(FILES "${TBB_BIN_DIR}/tbb${tbb_prefix}.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
 		install(FILES "${TBB_BIN_DIR}/tbb${tbb_prefix}.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
-		install(FILES "${TBB_BIN_DIR_DBG}/tbb_debug${tbb_prefix}.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
-		install(FILES "${TBB_BIN_DIR_DBG}/tbb_debug${tbb_prefix}.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+			install(FILES "${TBB_BIN_DIR_DBG}/tbb_debug${tbb_prefix}.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
+			install(FILES "${TBB_BIN_DIR_DBG}/tbb_debug${tbb_prefix}.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		if(OCE_INSTALL_PDB_FILES)
 			install(FILES "${TBB_BIN_DIR_DBG}/tbb_debug${tbb_prefix}.pdb" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
 			install(FILES "${TBB_BIN_DIR}/tbb${tbb_prefix}.pdb" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
@@ -1203,18 +1211,26 @@ if (OCE_AUTOINSTALL_DEPENDENT_LIBS)
 	if(OCE_TBB_MALLOC_SUPPORT)
 		if(NOT DEFINED TBB_BIN_DIR)
 			get_filename_component(TBB_MALLOC_BIN_DIR ${TBB_MALLOC_LIBRARY} PATH)
-			get_filename_component(TBB_MALLOC_BIN_DIR_DBG ${TBB_MALLOC_LIBRARY_DEBUG} PATH)
+			if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+				get_filename_component(TBB_MALLOC_BIN_DIR_DBG ${TBB_MALLOC_LIBRARY_DEBUG} PATH)
+			endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		else()
 			SET(TBB_MALLOC_BIN_DIR ${TBB_BIN_DIR})
-			SET(TBB_MALLOC_BIN_DIR_DBG ${TBB_BIN_DIR})
+			if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+				SET(TBB_MALLOC_BIN_DIR_DBG ${TBB_BIN_DIR})
+			endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		endif()
 
 		install(FILES "${TBB_MALLOC_BIN_DIR}/tbbmalloc.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
-		install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
 		install(FILES "${TBB_MALLOC_BIN_DIR}/tbbmalloc.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
-		install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+			install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.dll" DESTINATION ${OCE_INSTALL_BIN_DIR} CONFIGURATIONS Debug OPTIONAL)
+			install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.${OCE_LIB_EXTENSION}" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+		endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 		if(OCE_INSTALL_PDB_FILES)
-			install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.pdb" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+			if(CMAKE_CONFIGURATION_TYPES OR NMAKE)
+				install(FILES "${TBB_MALLOC_BIN_DIR_DBG}/tbbmalloc_debug.pdb" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Debug OPTIONAL)
+			endif(CMAKE_CONFIGURATION_TYPES OR NMAKE)
 			install(FILES "${TBB_MALLOC_BIN_DIR}/tbbmalloc.pdb" DESTINATION ${OCE_INSTALL_LIB_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel OPTIONAL)
 		endif()
 	endif(OCE_TBB_MALLOC_SUPPORT)
-- 
2.11.0


From 1094f6194126b392b9842786eeffa657beec1dbf Mon Sep 17 00:00:00 2001
From: tpaviot <tpaviot@xxxxxxxxx>
Date: Thu, 2 Mar 2017 06:45:45 +0100
Subject: [PATCH 4/5] Updated NEWS and appveyor files

---
 NEWS.md      | 11 +++++++++++
 appveyor.yml |  4 ++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index e5d048aec..840ae7260 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,14 @@
+### Version 0.17.3 - March 2017
+
+This version is binary compatible with OCE 0.17, OCE 0.17.1 and OCE 0.17.2
+
+* Fixed gcc "uninitialized variable" compilation warnings
+
+* Fixed debug library paths for gl2ps/freeimage/tbb
+
+Users who contributed to this release:
+  Thomas Paviot
+
 ### Version 0.17.2 - May 2016
 
 This version is binary compatible with 0CE 0.17 and OCE 0.17.1
diff --git a/appveyor.yml b/appveyor.yml
index ad2a78356..b7039e053 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,7 +1,7 @@
-version: oce-0.17.1-dev.{build}
+version: oce-0.17.3.{build}
 
 environment:
-  oce_version: 0.17.1-dev
+  oce_version: 0.17.3
   matrix:
     - generator: "MSYS Makefiles"
       Compiler: MinGW-gcc-4.8.1
-- 
2.11.0


From af336de6fd7984b045b8e67c127c1d12f911cd66 Mon Sep 17 00:00:00 2001
From: Cirilo Bernardo <cirilo.bernardo@xxxxxxxxx>
Date: Sun, 5 Mar 2017 13:46:16 +1100
Subject: [PATCH 5/5] 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 <iostream>
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Macro.hxx>
@@ -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 <iostream>
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Macro.hxx>
@@ -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 <FSD_CmpFile.ixx>
 #include <OSD.hxx>
+#include <OSD_OpenFile.hxx>
 
 #include <Storage_StreamModeError.hxx>
 #include <Storage_StreamUnknownTypeError.hxx>
@@ -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 <FSD_File.ixx>
 #include <OSD.hxx>
+#include <OSD_OpenFile.hxx>
 
 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") <<"): "<<file<<endl;
 #endif
   Standard_Boolean res = Write (fout,fnes);
 
   errno = 0;
-  fout.close();
+  CLOSE_STREAM( fout );
   res = fout.good() && res && !errno;
 
   return res;
diff --git a/src/IGESSelect/IGESSelect_WorkLibrary.cxx b/src/IGESSelect/IGESSelect_WorkLibrary.cxx
index b7f0aa490..dcf1e747b 100644
--- a/src/IGESSelect/IGESSelect_WorkLibrary.cxx
+++ b/src/IGESSelect/IGESSelect_WorkLibrary.cxx
@@ -97,9 +97,8 @@ static  Handle(IGESData_FileProtocol) IGESProto;
   DeclareAndCast(IGESData_Protocol,prot,ctx.Protocol());
 
   if (igesmod.IsNull() || prot.IsNull()) return Standard_False;
-  ofstream fout;
-  OSD_OpenStream(fout,ctx.FileName(),ios::out );
-  if (!fout) {
+  OPEN_OSTREAM( fout, ctx.FileName() );
+  if( !IS_OPEN( fout ) ) {
     ctx.CCheck(0)->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"<<endl;
 
   errno = 0;
-  fout.close();
+  CLOSE_STREAM( fout );
   status = fout.good() && status && !errno;
   if(errno)
     sout << strerror(errno) << endl;
diff --git a/src/OSD/OSD_MAllocHook.cxx b/src/OSD/OSD_MAllocHook.cxx
index e9e3d9c68..aba7afa21 100644
--- a/src/OSD/OSD_MAllocHook.cxx
+++ b/src/OSD/OSD_MAllocHook.cxx
@@ -14,6 +14,7 @@
 // commercial license or contractual agreement.
 
 #include <OSD_MAllocHook.hxx>
+#include <OSD_OpenFile.hxx>
 
 #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 <Standard_TypeDef.hxx>
 #include <Standard_Mutex.hxx>
 #include <stdio.h>
-#include <fstream>
+#include <iostream>
+
+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 <locale>
 #include <OSD_OpenFile.hxx>
 #include <TCollection_ExtendedString.hxx>
 #include <NCollection_UtfString.hxx>
@@ -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 <iostream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+
+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<char>( 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 <fstream>
 #include <TCollection_ExtendedString.hxx>
+#include <ext/stdio_filebuf.h>
 
-//! 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<char>* 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 <StepSelect_WorkLibrary.ixx>
+#include <OSD_OpenFile.hxx>
 
 #include <sys/stat.h>
 #include <errno.h>
@@ -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"<<endl;
       
   errno = 0;
-  fout.close();
+  CLOSE_STREAM( fout );
   isGood = fout.good() && isGood && !errno;
   if(errno)
     sout << strerror(errno) << endl;
diff --git a/src/VrmlAPI/VrmlAPI_Writer.cxx b/src/VrmlAPI/VrmlAPI_Writer.cxx
index a31c9d203..615934de2 100644
--- a/src/VrmlAPI/VrmlAPI_Writer.cxx
+++ b/src/VrmlAPI/VrmlAPI_Writer.cxx
@@ -216,8 +216,7 @@ void VrmlAPI_Writer::Write(const TopoDS_Shape& aShape,const Standard_CString aFi
 {
   OSD_Path thePath(aFile);
   TCollection_AsciiString theFile;thePath.SystemName(theFile);
-  ofstream outfile;
-  OSD_OpenStream(outfile, theFile.ToCString(), ios::out);
+  OPEN_OSTREAM( outfile, theFile.ToCString() );
   Handle(VrmlConverter_IsoAspect) ia = new VrmlConverter_IsoAspect;  // UIso
   Handle(VrmlConverter_IsoAspect) ia1 = new VrmlConverter_IsoAspect; //VIso
   ia->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


Follow ups