0026229: Add the possibility in OCAF to open/save a document from/to a stream object
authoribs <ibs@opencascade.com>
Fri, 27 Nov 2015 10:03:25 +0000 (13:03 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 17 Dec 2015 15:03:34 +0000 (18:03 +0300)
TDocStd_Application class extended to open/save a document of XmlOcaf and BinOcaf format
from/to standard SEEKABLE stream object which should support SEEK functionality.

Open and SaveAs DRAW commands got new additional argument "-stream" to turn on using of stream functionality.

The main changes for BinOcaf format applied in:
FSD_BinaryFile class (static method using standard stream added)
BinLDrivers_DocumentRetrievalDriver and BinLDrivers_DocumentStorageDriver classes use standard stream object as an argument

The main changes for XmlOcaf format applied in:
LDOMParser and LDOM_XmlWriter classes  use standard stream object as an argument

Unused class FSD_Archive and its siblings removed from MFC samples.

72 files changed:
dox/dev_guides/building/cmake/cmake.md
dox/dev_guides/building/wok/wok.md
dox/user_guides/draw_test_harness/draw_test_harness.md
samples/mfc/standard/05_ImportExport/CMakeLists.txt
samples/mfc/standard/05_ImportExport/adm/win/vc10/ImportExport.vcxproj
samples/mfc/standard/05_ImportExport/adm/win/vc10/ImportExport.vcxproj.filters
samples/mfc/standard/05_ImportExport/adm/win/vc11/ImportExport.vcxproj
samples/mfc/standard/05_ImportExport/adm/win/vc11/ImportExport.vcxproj.filters
samples/mfc/standard/05_ImportExport/adm/win/vc12/ImportExport.vcxproj
samples/mfc/standard/05_ImportExport/adm/win/vc12/ImportExport.vcxproj.filters
samples/mfc/standard/05_ImportExport/adm/win/vc8/ImportExport.vcproj
samples/mfc/standard/05_ImportExport/adm/win/vc9/ImportExport.vcproj
samples/mfc/standard/05_ImportExport/src/ColoredShape.cpp [deleted file]
samples/mfc/standard/05_ImportExport/src/ColoredShape.h [deleted file]
samples/mfc/standard/05_ImportExport/src/ColoredShapes.cpp
samples/mfc/standard/05_ImportExport/src/FSD_Archive.cxx [deleted file]
samples/mfc/standard/05_ImportExport/src/FSD_Archive.hxx [deleted file]
samples/mfc/standard/05_ImportExport/src/FSD_Archive.ixx [deleted file]
samples/mfc/standard/05_ImportExport/src/FSD_Archive.jxx [deleted file]
samples/mfc/standard/05_ImportExport/src/FSD_CArchive.hxx [deleted file]
samples/mfc/standard/05_ImportExport/src/FSD_CFile.hxx [deleted file]
samples/qt/Interface/src/Translate.cxx
src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.cxx
src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.hxx
src/BinLDrivers/BinLDrivers_DocumentStorageDriver.cxx
src/BinLDrivers/BinLDrivers_DocumentStorageDriver.hxx
src/CDF/CDF_Application.cxx
src/CDF/CDF_Application.hxx
src/CDM/CDM_Document.hxx
src/DDF/DDF_IOStream.cxx
src/DDF/DDF_IOStream.hxx
src/DDocStd/DDocStd_ApplicationCommands.cxx
src/FSD/FSD_BinaryFile.cxx
src/FSD/FSD_BinaryFile.hxx
src/FSD/FSD_CmpFile.cxx
src/FSD/FSD_CmpFile.hxx
src/FSD/FSD_File.cxx
src/FSD/FSD_File.hxx
src/LDOM/LDOMParser.cxx
src/LDOM/LDOMParser.hxx
src/LDOM/LDOM_XmlReader.cxx
src/LDOM/LDOM_XmlReader.hxx
src/LDOM/LDOM_XmlWriter.cxx
src/LDOM/LDOM_XmlWriter.hxx
src/PCDM/PCDM.cxx
src/PCDM/PCDM.hxx
src/PCDM/PCDM_ReadWriter.cxx
src/PCDM/PCDM_ReadWriter.hxx
src/PCDM/PCDM_Reader.hxx
src/PCDM/PCDM_RetrievalDriver.cxx
src/PCDM/PCDM_RetrievalDriver.hxx
src/PCDM/PCDM_StorageDriver.cxx
src/PCDM/PCDM_StorageDriver.hxx
src/PCDM/PCDM_Writer.hxx
src/Standard/Standard_Persistent.hxx
src/StdResource/XCAF
src/Storage/Storage_BaseDriver.cxx
src/Storage/Storage_BaseDriver.hxx
src/Storage/Storage_Data.hxx
src/Storage/Storage_HeaderData.hxx
src/Storage/Storage_InternalData.hxx
src/Storage/Storage_Root.hxx
src/Storage/Storage_RootData.hxx
src/Storage/Storage_TypeData.hxx
src/TDocStd/TDocStd_Application.cxx
src/TDocStd/TDocStd_Application.hxx
src/XmlLDrivers/XmlLDrivers_DocumentRetrievalDriver.cxx
src/XmlLDrivers/XmlLDrivers_DocumentRetrievalDriver.hxx
src/XmlLDrivers/XmlLDrivers_DocumentStorageDriver.cxx
src/XmlLDrivers/XmlLDrivers_DocumentStorageDriver.hxx
tests/bugs/caf/bug26229_1 [new file with mode: 0644]
tests/bugs/caf/bug26229_2 [new file with mode: 0644]

index a1d4436..d711f2e 100644 (file)
@@ -102,7 +102,7 @@ The following table enumerates the full list of environment variables used at co
 | 3RDPARTY_GL2PS_* | Path | Path to GL2PS binaries |
 | 3RDPARTY_TBB* | Path | Path to TBB binaries |
 | 3RDPARTY_VTK_* | Path | Path to VTK binaries |
-| BUILD_MODULE_<MODULE>| Boolean flag | Indicates whether the corresponding OCCT module should be built or not. It should be noted that some toolkits of a module can be built even if this module is not checked (this happens if some other modules depend on these toolkits). The main modules and their descriptions can be found in @ref occt_user_guides |
+| BUILD_MODULE_<MODULE>| Boolean flag | Indicates whether the corresponding OCCT module should be built or not. It should be noted that some toolkits of a module can be built even if this module is not checked (this happens if some other modules depend on these toolkits). The main modules and their descriptions can be found in @ref user_guides |
 | BUILD_LIBRARY_TYPE | String |  Specifies the type of library to be created. "Shared" libraries are linked dynamically and loaded at runtime. "Static" libraries are archives of object files for use when linking other targets |
 | BUILD_ADDITIONAL_TOOLKITS | String | Semicolon-separated individual toolkits to include into build process. If you want to build some particular libraries (toolkits) only, then you may uncheck all modules in the corresponding *BUILD_MODUE_\<MODULE\>* options and provide the list of necessary libraries here. Of course, all dependencies will be resolved automatically |
 | REBUILD_PLATFORM_DEPENDENT_CODE | Boolean flag | Enables Flex/Bison lexical analyzers. OCCT source files relating to STEP reader and ExprIntrp functionality are generated automatically with Flex/Bison. Checking this options leads to automatic search of Flex/Bison binaries and regeneration of the mentioned files |
index c3fe042..177488c 100644 (file)
@@ -3,9 +3,9 @@ Using WOK {#occt_dev_guides__building_wok}
 
 @tableofcontents
 
-\ref occt_dev_guides__wok "WOK" is a legacy build environment for Open CASCADE Technology. 
+WOK is a legacy build environment for Open CASCADE Technology. 
 It is required for generation of header files for classes defined with 
-@ref occt_dev_guides__cdl "CDL" ("Cascade Definition Language"). 
+CDL ("Cascade Definition Language"). 
 Also tools for generation of project files for other build systems, and OCCT 
 documentation, are integrated to WOK.
 
@@ -105,7 +105,7 @@ and third-party components required for building OCCT.
 
   Note that <i>$CASROOT</i> is equal to *D:/occt* now.
 
-  Then you can work with this workbench using normal WOK functionality (*wprocess, umake*, etc.; see @ref occt_dev_guides__wok "WOK User's Guide" for details) or use it only for generation of derived sources and project files, and build OCCT with Visual Studio on Windows or *make* command on Linux, as described below.
+  Then you can work with this workbench using normal WOK functionality (*wprocess, umake*, etc.) or use it only for generation of derived sources and project files, and build OCCT with Visual Studio on Windows or *make* command on Linux, as described below.
   
 @section wok3 Generation of building projects
 
index 1ce1cb8..101594f 100644 (file)
@@ -2970,11 +2970,13 @@ Makes a list of documents handled during the session of the application.
 
 Syntax:       
 ~~~~~
-Open path docname
+Open path docname [-stream]
 ~~~~~ 
 
 Retrieves the document of file **docname** in the path **path**. Overwrites the document, if it is already in session. 
 
+option <i>-stream</i> activates usage of alternative interface of OCAF persistence working with C++ streams instead of file names.
+
 **Example:** 
 ~~~~~
 Open /myPath/myFile.std D
@@ -3012,10 +3014,12 @@ Save D
 
 Syntax:       
 ~~~~~
-SaveAs docname path
+SaveAs docname path [-stream]
 ~~~~~ 
 
-Saves the active document in the file **docname** in the path **path**. Overwrites the file if it already exists. 
+Saves the active document in the file **docname** in the path **path**. Overwrites the file if it already exists.
+
+option <i>-stream</i> activates usage of alternative interface of OCAF persistence working with C++ streams instead of file names.
 
 **Example:** 
 ~~~~~
index cb50b13..ee084e2 100644 (file)
@@ -7,12 +7,10 @@ set (CMAKE_MFC_FLAG 2)
 
 set (ImportExport_SRC_DIR      ${MFC_STANDARD_SAMPLES_DIR}/05_ImportExport/src)
 set (ImportExport_HEADER_FILES ${ImportExport_SRC_DIR}/ColoredShapes.h
-                               ${ImportExport_SRC_DIR}/FSD_Archive.hxx
                                ${ImportExport_SRC_DIR}/ImportExportApp.h
                                ${ImportExport_SRC_DIR}/ImportExportDoc.h
                                ${ImportExport_SRC_DIR}/StdAfx.h )
 set (ImportExport_SOURCE_FILES ${ImportExport_SRC_DIR}/ColoredShapes.cpp
-                               ${ImportExport_SRC_DIR}/FSD_Archive.cxx
                                ${ImportExport_SRC_DIR}/ImportExportApp.cpp
                                ${ImportExport_SRC_DIR}/ImportExportDoc.cpp
                                ${ImportExport_SRC_DIR}/StdAfx.cpp)
index 0632176..3cacd02 100644 (file)
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp" />
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx" />
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\src\ColoredShapes.h" />
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx" />
     <ClInclude Include="..\..\..\src\ImportExportApp.h" />
     <ClInclude Include="..\..\..\src\ImportExportDoc.h" />
     <ClInclude Include="..\..\..\res\resource.h" />
index 9046b4b..9e69403 100644 (file)
@@ -17,9 +17,6 @@
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -42,9 +39,6 @@
     <ClInclude Include="..\..\..\src\ColoredShapes.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\src\ImportExportApp.h">
       <Filter>Header Files</Filter>
     </ClInclude>
index b3d617a..3ed476b 100644 (file)
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp" />
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx" />
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\src\ColoredShapes.h" />
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx" />
     <ClInclude Include="..\..\..\src\ImportExportApp.h" />
     <ClInclude Include="..\..\..\src\ImportExportDoc.h" />
     <ClInclude Include="..\..\..\res\resource.h" />
index 9046b4b..9e69403 100644 (file)
@@ -17,9 +17,6 @@
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -42,9 +39,6 @@
     <ClInclude Include="..\..\..\src\ColoredShapes.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\src\ImportExportApp.h">
       <Filter>Header Files</Filter>
     </ClInclude>
index 715b18c..8ae6e6a 100644 (file)
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp" />
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx" />
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\src\ColoredShapes.h" />
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx" />
     <ClInclude Include="..\..\..\src\ImportExportApp.h" />
     <ClInclude Include="..\..\..\src\ImportExportDoc.h" />
     <ClInclude Include="..\..\..\res\resource.h" />
index 9046b4b..9e69403 100644 (file)
@@ -17,9 +17,6 @@
     <ClCompile Include="..\..\..\src\ColoredShapes.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\..\src\FSD_Archive.cxx">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\..\src\ImportExportApp.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -42,9 +39,6 @@
     <ClInclude Include="..\..\..\src\ColoredShapes.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\..\src\FSD_Archive.hxx">
-      <Filter>Header Files</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\..\src\ImportExportApp.h">
       <Filter>Header Files</Filter>
     </ClInclude>
index fc45493..578208f 100644 (file)
                                >
                        </File>
                        <File
-                               RelativePath="..\..\..\src\FSD_Archive.cxx"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\..\res\ImportExport.rc"
                                >
                                <FileConfiguration
                                >
                        </File>
                        <File
-                               RelativePath="..\..\..\src\FSD_Archive.hxx"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\..\src\ImportExportApp.h"
                                >
                        </File>
index 5259546..b17cce3 100644 (file)
                                >
                        </File>
                        <File
-                               RelativePath="..\..\..\src\FSD_Archive.cxx"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\..\res\ImportExport.rc"
                                >
                                <FileConfiguration
                                >
                        </File>
                        <File
-                               RelativePath="..\..\..\src\FSD_Archive.hxx"
-                               >
-                       </File>
-                       <File
                                RelativePath="..\..\..\src\ImportExportApp.h"
                                >
                        </File>
diff --git a/samples/mfc/standard/05_ImportExport/src/ColoredShape.cpp b/samples/mfc/standard/05_ImportExport/src/ColoredShape.cpp
deleted file mode 100755 (executable)
index e80a9c1..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-// ColoredShape.cpp: implementation of the CColoredShape class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
-
-#include "ColoredShape.h"
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-CColoredShape::CColoredShape()
-{
-       m_colorName = Quantity_NOC_RED;
-}
-
-
-CColoredShape::CColoredShape(const Quantity_NameOfColor aColor, const TopoDS_Shape& aShape)
-{
-       m_colorName   = aColor;
-       m_shapeObject = aShape;
-}
-
-IMPLEMENT_SERIAL(CColoredShape, CObject,1);
-
-// This schema contains all the Persistent Geometry and Topology
-#include <ShapeSchema.hxx>  
-
-// Tools to store TopoDS_Shape
-#include <MgtBRep.hxx>
-#include <PTopoDS_HShape.hxx>
-#include <PTColStd_TransientPersistentMap.hxx>
-#include <TopoDS_Shape.hxx>
-
-// Tools to put Persistent Object in an archive
-#include <FSD_Archive.hxx>
-#include <Storage_Data.hxx>
-#include <Storage_HSeqOfRoot.hxx>
-#include <Storage_Root.hxx>
-#include <PTColStd_PersistentTransientMap.hxx>
-
-void CColoredShape::Serialize(CArchive & ar)
-{
-       CObject::Serialize(ar);
-
-       // an I/O driver
-       FSD_Archive f( &ar );
-
-       // the applicative Schema containing Persistent Topology and Geometry
-       // Note that it inherits from the class Storage_Schema
-       Handle(ShapeSchema) s = new ShapeSchema;
-
-       if ( ar.IsStoring() ) 
-       {   
-               // Store the color in the archive
-               ar << m_colorName;
-
-               //Create the persistent Shape
-               PTColStd_TransientPersistentMap aMap;
-
-               Handle(PTopoDS_HShape) aPShape = 
-                       MgtBRep::Translate(m_shapeObject, aMap, MgtBRep_WithoutTriangle);
-
-               // Store the Persistent shape in the archive
-               Handle(Storage_Data) d = new Storage_Data;
-               d->AddRoot("ObjectName", aPShape);
-               s->Write( f, d);
-
-               // Check
-               if (d->ErrorStatus() != Storage_VSOk) 
-               {
-                       ::MessageBox(NULL, " Error while writing... ", " Error ",MB_OK) ;
-               }
-               
-       }
-       else
-       {
-               // Read the Color from the archive
-               Standard_Integer tmp;
-
-               ar >> tmp;
-               m_colorName = (Quantity_NameOfColor) tmp;
-
-               // Read the Persistent Shape from the archive
-               Handle(Storage_Data) d = s->Read( f );
-               Handle(Storage_HSeqOfRoot)  roots = d->Roots();
-               Handle(Standard_Persistent) p;
-               Handle(Storage_Root) r;
-               Handle(PTopoDS_HShape) aPShape;
-
-               r = roots->Value(1);
-               p = r->Object();
-               aPShape  = Handle(PTopoDS_HShape)::DownCast(p);
-
-               // Create the shape
-               PTColStd_PersistentTransientMap aMap;
-
-               MgtBRep::Translate(aPShape,aMap,m_shapeObject,MgtBRep_WithoutTriangle);
-       }
-}
-
-void CColoredShape::Display(Handle(AIS_InteractiveContext)& anAIScontext)
-{
-       Handle(AIS_Shape) ais = new AIS_Shape(m_shapeObject);
-
-       anAIScontext->SetColor(ais, m_colorName);
-       anAIScontext->Display(ais, Standard_False);
-
-}
diff --git a/samples/mfc/standard/05_ImportExport/src/ColoredShape.h b/samples/mfc/standard/05_ImportExport/src/ColoredShape.h
deleted file mode 100755 (executable)
index 6168386..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// ColoredShape.h: interface for the CColoredShape class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(AFX_COLOREDSHAPE_H__C6419AF3_A78A_11D1_8C93_00AA00D10994__INCLUDED_)
-#define AFX_COLOREDSHAPE_H__C6419AF3_A78A_11D1_8C93_00AA00D10994__INCLUDED_
-
-#if _MSC_VER >= 1000
-#pragma once
-#endif // _MSC_VER >= 1000
-
-class CColoredShape : public CObject  
-{
-public:
-       CColoredShape( const Quantity_NameOfColor aColor, const TopoDS_Shape& aShape);
-
-       void Display( Handle(AIS_InteractiveContext)& anAIScontext);
-
-       // fields
-       Quantity_NameOfColor m_colorName;
-       TopoDS_Shape         m_shapeObject;
-
-protected:
-       CColoredShape();
-
-       // Declare CArchive >> operator
-       DECLARE_SERIAL(CColoredShape);
-
-       // mute CObject::Serialize
-       void Serialize(CArchive& ar);
-
-};
-
-#endif // !defined(AFX_COLOREDSHAPE_H__C6419AF3_A78A_11D1_8C93_00AA00D10994__INCLUDED_)
index 0c2037c..733a7cc 100755 (executable)
@@ -39,10 +39,6 @@ IMPLEMENT_SERIAL(CColoredShapes, CObject,1);
 #include <TopoDS_Shape.hxx>
 
 // Tools to put Persistent Object in an archive
-#include <FSD_Archive.hxx>
-#include <Storage_Data.hxx>
-#include <Storage_HSeqOfRoot.hxx>
-#include <Storage_Root.hxx>
 
 void CColoredShapes::Display(Handle(AIS_InteractiveContext)& anAIScontext)
 {
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_Archive.cxx b/samples/mfc/standard/05_ImportExport/src/FSD_Archive.cxx
deleted file mode 100755 (executable)
index dbc328f..0000000
+++ /dev/null
@@ -1,1309 +0,0 @@
-
-#include "stdafx.h"
-
-#include "FSD_CArchive.hxx"
-#include "FSD_Archive.ixx"
-
-#include <FSD_CFile.hxx>
-
-#define FSD_REF 'R'
-#define FSD_CHA 'c'
-#define FSD_EXT 'C'
-#define FSD_INT 'I'
-#define FSD_BOO 'B'
-#define FSD_REA 'F'
-#define FSD_SHO 'f'
-#define FSD_END 'E'
-
-const Standard_CString MAGICNUMBER = "FSDARCH";
-
-FSD_Archive::FSD_Archive()
-{
-  myStream = NULL;
-  myEof = Standard_False;
-  myExternFlag = Standard_False;
-  myCFile = NULL;
-  myFormat = Standard_False;
-}
-
-FSD_Archive::FSD_Archive(const FSD_CArchive& anArchive)
-{
-  myStream = anArchive;
-  myEof = Standard_False;
-  myExternFlag = Standard_True;
-  myCFile = NULL;
-  myFormat = Standard_False;
-  if (myStream->IsLoading()) SetOpenMode(Storage_VSRead);
-  else SetOpenMode(Storage_VSWrite);
-}
-
-Storage_Error FSD_Archive::IsGoodFileType(const TCollection_AsciiString& aName)
-{
-  FSD_Archive      f;
-  Storage_Error s;
-  s = f.Open(aName,Storage_VSRead);
-
-  if (s == Storage_VSOk) {
-    TCollection_AsciiString l;
-    Standard_Integer len = (int)strlen(FSD_Archive::MagicNumber());
-
-    f.ReadChar(l,len);
-
-    f.Close();
-
-    if (strncmp(FSD_Archive::MagicNumber(),l.ToCString(),len) != 0) {
-      s = Storage_VSFormatError;
-    }
-  }
-  return s;
-}
-
-Storage_Error FSD_Archive::Open(const TCollection_AsciiString& theName,
-                                const Storage_OpenMode aMode)
-{
-  Storage_Error result = Storage_VSOk;
-  CString aName = theName.ToCString();
-  SetName (theName);
-  if (OpenMode() == Storage_VSNone) {
-       if (aMode == Storage_VSRead) {
-               if (!((FSD_CFile*)myCFile)->Open(aName, CFile::modeRead))
-                               result = Storage_VSOpenError;
-       }
-       else if (aMode == Storage_VSWrite) {
-               if (!((FSD_CFile*)myCFile)->Open(aName, CFile::modeCreate | CFile::modeWrite))
-                               result = Storage_VSOpenError;
-       }
-       else if (aMode == Storage_VSReadWrite) {
-               if (!((FSD_CFile*)myCFile)->Open(aName, CFile::modeReadWrite))
-                               result = Storage_VSOpenError;
-       }
-       if (result == Storage_VSOk) {
-               if (aMode == Storage_VSRead) {
-                       myStream = new CArchive( ((FSD_CFile*)myCFile), CArchive::load);
-               }
-               else {
-                       myStream = new CArchive( ((FSD_CFile*)myCFile), CArchive::store);
-               }
-
-               SetOpenMode(aMode);
-       }
-
-       myEof = Standard_False;
-
-  }
-  else {
-         result = Storage_VSAlreadyOpen;
-  }
-  return result;
-}
-
-Standard_Boolean FSD_Archive::IsEnd()
-{
-       return myEof;
-}
-
-Storage_Error FSD_Archive::Close()
-{
-  Storage_Error result = Storage_VSOk;
-
-  myEof = Standard_False;
-
-  if (OpenMode() != Storage_VSNone) {
-      if (!myExternFlag) {
-               (*myStream).Close();
-               ((FSD_CFile*)myCFile)->Close();
-               delete myStream;
-      }
-      myExternFlag = Standard_False;
-       myStream = NULL;
-      SetOpenMode(Storage_VSNone);
-  }
-  else {
-    result = Storage_VSNotOpen;
-  }
-
-  return result;
-}
-
-// ------------------ PROTECTED
-
-const Standard_CString FSD_Archive::MagicNumber()
-{
-  return MAGICNUMBER;
-}
-
-
-void FSD_Archive::ReadLine(TCollection_AsciiString& buffer)
-{
-  TRY {
-       char c;
-       Standard_Boolean IsEnd = Standard_False;
-  
-       buffer.Clear();
-
-       while (!IsEnd) {
-           (*myStream) >> c;
-
-           if (c != '\0') {
-                       buffer += c;
-               }
-               else {
-                       buffer += c;
-                       IsEnd = Standard_True;
-               }
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-  }
-  END_CATCH
-}
-
-void FSD_Archive::WriteLine(const TCollection_AsciiString& buffer)
-{
-       Standard_Integer i;
-  for (i = 1; i <= buffer.Length(); i++) {
-         (*myStream) << buffer.Value(i);
-       }
-  (*myStream) << (Standard_Character)0;
-}
-
-void FSD_Archive::WriteExtendedLine(const TCollection_ExtendedString& buffer)
-{
-  Standard_ExtString extBuffer;
-  Standard_Integer   i;
-
-  extBuffer = buffer.ToExtString(); 
-
-  for (i = 0; i < buffer.Length(); i++) {
-    (*myStream) << extBuffer[i];
-  }
-
-  (*myStream) << (Standard_ExtCharacter)0;
-}
-
-void FSD_Archive::ReadExtendedLine(TCollection_ExtendedString& buffer)
-{
-  TRY {
-       Standard_ExtCharacter i = 0;
-       Standard_Boolean fin = Standard_False;
-
-       buffer.Clear();
-
-       while (!fin) {
-           (*myStream) >> i;
-               if (i == 0) fin = Standard_True;
-           else buffer += (Standard_ExtCharacter)i;
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-  }
-  END_CATCH
-}
-
-void FSD_Archive::ReadChar(TCollection_AsciiString& buffer, const Standard_Integer rsize)
-{
-  TRY {
-       char             c;
-       Standard_Integer ccount = 0;
-
-       buffer.Clear();
-
-       while (ccount < rsize) {
-           (*myStream) >> c;
-           buffer += c;
-           ccount++;
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-  }
-  END_CATCH
-}
-
-
-Storage_Error FSD_Archive::FindTag(const Standard_CString aTag)
-{
-  TCollection_AsciiString l;
-  Standard_CString str;
-
-  ReadLine(l);
-  str = l.ToCString();
-
-  Standard_Integer aNum = 0;
-
-  if(!myFormat)
-    aNum = 1;
-
-  while ((strcmp(&str[aNum],aTag) != 0) && !IsEnd()) {
-//  while ((strcmp(&str[1],aTag) != 0) && !IsEnd()) {
-    ReadLine(l);
-    str = l.ToCString();
-  }
-
-  if (IsEnd()) {
-    return Storage_VSSectionNotFound;
-  }
-  else {
-    return Storage_VSOk;
-  }
-}
-
-void FSD_Archive::SkipObject()
-{
-       Standard_Boolean errorStatus = Standard_False;
-       TRY {
-               char c;
-               Standard_Boolean IsEnd = Standard_False;
-               Standard_Integer rtmp,itmp;
-               Standard_Real    ftmp;
-               Standard_ShortReal stmp;
-               Standard_Integer btmp;
-               Standard_Character ctmp;
-               Standard_ExtCharacter etmp;
-
-               ReadPersistentObjectHeader(rtmp,itmp);
-
-               while (!IsEnd) {
-                       (*myStream) >> c;
-
-                       switch (c) {
-                               case FSD_REF:
-                                       (*myStream) >> rtmp;
-                                       break;
-                               case FSD_CHA:
-                                       (*myStream) >> ctmp;
-                                       break;
-                               case FSD_EXT:
-                                       (*myStream) >> etmp;
-                                       break;
-                               case FSD_INT:
-                                       (*myStream) >> itmp;
-                                       break;
-                               case FSD_BOO:
-                                       (*myStream) >> btmp;
-                                       break;
-                               case FSD_REA:
-                                       (*myStream) >> ftmp;
-                                       break;
-                               case FSD_SHO:
-                                       (*myStream) >> stmp;
-                                       break;
-                               case FSD_END: 
-                                       IsEnd = Standard_True;
-                                       break;
-                               default: 
-                                       errorStatus = Standard_True;
-                                       IsEnd = Standard_True;
-                                       break;
-                       }
-               }
-       }
-       CATCH(CArchiveException,e) {
-               if ((e->m_cause != CArchiveException::endOfFile) &&
-                       (e->m_cause != CArchiveException::none)) errorStatus = Standard_True;
-               else if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       }
-       END_CATCH
-}
-
-// ---------------------- PUBLIC : PUT
-
-Storage_BaseDriver& FSD_Archive::PutReference(const Standard_Integer aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-
-  TRY {
-       (*myStream) << FSD_REF << aValue;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutCharacter(const Standard_Character aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-
-  TRY {
-       //unsigned short i = aValue;
-       //(*myStream) << FSD_CHA << i;
-       (*myStream) << FSD_CHA << aValue;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutExtCharacter(const Standard_ExtCharacter aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << FSD_EXT << aValue;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutInteger(const Standard_Integer aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << FSD_INT << aValue;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutBoolean(const Standard_Boolean aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << FSD_BOO << ((Standard_Integer)aValue);
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutReal(const Standard_Real aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << FSD_REA << ((Standard_Real)aValue);
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::PutShortReal(const Standard_ShortReal aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << FSD_SHO << aValue;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return *this;
-}
-
-// ----------------- PUBLIC : GET
-
-Storage_BaseDriver& FSD_Archive::GetReference(Standard_Integer& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_REF)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetCharacter(Standard_Character& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //unsigned short i;
-       Standard_Character i;
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_CHA) {
-               (*myStream) >> i;
-               aValue = (char)i;
-       }
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetExtCharacter(Standard_ExtCharacter& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_EXT)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetInteger(Standard_Integer& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_INT)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetBoolean(Standard_Boolean& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_BOO)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetReal(Standard_Real& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_REA)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-Storage_BaseDriver& FSD_Archive::GetShortReal(Standard_ShortReal& aValue)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-char ptype;
-       (*myStream) >> ptype;
-       if (ptype == FSD_SHO)
-               (*myStream) >> aValue;
-       else errorStatus = Standard_True;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return *this;
-}
-
-// -------------------------- DESTROY
-
-void FSD_Archive::Destroy()
-{
-  if (OpenMode() != Storage_VSNone) {
-    Close();
-    if (myCFile) {
-      delete ((FSD_CFile*)myCFile);
-      myCFile = NULL;
-    }
-
-  }
-}
-
-// -------------------------- INFO : WRITE
-
-Storage_Error FSD_Archive::BeginWriteInfoSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-         //(*myStream) << FSD_Archive::MagicNumber();
-  WriteLine(TCollection_AsciiString(FSD_Archive::MagicNumber()));
-               //(*myStream) << "BEGIN_INFO_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_INFO_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-void FSD_Archive::WriteInfo(const Standard_Integer nbObj,
-                            const TCollection_AsciiString& dbVersion,
-                            const TCollection_AsciiString& date,
-                            const TCollection_AsciiString& schemaName,
-                            const TCollection_AsciiString& schemaVersion,
-                            const TCollection_ExtendedString& appName,
-                            const TCollection_AsciiString& appVersion,
-                            const TCollection_ExtendedString& dataType,
-                            const TColStd_SequenceOfAsciiString& userInfo)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       Standard_Integer i;
-
-       (*myStream) << nbObj;
-       //(*myStream) << dbVersion.ToCString() << '\0';
-  WriteLine(dbVersion);
-       //(*myStream) << date.ToCString() << '\0';
-  WriteLine(date);
-       //(*myStream) << schemaName.ToCString() << '\0';
-  WriteLine(schemaName);
-       //(*myStream) << schemaVersion.ToCString() << '\0';
-  WriteLine(schemaVersion);
-       WriteExtendedLine(appName);
-       //(*myStream) << appVersion.ToCString() << '\0';
-  WriteLine(appVersion);
-       WriteExtendedLine(dataType);
-       (*myStream) << userInfo.Length();
-       
-       for (i = 1; i <= userInfo.Length(); i++) {
-           //(*myStream) << userInfo.Value(i).ToCString() << '\0';
-    WriteLine(userInfo.Value(i));
-       }
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-}
-
-
-Storage_Error FSD_Archive::EndWriteInfoSection() 
-{
-
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_INFO_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_INFO_SECTION"));
- }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-Storage_Error FSD_Archive::BeginReadInfoSection() 
-{
-  Storage_Error s;
-
-  TCollection_AsciiString l;
-  Standard_Integer len = (int)strlen(FSD_Archive::MagicNumber());
-
-  // first character is length of the magic number
-  ReadChar(l,1);
-
-  if(l.ToCString()[0] != (Standard_Character) len) 
-    myFormat = Standard_True;
-
-  if(myFormat) {
-    TCollection_AsciiString ll;
-    ReadLine(ll);
-    l += ll;
-  } else {
-    ReadChar(l,len);
-  }
-  if (strncmp(FSD_Archive::MagicNumber(),l.ToCString(),len) != 0) {
-    s = Storage_VSFormatError;
-  }
-  else {
-    s = FindTag("BEGIN_INFO_SECTION");
-  }
-  return s;
-}
-
-// ------------------- INFO : READ
-
-void FSD_Archive::ReadInfo(Standard_Integer& nbObj,
-                           TCollection_AsciiString& dbVersion,
-                           TCollection_AsciiString& date,
-                           TCollection_AsciiString& schemaName,
-                           TCollection_AsciiString& schemaVersion,
-                           TCollection_ExtendedString& appName,
-                           TCollection_AsciiString& appVersion,
-                           TCollection_ExtendedString& dataType,
-                           TColStd_SequenceOfAsciiString& userInfo) 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> nbObj;
-
-       ReadLine(dbVersion);
-       ReadLine(date);
-       ReadLine(schemaName);
-       ReadLine(schemaVersion);
-       ReadExtendedLine(appName);
-       ReadLine(appVersion);
-       ReadExtendedLine(dataType);
-
-       Standard_Integer i,len = 0;
-
-       (*myStream) >> len;
-
-       TCollection_AsciiString line;
-
-       for (i = 1; i <= len && !IsEnd(); i++) {
-               ReadLine(line);
-               userInfo.Append(line);
-               line.Clear();
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();     
-}
-
-Storage_Error FSD_Archive::EndReadInfoSection() 
-{
-  return FindTag("END_INFO_SECTION");
-}
-
-// ---------------- COMMENTS : WRITE
-
-Storage_Error FSD_Archive::BeginWriteCommentSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "BEGIN_COMMENT_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_COMMENT_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();  
-  return Storage_VSOk;
-}
-
-void FSD_Archive::WriteComment(const TColStd_SequenceOfExtendedString& aCom)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       Standard_Integer i,aSize;
-
-       aSize = aCom.Length();
-       (*myStream) << aSize; 
-       for (i = 1; i <= aSize; i++) {
-               WriteExtendedLine(aCom.Value(i));
-       }
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-Storage_Error FSD_Archive::EndWriteCommentSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_COMMENT_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_COMMENT_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-// ---------------- COMMENTS : READ
-
-Storage_Error FSD_Archive::BeginReadCommentSection() 
-{
-  return FindTag("BEGIN_COMMENT_SECTION");
-}
-
-void FSD_Archive::ReadComment(TColStd_SequenceOfExtendedString& aCom)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       TCollection_ExtendedString line;
-       Standard_Integer           len,i;
-
-       (*myStream) >> len;
-  
-       for (i = 1; i <= len && !IsEnd(); i++) {
-               ReadExtendedLine(line);
-               aCom.Append(line);
-               line.Clear();
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();
-}
-
-Storage_Error FSD_Archive::EndReadCommentSection() 
-{
-  return FindTag("END_COMMENT_SECTION");
-}
-
-// --------------- TYPE : WRITE
-
-Storage_Error FSD_Archive::BeginWriteTypeSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "BEGIN_TYPE_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_TYPE_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-void FSD_Archive::SetTypeSectionSize(const Standard_Integer aSize)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << aSize;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-void FSD_Archive::WriteTypeInformations (const Standard_Integer typeNum,
-                                         const TCollection_AsciiString& typeName)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << typeNum << typeName.ToCString() << '\0';
-  (*myStream) << typeNum;
-  WriteLine(typeName);
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-Storage_Error FSD_Archive::EndWriteTypeSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_TYPE_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_TYPE_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-// ------------------- TYPE : READ
-
-Storage_Error FSD_Archive::BeginReadTypeSection() 
-{
-  return FindTag("BEGIN_TYPE_SECTION");
-}
-
-Standard_Integer FSD_Archive::TypeSectionSize() 
-{
-  Standard_Integer i = 0;
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> i;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return i;
-}
-
-void FSD_Archive::ReadTypeInformations(Standard_Integer& typeNum, TCollection_AsciiString& typeName)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       unsigned char c;
-       (*myStream) >> typeNum;
-       (*myStream) >> c;
-       if(myFormat) {
-         TCollection_AsciiString tn;
-         typeName = (Standard_Character) c;
-         ReadLine(tn);
-         typeName += tn;
-       } else {
-         ReadLine(typeName);
-       }
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();
-}
-
-Storage_Error FSD_Archive::EndReadTypeSection() 
-{
-  return FindTag("END_TYPE_SECTION");
-}
-
-// -------------------- ROOT : WRITE
-
-Storage_Error FSD_Archive::BeginWriteRootSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "BEGIN_ROOT_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_ROOT_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-void FSD_Archive::SetRootSectionSize(const Standard_Integer aSize)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << aSize;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-void FSD_Archive::WriteRoot (const TCollection_AsciiString& rootName,
-                             const Standard_Integer aRef,
-                             const TCollection_AsciiString& rootType)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << aRef << rootName.ToCString() << '\0' << rootType.ToCString() << '\0';
-  (*myStream) << aRef;
-  WriteLine(rootName);
-  WriteLine(rootType);
-
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-Storage_Error FSD_Archive::EndWriteRootSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_ROOT_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_ROOT_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-// ----------------------- ROOT : READ
-
-Storage_Error FSD_Archive::BeginReadRootSection() 
-{
-  return FindTag("BEGIN_ROOT_SECTION");
-}
-
-Standard_Integer FSD_Archive::RootSectionSize() 
-{
-  Standard_Integer i = 0;
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> i;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return i;
-}
-
-void FSD_Archive::ReadRoot(TCollection_AsciiString& rootName,
-                           Standard_Integer& aRef,
-                           TCollection_AsciiString& rootType)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> aRef;
-       ReadLine(rootName);
-       ReadLine(rootType);
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();
-}
-
-Storage_Error FSD_Archive::EndReadRootSection() 
-{
-  return FindTag("END_ROOT_SECTION");
-}
-
-// -------------------------- REF : WRITE
-
-Storage_Error FSD_Archive::BeginWriteRefSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "BEGIN_REF_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_REF_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-void FSD_Archive::SetRefSectionSize(const Standard_Integer aSize)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << aSize; 
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-void FSD_Archive::WriteReferenceType(const Standard_Integer reference,
-                                     const Standard_Integer typeNum)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << reference << typeNum;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-Storage_Error FSD_Archive::EndWriteRefSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_REF_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_REF_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-// ----------------------- REF : READ
-
-Storage_Error FSD_Archive::BeginReadRefSection() 
-{
-  return FindTag("BEGIN_REF_SECTION");
-}
-
-Standard_Integer FSD_Archive::RefSectionSize() 
-{
-  Standard_Integer i = 0;
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> i;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamTypeMismatchError::Raise();
-  return i;
-}
-
-void FSD_Archive::ReadReferenceType(Standard_Integer& reference,
-                                    Standard_Integer& typeNum)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> reference;
-       (*myStream) >> typeNum;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();
-}
-
-Storage_Error FSD_Archive::EndReadRefSection() 
-{
-  return FindTag("END_REF_SECTION");
-}
-
-// -------------------- DATA : WRITE
-
-Storage_Error FSD_Archive::BeginWriteDataSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "BEGIN_DATA_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("BEGIN_DATA_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-void FSD_Archive::WritePersistentObjectHeader(const Standard_Integer aRef,
-                                              const Standard_Integer aType)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) << aRef << aType;
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamWriteError::Raise();
-}
-
-void FSD_Archive::BeginWritePersistentObjectData() 
-{
-}
-
-void FSD_Archive::BeginWriteObjectData() 
-{
-}
-
-void FSD_Archive::EndWriteObjectData() 
-{
-}
-
-void FSD_Archive::EndWritePersistentObjectData() 
-{      
-       (*myStream) << 'E';
-}
-
-Storage_Error FSD_Archive::EndWriteDataSection() 
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       //(*myStream) << "END_DATA_SECTION" << '\0';
-  WriteLine(TCollection_AsciiString("END_DATA_SECTION"));
-  }
-  CATCH(CArchiveException,e) {
-       errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) Storage_StreamWriteError::Raise();
-  return Storage_VSOk;
-}
-
-// ---------------------- DATA : READ
-
-Storage_Error FSD_Archive::BeginReadDataSection() 
-{
-  return FindTag("BEGIN_DATA_SECTION");
-}
-
-void FSD_Archive::ReadPersistentObjectHeader(Standard_Integer& aRef, Standard_Integer& aType)
-{
-  Standard_Boolean errorStatus = Standard_False;
-  TRY {
-       (*myStream) >> aRef;
-       (*myStream) >> aType;
-  }
-  CATCH(CArchiveException,e) {
-       if (e->m_cause == CArchiveException::endOfFile) myEof = Standard_True;
-       else errorStatus = Standard_True;
-  }
-  END_CATCH
-
-  if (errorStatus) 
-         Storage_StreamTypeMismatchError::Raise();
-}
-
-void FSD_Archive::BeginReadPersistentObjectData() 
-{
-}
-
-void FSD_Archive::BeginReadObjectData() 
-{
-}
-
-void FSD_Archive::EndReadObjectData() 
-{
-}
-
-void FSD_Archive::EndReadPersistentObjectData() 
-{
-       char theEnd;
-
-       (*myStream) >> theEnd;
-
-       if (theEnd != 'E') {
-               Storage_StreamFormatError::Raise();
-       }
-}
-
-Storage_Error FSD_Archive::EndReadDataSection() 
-{
-  return FindTag("END_DATA_SECTION");
-}
-
-Storage_Position FSD_Archive::Tell() 
-{
-       return 0; //just a stub
-}
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_Archive.hxx b/samples/mfc/standard/05_ImportExport/src/FSD_Archive.hxx
deleted file mode 100755 (executable)
index a414fde..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-// File generated by CPPExt (Value)
-//                     Copyright (C) 1991,1995 by
-//  
-//                      MATRA DATAVISION, FRANCE
-//  
-// This software is furnished in accordance with the terms and conditions
-// of the contract and with the inclusion of the above copyright notice.
-// This software or any other copy thereof may not be provided or otherwise
-// be made available to any other person. No title to an ownership of the
-// software is hereby transferred.
-//  
-// At the termination of the contract, the software and all copies of this
-// software must be deleted.
-
-#ifndef _FSD_Archive_HeaderFile
-#define _FSD_Archive_HeaderFile
-
-#ifndef _FSD_CArchive_HeaderFile
-#include <FSD_CArchive.hxx>
-#endif
-#ifndef _Standard_Address_HeaderFile
-#include <Standard_Address.hxx>
-#endif
-#ifndef _Standard_Boolean_HeaderFile
-#include <Standard_Boolean.hxx>
-#endif
-#ifndef _Storage_BaseDriver_HeaderFile
-#include <Storage_BaseDriver.hxx>
-#endif
-#ifndef _Storage_Error_HeaderFile
-#include <Storage_Error.hxx>
-#endif
-#ifndef _Storage_OpenMode_HeaderFile
-#include <Storage_OpenMode.hxx>
-#endif
-#ifndef _Standard_Integer_HeaderFile
-#include <Standard_Integer.hxx>
-#endif
-#ifndef _Standard_Character_HeaderFile
-#include <Standard_Character.hxx>
-#endif
-#ifndef _Standard_ExtCharacter_HeaderFile
-#include <Standard_ExtCharacter.hxx>
-#endif
-#ifndef _Standard_Real_HeaderFile
-#include <Standard_Real.hxx>
-#endif
-#ifndef _Standard_ShortReal_HeaderFile
-#include <Standard_ShortReal.hxx>
-#endif
-#ifndef _Standard_CString_HeaderFile
-#include <Standard_CString.hxx>
-#endif
-#include <TColStd_SequenceOfAsciiString.hxx>
-#include <TColStd_SequenceOfExtendedString.hxx>
-class Storage_StreamTypeMismatchError;
-class Storage_StreamFormatError;
-class Storage_StreamWriteError;
-class Storage_StreamExtCharParityError;
-class TCollection_AsciiString;
-class TCollection_ExtendedString;
-class Storage_BaseDriver;
-
-
-#ifndef _Standard_HeaderFile
-#include <Standard.hxx>
-#endif
-#ifndef _Standard_Macro_HeaderFile
-#include <Standard_Macro.hxx>
-#endif
-
-class FSD_Archive  : public Storage_BaseDriver {
-
-public:
-
-    void* operator new(size_t,void* anAddress) 
-      {
-        return anAddress;
-      }
-    void* operator new(size_t size) 
-      { 
-        return Standard::Allocate(size); 
-      }
-    void  operator delete(void *anAddress) 
-      { 
-        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
-      }
- // Methods PUBLIC
- // 
-Standard_EXPORT virtual long Tell();
-
-Standard_EXPORT FSD_Archive();
-Standard_EXPORT FSD_Archive(const FSD_CArchive& anArchive);
-Standard_EXPORT   Storage_Error Open(const TCollection_AsciiString& aName,const Storage_OpenMode aMode) ;
-Standard_EXPORT   Standard_Boolean IsEnd() ;
-Standard_EXPORT static  Storage_Error IsGoodFileType(const TCollection_AsciiString& aName) ;
-Standard_EXPORT   Storage_Error BeginWriteInfoSection() ;
-Standard_EXPORT   void WriteInfo(const Standard_Integer nbObj,const TCollection_AsciiString& dbVersion,const TCollection_AsciiString& date,const TCollection_AsciiString& schemaName,const TCollection_AsciiString& schemaVersion,const TCollection_ExtendedString& appName,const TCollection_AsciiString& appVersion,const TCollection_ExtendedString& objectType,const TColStd_SequenceOfAsciiString& userInfo) ;
-Standard_EXPORT   Storage_Error EndWriteInfoSection() ;
-Standard_EXPORT   Storage_Error BeginReadInfoSection() ;
-Standard_EXPORT   void ReadInfo(Standard_Integer& nbObj,TCollection_AsciiString& dbVersion,TCollection_AsciiString& date,TCollection_AsciiString& schemaName,TCollection_AsciiString& schemaVersion,TCollection_ExtendedString& appName,TCollection_AsciiString& appVersion,TCollection_ExtendedString& objectType,TColStd_SequenceOfAsciiString& userInfo) ;
-Standard_EXPORT   Storage_Error EndReadInfoSection() ;
-Standard_EXPORT   Storage_Error BeginWriteCommentSection() ;
-Standard_EXPORT   void WriteComment(const TColStd_SequenceOfExtendedString& userComments) ;
-Standard_EXPORT   Storage_Error EndWriteCommentSection() ;
-Standard_EXPORT   Storage_Error BeginReadCommentSection() ;
-Standard_EXPORT   void ReadComment(TColStd_SequenceOfExtendedString& userComments) ;
-Standard_EXPORT   Storage_Error EndReadCommentSection() ;
-Standard_EXPORT   Storage_Error BeginWriteTypeSection() ;
-Standard_EXPORT   void SetTypeSectionSize(const Standard_Integer aSize) ;
-Standard_EXPORT   void WriteTypeInformations(const Standard_Integer typeNum,const TCollection_AsciiString& typeName) ;
-Standard_EXPORT   Storage_Error EndWriteTypeSection() ;
-Standard_EXPORT   Storage_Error BeginReadTypeSection() ;
-Standard_EXPORT   Standard_Integer TypeSectionSize() ;
-Standard_EXPORT   void ReadTypeInformations(Standard_Integer& typeNum,TCollection_AsciiString& typeName) ;
-Standard_EXPORT   Storage_Error EndReadTypeSection() ;
-Standard_EXPORT   Storage_Error BeginWriteRootSection() ;
-Standard_EXPORT   void SetRootSectionSize(const Standard_Integer aSize) ;
-Standard_EXPORT   void WriteRoot(const TCollection_AsciiString& rootName,const Standard_Integer aRef,const TCollection_AsciiString& aType) ;
-Standard_EXPORT   Storage_Error EndWriteRootSection() ;
-Standard_EXPORT   Storage_Error BeginReadRootSection() ;
-Standard_EXPORT   Standard_Integer RootSectionSize() ;
-Standard_EXPORT   void ReadRoot(TCollection_AsciiString& rootName,Standard_Integer& aRef,TCollection_AsciiString& aType) ;
-Standard_EXPORT   Storage_Error EndReadRootSection() ;
-Standard_EXPORT   Storage_Error BeginWriteRefSection() ;
-Standard_EXPORT   void SetRefSectionSize(const Standard_Integer aSize) ;
-Standard_EXPORT   void WriteReferenceType(const Standard_Integer reference,const Standard_Integer typeNum) ;
-Standard_EXPORT   Storage_Error EndWriteRefSection() ;
-Standard_EXPORT   Storage_Error BeginReadRefSection() ;
-Standard_EXPORT   Standard_Integer RefSectionSize() ;
-Standard_EXPORT   void ReadReferenceType(Standard_Integer& reference,Standard_Integer& typeNum) ;
-Standard_EXPORT   Storage_Error EndReadRefSection() ;
-Standard_EXPORT   Storage_Error BeginWriteDataSection() ;
-Standard_EXPORT   void WritePersistentObjectHeader(const Standard_Integer aRef,const Standard_Integer aType) ;
-Standard_EXPORT   void BeginWritePersistentObjectData() ;
-Standard_EXPORT   void BeginWriteObjectData() ;
-Standard_EXPORT   void EndWriteObjectData() ;
-Standard_EXPORT   void EndWritePersistentObjectData() ;
-Standard_EXPORT   Storage_Error EndWriteDataSection() ;
-Standard_EXPORT   Storage_Error BeginReadDataSection() ;
-Standard_EXPORT   void ReadPersistentObjectHeader(Standard_Integer& aRef,Standard_Integer& aType) ;
-Standard_EXPORT   void BeginReadPersistentObjectData() ;
-Standard_EXPORT   void BeginReadObjectData() ;
-Standard_EXPORT   void EndReadObjectData() ;
-Standard_EXPORT   void EndReadPersistentObjectData() ;
-Standard_EXPORT   Storage_Error EndReadDataSection() ;
-Standard_EXPORT   void SkipObject() ;
-Standard_EXPORT   Storage_BaseDriver& PutReference(const Standard_Integer aValue) ;
-Standard_EXPORT   Storage_BaseDriver& PutCharacter(const Standard_Character aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_Character aValue) 
-{
-  return PutCharacter(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& PutExtCharacter(const Standard_ExtCharacter aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_ExtCharacter aValue) 
-{
-  return PutExtCharacter(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& PutInteger(const Standard_Integer aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_Integer aValue) 
-{
-  return PutInteger(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& PutBoolean(const Standard_Boolean aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_Boolean aValue) 
-{
-  return PutBoolean(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& PutReal(const Standard_Real aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_Real aValue) 
-{
-  return PutReal(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& PutShortReal(const Standard_ShortReal aValue) ;
-  Storage_BaseDriver& operator <<(const Standard_ShortReal aValue) 
-{
-  return PutShortReal(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetReference(Standard_Integer& aValue) ;
-Standard_EXPORT   Storage_BaseDriver& GetCharacter(Standard_Character& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_Character& aValue) 
-{
-  return GetCharacter(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetExtCharacter(Standard_ExtCharacter& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_ExtCharacter& aValue) 
-{
-  return GetExtCharacter(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetInteger(Standard_Integer& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_Integer& aValue) 
-{
-  return GetInteger(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetBoolean(Standard_Boolean& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_Boolean& aValue) 
-{
-  return GetBoolean(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetReal(Standard_Real& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_Real& aValue) 
-{
-  return GetReal(aValue);
-}
-
-Standard_EXPORT   Storage_BaseDriver& GetShortReal(Standard_ShortReal& aValue) ;
-  Storage_BaseDriver& operator >>(Standard_ShortReal& aValue) 
-{
-  return GetShortReal(aValue);
-}
-
-Standard_EXPORT   Storage_Error Close() ;
-Standard_EXPORT   void Destroy() ;
-~FSD_Archive()
-{
-  Destroy();
-}
-
-
-
-
-
-
-protected:
-
- // Methods PROTECTED
- // 
-Standard_EXPORT   void ReadLine(TCollection_AsciiString& buffer) ;
-Standard_EXPORT   void WriteLine(const TCollection_AsciiString& buffer) ;
-Standard_EXPORT   void ReadExtendedLine(TCollection_ExtendedString& buffer) ;
-Standard_EXPORT   void WriteExtendedLine(const TCollection_ExtendedString& buffer) ;
-Standard_EXPORT   void ReadChar(TCollection_AsciiString& buffer,const Standard_Integer rsize) ;
-Standard_EXPORT   Storage_Error FindTag(const Standard_CString aTag) ;
-
-
- // Fields PROTECTED
- //
-
-
-private: 
-
- // Methods PRIVATE
- // 
-Standard_EXPORT static const Standard_CString MagicNumber() ;
-
-
- // Fields PRIVATE
- //
-FSD_CArchive myStream;
-Standard_Address myCFile;
-Standard_Boolean myEof;
-Standard_Boolean myExternFlag;
-Standard_Boolean myFormat;
-
-
-};
-
-
-
-
-
-// other Inline functions and methods (like "C++: function call" methods)
-//
-
-
-#endif
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_Archive.ixx b/samples/mfc/standard/05_ImportExport/src/FSD_Archive.ixx
deleted file mode 100755 (executable)
index 9435cae..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// File generated by CPPExt (Value)
-//                     Copyright (C) 1991,1995 by
-//  
-//                      MATRA DATAVISION, FRANCE
-//  
-// This software is furnished in accordance with the terms and conditions
-// of the contract and with the inclusion of the above copyright notice.
-// This software or any other copy thereof may not be provided or otherwise
-// be made available to any other person. No title to an ownership of the
-// software is hereby transferred.
-//  
-// At the termination of the contract, the software and all copies of this
-// software must be deleted.
-//
-#include <FSD_Archive.jxx>
-
-
-
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_Archive.jxx b/samples/mfc/standard/05_ImportExport/src/FSD_Archive.jxx
deleted file mode 100755 (executable)
index c08ddb7..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef _Storage_StreamTypeMismatchError_HeaderFile
-#include <Storage_StreamTypeMismatchError.hxx>
-#endif
-#ifndef _Storage_StreamFormatError_HeaderFile
-#include <Storage_StreamFormatError.hxx>
-#endif
-#ifndef _Storage_StreamWriteError_HeaderFile
-#include <Storage_StreamWriteError.hxx>
-#endif
-#ifndef _Storage_StreamExtCharParityError_HeaderFile
-#include <Storage_StreamExtCharParityError.hxx>
-#endif
-#ifndef _TCollection_AsciiString_HeaderFile
-#include <TCollection_AsciiString.hxx>
-#endif
-#ifndef _TCollection_ExtendedString_HeaderFile
-#include <TCollection_ExtendedString.hxx>
-#endif
-#ifndef _TColStd_SequenceOfAsciiString_HeaderFile
-#include <TColStd_SequenceOfAsciiString.hxx>
-#endif
-#ifndef _TColStd_SequenceOfExtendedString_HeaderFile
-#include <TColStd_SequenceOfExtendedString.hxx>
-#endif
-#ifndef _Storage_BaseDriver_HeaderFile
-#include <Storage_BaseDriver.hxx>
-#endif
-#ifndef _FSD_Archive_HeaderFile
-#include <FSD_Archive.hxx>
-#endif
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_CArchive.hxx b/samples/mfc/standard/05_ImportExport/src/FSD_CArchive.hxx
deleted file mode 100755 (executable)
index e580326..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _FSD_CArchive_HeaderFile
-#define _FSD_CArchive_HeaderFile
-
-//#define _MBCS
-#include <afx.h>
-
-typedef CArchive* FSD_CArchive;
-
-#endif
diff --git a/samples/mfc/standard/05_ImportExport/src/FSD_CFile.hxx b/samples/mfc/standard/05_ImportExport/src/FSD_CFile.hxx
deleted file mode 100755 (executable)
index 64d9c75..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _FSD_CFile_HeaderFile
-#define _FSD_CFile_HeaderFile
-
-//#define _MBCS
-#include <afx.h>
-
-typedef CFile FSD_CFile;
-
-#endif
index 38302df..038e0e0 100755 (executable)
@@ -16,8 +16,6 @@
 #include <AIS_Shape.hxx>
 #include <AIS_InteractiveObject.hxx>
 
-#include <FSD_File.hxx>
-
 #include <IGESControl_Reader.hxx>
 #include <IGESControl_Writer.hxx>
 #include <IGESControl_Controller.hxx>
index 87bcb5f..e5cdfd1 100644 (file)
@@ -27,7 +27,9 @@
 #include <CDM_MessageDriver.hxx>
 #include <FSD_BinaryFile.hxx>
 #include <FSD_FileHeader.hxx>
+#include <OSD_OpenFile.hxx>
 #include <PCDM_Document.hxx>
+#include <PCDM_ReadWriter.hxx>
 #include <Standard_ErrorHandler.hxx>
 #include <Standard_Stream.hxx>
 #include <Standard_Type.hxx>
@@ -93,15 +95,42 @@ void BinLDrivers_DocumentRetrievalDriver::Make (const Handle(PCDM_Document)&,
 //function : Read
 //purpose  :
 //=======================================================================
-
-#define START_TYPES "START_TYPES"
-#define END_TYPES "END_TYPES"
-
 void BinLDrivers_DocumentRetrievalDriver::Read
                          (const TCollection_ExtendedString& theFileName,
                           const Handle(CDM_Document)&       theNewDocument,
                           const Handle(CDM_Application)&    theApplication)
 {
+  std::ifstream aFileStream;
+  OSD_OpenStream (aFileStream, theFileName, std::ios::in | std::ios::binary);
+
+  if (aFileStream.is_open() && aFileStream.good())
+  {
+    Handle(Storage_Data) dData;
+    TCollection_ExtendedString aFormat = PCDM_ReadWriter::FileFormat (aFileStream, dData);
+
+    Read (aFileStream, dData, theNewDocument, theApplication);
+  }
+  else
+  {
+    myReaderStatus = PCDM_RS_OpenError;
+  }
+}
+
+#define MODIFICATION_COUNTER "MODIFICATION_COUNTER: "
+#define REFERENCE_COUNTER "REFERENCE_COUNTER: "
+
+#define START_TYPES "START_TYPES"
+#define END_TYPES "END_TYPES"
+
+//=======================================================================
+//function : Read
+//purpose  :
+//=======================================================================
+void BinLDrivers_DocumentRetrievalDriver::Read (Standard_IStream&               theIStream,
+                                                const Handle(Storage_Data)&     theStorageData,
+                                                const Handle(CDM_Document)&     theDoc,
+                                                const Handle(CDM_Application)&  theApplication)
+{
   myReaderStatus = PCDM_RS_DriverFailure;
   myMsgDriver = theApplication -> MessageDriver();
 
@@ -109,7 +138,7 @@ void BinLDrivers_DocumentRetrievalDriver::Read
     ("BinLDrivers_DocumentRetrievalDriver: ");
 
   Handle(TDocStd_Document) aDoc =
-    Handle(TDocStd_Document)::DownCast(theNewDocument);
+    Handle(TDocStd_Document)::DownCast(theDoc);
   if (aDoc.IsNull()) {
 #ifdef OCCT_DEBUG
     WriteMessage (aMethStr + "error: null document");
@@ -118,15 +147,29 @@ void BinLDrivers_DocumentRetrievalDriver::Read
     return;
   }
 
-  TCollection_AsciiString aFileName (theFileName);
-
-  // 1. Read the information section
+  // 1. the information section
   Handle(Storage_HeaderData) aHeaderData;
-  Storage_Position anInfoSectionEnd = ReadInfoSection( aFileName, aHeaderData );
-  if (!anInfoSectionEnd) {
-    WriteMessage (aMethStr + "error: file has invalid header");
-    myReaderStatus = PCDM_RS_UnrecognizedFileFormat;
-    return;
+  
+  if (!theStorageData.IsNull())
+  {
+    aHeaderData = theStorageData->HeaderData();
+  }
+
+  if (!aHeaderData.IsNull())
+  {
+    for (Standard_Integer i = 1; i <= aHeaderData->UserInfo().Length(); i++)
+    {
+      const TCollection_AsciiString& aLine = aHeaderData->UserInfo().Value(i);
+
+      if(aLine.Search(REFERENCE_COUNTER) != -1)
+      {
+        theDoc->SetReferenceCounter (aLine.Token(" ", 2).IntegerValue());
+      }
+      else if(aLine.Search(MODIFICATION_COUNTER) != -1)
+      {
+        theDoc->SetModifications (aLine.Token(" ", 2).IntegerValue());
+      }
+    }
   }
 
   // 1.a Version of writer
@@ -193,23 +236,6 @@ void BinLDrivers_DocumentRetrievalDriver::Read
        WriteMessage (aTypeNames(i));
   }
 
-  // Open the file stream
-#ifdef _WIN32
-  ifstream anIS ((const wchar_t*) theFileName.ToExtString(), ios::in | ios::binary);
-#else
-  ifstream anIS (aFileName.ToCString());
-#endif
-
-  if (!anIS) {
-    // Can not open file
-    WriteMessage (aMethStr + "error: can't open file " + theFileName);
-    myReaderStatus = PCDM_RS_OpenError;
-    return;
-  }
-
-  // skip info section
-  anIS.seekg( (streampos) anInfoSectionEnd );
-
   // propagate the opened document version to data drivers
   PropagateDocumentVersion(aFileVer);
 
@@ -226,30 +252,30 @@ void BinLDrivers_DocumentRetrievalDriver::Read
   if (aFileVer >= 3) {
     BinLDrivers_DocumentSection aSection;
     do {
-      BinLDrivers_DocumentSection::ReadTOC (aSection, anIS);
+      BinLDrivers_DocumentSection::ReadTOC (aSection, theIStream);
       mySections.Append(aSection);
     } while
       (!aSection.Name().IsEqual((Standard_CString)SHAPESECTION_POS));
-    aDocumentPos = anIS.tellg(); // position of root label
+    aDocumentPos = theIStream.tellg(); // position of root label
 
     BinLDrivers_VectorOfDocumentSection::Iterator anIterS (mySections);
     for (; anIterS.More(); anIterS.Next()) {
       BinLDrivers_DocumentSection& aCurSection = anIterS.ChangeValue();
       if (aCurSection.IsPostRead() == Standard_False) {
-        anIS.seekg ((streampos) aCurSection.Offset());
+        theIStream.seekg ((streampos) aCurSection.Offset());
         if (aCurSection.Name().IsEqual ((Standard_CString)SHAPESECTION_POS)) 
-          ReadShapeSection (aCurSection, anIS);
+          ReadShapeSection (aCurSection, theIStream);
         else
-          ReadSection (aCurSection, theNewDocument, anIS); 
+          ReadSection (aCurSection, theDoc, theIStream); 
       }
     }
   } else { //aFileVer < 3
-    aDocumentPos = anIS.tellg(); // position of root label
+    aDocumentPos = theIStream.tellg(); // position of root label
 
     // retrieve SHAPESECTION_POS string
     char aShapeSecLabel[SIZEOFSHAPELABEL + 1];
     aShapeSecLabel[SIZEOFSHAPELABEL] = 0x00;
-    anIS.read ((char*)&aShapeSecLabel, SIZEOFSHAPELABEL);// SHAPESECTION_POS
+    theIStream.read ((char*)&aShapeSecLabel, SIZEOFSHAPELABEL);// SHAPESECTION_POS
     TCollection_AsciiString aShapeLabel(aShapeSecLabel);
     // detect if a file was written in old fashion (version 2 without shapes)
     // and if so then skip reading ShapeSection
@@ -263,7 +289,7 @@ void BinLDrivers_DocumentRetrievalDriver::Read
 
       // retrieve ShapeSection Position
       Standard_Integer aShapeSectionPos; // go to ShapeSection
-      anIS.read ((char*)&aShapeSectionPos, sizeof(Standard_Integer));
+      theIStream.read ((char*)&aShapeSectionPos, sizeof(Standard_Integer));
 
 #if DO_INVERSE
       aShapeSectionPos = InverseInt (aShapeSectionPos);
@@ -272,26 +298,26 @@ void BinLDrivers_DocumentRetrievalDriver::Read
       cout <<"aShapeSectionPos = " <<aShapeSectionPos <<endl;
 #endif
       if(aShapeSectionPos) { 
-       aDocumentPos = anIS.tellg();
-       anIS.seekg((streampos) aShapeSectionPos);
+       aDocumentPos = theIStream.tellg();
+       theIStream.seekg((streampos) aShapeSectionPos);
 
-       CheckShapeSection(aShapeSectionPos, anIS);
+       CheckShapeSection(aShapeSectionPos, theIStream);
        // Read Shapes
        BinLDrivers_DocumentSection aCurSection;
-       ReadShapeSection (aCurSection, anIS, Standard_False);
+       ReadShapeSection (aCurSection, theIStream, Standard_False);
       }
     }
   } // end of reading Sections or shape section
 
   // Return to read of the Document structure
-  anIS.seekg(aDocumentPos);
+  theIStream.seekg(aDocumentPos);
 
   // read the header (tag) of the root label
   Standard_Integer aTag;
-  anIS.read ((char*)&aTag, sizeof(Standard_Integer));
+  theIStream.read ((char*)&aTag, sizeof(Standard_Integer));
 
   // read sub-tree of the root label
-  Standard_Integer nbRead = ReadSubTree (anIS, aData->Root());
+  Standard_Integer nbRead = ReadSubTree (theIStream, aData->Root());
   myPAtt.Destroy();    // free buffer
   myRelocTable.Clear();
   myMapUnsupported.Clear();
@@ -306,12 +332,12 @@ void BinLDrivers_DocumentRetrievalDriver::Read
 
   // Read Sections (post-reading type)
   if (aFileVer >= 3) {
-    BinLDrivers_VectorOfDocumentSection::Iterator anIterS (mySections);
-    for (; anIterS.More(); anIterS.Next()) {
-      BinLDrivers_DocumentSection& aCurSection = anIterS.ChangeValue();
+    BinLDrivers_VectorOfDocumentSection::Iterator aSectIter (mySections);
+    for (; aSectIter.More(); aSectIter.Next()) {
+      BinLDrivers_DocumentSection& aCurSection = aSectIter.ChangeValue();
       if (aCurSection.IsPostRead()) {
-       anIS.seekg ((streampos) aCurSection.Offset());
-       ReadSection (aCurSection, theNewDocument, anIS); 
+       theIStream.seekg ((streampos) aCurSection.Offset());
+       ReadSection (aCurSection, theDoc, theIStream); 
       }
     }
   }
@@ -421,38 +447,6 @@ Handle(BinMDF_ADriverTable) BinLDrivers_DocumentRetrievalDriver::AttributeDriver
   return BinLDrivers::AttributeDrivers (theMessageDriver);
 }
 
-//=======================================================================
-//function : ReadInfoSection
-//purpose  : Read the info  section  of  theFile, return a file
-//           position corresponding to the info section end
-//=======================================================================
-
-Storage_Position BinLDrivers_DocumentRetrievalDriver::ReadInfoSection
-                         (const TCollection_AsciiString& theFileName,
-                          Handle(Storage_HeaderData)&    theData)
-{
-  TCollection_ExtendedString aMsg
-    ( "BinLDrivers_DocumentRetrievalDriver: error: ");
-
-  FSD_BinaryFile aFileDriver;
-  Storage_Position aPos = 0;
-  if (aFileDriver.Open( theFileName, Storage_VSRead ) == Storage_VSOk)
-  {
-    Storage_Schema aSchema;
-    theData = aSchema.ReadHeaderSection( aFileDriver );
-
-    if (theData->ErrorStatus() == Storage_VSOk)
-      aPos = aFileDriver.Tell();
-    else
-      WriteMessage( aMsg + theData->ErrorStatusExtension() );
-  }
-  else
-    WriteMessage( aMsg + "can not open file " + theFileName);
-
-  aFileDriver.Close();
-
-  return aPos;
-}
 
 //=======================================================================
 //function : WriteMessage
index d635a52..4b2a11d 100644 (file)
@@ -28,6 +28,8 @@
 #include <Standard_IStream.hxx>
 #include <Storage_Position.hxx>
 #include <Standard_Boolean.hxx>
+#include <Storage_Data.hxx>
+
 class BinMDF_ADriverTable;
 class CDM_MessageDriver;
 class TCollection_ExtendedString;
@@ -64,6 +66,11 @@ public:
   
   //! retrieves the content of the file into a new Document.
   Standard_EXPORT virtual void Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, const Handle(CDM_Application)& theApplication) Standard_OVERRIDE;
+
+  Standard_EXPORT virtual void Read (Standard_IStream&               theIStream,
+                                     const Handle(Storage_Data)&     theStorageData,
+                                     const Handle(CDM_Document)&     theDoc,
+                                     const Handle(CDM_Application)&  theApplication) Standard_OVERRIDE;
   
   Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(CDM_MessageDriver)& theMsgDriver);
 
@@ -78,10 +85,6 @@ protected:
   //! Read the tree from the stream <theIS> to <theLabel>
   Standard_EXPORT virtual Standard_Integer ReadSubTree (Standard_IStream& theIS, const TDF_Label& theData);
   
-  //! Read the  info  section  of  theFile into theData,
-  //! return a file  position  corresponding to the info
-  //! section end
-  Standard_EXPORT Storage_Position ReadInfoSection (const TCollection_AsciiString& theFile, Handle(Storage_HeaderData)& theData);
   
   //! define the procedure of reading a section to file.
   Standard_EXPORT virtual void ReadSection (BinLDrivers_DocumentSection& theSection, const Handle(CDM_Document)& theDoc, Standard_IStream& theIS);
index 63f8e80..4d3a397 100644 (file)
@@ -26,6 +26,7 @@
 #include <CDM_MessageDriver.hxx>
 #include <FSD_BinaryFile.hxx>
 #include <FSD_FileHeader.hxx>
+#include <OSD_OpenFile.hxx>
 #include <PCDM_ReadWriter.hxx>
 #include <Standard_ErrorHandler.hxx>
 #include <Standard_Type.hxx>
@@ -78,19 +79,39 @@ void BinLDrivers_DocumentStorageDriver::Write
   SetIsError(Standard_False);
   SetStoreStatus(PCDM_SS_OK);
 
-  myMsgDriver = theDocument -> Application() -> MessageDriver();
+  myFileName = theFileName;
+
+  std::ofstream aFileStream;
+  OSD_OpenStream (aFileStream, theFileName, std::ios::out | std::ios::binary);
+
+  if (aFileStream.is_open() && aFileStream.good())
+  {
+    Write (theDocument, aFileStream);
+  }
+  else
+  {
+    SetIsError (Standard_True);
+    SetStoreStatus(PCDM_SS_WriteFailure);
+  }
+}
+
+//=======================================================================
+//function : Write
+//purpose  :
+//=======================================================================
+
+void BinLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)& theDoc, Standard_OStream& theOStream)
+{
+  myMsgDriver = theDoc->Application()->MessageDriver();
   myMapUnsupported.Clear();
 
   Handle(TDocStd_Document) aDoc =
-    Handle(TDocStd_Document)::DownCast(theDocument);
+    Handle(TDocStd_Document)::DownCast(theDoc);
   if (aDoc.IsNull()) {
     SetIsError(Standard_True);
     SetStoreStatus(PCDM_SS_Doc_IsNull);
   }
   else {
-    // Open the file
-    TCollection_AsciiString aFileName (theFileName);
-
     // First pass: collect empty labels, assign IDs to the types
     if (myDrivers.IsNull())
       myDrivers = AttributeDrivers (myMsgDriver);
@@ -98,7 +119,8 @@ void BinLDrivers_DocumentStorageDriver::Write
     FirstPass (aData->Root());
 
 //  1. Write info section (including types table)
-    WriteInfoSection(theDocument, aFileName);
+    WriteInfoSection (aDoc, theOStream);
+
     myTypesMap.Clear();
     if (IsError())
     {
@@ -106,73 +128,58 @@ void BinLDrivers_DocumentStorageDriver::Write
         return;
     }
 
-#if defined(_WIN32)
-    ofstream anOS ((const wchar_t*) theFileName.ToExtString(), ios::in | ios::binary | ios::ate);
-#elif !defined(IRIX) // 10.10.2005
-    ofstream anOS (aFileName.ToCString(), ios::in | ios::binary | ios::ate);
-#else
-    ofstream anOS (aFileName.ToCString(), ios::ate);
-    //ofstream anOS (aFileName.ToCString(), ios::out| ios::binary | ios::ate);
-#endif
-#ifdef OCCT_DEBUG
-    const Standard_Integer aP = (Standard_Integer) anOS.tellp();
-    cout << "POS = " << aP <<endl;
-#endif
-//#endif
 
-    if (anOS) {
 
 //  2. Write the Table of Contents of Sections
-      BinLDrivers_VectorOfDocumentSection::Iterator anIterS (mySections);
-      for (; anIterS.More(); anIterS.Next())
-        anIterS.ChangeValue().WriteTOC (anOS);
+    BinLDrivers_VectorOfDocumentSection::Iterator anIterS (mySections);
+    for (; anIterS.More(); anIterS.Next())
+      anIterS.ChangeValue().WriteTOC (theOStream);
 
-      // Shapes Section is the last one, it indicates the end of the table.
-      BinLDrivers_DocumentSection aShapesSection (SHAPESECTION_POS,
-                                                  Standard_False);
-      aShapesSection.WriteTOC (anOS);
+    // Shapes Section is the last one, it indicates the end of the table.
+    BinLDrivers_DocumentSection aShapesSection (SHAPESECTION_POS,
+                                                Standard_False);
+    aShapesSection.WriteTOC (theOStream);
 
 //  3. Write document contents
-      // (Storage data to the stream)
-      myRelocTable.Clear();
-      myPAtt.Init();
+    // (Storage data to the stream)
+    myRelocTable.Clear();
+    myPAtt.Init();
 
-//    Write Doc structure
-      WriteSubTree (aData->Root(), anOS); // Doc is written
+//  Write Doc structure
+    WriteSubTree (aData->Root(), theOStream); // Doc is written
 
 //  4. Write Shapes section
-      WriteShapeSection(aShapesSection, anOS);
-
-// Write application-defined sections
-      for (anIterS.Init (mySections); anIterS.More(); anIterS.Next()) {
-        BinLDrivers_DocumentSection& aSection = anIterS.ChangeValue();
-        const Standard_Size aSectionOffset = (Standard_Size) anOS.tellp();
-        WriteSection (aSection.Name(), theDocument, anOS);
-        aSection.Write (anOS, aSectionOffset);
-      }
-
-// End of processing: close structures and check the status
-      myPAtt.Destroy();   // free buffer
-      myEmptyLabels.Clear();
-      myMapUnsupported.Clear();
-
-      if (!myRelocTable.Extent()) {
-        // No objects written
+    WriteShapeSection (aShapesSection, theOStream);
+
+    // Write application-defined sections
+    for (anIterS.Init (mySections); anIterS.More(); anIterS.Next()) {
+      BinLDrivers_DocumentSection& aSection = anIterS.ChangeValue();
+      const Standard_Size aSectionOffset = (Standard_Size) theOStream.tellp();
+      WriteSection (aSection.Name(), aDoc, theOStream);
+      aSection.Write (theOStream, aSectionOffset);
+    }
+
+    // End of processing: close structures and check the status
+    myPAtt.Destroy();   // free buffer
+    myEmptyLabels.Clear();
+    myMapUnsupported.Clear();
+
+    if (!myRelocTable.Extent()) {
+      // No objects written
 #ifdef OCCT_DEBUG
-        WriteMessage ("BinLDrivers_DocumentStorageDriver, no objects written");
+      WriteMessage ("BinLDrivers_DocumentStorageDriver, no objects written");
 #endif
-        SetIsError(Standard_True);
-        SetStoreStatus(PCDM_SS_No_Obj);
-      }
-      myRelocTable.Clear();
+      SetIsError(Standard_True);
+      SetStoreStatus(PCDM_SS_No_Obj);
     }
+    myRelocTable.Clear();
 
-    if (!anOS) {
+    if (!theOStream) {
       // A problem with the stream
 #ifdef OCCT_DEBUG
       TCollection_ExtendedString anErrorStr ("Error: ");
       WriteMessage (anErrorStr + "BinLDrivers_DocumentStorageDriver, Problem with the file stream, rdstate="
-                    + (Standard_Integer )anOS.rdstate());
+                    + (Standard_Integer )theOStream.rdstate());
 #endif
       SetIsError(Standard_True);
       SetStoreStatus(PCDM_SS_WriteFailure);
@@ -361,77 +368,119 @@ void BinLDrivers_DocumentStorageDriver::FirstPass
 #define START_TYPES "START_TYPES"
 #define END_TYPES "END_TYPES"
 
-void BinLDrivers_DocumentStorageDriver::WriteInfoSection
-                         (const Handle(CDM_Document)&    theDocument,
-                          const TCollection_AsciiString& theFileName)
+void BinLDrivers_DocumentStorageDriver::WriteInfoSection 
+                         (const Handle(CDM_Document)&    theDoc,
+                          Standard_OStream&              theOStream)
 {
-  FSD_BinaryFile aFileDriver;
-  if (aFileDriver.Open( theFileName, Storage_VSWrite ) != Storage_VSOk) {
-    WriteMessage (TCollection_ExtendedString("Error: Cannot open file ") +
-                  theFileName);
-    SetIsError(Standard_True);
-    return;
+  // Magic number
+  theOStream.write (FSD_BinaryFile::MagicNumber(), strlen(FSD_BinaryFile::MagicNumber()));
+
+  FSD_FileHeader aHeader;
+
+  {
+    aHeader.testindian  = -1;
+    aHeader.binfo       = -1;
+    aHeader.einfo       = -1;
+    aHeader.bcomment    = -1;
+    aHeader.ecomment    = -1;
+    aHeader.btype       = -1;
+    aHeader.etype       = -1;
+    aHeader.broot       = -1;
+    aHeader.eroot       = -1;
+    aHeader.bref        = -1;
+    aHeader.eref        = -1;
+    aHeader.bdata       = -1;
+    aHeader.edata       = -1;
+  }
+
+  // aHeader.testindian
+  {
+    union {
+      char ti2[4];
+      Standard_Integer aResult;
+    } aWrapUnion;
+
+    aWrapUnion.ti2[0] = 1;
+    aWrapUnion.ti2[1] = 2;
+    aWrapUnion.ti2[2] = 3;
+    aWrapUnion.ti2[3] = 4;
+
+    aHeader.testindian = aWrapUnion.aResult;
   }
 
-  if (aFileDriver.BeginWriteInfoSection() == Storage_VSOk)
+  // info section
+  aHeader.binfo = (Standard_Integer)theOStream.tellp();
+
+  // header section
+  aHeader.einfo = aHeader.binfo + FSD_BinaryFile::WriteHeader (theOStream, aHeader, Standard_True);
+  
+  // add format
+  Handle(Storage_Data) theData = new Storage_Data;
+  PCDM_ReadWriter::WriteFileFormat (theData, theDoc);
+  PCDM_ReadWriter::Writer()->WriteReferenceCounter (theData, theDoc);
+  PCDM_ReadWriter::Writer()->WriteReferences       (theData, theDoc, myFileName);
+  PCDM_ReadWriter::Writer()->WriteExtensions       (theData, theDoc);
+  PCDM_ReadWriter::Writer()->WriteVersion          (theData, theDoc);
+
+  // add the types table
+  theData->AddToUserInfo(START_TYPES);
+  for (Standard_Integer i = 1; i <= myTypesMap.Extent(); i++)
   {
-    // add format
-    Handle(Storage_Data) theData = new Storage_Data;
-    PCDM_ReadWriter::WriteFileFormat( theData, theDocument );
-    PCDM_ReadWriter::Writer()->WriteReferenceCounter(theData,theDocument);
-    PCDM_ReadWriter::Writer()->WriteReferences(theData,theDocument,theFileName);
-    PCDM_ReadWriter::Writer()->WriteExtensions(theData,theDocument);
-    PCDM_ReadWriter::Writer()->WriteVersion(theData,theDocument);
-
-    // add the types table
-    theData->AddToUserInfo(START_TYPES);
-    Standard_Integer i;
-    for (i = 1; i <= myTypesMap.Extent(); i++) {
-      Handle(BinMDF_ADriver) aDriver = myDrivers->GetDriver(i);
-      if (!aDriver.IsNull()) {
-        const TCollection_AsciiString& aTypeName = aDriver->TypeName();
-        theData->AddToUserInfo(aTypeName);
-      }
+    Handle(BinMDF_ADriver) aDriver = myDrivers->GetDriver(i);
+    if (!aDriver.IsNull())
+    {
+      const TCollection_AsciiString& aTypeName = aDriver->TypeName();
+      theData->AddToUserInfo (aTypeName);
     }
-    theData->AddToUserInfo(END_TYPES);
-
-    // add document comments
-    TColStd_SequenceOfExtendedString aComments;
-    theDocument->Comments(aComments);
-    for (i = 1; i <= aComments.Length(); i++)
-      theData->AddToComments(aComments(i));
-
-    // Info
-    aFileDriver.WriteInfo
-      (1,           //   nbObj
-       BinLDrivers::StorageVersion(),
-       Storage_Schema::ICreationDate(),
-       TCollection_AsciiString(SchemaName(),'?'),
-       1,           //   schemaVersion
-       theData->ApplicationName(),
-       theData->ApplicationVersion(),
-       theData->DataType(),
-       theData->UserInfo()
-       );
-
-    // we write a complete header section: info and comments
-    aFileDriver.EndWriteInfoSection();
-    aFileDriver.BeginWriteCommentSection();
-    aFileDriver.WriteComment(theData->Comments());// <=== !!! szy - it was missed
-    aFileDriver.EndWriteCommentSection();
-    // here the location of info and comment sections is written
-    aFileDriver.EndWriteDataSection();
   }
-  else {
-    WriteMessage(TCollection_ExtendedString("Error: Problem writing header "
-                                            "into file ") + theFileName);
-    SetIsError(Standard_True);
+  theData->AddToUserInfo(END_TYPES);
+
+  Standard_Integer aObjNb = 1;
+  Standard_Integer aShemaVer = 1;
+
+  aHeader.einfo += FSD_BinaryFile::WriteInfo (theOStream,
+                                              aObjNb,
+                                              BinLDrivers::StorageVersion(),
+                                              Storage_Schema::ICreationDate(),
+                                              TCollection_AsciiString(SchemaName(),'?'),
+                                              aShemaVer,
+                                              theData->ApplicationName(),
+                                              theData->ApplicationVersion(),
+                                              theData->DataType(),
+                                              theData->UserInfo(),
+                                              Standard_True); // only count the size of the section
+
+  // calculate comment section
+  TColStd_SequenceOfExtendedString aComments;
+  theDoc->Comments(aComments);
+  for (Standard_Integer i = 1; i <= aComments.Length(); i++)
+  {
+    theData->AddToComments (aComments(i));
   }
-#ifdef OCCT_DEBUG
-    const Standard_Integer aP = (Standard_Integer) aFileDriver.Tell();
-    cout << "POS = " << aP <<endl;
-#endif
-  aFileDriver.Close();
+
+  aHeader.bcomment = aHeader.einfo;
+  aHeader.ecomment = aHeader.bcomment + FSD_BinaryFile::WriteComment(theOStream, theData->Comments(), Standard_True);
+
+  aHeader.edata = aHeader.ecomment;
+
+  // write header information
+  FSD_BinaryFile::WriteHeader (theOStream, aHeader);
+
+  // write info section
+  FSD_BinaryFile::WriteInfo (theOStream,
+                             aObjNb,
+                             BinLDrivers::StorageVersion(),
+                             Storage_Schema::ICreationDate(),
+                             TCollection_AsciiString(SchemaName(),'?'),
+                             aShemaVer,
+                             theData->ApplicationName(),
+                             theData->ApplicationVersion(),
+                             theData->DataType(),
+                             theData->UserInfo());
+
+  // write the comments
+  FSD_BinaryFile::WriteComment(theOStream, theData->Comments());
+  
 }
 
 //=======================================================================
index 4c4ed4a..f8cdb2c 100644 (file)
@@ -56,6 +56,9 @@ public:
   
   //! Write <theDocument> to the binary file <theFileName>
   Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, const TCollection_ExtendedString& theFileName) Standard_OVERRIDE;
+
+  //! Write <theDocument> to theOStream
+  Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) Standard_OVERRIDE;
   
   Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(CDM_MessageDriver)& theMsgDriver);
   
@@ -97,7 +100,7 @@ private:
   Standard_EXPORT Standard_Boolean FirstPassSubTree (const TDF_Label& L, TDF_LabelList& ListOfEmptyL);
   
   //! Write info secton using FSD_BinaryFile driver
-  Standard_EXPORT void WriteInfoSection (const Handle(CDM_Document)& theDocument, const TCollection_AsciiString& theFile);
+  Standard_EXPORT void WriteInfoSection (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream);
   
   Standard_EXPORT void UnsupportedAttrMsg (const Handle(Standard_Type)& theType);
 
@@ -107,6 +110,7 @@ private:
   TColStd_MapOfTransient myMapUnsupported;
   TColStd_IndexedMapOfTransient myTypesMap;
   BinLDrivers_VectorOfDocumentSection mySections;
+  TCollection_ExtendedString myFileName;
 
 
 };
index eda4b96..029ba78 100644 (file)
@@ -384,6 +384,67 @@ Handle(PCDM_Reader) CDF_Application::Reader (const TCollection_ExtendedString& a
 }
 
 //=======================================================================
+//function : Read
+//purpose  : 
+//=======================================================================
+Handle(CDM_Document) CDF_Application::Read (Standard_IStream& theIStream)
+{
+  Handle(CDM_Document) aDoc;
+  Handle(Storage_Data) dData;
+  
+  TCollection_ExtendedString aFormat;
+
+  try
+  {
+    OCC_CATCH_SIGNALS
+    
+    aFormat = PCDM_ReadWriter::FileFormat (theIStream, dData);
+  }
+  catch (Standard_Failure)
+  {
+    myRetrievableStatus = PCDM_RS_FormatFailure;
+    
+    Standard_SStream aMsg;
+    aMsg << Standard_Failure::Caught() << endl;
+    Standard_Failure::Raise(aMsg);
+  }
+
+  if (aFormat.IsEmpty())
+  {
+    myRetrievableStatus = PCDM_RS_FormatFailure;
+    return aDoc;
+  }
+  // 1. use a format name to detect plugin corresponding to the format to continue reading
+  Handle(PCDM_Reader) aReader = ReaderFromFormat (aFormat);
+
+  // 2. create document with the detected reader
+  aDoc = aReader->CreateDocument();
+
+  // 3. read the content of theIStream to aDoc
+  try
+  {
+    OCC_CATCH_SIGNALS
+  
+    aReader->Read (theIStream, dData, aDoc, this);
+  }
+  catch (Standard_Failure)
+  {
+    myRetrievableStatus = aReader->GetStatus();
+    if (myRetrievableStatus  > PCDM_RS_AlreadyRetrieved)
+    {
+      Standard_SStream aMsg;
+      aMsg << Standard_Failure::Caught() << endl;
+      Standard_Failure::Raise(aMsg);
+    }  
+  }
+
+  myRetrievableStatus = aReader->GetStatus();
+
+  return aDoc;
+}
+
+//=======================================================================
 //function : FindReaderFromFormat
 //purpose  : 
 //=======================================================================
index a399285..116aea1 100644 (file)
@@ -29,6 +29,8 @@
 #include <CDF_TypeOfActivation.hxx>
 #include <Standard_ExtString.hxx>
 #include <Standard_Integer.hxx>
+#include <Standard_IStream.hxx>
+
 class Standard_NoSuchObject;
 class CDF_Session;
 class Standard_GUID;
@@ -119,7 +121,11 @@ public:
   Standard_EXPORT Standard_Boolean FindReader (const TCollection_ExtendedString& aFileName);
   
   Standard_EXPORT Handle(PCDM_Reader) Reader (const TCollection_ExtendedString& aFileName);
-  
+
+  //! Reads aDoc from standard SEEKABLE stream theIStream,
+  //! the stream should support SEEK fuctionality
+  Standard_EXPORT Handle(CDM_Document) Read (Standard_IStream& theIStream);
   Standard_EXPORT Standard_Boolean FindReaderFromFormat (const TCollection_ExtendedString& aFormat);
   
   Standard_EXPORT Handle(PCDM_Reader) ReaderFromFormat (const TCollection_ExtendedString& aFormat);
index 612e359..d34be1c 100644 (file)
@@ -366,6 +366,12 @@ Standard_OStream& operator << (Standard_OStream& anOStream);
   //! returns Boolean from Standard
   Standard_EXPORT virtual void Update();
 
+  Standard_EXPORT Handle(CDM_Reference) Reference (const Standard_Integer aReferenceIdentifier) const;
+
+  Standard_EXPORT void SetModifications (const Standard_Integer Modifications);
+
+  Standard_EXPORT void SetReferenceCounter (const Standard_Integer aReferenceCounter);
+
 friend class CDM_Reference;
 friend class CDM_ReferenceIterator;
 friend class CDM_Application;
@@ -393,9 +399,7 @@ private:
   //! the manager returned by  this method will be
   //! used to search for the following resource items.
   Standard_EXPORT Handle(Resource_Manager) StorageResource();
-  
-  Standard_EXPORT Handle(CDM_Reference) Reference (const Standard_Integer aReferenceIdentifier) const;
-  
+
   Standard_EXPORT void ComputePresentation();
   
   Standard_EXPORT void UnvalidPresentation();
@@ -405,10 +409,6 @@ private:
   Standard_EXPORT void AddFromReference (const Handle(CDM_Reference)& aReference);
   
   Standard_EXPORT void RemoveFromReference (const Standard_Integer aReferenceIdentifier);
-  
-  Standard_EXPORT void SetModifications (const Standard_Integer Modifications);
-  
-  Standard_EXPORT void SetReferenceCounter (const Standard_Integer aReferenceCounter);
 
   TColStd_SequenceOfExtendedString myComments;
   TCollection_ExtendedString myPresentation;
index d86bdd0..45e17bf 100644 (file)
@@ -703,6 +703,15 @@ void DDF_IOStream::ReadInfo(Standard_Integer& nbObj,
 }
 
 //=======================================================================
+//function : ReadCompleteInfo
+//purpose  : 
+//=======================================================================
+void DDF_IOStream::ReadCompleteInfo( Standard_IStream& /*theIStream*/, Handle(Storage_Data)& /*theData*/ )
+{
+
+}
+
+//=======================================================================
 //function : EndReadInfoSection
 //purpose  : 
 //=======================================================================
index 5136944..bd9419a 100644 (file)
@@ -56,6 +56,7 @@ static  Storage_Error IsGoodFileType(istream* anIStream) ;
   Storage_Error EndWriteInfoSection() ;
   Storage_Error BeginReadInfoSection() ;
   void ReadInfo(Standard_Integer& nbObj,TCollection_AsciiString& dbVersion,TCollection_AsciiString& date,TCollection_AsciiString& schemaName,TCollection_AsciiString& schemaVersion,TCollection_ExtendedString& appName,TCollection_AsciiString& appVersion,TCollection_ExtendedString& objectType,TColStd_SequenceOfAsciiString& userInfo) ;
+  void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData);
   Storage_Error EndReadInfoSection() ;
   Storage_Error BeginWriteCommentSection() ;
   void WriteComment(const TColStd_SequenceOfExtendedString& userComments) ;
index 9b5b2fa..577eaa8 100644 (file)
@@ -32,6 +32,7 @@
 #include <TDF_Tool.hxx> 
 
 #include <OSD_Path.hxx>
+#include <OSD_OpenFile.hxx>
 #include <TDocStd_PathParser.hxx>
 
 #include <AIS_InteractiveContext.hxx>
@@ -129,7 +130,7 @@ static Standard_Integer DDocStd_Open (Draw_Interpretor& di,
                                      Standard_Integer nb,
                                      const char** a)
 {   
-  if (nb == 3) {
+  if (nb >= 3) {
     TCollection_ExtendedString path (a[1]); 
     Handle(TDocStd_Application) A;
     if (!DDocStd::Find(A)) return 1;
@@ -139,7 +140,30 @@ static Standard_Integer DDocStd_Open (Draw_Interpretor& di,
       di <<"document " << insession << "  is already in session\n";
       return 0;
     }
-    PCDM_ReaderStatus theStatus = A->Open(path,D);
+    PCDM_ReaderStatus theStatus;
+
+    Standard_Boolean anUseStream = Standard_False;
+    for ( Standard_Integer i = 3; i < nb; i++ )
+    {
+      if (!strcmp (a[i], "-stream"))
+      {
+        di << "standard SEEKABLE stream is used\n";
+        anUseStream = Standard_True;
+        break;
+      }
+    }
+
+    if (anUseStream)
+    {
+      std::ifstream aFileStream;
+      OSD_OpenStream (aFileStream, path, std::ios::in | std::ios::binary);
+
+      theStatus = A->Open (aFileStream, D);
+    }
+    else
+    {
+      theStatus = A->Open(path,D);
+    }
     if (theStatus == PCDM_RS_OK && !D.IsNull()) {
       Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D);
       TDataStd_Name::Set(D->GetData()->Root(),a[2]);
@@ -214,13 +238,36 @@ static Standard_Integer DDocStd_SaveAs (Draw_Interpretor& di,
                                        Standard_Integer nb,
                                        const char** a)
 {  
-  if (nb == 3) {
+  if (nb >= 3) {
     Handle(TDocStd_Document) D;    
     if (!DDocStd::GetDocument(a[1],D)) return 1;  
     TCollection_ExtendedString path (a[2]); 
     Handle(TDocStd_Application) A;
     if (!DDocStd::Find(A)) return 1;
-    PCDM_StoreStatus theStatus = A->SaveAs(D,path);
+    PCDM_StoreStatus theStatus;
+    
+    Standard_Boolean anUseStream = Standard_False;
+    for ( Standard_Integer i = 3; i < nb; i++ )
+    {
+      if (!strcmp (a[i], "-stream"))
+      {
+        di << "standard SEEKABLE stream is used\n";
+        anUseStream = Standard_True;
+        break;
+      }
+    }
+
+    if (anUseStream)
+    {
+      std::ofstream aFileStream;
+      OSD_OpenStream (aFileStream, path, std::ios::out | std::ios::binary);
+      theStatus = A->SaveAs (D, aFileStream);
+    }
+    else
+    {
+      theStatus = A->SaveAs(D,path);
+    }
+    
     if (theStatus != PCDM_SS_OK ) {
       switch ( theStatus ) {
         case PCDM_SS_DriverFailure: {
@@ -456,11 +503,11 @@ void DDocStd::ApplicationCommands(Draw_Interpretor& theCommands)
                  __FILE__, DDocStd_NewDocument, g);  
 
   theCommands.Add("Open",
-                 "Open path docname",
+                 "Open path docname [-stream]",
                  __FILE__, DDocStd_Open, g);   
 
   theCommands.Add("SaveAs",
-                 "SaveAs DOC path",
+                 "SaveAs DOC path [-stream]",
                  __FILE__, DDocStd_SaveAs, g);  
 
   theCommands.Add("Save",
index 4578460..0a40d2d 100644 (file)
 #include <OSD.hxx>
 #include <OSD_OpenFile.hxx>
 #include <Storage_BaseDriver.hxx>
+#include <Storage_HArrayOfCallBack.hxx>
+#include <Storage_HeaderData.hxx>
+#include <Storage_InternalData.hxx>
+#include <Storage_RootData.hxx>
 #include <Storage_StreamExtCharParityError.hxx>
 #include <Storage_StreamFormatError.hxx>
 #include <Storage_StreamTypeMismatchError.hxx>
 #include <Storage_StreamWriteError.hxx>
+#include <Storage_TypeData.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
 #include <Standard_Assert.hxx>
@@ -247,6 +252,32 @@ Storage_BaseDriver& FSD_BinaryFile::PutInteger(const Standard_Integer aValue)
 }
 
 //=======================================================================
+//function : PutInteger
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::PutInteger (Standard_OStream&      theOStream,
+                                             const Standard_Integer theValue,
+                                             const Standard_Boolean theOnlyCount)
+{
+#if OCCT_BINARY_FILE_DO_INVERSE
+  Standard_Integer t = InverseInt (theValue);
+#else
+  Standard_Integer t = theValue;
+#endif
+
+  if (!theOnlyCount)
+  {
+    theOStream.write ((char*)&t, sizeof(Standard_Integer));
+    if (theOStream.fail())
+    {
+      Storage_StreamWriteError::Raise();
+    }
+  }
+
+  return sizeof(Standard_Integer);
+}
+
+//=======================================================================
 //function : PutBoolean
 //purpose  : 
 //=======================================================================
@@ -313,6 +344,24 @@ Storage_BaseDriver& FSD_BinaryFile::GetReference(Standard_Integer& aValue)
 }
 
 //=======================================================================
+//function : GetReference
+//purpose  : ----------------- PUBLIC : GET
+//=======================================================================
+void FSD_BinaryFile::GetReference(Standard_IStream& theIStream, Standard_Integer& aValue)
+{
+  theIStream.read ((char*)&aValue, sizeof(Standard_Integer));
+
+  if (theIStream.gcount() != sizeof(Standard_Integer))
+  {
+    Storage_StreamTypeMismatchError::Raise();
+  }
+
+#if OCCT_BINARY_FILE_DO_INVERSE
+  aValue = InverseInt (aValue);
+#endif
+}
+
+//=======================================================================
 //function : GetCharacter
 //purpose  : 
 //=======================================================================
@@ -355,6 +404,25 @@ Storage_BaseDriver& FSD_BinaryFile::GetInteger(Standard_Integer& aValue)
 }
 
 //=======================================================================
+//function : GetInteger
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::GetInteger (Standard_IStream& theIStream, Standard_Integer& theValue)
+{
+
+  theIStream.read ((char*)&theValue, sizeof(Standard_Integer));
+
+  if (theIStream.gcount() != sizeof(Standard_Integer))
+  {
+    Storage_StreamTypeMismatchError::Raise();
+  }
+   
+#if OCCT_BINARY_FILE_DO_INVERSE
+  theValue = InverseInt (theValue);
+#endif
+}
+
+//=======================================================================
 //function : GetBoolean
 //purpose  : 
 //=======================================================================
@@ -476,6 +544,43 @@ void FSD_BinaryFile::WriteInfo(const Standard_Integer nbObj,
 }
 
 //=======================================================================
+//function : WriteInfo
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::WriteInfo (Standard_OStream&                    theOStream,
+                                            const Standard_Integer               theObjNb,
+                                            const TCollection_AsciiString&       theStoreVer,
+                                            const TCollection_AsciiString&       theCreationDate,
+                                            const TCollection_AsciiString&       theSchemaName,
+                                            const TCollection_AsciiString&       theSchemaVersion,
+                                            const TCollection_ExtendedString&    theAppName,
+                                            const TCollection_AsciiString&       theAppVer,
+                                            const TCollection_ExtendedString&    theDataType,
+                                            const TColStd_SequenceOfAsciiString& theUserInfo,
+                                            const Standard_Boolean               theOnlyCount) 
+{
+  Standard_Integer anInfoSize = 0;
+
+  anInfoSize += PutInteger (theOStream, theObjNb, theOnlyCount);
+  anInfoSize += WriteString(theOStream, theStoreVer, theOnlyCount);
+  anInfoSize += WriteString(theOStream, theCreationDate, theOnlyCount);
+  anInfoSize += WriteString(theOStream, theSchemaName, theOnlyCount);
+  anInfoSize += WriteString(theOStream, theSchemaVersion, theOnlyCount);
+  anInfoSize += WriteExtendedString(theOStream, theAppName, theOnlyCount);
+  anInfoSize += WriteString(theOStream, theAppVer, theOnlyCount);
+  anInfoSize += WriteExtendedString(theOStream, theDataType, theOnlyCount);
+  
+  Standard_Integer i = theUserInfo.Length();
+  anInfoSize += PutInteger(theOStream, i, theOnlyCount);
+
+  for (i = 1; i <= theUserInfo.Length(); i++) {
+    anInfoSize += WriteString (theOStream, theUserInfo.Value(i), theOnlyCount);
+  }
+
+  return anInfoSize;
+}
+
+//=======================================================================
 //function : EndWriteInfoSection
 //purpose  : read
 //=======================================================================
@@ -488,6 +593,17 @@ Storage_Error FSD_BinaryFile::EndWriteInfoSection()
 }
 
 //=======================================================================
+//function : EndWriteInfoSection
+//purpose  : read
+//=======================================================================
+Storage_Error FSD_BinaryFile::EndWriteInfoSection(Standard_OStream& theOStream) 
+{
+  myHeader.einfo = (Standard_Integer)theOStream.tellp();
+
+  return Storage_VSOk;
+}
+
+//=======================================================================
 //function : BeginReadInfoSection
 //purpose  : 
 //=======================================================================
@@ -546,6 +662,118 @@ void FSD_BinaryFile::ReadInfo(Standard_Integer& nbObj,
 }
 
 //=======================================================================
+//function : ReadInfo
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData)
+{
+  FSD_FileHeader aHeaderPos;
+  ReadHeader(theIStream, aHeaderPos);
+
+  if (theData.IsNull())
+  {
+    theData = new Storage_Data();
+  }
+
+  Handle(Storage_InternalData) iData = theData->InternalData();
+  Handle(Storage_TypeData)     tData = theData->TypeData();
+  Handle(Storage_RootData)     rData = theData->RootData();
+  Handle(Storage_HeaderData)   hData = theData->HeaderData();
+
+  ReadHeaderData (theIStream, hData);
+
+  Handle(Storage_HArrayOfCallBack) theCallBack;
+
+  while (theIStream.good() && !theIStream.eof())
+  {
+    Standard_Integer aPos = (Standard_Integer)theIStream.tellg();
+
+    if (aPos >= aHeaderPos.edata)
+    {
+      break;
+    }
+    else if (aPos == aHeaderPos.bcomment)
+    {
+      TColStd_SequenceOfExtendedString mComment;
+      ReadComment (theIStream, mComment);
+
+      for (Standard_Integer i = 1; i <= mComment.Length(); i++)
+      {
+        hData->AddToComments (mComment.Value(i));
+      }
+
+      iData->ReadArray() = new Storage_HPArray(1, theData->NumberOfObjects());
+    }
+    else if (aPos == aHeaderPos.btype)
+    {
+      Standard_Integer aTypeSectionSize = TypeSectionSize (theIStream);
+      theCallBack = new Storage_HArrayOfCallBack (1, aTypeSectionSize);
+
+      TCollection_AsciiString  aTypeName;
+      Standard_Integer         aTypeNum;
+
+      for (Standard_Integer i = 1; i <= aTypeSectionSize; i++)
+      {
+        ReadTypeInformations (theIStream, aTypeNum, aTypeName);
+        tData->AddType (aTypeName,aTypeNum);
+
+        theCallBack->SetValue (aTypeNum, NULL);
+      }
+    }
+    else if (aPos == aHeaderPos.broot)
+    {
+      Standard_Integer aRootSectionSize = RootSectionSize(theIStream);
+
+      Standard_Integer aRef;
+      TCollection_AsciiString aRootName, aTypeName;
+      Handle(Storage_Root) aRoot;
+      Handle(Standard_Persistent) aPer;
+
+      for (Standard_Integer i = 1; i <= aRootSectionSize; i++)
+      {
+        ReadRoot (theIStream, aRootName, aRef, aTypeName);
+
+        aRoot = new Storage_Root(aRootName, aPer);
+        aRoot->SetReference(aRef);
+        aRoot->SetType(aTypeName);
+        rData->AddRoot(aRoot);
+      }
+    }
+    else if (aPos == aHeaderPos.bref)
+    {
+      Standard_Integer aRefSectionSize = RefSectionSize (theIStream);
+
+      Standard_Integer aTypeNum, aRef = 0;
+
+      for (Standard_Integer i = 1; i <= aRefSectionSize; i++)
+      {
+        ReadReferenceType (theIStream, aRef, aTypeNum);
+            
+        iData->ReadArray()->ChangeValue(aRef) = theCallBack->Value(aTypeNum)->New();
+
+        if (!iData->ReadArray()->ChangeValue(aRef).IsNull())
+        {
+          iData->ReadArray()->ChangeValue(aRef)->TypeNum() = aTypeNum;
+        }
+      }
+    }
+    else if (aPos == aHeaderPos.bdata)
+    {
+      //
+    }
+  }
+
+  Handle(Storage_HSeqOfRoot) aRoots = rData->Roots();
+  for(Standard_Integer i = 1; i <= theData->NumberOfRoots(); i++)
+  {
+    const Handle(Storage_Root)& aCurRoot = aRoots->Value(i);
+    rData->UpdateRoot (aCurRoot->Name(), iData->ReadArray()->Value (aCurRoot->Reference()));
+  }
+
+  iData->Clear();
+}
+
+//=======================================================================
 //function : EndReadInfoSection
 //purpose  : COMMENTS SECTION
 //           write
@@ -569,6 +797,16 @@ Storage_Error FSD_BinaryFile::BeginWriteCommentSection()
 }
 
 //=======================================================================
+//function : BeginWriteCommentSection
+//purpose  :
+//=======================================================================
+Storage_Error FSD_BinaryFile::BeginWriteCommentSection(Standard_OStream& theOStream) 
+{
+  myHeader.bcomment = (Standard_Integer)theOStream.tellp();
+  return Storage_VSOk;
+}
+
+//=======================================================================
 //function : WriteComment
 //purpose  : 
 //=======================================================================
@@ -585,6 +823,26 @@ void FSD_BinaryFile::WriteComment(const TColStd_SequenceOfExtendedString& aCom)
 }
 
 //=======================================================================
+//function : WriteComment
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::WriteComment (Standard_OStream&                       theOStream,
+                                               const TColStd_SequenceOfExtendedString& theComments,
+                                               const Standard_Boolean                  theOnlyCount)
+{
+  Standard_Integer aCommentSize = 0;
+
+  Standard_Integer aSize = theComments.Length();
+  aCommentSize += PutInteger(theOStream, aSize, theOnlyCount);
+
+  for (Standard_Integer i = 1; i <= aSize; i++) {
+    aCommentSize += WriteExtendedString (theOStream, theComments.Value(i), theOnlyCount);
+  }
+
+  return aCommentSize;
+}
+
+//=======================================================================
 //function : EndWriteCommentSection
 //purpose  : read
 //=======================================================================
@@ -597,6 +855,17 @@ Storage_Error FSD_BinaryFile::EndWriteCommentSection()
 }
 
 //=======================================================================
+//function : EndWriteCommentSection
+//purpose  : read
+//=======================================================================
+Storage_Error FSD_BinaryFile::EndWriteCommentSection (Standard_OStream& theOStream) 
+{
+  myHeader.ecomment = (Standard_Integer)theOStream.tellp();
+
+  return Storage_VSOk;
+}
+
+//=======================================================================
 //function : BeginReadCommentSection
 //purpose  : ---------------- COMMENTS : READ
 //=======================================================================
@@ -625,6 +894,23 @@ void FSD_BinaryFile::ReadComment(TColStd_SequenceOfExtendedString& aCom)
 }
 
 //=======================================================================
+//function : ReadComment
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadComment (Standard_IStream& theIStream, TColStd_SequenceOfExtendedString& aCom)
+{
+  TCollection_ExtendedString line;
+  Standard_Integer           len,i;
+
+  GetInteger(theIStream, len);
+  for (i = 1; i <= len && theIStream.good(); i++)
+  {
+    ReadExtendedString(theIStream, line);
+    aCom.Append(line);
+  }
+}
+
+//=======================================================================
 //function : EndReadCommentSection
 //purpose  : 
 //=======================================================================
@@ -706,6 +992,18 @@ Standard_Integer FSD_BinaryFile::TypeSectionSize()
 }
 
 //=======================================================================
+//function : TypeSectionSize
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::TypeSectionSize(Standard_IStream& theIStream) 
+{
+  Standard_Integer i;
+
+  GetInteger(theIStream, i);
+  return i;
+}
+
+//=======================================================================
 //function : ReadTypeInformations
 //purpose  : 
 //=======================================================================
@@ -717,6 +1015,16 @@ void FSD_BinaryFile::ReadTypeInformations(Standard_Integer& typeNum,TCollection_
 }
 
 //=======================================================================
+//function : ReadTypeInformations
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadTypeInformations(Standard_IStream& theIStream, Standard_Integer& typeNum,TCollection_AsciiString& typeName) 
+{
+  GetInteger(theIStream, typeNum);
+  ReadString(theIStream, typeName);
+}
+
+//=======================================================================
 //function : EndReadTypeSection
 //purpose  : ROOT SECTION
 //           write
@@ -799,6 +1107,18 @@ Standard_Integer FSD_BinaryFile::RootSectionSize()
 }
 
 //=======================================================================
+//function : RootSectionSize
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::RootSectionSize (Standard_IStream& theIStream) 
+{
+  Standard_Integer i;
+
+  GetInteger(theIStream, i);
+  return i;
+}
+
+//=======================================================================
 //function : ReadRoot
 //purpose  : 
 //=======================================================================
@@ -811,6 +1131,17 @@ void FSD_BinaryFile::ReadRoot(TCollection_AsciiString& rootName, Standard_Intege
 }
 
 //=======================================================================
+//function : ReadRoot
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadRoot (Standard_IStream& theIStream, TCollection_AsciiString& rootName, Standard_Integer& aRef,TCollection_AsciiString& rootType) 
+{
+  GetReference(theIStream, aRef);
+  ReadString(theIStream, rootName);
+  ReadString(theIStream, rootType);
+}
+
+//=======================================================================
 //function : EndReadRootSection
 //purpose  : REF SECTION
 //           write
@@ -892,6 +1223,18 @@ Standard_Integer FSD_BinaryFile::RefSectionSize()
 }
 
 //=======================================================================
+//function : RefSectionSize
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::RefSectionSize (Standard_IStream& theIStream) 
+{
+  Standard_Integer i;
+
+  GetInteger(theIStream, i);
+  return i;
+}
+
+//=======================================================================
 //function : ReadReferenceType
 //purpose  : 
 //=======================================================================
@@ -904,6 +1247,16 @@ void FSD_BinaryFile::ReadReferenceType(Standard_Integer& reference,
 }
 
 //=======================================================================
+//function : ReadReferenceType
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadReferenceType (Standard_IStream& theIStream, Standard_Integer& reference, Standard_Integer& typeNum) 
+{
+  GetReference (theIStream, reference);
+  GetInteger   (theIStream, typeNum);
+}
+
+//=======================================================================
 //function : EndReadRefSection
 //purpose  : DATA SECTION
 //           write
@@ -1078,6 +1431,32 @@ void FSD_BinaryFile::WriteString(const TCollection_AsciiString& aString)
 }
 
 //=======================================================================
+//function : WriteString
+//purpose  : write string at the current position.
+//=======================================================================
+Standard_Integer FSD_BinaryFile::WriteString (Standard_OStream&              theOStream,
+                                              const TCollection_AsciiString& theString,
+                                              const Standard_Boolean         theOnlyCount)
+{
+  Standard_Integer aNumAndStrLen, anAsciiStrLen;
+
+  anAsciiStrLen = aNumAndStrLen = theString.Length();
+
+  aNumAndStrLen += PutInteger (theOStream, anAsciiStrLen, theOnlyCount);
+
+  if (anAsciiStrLen > 0 && !theOnlyCount)
+  {
+    theOStream.write (theString.ToCString(), theString.Length());
+    if (theOStream.fail())
+    {
+      Storage_StreamWriteError::Raise();
+    }
+  }
+
+  return aNumAndStrLen;
+}
+
+//=======================================================================
 //function : ReadString
 //purpose  : read string from the current position.
 //=======================================================================
@@ -1100,6 +1479,44 @@ void FSD_BinaryFile::ReadString(TCollection_AsciiString& aString)
 }
 
 //=======================================================================
+//function : ReadString
+//purpose  : read string from the current position.
+//=======================================================================
+void FSD_BinaryFile::ReadString (Standard_IStream& theIStream, TCollection_AsciiString& aString)
+{
+  Standard_Integer size = 0;
+
+  GetInteger(theIStream, size);
+
+  if (size > 0)
+  {
+    Standard_Character *c = (Standard_Character *)Standard::Allocate((size+1) * sizeof(Standard_Character));
+
+    if (!theIStream.good())
+    {
+      Storage_StreamReadError::Raise();
+    }
+
+    theIStream.read (c, size);
+
+    if (theIStream.gcount() != size)
+    {
+      Storage_StreamReadError::Raise();
+    }
+
+    c[size] = '\0';
+    
+    aString = c;
+    
+    Standard::Free(c);
+  }
+  else
+  {
+    aString.Clear();
+  }
+}
+
+//=======================================================================
 //function : WriteExtendedString
 //purpose  : write string at the current position.
 //=======================================================================
@@ -1133,6 +1550,49 @@ void FSD_BinaryFile::WriteExtendedString(const TCollection_ExtendedString& aStri
 }
 
 //=======================================================================
+//function : WriteExtendedString
+//purpose  : write string at the current position.
+//=======================================================================
+Standard_Integer FSD_BinaryFile::WriteExtendedString (Standard_OStream&                 theOStream,
+                                                      const TCollection_ExtendedString& theString,
+                                                      const Standard_Boolean            theOnlyCount)
+{
+  Standard_Integer aNumAndStrLen, anExtStrLen;
+  anExtStrLen = theString.Length();
+
+  aNumAndStrLen = anExtStrLen * sizeof(Standard_ExtCharacter);
+  aNumAndStrLen += PutInteger (theOStream, anExtStrLen, theOnlyCount);
+
+  if (anExtStrLen > 0 && !theOnlyCount)
+  {
+    Standard_ExtString anExtStr;
+#if OCCT_BINARY_FILE_DO_INVERSE
+    TCollection_ExtendedString aCopy = theString;
+    anExtStr = aCopy.ToExtString();
+
+    Standard_PExtCharacter pChar;
+    //
+    pChar = (Standard_PExtCharacter)anExtStr;
+
+    for (Standard_Integer i = 0; i < anExtStrLen; i++)
+    {
+      pChar[i] = InverseExtChar (pChar[i]);
+    }
+#else
+    anExtStr = theString.ToExtString();
+#endif
+
+    theOStream.write((char*)anExtStr, sizeof(Standard_ExtCharacter)*theString.Length());
+    if (theOStream.fail())
+    {
+      Storage_StreamWriteError::Raise();
+    }
+  }
+
+  return aNumAndStrLen;
+}
+
+//=======================================================================
 //function : ReadExtendedString
 //purpose  : read string from the current position.
 //=======================================================================
@@ -1161,6 +1621,49 @@ void FSD_BinaryFile::ReadExtendedString(TCollection_ExtendedString& aString)
 }
 
 //=======================================================================
+//function : ReadExtendedString
+//purpose  : read string from the current position.
+//=======================================================================
+void FSD_BinaryFile::ReadExtendedString (Standard_IStream& theIStream, TCollection_ExtendedString& aString)
+{
+  Standard_Integer size = 0;
+
+  GetInteger (theIStream, size);
+
+  if (size > 0)
+  {
+    Standard_ExtCharacter *c = (Standard_ExtCharacter *)Standard::Allocate((size+1) * sizeof(Standard_ExtCharacter));
+
+    if (!theIStream.good())
+    {
+      Storage_StreamReadError::Raise();
+    }
+
+    theIStream.read ((char *)c, size*sizeof(Standard_ExtCharacter));
+
+    if (theIStream.gcount() != size)
+    {
+      Storage_StreamReadError::Raise();
+    }
+          
+    c[size] = '\0';
+
+#if OCCT_BINARY_FILE_DO_INVERSE
+    for (Standard_Integer i=0; i < size; i++)
+    {
+      c[i] = InverseExtChar (c[i]);
+    }
+#endif
+    aString = c;
+    Standard::Free(c);
+  }
+  else
+  {
+    aString.Clear();
+  }
+}
+
+//=======================================================================
 //function : WriteHeader
 //purpose  : 
 //=======================================================================
@@ -1183,6 +1686,33 @@ void FSD_BinaryFile::WriteHeader()
 }
 
 //=======================================================================
+//function : WriteHeader
+//purpose  : 
+//=======================================================================
+Standard_Integer FSD_BinaryFile::WriteHeader (Standard_OStream&      theOStream, 
+                                              const FSD_FileHeader&  theHeader,
+                                              const Standard_Boolean theOnlyCount)
+{
+  Standard_Integer aHeaderSize = 0;
+
+  aHeaderSize += PutInteger (theOStream, theHeader.testindian, theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.binfo,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.einfo,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.bcomment,   theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.ecomment,   theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.btype,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.etype,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.broot,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.eroot,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.bref,       theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.eref,       theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.bdata,      theOnlyCount);
+  aHeaderSize += PutInteger (theOStream, theHeader.edata,      theOnlyCount);
+
+   return aHeaderSize;
+}
+
+//=======================================================================
 //function : ReadHeader
 //purpose  : 
 //=======================================================================
@@ -1204,6 +1734,73 @@ void FSD_BinaryFile::ReadHeader()
   GetInteger(myHeader.edata);
 }
 
+//=======================================================================
+//function : ReadHeader
+//purpose  : 
+//=======================================================================
+
+void FSD_BinaryFile::ReadHeader(Standard_IStream& theIStream, FSD_FileHeader& theFileHeader)
+{
+  GetInteger (theIStream, theFileHeader.testindian);
+  GetInteger (theIStream, theFileHeader.binfo);
+  GetInteger (theIStream, theFileHeader.einfo);
+  GetInteger (theIStream, theFileHeader.bcomment);
+  GetInteger (theIStream, theFileHeader.ecomment);
+  GetInteger (theIStream, theFileHeader.btype);
+  GetInteger (theIStream, theFileHeader.etype);
+  GetInteger (theIStream, theFileHeader.broot);
+  GetInteger (theIStream, theFileHeader.eroot);
+  GetInteger (theIStream, theFileHeader.bref);
+  GetInteger (theIStream, theFileHeader.eref);
+  GetInteger (theIStream, theFileHeader.bdata);
+  GetInteger (theIStream, theFileHeader.edata);
+}
+
+//=======================================================================
+//function : ReadHeaderData
+//purpose  : 
+//=======================================================================
+void FSD_BinaryFile::ReadHeaderData( Standard_IStream& theIStream, const Handle(Storage_HeaderData)& theHeaderData )
+{
+  // read info 
+  TCollection_AsciiString          uinfo,mStorageVersion,mDate,mSchemaName,mSchemaVersion,mApplicationVersion;
+  TCollection_ExtendedString       mApplicationName,mDataType;
+  TColStd_SequenceOfAsciiString    mUserInfo;
+  Standard_Integer                 mNBObj;
+
+  FSD_BinaryFile::GetInteger (theIStream, mNBObj);
+  FSD_BinaryFile::ReadString (theIStream, mStorageVersion);
+  FSD_BinaryFile::ReadString (theIStream, mDate);
+  FSD_BinaryFile::ReadString (theIStream, mSchemaName);
+  FSD_BinaryFile::ReadString (theIStream, mSchemaVersion);
+  FSD_BinaryFile::ReadExtendedString(theIStream, mApplicationName);
+  FSD_BinaryFile::ReadString (theIStream, mApplicationVersion);
+  FSD_BinaryFile::ReadExtendedString(theIStream, mDataType);
+
+  Standard_Integer len = 0;
+  TCollection_AsciiString line;
+
+  FSD_BinaryFile::GetInteger(theIStream, len);
+
+  for (Standard_Integer i = 1; i <= len && theIStream.good(); i++)
+  {
+    FSD_BinaryFile::ReadString (theIStream, line);
+    mUserInfo.Append(line);
+  }
+
+  theHeaderData->SetNumberOfObjects(mNBObj);
+  theHeaderData->SetStorageVersion(mStorageVersion);
+  theHeaderData->SetCreationDate(mDate);
+  theHeaderData->SetSchemaName(mSchemaName);
+  theHeaderData->SetSchemaVersion(mSchemaVersion);
+  theHeaderData->SetApplicationName(mApplicationName);
+  theHeaderData->SetApplicationVersion(mApplicationVersion);
+  theHeaderData->SetDataType(mDataType);
+
+  for (Standard_Integer i = 1; i <= mUserInfo.Length(); i++) {
+    theHeaderData->AddToUserInfo(mUserInfo.Value(i));
+  }
+}
 
 //=======================================================================
 //function : Tell
index 89ff410..3060a1d 100644 (file)
@@ -26,6 +26,7 @@
 #include <Storage_BaseDriver.hxx>
 #include <Storage_Error.hxx>
 #include <Storage_OpenMode.hxx>
+#include <Storage_Data.hxx>
 #include <Standard_Boolean.hxx>
 #include <Storage_Position.hxx>
 #include <Standard_Integer.hxx>
@@ -44,6 +45,7 @@ class Storage_StreamExtCharParityError;
 class TCollection_AsciiString;
 class TCollection_ExtendedString;
 class Storage_BaseDriver;
+class Storage_HeaderData;
 
 
 // Macro that tells if bytes must be reversed when read/write 
@@ -78,26 +80,52 @@ public:
   Standard_EXPORT static Storage_Error IsGoodFileType (const TCollection_AsciiString& aName);
   
   Standard_EXPORT Storage_Error BeginWriteInfoSection();
+
+  Standard_EXPORT static Standard_Integer WriteInfo (Standard_OStream& theOStream,
+                                                     const Standard_Integer nbObj,
+                                                     const TCollection_AsciiString& dbVersion,
+                                                     const TCollection_AsciiString& date,
+                                                     const TCollection_AsciiString& schemaName,
+                                                     const TCollection_AsciiString& schemaVersion,
+                                                     const TCollection_ExtendedString& appName,
+                                                     const TCollection_AsciiString& appVersion,
+                                                     const TCollection_ExtendedString& objectType,
+                                                     const TColStd_SequenceOfAsciiString& userInfo,
+                                                     const Standard_Boolean theOnlyCount = Standard_False);
   
   Standard_EXPORT void WriteInfo (const Standard_Integer nbObj, const TCollection_AsciiString& dbVersion, const TCollection_AsciiString& date, const TCollection_AsciiString& schemaName, const TCollection_AsciiString& schemaVersion, const TCollection_ExtendedString& appName, const TCollection_AsciiString& appVersion, const TCollection_ExtendedString& objectType, const TColStd_SequenceOfAsciiString& userInfo);
   
   Standard_EXPORT Storage_Error EndWriteInfoSection();
+
+  Standard_EXPORT Storage_Error EndWriteInfoSection(Standard_OStream& theOStream);
   
   Standard_EXPORT Storage_Error BeginReadInfoSection();
   
   Standard_EXPORT void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo);
   
+  Standard_EXPORT void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData);
+
   Standard_EXPORT Storage_Error EndReadInfoSection();
   
   Standard_EXPORT Storage_Error BeginWriteCommentSection();
   
+  Standard_EXPORT Storage_Error BeginWriteCommentSection (Standard_OStream& theOStream);
+  
   Standard_EXPORT void WriteComment (const TColStd_SequenceOfExtendedString& userComments);
   
+  Standard_EXPORT static Standard_Integer WriteComment (Standard_OStream& theOStream,
+                                                        const TColStd_SequenceOfExtendedString& theComments,
+                                                        const Standard_Boolean theOnlyCount = Standard_False);
+  
   Standard_EXPORT Storage_Error EndWriteCommentSection();
+
+  Standard_EXPORT Storage_Error EndWriteCommentSection (Standard_OStream& theOStream);
   
   Standard_EXPORT Storage_Error BeginReadCommentSection();
   
   Standard_EXPORT void ReadComment (TColStd_SequenceOfExtendedString& userComments);
+
+  Standard_EXPORT static void ReadComment (Standard_IStream& theIStream, TColStd_SequenceOfExtendedString& userComments);
   
   Standard_EXPORT Storage_Error EndReadCommentSection();
   
@@ -112,8 +140,12 @@ public:
   Standard_EXPORT Storage_Error BeginReadTypeSection();
   
   Standard_EXPORT Standard_Integer TypeSectionSize();
+
+  Standard_EXPORT static Standard_Integer TypeSectionSize(Standard_IStream& theIStream);
   
   Standard_EXPORT void ReadTypeInformations (Standard_Integer& typeNum, TCollection_AsciiString& typeName);
+
+  Standard_EXPORT static void ReadTypeInformations (Standard_IStream& theIStream, Standard_Integer& typeNum, TCollection_AsciiString& typeName);
   
   Standard_EXPORT Storage_Error EndReadTypeSection();
   
@@ -129,7 +161,11 @@ public:
   
   Standard_EXPORT Standard_Integer RootSectionSize();
   
+  Standard_EXPORT static Standard_Integer RootSectionSize(Standard_IStream& theIStream);
+  
   Standard_EXPORT void ReadRoot (TCollection_AsciiString& rootName, Standard_Integer& aRef, TCollection_AsciiString& aType);
+
+  Standard_EXPORT static void ReadRoot (Standard_IStream& theIStream, TCollection_AsciiString& rootName, Standard_Integer& aRef, TCollection_AsciiString& aType);
   
   Standard_EXPORT Storage_Error EndReadRootSection();
   
@@ -144,8 +180,12 @@ public:
   Standard_EXPORT Storage_Error BeginReadRefSection();
   
   Standard_EXPORT Standard_Integer RefSectionSize();
+
+  Standard_EXPORT static Standard_Integer RefSectionSize(Standard_IStream& theIStream);
   
   Standard_EXPORT void ReadReferenceType (Standard_Integer& reference, Standard_Integer& typeNum);
+
+  Standard_EXPORT static void ReadReferenceType (Standard_IStream& theIStream, Standard_Integer& reference, Standard_Integer& typeNum);
   
   Standard_EXPORT Storage_Error EndReadRefSection();
   
@@ -193,6 +233,10 @@ Storage_BaseDriver& operator << (const Standard_ExtCharacter aValue)
   return PutExtCharacter(aValue);
 }
   
+  Standard_EXPORT static Standard_Integer PutInteger (Standard_OStream& theOStream,
+                                                      const Standard_Integer aValue,
+                                                      const Standard_Boolean theOnlyCount = Standard_False);
+
   Standard_EXPORT Storage_BaseDriver& PutInteger (const Standard_Integer aValue);
 Storage_BaseDriver& operator << (const Standard_Integer aValue)
 {
@@ -224,6 +268,8 @@ Storage_BaseDriver& operator >> (Standard_Character& aValue)
 {
   return GetCharacter(aValue);
 }
+
+  Standard_EXPORT static void GetReference (Standard_IStream& theIStream, Standard_Integer& aValue);
   
   Standard_EXPORT Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue);
 Storage_BaseDriver& operator >> (Standard_ExtCharacter& aValue)
@@ -236,6 +282,8 @@ Storage_BaseDriver& operator >> (Standard_Integer& aValue)
 {
   return GetInteger(aValue);
 }
+
+  Standard_EXPORT static void GetInteger (Standard_IStream& theIStream, Standard_Integer& aValue);
   
   Standard_EXPORT Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue);
 Storage_BaseDriver& operator >> (Standard_Boolean& aValue)
@@ -288,6 +336,20 @@ Storage_BaseDriver& operator >> (Standard_ShortReal& aValue)
   ///Inverse bytes in size value
   Standard_EXPORT static Standard_Size InverseSize(const Standard_Size theValue);
 
+  Standard_EXPORT static void ReadHeader (Standard_IStream& theIStream, FSD_FileHeader& theFileHeader);
+
+  Standard_EXPORT static void ReadHeaderData (Standard_IStream& theIStream, const Handle(Storage_HeaderData)& theHeaderData);
+
+  Standard_EXPORT static void ReadString (Standard_IStream& theIStream, TCollection_AsciiString& buffer);
+
+  Standard_EXPORT static void ReadExtendedString (Standard_IStream& theIStream, TCollection_ExtendedString& buffer);
+
+  Standard_EXPORT static Standard_Integer WriteHeader (Standard_OStream&      theOStream, 
+                                                       const FSD_FileHeader&  theHeader,
+                                                       const Standard_Boolean theOnlyCount = Standard_False);
+
+  Standard_EXPORT static Standard_CString MagicNumber();
+
 protected:
 
   
@@ -299,12 +361,22 @@ protected:
   
   //! write string at the current position.
   Standard_EXPORT void WriteString (const TCollection_AsciiString& buffer);
+
+  //! write string at the current position.
+  Standard_EXPORT static Standard_Integer WriteString (Standard_OStream&              theOStream,
+                                                       const TCollection_AsciiString& theString,
+                                                       const Standard_Boolean         theOnlyCount = Standard_False);
   
   //! read string from the current position.
   Standard_EXPORT void ReadExtendedString (TCollection_ExtendedString& buffer);
   
   //! write string at the current position.
   Standard_EXPORT void WriteExtendedString (const TCollection_ExtendedString& buffer);
+  
+  //! write string at the current position.
+  Standard_EXPORT static Standard_Integer WriteExtendedString (Standard_OStream& theOStream,
+                                                               const TCollection_ExtendedString& theString,
+                                                               const Standard_Boolean theOnlyCount = Standard_False);
 
 private:
   
@@ -312,7 +384,6 @@ private:
   
   void ReadHeader();
   
-  static Standard_CString MagicNumber();
 
 private:
 
index 9259f67..5a50e31 100644 (file)
@@ -756,6 +756,16 @@ void FSD_CmpFile::ReadInfo(Standard_Integer& nbObj,
 }
 
 //=======================================================================
+//function : ReadCompleteInfo
+//purpose  : 
+//           
+//=======================================================================
+void FSD_CmpFile::ReadCompleteInfo( Standard_IStream& /*theIStream*/, Handle(Storage_Data)& /*theData*/)
+{
+
+}
+
+//=======================================================================
 //function : EndReadInfoSection
 //purpose  : COMMENTS SECTION
 //           write
index bf25679..5a67179 100644 (file)
@@ -75,6 +75,8 @@ public:
   
   Standard_EXPORT void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo);
   
+  Standard_EXPORT void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData);
+  
   Standard_EXPORT Storage_Error EndReadInfoSection();
   
   Standard_EXPORT Storage_Error BeginWriteCommentSection();
@@ -251,6 +253,7 @@ Storage_BaseDriver& operator >> (Standard_ShortReal& aValue)
   Destroy();
 }
 
+  Standard_EXPORT static Standard_CString MagicNumber();
 
 
 
@@ -281,8 +284,6 @@ protected:
 
 private:
   
-  static Standard_CString MagicNumber();
-  
   void RaiseError (const Handle(Standard_Type)& theFailure);
 
 private:
index 7d75f68..79bddfa 100644 (file)
@@ -750,6 +750,16 @@ void FSD_File::ReadInfo(Standard_Integer& nbObj,
 }
 
 //=======================================================================
+//function : ReadCompleteInfo
+//purpose  : 
+//           
+//=======================================================================
+void FSD_File::ReadCompleteInfo( Standard_IStream& /*theIStream*/, Handle(Storage_Data)& /*theData*/)
+{
+
+}
+
+//=======================================================================
 //function : EndReadInfoSection
 //purpose  : COMMENTS SECTION
 //           write
index 8f093b0..97e5c0b 100644 (file)
@@ -86,6 +86,8 @@ public:
   Standard_EXPORT Storage_Error BeginReadInfoSection();
   
   Standard_EXPORT void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo);
+
+  Standard_EXPORT void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData);
   
   Standard_EXPORT Storage_Error EndReadInfoSection();
   
@@ -269,6 +271,7 @@ Storage_BaseDriver& operator >> (Standard_ShortReal& aValue)
   Destroy();
 }
 
+  Standard_EXPORT static Standard_CString MagicNumber();
 
 
 
@@ -299,9 +302,7 @@ protected:
 
 private:
   
-  static Standard_CString MagicNumber();
 
-private:
 
   FSD_FStream myStream;
 };
index 432aaf4..51b2abf 100644 (file)
@@ -24,6 +24,7 @@
 #include <LDOM_BasicText.hxx>
 #include <LDOM_CharReference.hxx>
 #include <TCollection_ExtendedString.hxx>
+#include <OSD_OpenFile.hxx>
 
 #include <fcntl.h>
 #ifdef _MSC_VER
@@ -53,13 +54,14 @@ static
 inline
 #endif
         LDOM_XmlReader::RecordType ReadRecord (LDOM_XmlReader&  aReader,
+                                               Standard_IStream& theIStream,
                                                LDOM_OSStream&   aData)
 {
 #ifdef LDOM_PARSER_TRACE
   static aCounter = 0;
   ++ aCounter;
 #endif
-  const LDOM_XmlReader::RecordType aType = aReader.ReadRecord (aData);
+  const LDOM_XmlReader::RecordType aType = aReader.ReadRecord (theIStream, aData);
 #ifdef LDOM_PARSER_TRACE
   static FILE * ff = NULL;
   TCollection_AsciiString aTraceFileName;
@@ -117,10 +119,10 @@ Standard_Boolean LDOMParser::parse (istream& anInput)
 
   // Create the Reader instance
   if (myReader) delete myReader;
-  myReader = new LDOM_XmlReader (anInput, myDocument, myError);
+  myReader = new LDOM_XmlReader (myDocument, myError);
 
   // Parse
-  return ParseDocument();
+  return ParseDocument (anInput);
 }
 
 //=======================================================================
@@ -130,30 +132,18 @@ Standard_Boolean LDOMParser::parse (istream& anInput)
 
 Standard_Boolean LDOMParser::parse (const char * const aFileName)
 {
-  // Open the DOM Document
-  myDocument = new LDOM_MemManager (20000);
-  myError.Clear ();
+  std::ifstream aFileStream;
+  OSD_OpenStream (aFileStream, aFileName, std::ios::in);
 
-  // Open the file
-#ifdef _WIN32
-  TCollection_ExtendedString aFileNameW(aFileName, Standard_True);
-  int aFile = _wopen ((const wchar_t*) aFileNameW.ToExtString(), O_RDONLY);
-#else
-  int aFile = open (aFileName, O_RDONLY);
-#endif
-  if (aFile < 0) {
+  if (aFileStream.good())
+  {
+    return parse (aFileStream);
+  }
+  else
+  {
     myError = "Fatal XML error: Cannot open XML file";
     return Standard_True;
   }
-
-  // Create the Reader instance
-  if (myReader) delete myReader;
-  myReader = new LDOM_XmlReader (aFile, myDocument, myError);
-
-  // Parse
-  Standard_Boolean isError = ParseDocument();
-  close (aFile);
-  return isError;
 }
 
 //=======================================================================
@@ -161,14 +151,14 @@ Standard_Boolean LDOMParser::parse (const char * const aFileName)
 //purpose  : parse the whole document (abstracted from the XML source)
 //=======================================================================
 
-Standard_Boolean LDOMParser::ParseDocument ()
+Standard_Boolean LDOMParser::ParseDocument (istream& theIStream)
 {
   Standard_Boolean      isError   = Standard_False;
   Standard_Boolean      isElement = Standard_False;
   Standard_Boolean      isDoctype = Standard_False;
 
   for(;;) {
-    LDOM_XmlReader::RecordType aType = ReadRecord (*myReader, myCurrentData);
+    LDOM_XmlReader::RecordType aType = ReadRecord (*myReader, theIStream, myCurrentData);
     switch (aType) {
     case LDOM_XmlReader::XML_HEADER:
       if (isDoctype || isElement) {
@@ -211,7 +201,7 @@ Standard_Boolean LDOMParser::ParseDocument ()
           myError = "User abort at startElement()";
           break;
         }
-        isError = ParseElement ();
+        isError = ParseElement (theIStream);
         if (isError) break;
         continue;
       }
@@ -241,7 +231,7 @@ Standard_Boolean LDOMParser::ParseDocument ()
 //purpose  : parse one element, given the type of its XML presentation
 //=======================================================================
 
-Standard_Boolean LDOMParser::ParseElement ()
+Standard_Boolean LDOMParser::ParseElement (Standard_IStream& theIStream)
 {
   Standard_Boolean  isError = Standard_False;
   const LDOM_BasicElement * aParent = &myReader->GetElement();
@@ -250,7 +240,7 @@ Standard_Boolean LDOMParser::ParseElement ()
     LDOM_Node::NodeType aLocType;
     LDOMBasicString     aTextValue;
     char *aTextStr;
-    LDOM_XmlReader::RecordType aType = ReadRecord (* myReader, myCurrentData);
+    LDOM_XmlReader::RecordType aType = ReadRecord (* myReader, theIStream, myCurrentData);
     switch (aType) {
     case LDOM_XmlReader::XML_UNKNOWN:
       isError = Standard_True;
@@ -275,7 +265,7 @@ Standard_Boolean LDOMParser::ParseElement ()
         myError = "User abort at startElement()";
         break;
       }
-      isError = ParseElement ();
+      isError = ParseElement (theIStream);
       break;
     case LDOM_XmlReader::XML_END_ELEMENT:
       {
index d350e8f..bf99d1c 100644 (file)
@@ -73,9 +73,9 @@ class LDOMParser
 
  private:
   // ---------- PRIVATE METHODS ----------
-  Standard_Boolean      ParseDocument   ();
+  Standard_Boolean      ParseDocument   (Standard_IStream& theIStream);
 
-  Standard_Boolean      ParseElement    ();
+  Standard_Boolean      ParseElement    (Standard_IStream& theIStream);
 
   // ---------- PRIVATE (PROHIBITED) METHODS ----------
 
index 6e4d8a6..ff2d500 100644 (file)
@@ -63,32 +63,10 @@ static Standard_Boolean isName          (const char             * aString,
 //purpose  : Constructor (file descriptor)
 //=======================================================================
 
-LDOM_XmlReader::LDOM_XmlReader (const int                       theFileDes,
+LDOM_XmlReader::LDOM_XmlReader (
                                 const Handle(LDOM_MemManager)&  theDocument,
                                 TCollection_AsciiString&        theErrorString)
 : myEOF      (Standard_False),
-  myFileDes  (theFileDes),
-  myIStream  (cin),  // just a placeholder, myIStream will never be used anyway
-  myError    (theErrorString),
-  myDocument (theDocument),
-  myElement  (NULL),
-  myLastChild(NULL), 
-  myPtr      (&myBuffer[0]),
-  myEndPtr   (&myBuffer[0])
-{
-}
-
-//=======================================================================
-//function : LDOM_XmlReader()
-//purpose  : Constructor (istream)
-//=======================================================================
-
-LDOM_XmlReader::LDOM_XmlReader (istream&                        theInput,
-                                const Handle(LDOM_MemManager)&  theDocument,
-                                TCollection_AsciiString&        theErrorString)
-: myEOF      (Standard_False),
-  myFileDes  (FILE_NONVALUE),
-  myIStream  (theInput),
   myError    (theErrorString),
   myDocument (theDocument),
   myElement  (NULL),
@@ -103,8 +81,8 @@ LDOM_XmlReader::LDOM_XmlReader (istream&                        theInput,
 //purpose  : Read a record from XML file
 //=======================================================================
 
-LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord
-                                        (LDOM_OSStream& theData)
+LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord (Standard_IStream& theIStream,
+                                        LDOM_OSStream& theData)
 {
   theData.Clear();
   myError.Clear();
@@ -136,14 +114,9 @@ LDOM_XmlReader::RecordType LDOM_XmlReader::ReadRecord
       // Read the full buffer and reset start and end buffer pointers
         myPtr    = &myBuffer[0];
         Standard_Size aNBytes;
-        if (myFileDes != FILE_NONVALUE)
-          aNBytes = read (myFileDes, &myBuffer[aBytesRest],
-                          XML_BUFFER_SIZE - aBytesRest);
-        else {
-          myIStream.read (&myBuffer[aBytesRest],
+          theIStream.read (&myBuffer[aBytesRest],
                           XML_BUFFER_SIZE - aBytesRest);
-          aNBytes = (Standard_Size)myIStream.gcount();
-        }
+          aNBytes = (Standard_Size)theIStream.gcount();
         if (aNBytes == 0)
           myEOF = Standard_True;                  // END-OF-FILE
         myEndPtr = &myBuffer[aBytesRest + aNBytes];
index 90550a6..f40de60 100644 (file)
@@ -47,15 +47,12 @@ class LDOM_XmlReader
   };
 
   // ---------- PUBLIC METHODS ----------
-  LDOM_XmlReader (const int aFileDes, const Handle(LDOM_MemManager)& aDocument,
+  LDOM_XmlReader (const Handle(LDOM_MemManager)& aDocument,
                   TCollection_AsciiString& anErrorString);
   // Constructor - takes a file descriptor for input
-
-  LDOM_XmlReader (istream& anInput, const Handle(LDOM_MemManager)& aDocument,
-                  TCollection_AsciiString& anErrorString);
   // Constructor - takes an istream for input
 
-  RecordType            ReadRecord      (LDOM_OSStream& theData);
+  RecordType            ReadRecord      (Standard_IStream& theIStream, LDOM_OSStream& theData);
   // reading a markup or other element of XML format
 
   LDOM_BasicElement&    GetElement      () const        { return * myElement; }
@@ -78,8 +75,6 @@ class LDOM_XmlReader
   // ---------- PRIVATE FIELDS ----------
 
   Standard_Boolean              myEOF;
-  int                           myFileDes; // alternative 1: file descriptor
-  istream&                      myIStream; // alternative 2: istream
   TCollection_AsciiString       & myError;
   Handle(LDOM_MemManager)       myDocument;
   LDOM_BasicElement             * myElement;
index 2c10b63..b2210e5 100644 (file)
 #define chLatin_Y       'Y'
 #define chLatin_Z       'Z'
 
-static const LXMLCh  gEndElement[] = { chOpenAngle, chForwardSlash, chNull };
-static const LXMLCh  gEndElement1[]= { chForwardSlash, chNull };
-//static const LXMLCh  gEndPI[] = { chQuestion, chCloseAngle, chNull };
-//static const LXMLCh  gStartPI[] = { chOpenAngle, chQuestion, chNull };
-static const LXMLCh  gXMLDecl1[] =
+static const char  gEndElement[] = { chOpenAngle, chForwardSlash, chNull };
+static const char  gEndElement1[]= { chForwardSlash, chNull };
+
+static const char  gXMLDecl1[] =
 {       chOpenAngle, chQuestion, chLatin_x, chLatin_m, chLatin_l
     ,   chSpace, chLatin_v, chLatin_e, chLatin_r, chLatin_s, chLatin_i
     ,   chLatin_o, chLatin_n, chEqual, chDoubleQuote, chNull
 };
-static const LXMLCh  gXMLDecl2[] =
+static const char  gXMLDecl2[] =
 {       chDoubleQuote, chSpace, chLatin_e, chLatin_n, chLatin_c
     ,   chLatin_o, chLatin_d, chLatin_i, chLatin_n, chLatin_g, chEqual
     ,   chDoubleQuote, chNull
 };
-/*
-static const LXMLCh  gXMLDecl3[] =
-{       chDoubleQuote, chSpace, chLatin_s, chLatin_t, chLatin_a
-    ,   chLatin_n, chLatin_d, chLatin_a, chLatin_l, chLatin_o
-    ,   chLatin_n, chLatin_e, chEqual, chDoubleQuote, chNull
-};
-*/
-static const LXMLCh  gXMLDecl4[] =
+
+static const char  gXMLDecl4[] =
 {       chDoubleQuote, chQuestion, chCloseAngle
     ,   chLF, chNull
 };
-static const LXMLCh  gStartCDATA[] =
+static const char  gStartCDATA[] =
 {       chOpenAngle, chBang, chOpenSquare, chLatin_C, chLatin_D,
         chLatin_A, chLatin_T, chLatin_A, chOpenSquare, chNull
 };
-static const LXMLCh  gEndCDATA[] =
+static const char  gEndCDATA[] =
 {    chCloseSquare, chCloseSquare, chCloseAngle, chNull };
-static const LXMLCh  gStartComment[] =
+static const char  gStartComment[] =
 {    chOpenAngle, chBang, chDash, chDash, chNull };
-static const LXMLCh  gEndComment[] =
+static const char  gEndComment[] =
 {    chDash, chDash, chCloseAngle, chNull };
-/*
-static const LXMLCh  gStartDoctype[] =
-{   chOpenAngle, chBang, chLatin_D, chLatin_O, chLatin_C, chLatin_T,
-    chLatin_Y, chLatin_P, chLatin_E, chSpace, chNull
-};
-static const LXMLCh  gPublic[] =
-{   chLatin_P, chLatin_U, chLatin_B, chLatin_L, chLatin_I,
-    chLatin_C, chSpace, chDoubleQuote, chNull
-};
-static const LXMLCh  gSystem[] =
-{   chLatin_S, chLatin_Y, chLatin_S, chLatin_T, chLatin_E,
-    chLatin_M, chSpace, chDoubleQuote, chNull
-};
-static const LXMLCh  gStartEntity[] =
-{   chOpenAngle, chBang, chLatin_E, chLatin_N, chLatin_T, chLatin_I,
-    chLatin_T, chLatin_Y, chSpace, chNull
-};
-static const LXMLCh  gNotation[] =
-{   chLatin_N, chLatin_D, chLatin_A, chLatin_T, chLatin_A,
-    chSpace, chDoubleQuote, chNull
-};
-*/
 
-static LXMLCh * getEncodingName (const LXMLCh * theEncodingName)
+static char* getEncodingName (const char* theEncodingName)
 {
-  const LXMLCh * anEncoding = theEncodingName;
+  const char* anEncoding = theEncodingName;
   if (theEncodingName == NULL)
   {
-//  anEncoding =           // US-ASCII
-//  { chLatin_U, chLatin_S, chDash, chLatin_A, chLatin_S, chLatin_C, chLatin_I,
-//      chLatin_I, chNull };
-    static const LXMLCh anUTFEncoding [] =   // UTF-8
-      { chLatin_U, chLatin_T, chLatin_F, chDash, chEight, chNull };
+    static const char anUTFEncoding [] =  {chLatin_U, chLatin_T, chLatin_F, chDash, chEight, chNull};
     anEncoding = anUTFEncoding;
   }
+
   Standard_Integer aLen = 0;
   while (anEncoding[aLen++] != chNull);
-  LXMLCh * aResult = new LXMLCh [aLen];
-  memcpy (aResult, anEncoding, aLen * sizeof (LXMLCh));
+
+  char * aResult = new char [aLen];
+  memcpy (aResult, anEncoding, aLen * sizeof (char));
+  
   return aResult;
 }
 
 //=======================================================================
-//function : LH3D_LXMLWriter()
-//purpose  : Constructor
+//function : LDOM_XmlWriter
+//purpose  : 
 //=======================================================================
-LDOM_XmlWriter::LDOM_XmlWriter (FILE            * aFile,
-                                const LXMLCh    * theEncoding)
-     : myFile         (aFile),
-       myEncodingName (::getEncodingName (theEncoding)),
-       myIndent       (0),
-       myCurIndent    (0),
-       myABuffer      (NULL),
-       myABufferLen   (0)
-{}
+LDOM_XmlWriter::LDOM_XmlWriter (const char * theEncoding)
+ : myEncodingName (::getEncodingName (theEncoding)),
+   myIndent       (0),
+   myCurIndent    (0),
+   myABuffer      (NULL),
+   myABufferLen   (0)
+{
+  ;
+}
 
 //=======================================================================
 //function : ~LDOM_XmlWriter
 //purpose  : Destructor
 //=======================================================================
-
 LDOM_XmlWriter::~LDOM_XmlWriter ()
 {
   delete [] myEncodingName;
-  if (myABuffer != NULL) delete [] myABuffer;
-}
 
-//=======================================================================
-//function : operator <<
-//purpose  : 
-//=======================================================================
-
-LDOM_XmlWriter& LDOM_XmlWriter::operator <<     (const LDOM_Document& aDoc)
-{
-  const char * anXMLversion = "1.0";
-  * this << gXMLDecl1 << anXMLversion
-    << gXMLDecl2 << myEncodingName << gXMLDecl4;
-
-  return (* this << aDoc.getDocumentElement());
-}
-
-//=======================================================================
-//function : operator <<
-//purpose  : Stream out an LDOMString
-//=======================================================================
-
-inline LDOM_XmlWriter& LDOM_XmlWriter::operator <<
-                                        (const LDOMBasicString& aString)
-{
-  switch (aString.Type()) {
-  case LDOMBasicString::LDOM_Integer:
-    {
-      Standard_Integer aValue;
-      aString.GetInteger (aValue);
-      fprintf (myFile, "%d", aValue);
-      break;
-    }
-  case LDOMBasicString::LDOM_AsciiHashed:       // attr names and element tags
-  case LDOMBasicString::LDOM_AsciiDocClear:
-    {
-      const char * str = aString.GetString();
-      if (str) {
-        const Standard_Size aLen = strlen (str);
-        if (aLen > 0) fwrite (str, aLen, 1, myFile);
-      }
-    }
-    break;
-  case LDOMBasicString::LDOM_AsciiFree:
-  case LDOMBasicString::LDOM_AsciiDoc:
-    {
-      const char * str = aString.GetString();
-      if (str) {
-        Standard_Integer aLen;
-        char * encStr = LDOM_CharReference::Encode(str, aLen, Standard_False);
-        if (aLen > 0) fwrite (encStr, aLen, 1, myFile);
-        if (encStr != str) delete [] encStr;
-      }
-    }
-  default: ;
+  if (myABuffer != NULL)
+  {
+    delete [] myABuffer;
   }
-  return * this;
 }
 
 //=======================================================================
-//function : operator<<()
-//purpose  : Stream out a char *.
+//function : Write
+//purpose  : 
 //=======================================================================
-inline LDOM_XmlWriter& LDOM_XmlWriter::operator << (const LXMLCh * aString)
+void LDOM_XmlWriter::Write (Standard_OStream& theOStream, const LDOM_Document& aDoc)
 {
-  Standard_Size aLength = strlen (aString);
-  if (aLength > 0) fwrite ((void *) aString, aLength, 1, myFile);
-  return * this;
-}
+  Write (theOStream, gXMLDecl1);
 
-//=======================================================================
-//function : operator<<()
-//purpose  : Stream out a character.
-//=======================================================================
-inline LDOM_XmlWriter& LDOM_XmlWriter::operator << (const LXMLCh aChar)
-{
-  fputc (aChar, myFile);
-  return * this;
-}
+  const char * anXMLversion = "1.0"; 
+  Write (theOStream, anXMLversion);
 
-//=======================================================================
-//function : WriteAttribute()
-//purpose  : Stream out an XML attribute.
-//=======================================================================
-void LDOM_XmlWriter::WriteAttribute (const LDOM_Node& theAtt)
-{
-  int        aLength;
-  const char * aName = theAtt.getNodeName().GetString();
-  const LDOMString aValueStr = theAtt.getNodeValue();
+  Write (theOStream, gXMLDecl2);
+  Write (theOStream, myEncodingName);
+  Write (theOStream, gXMLDecl4);
 
-  //    Integer attribute value
-  if (aValueStr.Type() == LDOMBasicString::LDOM_Integer) {
-    Standard_Integer anIntValue;
-    aValueStr.GetInteger (anIntValue);
-    aLength = (Standard_Integer) (20 + strlen (aName));
-    if (aLength > myABufferLen) {
-      if (myABuffer != NULL) delete [] myABuffer;
-      myABuffer    = new char [aLength+1];
-      myABufferLen = aLength;
-    }
-    sprintf (myABuffer, "%c%s%c%c%d%c", chSpace, aName,
-             chEqual, chDoubleQuote, anIntValue, chDoubleQuote);
-    aLength = (Standard_Integer) strlen (myABuffer);
-
-  //    String attribute value
-  } else {
-    const char  * aValue = aValueStr.GetString();
-    char        * encStr;
-    if (aValueStr.Type() == LDOMBasicString::LDOM_AsciiDocClear) {
-      encStr  = (char *) aValue;
-      aLength = (Standard_Integer) (4 + strlen (aValue) + strlen (aName));
-    } else {
-      encStr = LDOM_CharReference::Encode (aValue, aLength, Standard_True);
-      aLength += (Standard_Integer) (4 + strlen (aName));
-    }
-    if (aLength > myABufferLen) {
-      if (myABuffer != NULL) delete [] myABuffer;
-      myABuffer    = new char [aLength+1];
-      myABufferLen = aLength;
-    }
-    sprintf (myABuffer, "%c%s%c%c%s%c", chSpace, aName,
-             chEqual, chDoubleQuote, encStr, chDoubleQuote);
-    if (encStr != aValue) delete [] encStr;
-  }
-  fwrite ((void *) myABuffer, aLength, 1, myFile);
+  Write (theOStream, aDoc.getDocumentElement());
 }
 
 //=======================================================================
-//function : operator<<()
-//purpose  : Stream out a DOM node, and, recursively, all of its children.
-//           This function is the heart of writing a DOM tree out as XML source.
-//           Give it a document node and it will do the whole thing.
+//function : Write
+//purpose  : 
 //=======================================================================
-LDOM_XmlWriter& LDOM_XmlWriter::operator<<     (const LDOM_Node& theNodeToWrite)
+void LDOM_XmlWriter::Write (Standard_OStream& theOStream, const LDOM_Node& theNode)
 {
   // Get the name and value out for convenience
-  LDOMString   aNodeName  = theNodeToWrite.getNodeName();
-  LDOMString   aNodeValue = theNodeToWrite.getNodeValue();
-//  unsigned long dwLent = aNodeValue.length();
+  LDOMString aNodeName  = theNode.getNodeName();
+  LDOMString aNodeValue = theNode.getNodeValue();
 
-  switch (theNodeToWrite.getNodeType()) 
+  switch (theNode.getNodeType()) 
   {
-  case LDOM_Node::TEXT_NODE : 
-    * this << aNodeValue;
+    case LDOM_Node::TEXT_NODE : 
+    Write (theOStream, aNodeValue);
     break;
-  case LDOM_Node::ELEMENT_NODE : 
+    case LDOM_Node::ELEMENT_NODE : 
     {
       const int aMaxNSpaces    = 40;
-      static LXMLCh aSpaces [] = {
+      static char aSpaces [] = {
         chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace,
         chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace,
         chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace,
         chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace,
         chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace, chSpace,
         chOpenAngle, chNull };
-      const LXMLCh * anIndentString = &aSpaces [aMaxNSpaces -  myCurIndent];
-      if (anIndentString < &aSpaces[0]) anIndentString = &aSpaces[0];
+      const char * anIndentString = &aSpaces [aMaxNSpaces -  myCurIndent];
+      
+      if (anIndentString < &aSpaces[0])
+      {
+        anIndentString = &aSpaces[0];
+      }
 
       // Output the element start tag.
-      * this << anIndentString << aNodeName.GetString();
+      Write (theOStream, anIndentString);
+      Write (theOStream, aNodeName.GetString());
 
-        // Output any attributes of this element
-      const LDOM_Element& anElemToWrite = (const LDOM_Element&) theNodeToWrite;
-      LDOM_NodeList aListAtt = anElemToWrite.GetAttributesList ();
+      // Output any attributes of this element
+      const LDOM_Element& anElemToWrite = (const LDOM_Element&)theNode;
+      LDOM_NodeList aListAtt = anElemToWrite.GetAttributesList();
       Standard_Integer aListInd = aListAtt.getLength();
-      while (aListInd--) {
+      
+      while (aListInd--)
+      {
         LDOM_Node aChild = aListAtt.item (aListInd);
-        WriteAttribute (aChild);
+        WriteAttribute (theOStream, aChild);
       }
 
       //  Test for the presence of children
-      LDOM_Node aChild = theNodeToWrite.getFirstChild();
+      LDOM_Node aChild = theNode.getFirstChild();
       if (aChild != 0) 
       {
         // There are children. Close start-tag, and output children.
-        * this << chCloseAngle;
+        Write (theOStream, chCloseAngle);
         if (aChild.getNodeType() == LDOM_Node::ELEMENT_NODE && myIndent > 0)
-          * this << chLF;
+        {
+          Write(theOStream, chLF);
+        }
+
         Standard_Boolean isChildElem = Standard_False;
         while( aChild != 0) 
         {
           isChildElem = (aChild.getNodeType() == LDOM_Node::ELEMENT_NODE);
-          if (isChildElem)  myCurIndent += myIndent;
-          *this << aChild;
-          if (isChildElem)  myCurIndent -= myIndent;
-          do aChild = aChild.getNextSibling();
-          while (aChild.getNodeType() == LDOM_Node::ATTRIBUTE_NODE);
+          if (isChildElem)
+          {
+            myCurIndent += myIndent;
+          }
+
+          Write(theOStream, aChild);
+          
+          if (isChildElem)
+          {
+            myCurIndent -= myIndent;
+          }
+
+          do 
+          {
+            aChild = aChild.getNextSibling();
+          } while (aChild.getNodeType() == LDOM_Node::ATTRIBUTE_NODE);
         }
+
         // Done with children.  Output the end tag.
-        //
         if (isChildElem)
-          * this << anIndentString
-            << gEndElement1 << aNodeName.GetString() << chCloseAngle;
+        {
+          Write (theOStream, anIndentString);
+          Write (theOStream, gEndElement1);
+          Write (theOStream, aNodeName.GetString());
+          Write (theOStream, chCloseAngle);
+        }
         else
-          * this << gEndElement << aNodeName.GetString() << chCloseAngle;
+        {
+          Write (theOStream, gEndElement);
+          Write (theOStream, aNodeName.GetString());
+          Write (theOStream, chCloseAngle);
+        }
       }
       else
       {
         //  There were no children. Output the short form close of
         //  the element start tag, making it an empty-element tag.
-        * this << chForwardSlash << chCloseAngle;
+        Write (theOStream, chForwardSlash);
+        Write (theOStream, chCloseAngle);
       }
+
       if (myIndent > 0)
-        * this << chLF;
+      {
+        Write (theOStream, chLF);
+      }
       break;
     }
     case LDOM_Node::CDATA_SECTION_NODE: 
     {
-      * this << gStartCDATA << aNodeValue << gEndCDATA;
+      Write (theOStream, gStartCDATA);
+      Write (theOStream, aNodeValue);
+      Write (theOStream, gEndCDATA);
       break;
     }
     case LDOM_Node::COMMENT_NODE: 
     {
-      * this << gStartComment << aNodeValue << gEndComment;
+      Write (theOStream, gStartComment);
+      Write (theOStream, aNodeValue);
+      Write (theOStream, gEndComment);
       break;
     }
   default:
 #ifndef _MSC_VER
       cerr << "Unrecognized node type = "
-        << (long)theNodeToWrite.getNodeType() << endl
+        << (long)theNode.getNodeType() << endl
 #endif
   ; }
-  return *this;
+}
+
+//=======================================================================
+//function : 
+//purpose  : Stream out an LDOMString
+//=======================================================================
+void LDOM_XmlWriter::Write (Standard_OStream& theOStream, const LDOMBasicString& theString)
+{
+  switch (theString.Type())
+  {
+    case LDOMBasicString::LDOM_Integer:
+    {
+      Standard_Integer aValue;
+      theString.GetInteger (aValue);
+
+      TCollection_AsciiString aStrValue (aValue);
+      theOStream.write(aStrValue.ToCString(), strlen (aStrValue.ToCString()));
+
+      break;
+    }
+    case LDOMBasicString::LDOM_AsciiHashed:       // attr names and element tags
+    case LDOMBasicString::LDOM_AsciiDocClear:
+    {
+      const char* aStr = theString.GetString();
+      if (aStr)
+      {
+        const Standard_Size aLen = strlen (aStr);
+        if (aLen > 0) 
+        {
+          theOStream.write(aStr, aLen);
+        }
+      }
+    }
+    break;
+    case LDOMBasicString::LDOM_AsciiFree:
+    case LDOMBasicString::LDOM_AsciiDoc:
+    {
+      const char* aStr = theString.GetString();
+      if (aStr)
+      {
+        Standard_Integer aLen;
+        char* encStr = LDOM_CharReference::Encode (aStr, aLen, Standard_False);
+        if (aLen > 0)
+        {
+          theOStream.write(encStr, aLen);
+        }
+
+        if (encStr != aStr)
+        {
+          delete [] encStr;
+        }
+      }
+    }
+  default: ;
+  }
+}
+
+//=======================================================================
+//function : Write
+//purpose  : Stream out a char
+//=======================================================================
+void LDOM_XmlWriter::Write (Standard_OStream& theOStream, const char theChar)
+{
+  theOStream.write (&theChar, sizeof(char));
+}
+
+//=======================================================================
+//function : Write
+//purpose  : Stream out a char *
+//=======================================================================
+void LDOM_XmlWriter::Write (Standard_OStream& theOStream, const char * theString)
+{
+  Standard_Size aLength = strlen (theString);
+  if (aLength > 0)
+  {
+    theOStream.write (theString, aLength);
+  }
+}
+
+//=======================================================================
+//function : WriteAttribute()
+//purpose  : Stream out an XML attribute.
+//=======================================================================
+void LDOM_XmlWriter::WriteAttribute (Standard_OStream& theOStream, const LDOM_Node& theAtt)
+{
+  const char* aName = theAtt.getNodeName().GetString();
+  const LDOMString aValueStr = theAtt.getNodeValue();
+
+  int aLength = 0;
+
+  // Integer attribute value
+  if (aValueStr.Type() == LDOMBasicString::LDOM_Integer)
+  {
+    Standard_Integer anIntValue;
+    aValueStr.GetInteger (anIntValue);
+
+    aLength = (Standard_Integer)(20 + strlen (aName));
+    if (aLength > myABufferLen)
+    {
+      if (myABuffer != NULL)
+      {
+        delete [] myABuffer;
+      }
+      
+      myABuffer    = new char [aLength+1];
+      myABufferLen = aLength;
+    }
+    sprintf (myABuffer, "%c%s%c%c%d%c", chSpace, aName, chEqual, chDoubleQuote, anIntValue, chDoubleQuote);
+    aLength = (Standard_Integer)strlen (myABuffer);
+
+  
+  }
+  else // String attribute value
+  {
+    char* encStr;
+    const char* aValue = aValueStr.GetString();
+    if (aValueStr.Type() == LDOMBasicString::LDOM_AsciiDocClear)
+    {
+      encStr  = (char *) aValue;
+      aLength = (Standard_Integer) (4 + strlen (aValue) + strlen (aName));
+    }
+    else
+    {
+      encStr = LDOM_CharReference::Encode (aValue, aLength, Standard_True);
+      aLength += (Standard_Integer) (4 + strlen (aName));
+    }
+
+    if (aLength > myABufferLen)
+    {
+      if (myABuffer != NULL) 
+      {
+        delete [] myABuffer;
+      }
+      
+      myABuffer    = new char [aLength+1];
+      myABufferLen = aLength;
+    }
+
+    sprintf (myABuffer, "%c%s%c%c%s%c", chSpace, aName, chEqual, chDoubleQuote, encStr, chDoubleQuote);
+    
+    if (encStr != aValue)
+    {
+      delete [] encStr;
+    }
+  }
+
+  theOStream.write (myABuffer, aLength);
 }
index 9965e5c..4ef47d4 100644 (file)
 #ifndef LDOM_XmlWriter_HeaderFile
 #define LDOM_XmlWriter_HeaderFile
 
+#include <Standard_OStream.hxx>
 #include <Standard_TypeDef.hxx>
 #include <stdio.h>
 
-typedef char LXMLCh;
-
 class LDOM_Document;
 class LDOM_Node;
 class LDOMBasicString;
 
 class LDOM_XmlWriter
 {
- public:
-
-  Standard_EXPORT LDOM_XmlWriter (FILE * aFile, const char * theEncoding= NULL);
-  // Constructor
+public:
 
+  Standard_EXPORT LDOM_XmlWriter (const char* theEncoding = NULL);
+  
   Standard_EXPORT ~LDOM_XmlWriter ();
-  // Destructor
 
-  void SetIndentation (const Standard_Integer theIndent) { myIndent=theIndent; }
   // Set indentation for output (by default 0)
+  void SetIndentation (const Standard_Integer theIndent) { myIndent = theIndent; }
 
-  Standard_EXPORT LDOM_XmlWriter& operator<<    (const LDOM_Document& aDoc);
+  Standard_EXPORT void Write (Standard_OStream& theOStream, const LDOM_Document& theDoc);
 
-  Standard_EXPORT LDOM_XmlWriter& operator<<    (const LDOM_Node& toWrite);
-  //  ostream << DOM_Node   
   //  Stream out a DOM node, and, recursively, all of its children. This
   //  function is the heart of writing a DOM tree out as XML source. Give it
   //  a document node and it will do the whole thing.
+  Standard_EXPORT void Write (Standard_OStream& theOStream, const LDOM_Node& theNode);
 
- private:
-
-  void  WriteAttribute (const LDOM_Node& theAtt);
-
-  LDOM_XmlWriter& operator<< (const LDOMBasicString&);
-  //  Stream out LDOM String
-
-  inline LDOM_XmlWriter& operator<< (const LXMLCh * toWrite);
-  //  Stream out a character string. Doing this requires that we first transcode
-  //  to char * form in the default code page for the system
-
-  inline LDOM_XmlWriter& operator <<    (const LXMLCh aChar);
+private:
 
   LDOM_XmlWriter (const LDOM_XmlWriter& anOther);
-  //    Copy constructor - prohibited
 
   LDOM_XmlWriter& operator = (const LDOM_XmlWriter& anOther);
-  //    Assignment operator - prohibited
+  
+  void Write (Standard_OStream& theOStream, const LDOMBasicString& theString);
+  void Write (Standard_OStream& theOStream, const char* theString); 
+  void Write (Standard_OStream& theOStream, const char theChar);
+
+  void  WriteAttribute (Standard_OStream& theOStream, const LDOM_Node& theAtt);
 
  private:
 
-  FILE                          * myFile;
-  LXMLCh                        * myEncodingName;
-  Standard_Integer              myIndent;
-  Standard_Integer              myCurIndent;
-  char *                        myABuffer;      // for WriteAttribute()
-  Standard_Integer              myABufferLen;   // for WriteAttribute()
+  char*            myEncodingName;
+  Standard_Integer myIndent;
+  Standard_Integer myCurIndent;
+  char*            myABuffer;
+  Standard_Integer myABufferLen;
 };
 
 #endif
index e46a5ca..5c36817 100644 (file)
@@ -103,3 +103,48 @@ PCDM_TypeOfFileDriver PCDM::FileDriverType(const TCollection_AsciiString& aFileN
     return PCDM_TOFD_Unknown;
   }
 }
+
+//=======================================================================
+//function : FileDriverType
+//purpose  : 
+//=======================================================================
+
+PCDM_TypeOfFileDriver PCDM::FileDriverType (Standard_IStream& theIStream, PCDM_BaseDriverPointer& theBaseDriver)
+{
+  TCollection_AsciiString aReadMagicNumber;
+
+  if (theIStream.good())
+  {
+    streampos aDocumentPos = theIStream.tellg();
+
+    // read magic number from the file
+    aReadMagicNumber = Storage_BaseDriver::ReadMagicNumber (theIStream);
+
+    if (!theIStream.good())
+    {
+      theIStream.clear();
+    }
+
+    theIStream.seekg(aDocumentPos);
+  }
+
+  if(aReadMagicNumber == FSD_CmpFile::MagicNumber())
+  {
+    theBaseDriver = new FSD_CmpFile;
+    return PCDM_TOFD_CmpFile;
+  }
+  else if (aReadMagicNumber == FSD_File::MagicNumber())
+  {
+    theBaseDriver = new FSD_File;
+    return PCDM_TOFD_File;
+  }
+  else if (aReadMagicNumber == FSD_BinaryFile::MagicNumber())
+  {
+    theBaseDriver = new FSD_BinaryFile;
+    return PCDM_TOFD_File;
+  }
+
+  theBaseDriver = NULL;
+  return PCDM_TOFD_Unknown;
+}
+
index 90f24d0..ae7f1d7 100644 (file)
@@ -21,6 +21,8 @@
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
 
+#include <Standard_IStream.hxx>
+
 #include <Standard_Boolean.hxx>
 #include <PCDM_TypeOfFileDriver.hxx>
 #include <PCDM_BaseDriverPointer.hxx>
@@ -74,6 +76,8 @@ private:
 
   
   Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (const TCollection_AsciiString& aFileName, PCDM_BaseDriverPointer& aBaseDriver);
+  
+  Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (Standard_IStream& theIStream, PCDM_BaseDriverPointer& theBaseDriver);
 
 
 
index b210eae..b42b8a8 100644 (file)
@@ -40,6 +40,8 @@ IMPLEMENT_STANDARD_RTTIEXT(PCDM_ReadWriter,Standard_Transient)
 static TCollection_ExtendedString TryXmlDriverType
                                 (const TCollection_AsciiString& theFileName);
 
+static TCollection_ExtendedString TryXmlDriverType (Standard_IStream& theIStream);
+
 //=======================================================================
 //function : Open
 //purpose  : 
@@ -152,6 +154,41 @@ TCollection_ExtendedString PCDM_ReadWriter::FileFormat
 }
 
 //=======================================================================
+//function : FileFormat
+//purpose  : 
+//=======================================================================
+
+TCollection_ExtendedString PCDM_ReadWriter::FileFormat (Standard_IStream& theIStream, Handle(Storage_Data)& theData)
+{
+  TCollection_ExtendedString aFormat;
+
+  Storage_BaseDriver* aFileDriver;
+  if (PCDM::FileDriverType (theIStream, aFileDriver) == PCDM_TOFD_Unknown)
+  {
+    return ::TryXmlDriverType (theIStream);
+  }
+  
+  // the stream starts with a magic number, FileDriverType has read
+  // them already but returned the stream pos to initial state,
+  // thus we should read them before reading of info section
+  aFileDriver->ReadMagicNumber(theIStream);
+
+  aFileDriver->ReadCompleteInfo (theIStream, theData);
+
+  for (Standard_Integer i = 1; i <= theData->HeaderData()->UserInfo().Length(); i++)
+  {
+    const TCollection_AsciiString& aLine = theData->HeaderData()->UserInfo().Value(i);
+
+    if(aLine.Search (FILE_FORMAT) != -1)
+    {
+      aFormat = TCollection_ExtendedString (aLine.Token(" ",2).ToCString(), Standard_True);
+    }
+  }
+
+  return aFormat;
+}
+
+//=======================================================================
 //function : ::TryXmlDriverType
 //purpose  : called from FileFormat()
 //=======================================================================
@@ -174,3 +211,39 @@ static TCollection_ExtendedString TryXmlDriverType
   }
   return theFormat;
 }
+
+//=======================================================================
+//function : ::TryXmlDriverType
+//purpose  : called from FileFormat()
+//=======================================================================
+
+static TCollection_ExtendedString TryXmlDriverType (Standard_IStream& theIStream)
+{
+  TCollection_ExtendedString theFormat;
+  PCDM_DOMHeaderParser       aParser;
+  const char                 * aDocumentElementName = "document";
+  aParser.SetStartElementName (Standard_CString(aDocumentElementName));
+
+  if (theIStream.good())
+  {
+    streampos aDocumentPos = theIStream.tellg();
+
+    // Parse the file; if there is no error or an error appears before retrieval
+    // of the DocumentElement, the XML format cannot be defined
+    if (aParser.parse (theIStream))
+    {
+      LDOM_Element anElement = aParser.GetElement();
+      if (anElement.getTagName().equals (LDOMString(aDocumentElementName)))
+        theFormat = anElement.getAttribute ("format");
+    }
+
+    if (!theIStream.good())
+    {
+      theIStream.clear();
+    }
+
+    theIStream.seekg(aDocumentPos);
+  }
+
+  return theFormat;
+}
index 564ce9b..a66ad8e 100644 (file)
@@ -76,6 +76,10 @@ public:
   //! a FileFormat information.
   Standard_EXPORT static TCollection_ExtendedString FileFormat (const TCollection_ExtendedString& aFileName);
 
+  //! tries  to get a format  from the stream.  returns an empty
+  //! string if the file could not be read or does not have
+  //! a FileFormat information.
+  Standard_EXPORT static TCollection_ExtendedString FileFormat (Standard_IStream& theIStream, Handle(Storage_Data)& theData);
 
 
 
index 447ee83..85b39e5 100644 (file)
@@ -22,6 +22,9 @@
 
 #include <PCDM_ReaderStatus.hxx>
 #include <Standard_Transient.hxx>
+#include <Standard_IStream.hxx>
+#include <Storage_Data.hxx>
+
 class PCDM_DriverError;
 class CDM_Document;
 class TCollection_ExtendedString;
@@ -43,6 +46,11 @@ public:
   
   //! retrieves the content of the file into a new Document.
   Standard_EXPORT virtual void Read (const TCollection_ExtendedString& aFileName, const Handle(CDM_Document)& aNewDocument, const Handle(CDM_Application)& anApplication) = 0;
+
+  Standard_EXPORT virtual void Read (Standard_IStream&               theIStream,
+                                      const Handle(Storage_Data)&    theStorageData,
+                                      const Handle(CDM_Document)&    theDoc,
+                                      const Handle(CDM_Application)& theApplication) = 0;
   
     PCDM_ReaderStatus GetStatus() const;
 
index 4370a98..7844647 100644 (file)
@@ -73,6 +73,18 @@ void PCDM_RetrievalDriver::RaiseIfUnknownTypes(const Handle(Storage_Schema)& aSc
 //function : Read
 //purpose  : 
 //=======================================================================
+void PCDM_RetrievalDriver::Read(Standard_IStream&               /*theIStream*/,
+                                const Handle(Storage_Data)&     /*theStorageData*/,
+                                const Handle(CDM_Document)&     /*theDoc*/,
+                                const Handle(CDM_Application)&  /*theApplication*/)
+{
+  
+}
+
+//=======================================================================
+//function : Read
+//purpose  : 
+//=======================================================================
 
 void PCDM_RetrievalDriver::Read(const TCollection_ExtendedString& theFileName,
                                const Handle(CDM_Document)& aNewDocument,
index c3a1c4a..1a04b9c 100644 (file)
@@ -56,6 +56,11 @@ public:
   //! into a persistent document. and the Make   method to build a
   //! transient document.
   Standard_EXPORT virtual void Read (const TCollection_ExtendedString& aFileName, const Handle(CDM_Document)& aNewDocument, const Handle(CDM_Application)& anApplication) Standard_OVERRIDE;
+
+  Standard_EXPORT virtual void Read (Standard_IStream&              theIStream,
+                                     const Handle(Storage_Data)&    theStorageData,
+                                     const Handle(CDM_Document)&    theDoc,
+                                     const Handle(CDM_Application)& theApplication) Standard_OVERRIDE;
   
   Standard_EXPORT virtual void Make (const Handle(PCDM_Document)& aPCDM, const Handle(CDM_Document)& aNewDocument) = 0;
   
index af91ed8..0b62126 100644 (file)
@@ -105,6 +105,15 @@ void PCDM_StorageDriver::Write(const Handle(CDM_Document)& aDocument, const TCol
     PCDM_DriverError::Raise(theData->ErrorStatusExtension().ToCString());
 }
 
+
+//=======================================================================
+//function : Write
+//purpose  : 
+//=======================================================================
+void PCDM_StorageDriver::Write (const Handle(CDM_Document)& /*aDocument*/, Standard_OStream& /*theOStream*/) 
+{
+  
+}
 //void PCDM_StorageDriver::LoadExtensions(const Handle(Storage_Schema)& aSchema, const TColStd_SequenceOfExtendedString& Extensions) {}
 void PCDM_StorageDriver::LoadExtensions(const Handle(Storage_Schema)& , const TColStd_SequenceOfExtendedString& ) {}
 
index eb87503..8db3c8b 100644 (file)
@@ -75,6 +75,9 @@ public:
   //! by  default  Write will  use Make   method to build a persistent
   //! document and the Schema method to write the persistent document.
   Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) Standard_OVERRIDE;
+
+  //! Write <theDocument> to theOStream
+  Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) Standard_OVERRIDE;
   
   Standard_EXPORT void SetFormat (const TCollection_ExtendedString& aformat);
   
index 9905dbc..8de0caa 100644 (file)
@@ -38,6 +38,8 @@ public:
   
   Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) = 0;
 
+  //! Write <theDocument> to theOStream
+  Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) = 0;
 
 
 
index 73cfaa3..acfbdd4 100644 (file)
@@ -27,6 +27,7 @@ public:
   Standard_Persistent() : _typenum(0), _refnum(0) {}
 
   DEFINE_STANDARD_RTTIEXT(Standard_Persistent,Standard_Transient)
+  Standard_Integer& TypeNum() { return _typenum; }
 
 private:
   Standard_Integer _typenum;
index f65cdbc..4a67f6e 100755 (executable)
@@ -1,14 +1,50 @@
-formatlist: XmlXCAF BinXCAF
+formatlist: MDTV-XCAF XmlXCAF BinXCAF MDTV-Standard XmlOcaf BinOcaf
 !
 ! Default format
 xml.FileFormat: XmlXCAF
 !
+! XCAF attributes
+!
+MDTV-XCAF.Description: XCAF Document Version 1.0
+MDTV-XCAF.FileExtension: dxc
+MDTV-XCAF.StoragePlugin: ed8793f8-3142-11d4-b9b5-0060b0ee281b
+MDTV-XCAF.RetrievalPlugin: ed8793f9-3142-11d4-b9b5-0060b0ee281b
+MDTV-XCAFSchema: ed8793fa-3142-11d4-b9b5-0060b0ee281b
+!
+! XmlXCAF format
+!
 XmlXCAF.Description: XmlXCAF Document Version 1.0
 XmlXCAF.FileExtension: xml
 XmlXCAF.StoragePlugin: f78ff496-a779-11d5-aab4-0050044b1af1
 XmlXCAF.RetrievalPlugin: f78ff497-a779-11d5-aab4-0050044b1af1
 !
+! BinXCAF format
+!
 BinXCAF.Description: BinXCAF Document Version 1.0
 BinXCAF.FileExtension: xbf
 BinXCAF.StoragePlugin: a78ff496-a779-11d5-aab4-0050044b1af1
 BinXCAF.RetrievalPlugin: a78ff497-a779-11d5-aab4-0050044b1af1
+!
+! standard attributes
+!
+MDTV-Standard.Description: Standard Document Version 1.0
+MDTV-Standard.FileExtension: std
+MDTV-Standard.StoragePlugin: ad696000-5b34-11d1-b5ba-00a0c9064368
+MDTV-Standard.RetrievalPlugin: ad696001-5b34-11d1-b5ba-00a0c9064368
+MDTV-StandardSchema: ad696002-5b34-11d1-b5ba-00a0c9064368
+MDTV-Standard.AttributeStoragePlugin: 47b0b826-d931-11d1-b5da-00a0c9064368
+MDTV-Standard.AttributeRetrievalPlugin: 47b0b827-d931-11d1-b5da-00a0c9064368
+!
+! XmlOcaf format
+!
+XmlOcaf.Description: Xml Document Version 1.0
+XmlOcaf.FileExtension: xml
+XmlOcaf.StoragePlugin: 03a56820-8269-11d5-aab2-0050044b1af1
+XmlOcaf.RetrievalPlugin: 03a56822-8269-11d5-aab2-0050044b1af1
+!
+! BinOcaf format
+!
+BinOcaf.Description: Bin Ocaf Document Version 1.0
+BinOcaf.FileExtension: cbf
+BinOcaf.StoragePlugin: 03a56835-8269-11d5-aab2-0050044b1af1
+BinOcaf.RetrievalPlugin: 03a56836-8269-11d5-aab2-0050044b1af1
index a6aec14..76a76f7 100644 (file)
@@ -27,3 +27,22 @@ Storage_BaseDriver::Storage_BaseDriver() : myOpenMode(Storage_VSNone)
 void Storage_BaseDriver::Delete()
 {}
 
+TCollection_AsciiString Storage_BaseDriver::ReadMagicNumber (Standard_IStream& theIStream)
+{
+  // magic number has the same length which is 7: BINFILE, CMPFILE and FSDFILE
+  Standard_Size aMagicNumberLen = 7;
+
+  TCollection_AsciiString aReadMagicNumber;
+
+  char aChar;
+  Standard_Size aReadCharNb = 0;
+
+  while (theIStream.good() && (aReadCharNb < aMagicNumberLen))
+  {
+    theIStream.get(aChar);
+    aReadCharNb += (Standard_Size)theIStream.gcount();
+    aReadMagicNumber += aChar;
+  }
+
+  return aReadMagicNumber;
+}
index 4d6c504..8541ddc 100644 (file)
@@ -25,6 +25,7 @@
 #include <TCollection_AsciiString.hxx>
 #include <Storage_Error.hxx>
 #include <Standard_Boolean.hxx>
+#include <Storage_Data.hxx>
 #include <Storage_Position.hxx>
 #include <Standard_Integer.hxx>
 #include <TColStd_SequenceOfAsciiString.hxx>
@@ -61,6 +62,8 @@ Standard_EXPORT virtual ~Storage_BaseDriver(){Delete();}
     TCollection_AsciiString Name() const;
   
     Storage_OpenMode OpenMode() const;
+
+    Standard_EXPORT static TCollection_AsciiString ReadMagicNumber (Standard_IStream& theIStream);
   
   //! returns True if we are at end of the stream
   Standard_EXPORT virtual Standard_Boolean IsEnd() = 0;
@@ -77,6 +80,8 @@ Standard_EXPORT virtual ~Storage_BaseDriver(){Delete();}
   Standard_EXPORT virtual Storage_Error BeginReadInfoSection() = 0;
   
   Standard_EXPORT virtual void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo) = 0;
+
+  Standard_EXPORT virtual void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData) = 0;
   
   Standard_EXPORT virtual Storage_Error EndReadInfoSection() = 0;
   
index e5be252..78d3518 100644 (file)
@@ -230,14 +230,7 @@ friend class Storage_Schema;
 
   DEFINE_STANDARD_RTTIEXT(Storage_Data,MMgt_TShared)
 
-protected:
-
-
-
-
-private:
-
-  
   Standard_EXPORT Handle(Storage_HeaderData) HeaderData() const;
   
   Standard_EXPORT Handle(Storage_RootData) RootData() const;
@@ -247,7 +240,9 @@ private:
   Standard_EXPORT Handle(Storage_InternalData) InternalData() const;
   
   Standard_EXPORT void Clear() const;
-  
+
+private:  
+
   Standard_EXPORT void SetErrorStatus (const Storage_Error anError);
   
   Standard_EXPORT void SetErrorStatusExtension (const TCollection_AsciiString& anErrorExt);
index aa437f1..0eb38e7 100644 (file)
@@ -103,13 +103,7 @@ friend class Storage_Schema;
 
   DEFINE_STANDARD_RTTIEXT(Storage_HeaderData,MMgt_TShared)
 
-protected:
-
-
-
-
-private:
-
+public:
   
   Standard_EXPORT void SetNumberOfObjects (const Standard_Integer anObjectNumber);
   
@@ -120,7 +114,9 @@ private:
   Standard_EXPORT void SetSchemaVersion (const TCollection_AsciiString& aVersion);
   
   Standard_EXPORT void SetSchemaName (const TCollection_AsciiString& aName);
-  
+
+private:
   Standard_EXPORT void SetErrorStatus (const Storage_Error anError);
   
   Standard_EXPORT void SetErrorStatusExtension (const TCollection_AsciiString& anErrorExt);
index 3ff9c99..77f5411 100644 (file)
@@ -37,6 +37,7 @@ class Storage_InternalData : public MMgt_TShared
 
 public:
 
+  Standard_EXPORT Handle(Storage_HPArray) ReadArray() {return myReadArray;}
   
   Standard_EXPORT Storage_InternalData();
   
index 4cee1f3..82f2335 100644 (file)
@@ -83,6 +83,12 @@ public:
   //! Returns the name of this root type.
   Standard_EXPORT TCollection_AsciiString Type() const;
 
+  Standard_EXPORT void SetReference (const Standard_Integer aRef);
+
+  Standard_EXPORT Standard_Integer Reference() const;
+
+  Standard_EXPORT void SetType (const TCollection_AsciiString& aType);
+
 
 friend class Storage_Schema;
 
@@ -97,11 +103,6 @@ protected:
 private:
 
   
-  Standard_EXPORT void SetReference (const Standard_Integer aRef);
-  
-  Standard_EXPORT Standard_Integer Reference() const;
-  
-  Standard_EXPORT void SetType (const TCollection_AsciiString& aType);
 
   TCollection_AsciiString myName;
   TCollection_AsciiString myType;
index cecb68f..5069f01 100644 (file)
@@ -70,6 +70,7 @@ public:
   
   Standard_EXPORT void ClearErrorStatus();
 
+  Standard_EXPORT void UpdateRoot (const TCollection_AsciiString& aName, const Handle(Standard_Persistent)& aPers);
 
 friend class Storage_Schema;
 
@@ -84,7 +85,6 @@ protected:
 private:
 
   
-  Standard_EXPORT void UpdateRoot (const TCollection_AsciiString& aName, const Handle(Standard_Persistent)& aPers);
   
   Standard_EXPORT void SetErrorStatus (const Storage_Error anError);
   
index f1805a9..0726e2d 100644 (file)
@@ -58,6 +58,15 @@ public:
   
   Standard_EXPORT void Clear();
 
+  //! add a type to the list
+  Standard_EXPORT void AddType (const TCollection_AsciiString& aName, const Standard_Integer aTypeNum);
+
+  //! returns the name of the type with number <aTypeNum>
+  Standard_EXPORT TCollection_AsciiString Type (const Standard_Integer aTypeNum) const;
+
+  //! returns the name of the type with number <aTypeNum>
+  Standard_EXPORT Standard_Integer Type (const TCollection_AsciiString& aTypeName) const;
+
 
 friend class Storage_Schema;
 
@@ -72,15 +81,6 @@ protected:
 private:
 
   
-  //! add a type to the list
-  Standard_EXPORT void AddType (const TCollection_AsciiString& aName, const Standard_Integer aTypeNum);
-  
-  //! returns the name of the type with number <aTypeNum>
-  Standard_EXPORT TCollection_AsciiString Type (const Standard_Integer aTypeNum) const;
-  
-  //! returns the name of the type with number <aTypeNum>
-  Standard_EXPORT Standard_Integer Type (const TCollection_AsciiString& aTypeName) const;
-  
   Standard_EXPORT void SetErrorStatus (const Storage_Error anError);
   
   Standard_EXPORT void SetErrorStatusExtension (const TCollection_AsciiString& anErrorExt);
index f0e314d..d99356a 100644 (file)
@@ -20,6 +20,8 @@
 #include <CDF_Session.hxx>
 #include <CDF_Store.hxx>
 #include <CDM_MessageDriver.hxx>
+#include <PCDM_StorageDriver.hxx>
+#include <Plugin.hxx>
 #include <Plugin_Failure.hxx>
 #include <Resource_Manager.hxx>
 #include <Standard_DomainError.hxx>
@@ -230,6 +232,36 @@ PCDM_ReaderStatus TDocStd_Application::Open(const TCollection_ExtendedString& pa
 }
 
 //=======================================================================
+//function : Open
+//purpose  :
+//=======================================================================
+PCDM_ReaderStatus TDocStd_Application::Open (Standard_IStream& theIStream, Handle(TDocStd_Document)& theDoc)
+{ 
+  try
+  {
+    OCC_CATCH_SIGNALS
+
+    Handle(TDocStd_Document) D = Handle(TDocStd_Document)::DownCast (Read (theIStream));
+    if (!D.IsNull())
+    {
+      CDF_Application::Open(D);
+      theDoc = D;
+    }
+  }
+  catch (Standard_Failure)
+  {
+    Handle(Standard_Failure) aFailure = Standard_Failure::Caught();
+    if (!aFailure.IsNull() && !MessageDriver().IsNull())
+    {
+      TCollection_ExtendedString aFailureMessage (aFailure->GetMessageString());
+      MessageDriver()->Write (aFailureMessage.ToExtString());
+    }
+  }
+
+  return GetRetrieveStatus();
+}
+
+//=======================================================================
 //function : SaveAs
 //purpose  :
 //=======================================================================
@@ -272,6 +304,52 @@ PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,c
 }
 
 //=======================================================================
+//function : SaveAs
+//purpose  :
+//=======================================================================
+PCDM_StoreStatus TDocStd_Application::SaveAs (const Handle(TDocStd_Document)& theDoc, Standard_OStream& theOStream)
+{
+  PCDM_StoreStatus aStatus = PCDM_SS_Failure;
+
+  if (theDoc->FindStoragePlugin())
+  {
+    try
+    {
+      Handle(PCDM_StorageDriver) aDocStorageDriver = 
+        Handle(PCDM_StorageDriver)::DownCast (Plugin::Load(theDoc->StoragePlugin()));
+
+      if (!aDocStorageDriver.IsNull())
+      {
+        aDocStorageDriver->SetFormat (theDoc->StorageFormat());
+        aDocStorageDriver->Write (theDoc,theOStream);
+
+        if (aDocStorageDriver->GetStoreStatus() == PCDM_SS_OK)
+        {
+          theDoc->SetSaved();
+        }
+
+        aStatus = aDocStorageDriver->GetStoreStatus();
+      }
+    }
+    catch (Standard_Failure)
+    {
+      Handle(Standard_Failure) aFailure = Standard_Failure::Caught();
+      if (!aFailure.IsNull() && !MessageDriver().IsNull())
+      {
+        TCollection_ExtendedString aString (aFailure->GetMessageString());
+        MessageDriver()->Write(aString.ToExtString());
+      }
+    }
+  }
+  else
+  {
+    aStatus = PCDM_SS_DriverFailure;
+  }
+
+  return aStatus;
+}
+
+//=======================================================================
 //function : Save
 //purpose  :
 //=======================================================================
@@ -377,6 +455,56 @@ PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,
 }
 
 //=======================================================================
+//function : SaveAs
+//purpose  : 
+//=======================================================================
+
+PCDM_StoreStatus TDocStd_Application::SaveAs (const Handle(TDocStd_Document)& theDoc,
+                                              Standard_OStream&               theOStream,
+                                              TCollection_ExtendedString&     theStatusMessage) 
+{ 
+  PCDM_StoreStatus aStatus = PCDM_SS_Failure;
+
+  if (theDoc->FindStoragePlugin())
+  {
+    try
+    {
+      Handle(PCDM_StorageDriver) aDocStorageDriver = 
+        Handle(PCDM_StorageDriver)::DownCast (Plugin::Load(theDoc->StoragePlugin()));
+
+      if (!aDocStorageDriver.IsNull())
+      {
+        aDocStorageDriver->SetFormat (theDoc->StorageFormat());
+        aDocStorageDriver->Write (theDoc,theOStream);
+        
+        if (aDocStorageDriver->GetStoreStatus() == PCDM_SS_OK)
+        {
+          theDoc->SetSaved();
+        }
+
+        aStatus = aDocStorageDriver->GetStoreStatus();
+      }     
+    }
+    catch (Standard_Failure)
+    {
+      Handle(Standard_Failure) aFailure = Standard_Failure::Caught();
+      if (!aFailure.IsNull() && !MessageDriver().IsNull())
+      {
+        TCollection_ExtendedString aString (aFailure->GetMessageString());
+        MessageDriver()->Write(aString.ToExtString());
+      }
+    }
+  }
+  else
+  {
+    theStatusMessage = TCollection_ExtendedString("TDocStd_Application::sSaveAs: a storage plugin has not been found");
+    aStatus = PCDM_SS_DriverFailure;
+  }
+
+  return aStatus;
+}
+
+//=======================================================================
 //function : Save
 //purpose  : 
 //=======================================================================
index dae6313..355eed7 100644 (file)
@@ -24,6 +24,7 @@
 #include <CDF_Application.hxx>
 #include <Standard_CString.hxx>
 #include <Standard_Integer.hxx>
+#include <Standard_IStream.hxx>
 #include <TColStd_SequenceOfExtendedString.hxx>
 #include <PCDM_ReaderStatus.hxx>
 #include <PCDM_StoreStatus.hxx>
@@ -176,10 +177,19 @@ public:
   //! is already in memory, this method can be made
   //! to depend on the value returned by IsInSession.
   Standard_EXPORT PCDM_ReaderStatus Open (const TCollection_ExtendedString& path, Handle(TDocStd_Document)& aDoc);
+
+  //! Retrieves aDoc from standard SEEKABLE stream theIStream.
+  //! the stream should support SEEK fuctionality
+  Standard_EXPORT PCDM_ReaderStatus Open (Standard_IStream& theIStream, Handle(TDocStd_Document)& theDoc);
+
   
   //! Save the  active document  in the file  <name> in the
   //! path <path> ; o verwrites  the file  if  it already exists.
   Standard_EXPORT PCDM_StoreStatus SaveAs (const Handle(TDocStd_Document)& aDoc, const TCollection_ExtendedString& path);
+
+  //! Save theDoc to standard SEEKABLE stream theOStream.
+  //! the stream should support SEEK fuctionality
+  Standard_EXPORT PCDM_StoreStatus SaveAs(const Handle(TDocStd_Document)& theDoc, Standard_OStream& theOStream);
   
   //! Save aDoc active document.
   //! Exceptions:
@@ -191,6 +201,10 @@ public:
   //! path <path>  .  overwrite  the file  if  it
   //! already exist.
   Standard_EXPORT PCDM_StoreStatus SaveAs (const Handle(TDocStd_Document)& aDoc, const TCollection_ExtendedString& path, TCollection_ExtendedString& theStatusMessage);
+
+  //! Save theDoc TO standard SEEKABLE stream theOStream.
+  //! the stream should support SEEK fuctionality
+  Standard_EXPORT PCDM_StoreStatus SaveAs(const Handle(TDocStd_Document)& theDoc, Standard_OStream& theOStream, TCollection_ExtendedString& theStatusMessage);
   
   //! Save the document overwriting the previous file
   Standard_EXPORT PCDM_StoreStatus Save (const Handle(TDocStd_Document)& aDoc, TCollection_ExtendedString& theStatusMessage);
index ed87128..b60f794 100644 (file)
@@ -22,7 +22,9 @@
 #include <LDOM_LDOMImplementation.hxx>
 #include <LDOMParser.hxx>
 #include <OSD_Path.hxx>
+#include <OSD_OpenFile.hxx>
 #include <PCDM_Document.hxx>
+#include <PCDM_DOMHeaderParser.hxx>
 #include <Standard_Type.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TCollection_ExtendedString.hxx>
@@ -52,7 +54,9 @@ IMPLEMENT_STANDARD_RTTIEXT(XmlLDrivers_DocumentRetrievalDriver,PCDM_RetrievalDri
 
 #define START_REF         "START_REF"
 #define END_REF           "END_REF"
-#define REFERENCE_COUNTER "REFERENCE_COUNTER"
+
+#define MODIFICATION_COUNTER "MODIFICATION_COUNTER: "
+#define REFERENCE_COUNTER    "REFERENCE_COUNTER: "
 
 //#define TAKE_TIMES
 static void take_time (const Standard_Integer, const char *,
@@ -196,13 +200,42 @@ void XmlLDrivers_DocumentRetrievalDriver::Read
 {
   myReaderStatus = PCDM_RS_DriverFailure;
   myFileName = theFileName;
+
+  std::ifstream aFileStream;
+  OSD_OpenStream (aFileStream, myFileName, std::ios::in);
+
+  if (aFileStream.is_open() && aFileStream.good())
+  {
+    Read (aFileStream, NULL, theNewDocument, theApplication);
+  }
+  else
+  {
+    myReaderStatus = PCDM_RS_OpenError;
+   
+    TCollection_ExtendedString aMsg = TCollection_ExtendedString("Error: the file ") +
+                                      theFileName + " cannot be opened for reading";
+
+    theApplication->MessageDriver()->Write (aMsg.ToExtString());
+    Standard_Failure::Raise("File cannot be opened for reading");
+  }
+}
+
+//=======================================================================
+//function : Read
+//purpose  : 
+//=======================================================================
+void XmlLDrivers_DocumentRetrievalDriver::Read (Standard_IStream&              theIStream,
+                                                const Handle(Storage_Data)&    /*theStorageData*/,
+                                                const Handle(CDM_Document)&    theNewDocument,
+                                                const Handle(CDM_Application)& theApplication)
+{
   Handle(CDM_MessageDriver) aMessageDriver = theApplication -> MessageDriver();
   ::take_time (~0, " +++++ Start RETRIEVE procedures ++++++", aMessageDriver);
 
   // 1. Read DOM_Document from file
   LDOMParser aParser;
-  TCollection_AsciiString aName (theFileName,'?');
-  if (aParser.parse(aName.ToCString()))
+
+  if (aParser.parse(theIStream))
   {
     TCollection_AsciiString aData;
     cout << aParser.GetError(aData) << ": " << aData << endl;
@@ -276,8 +309,8 @@ void XmlLDrivers_DocumentRetrievalDriver::ReadFromDomDocument
       try {
         OCC_CATCH_SIGNALS
         TCollection_AsciiString anInf(anInfo,'?');
-        //Standard_Integer aRefCounter = anInf.Token(" ",2).IntegerValue();
-        //theNewDocument->SetReferenceCounter(aRefCounter);
+        Standard_Integer aRefCounter = anInf.Token(" ",2).IntegerValue();
+        theNewDocument->SetReferenceCounter(aRefCounter);
       }
       catch (Standard_Failure) { 
         //    cout << "warning: could not read the reference counter in " << aFileName << endl;
@@ -287,6 +320,20 @@ void XmlLDrivers_DocumentRetrievalDriver::ReadFromDomDocument
     aMsgDriver->Write(aMsg.ToExtString());
       }
     }
+    else if (anInfo.Search(MODIFICATION_COUNTER) != -1) {
+      try {
+        OCC_CATCH_SIGNALS
+        
+        TCollection_AsciiString anInf(anInfo,'?');
+        Standard_Integer aModCounter = anInf.Token(" ",2).IntegerValue();
+        theNewDocument->SetModifications (aModCounter);
+      }
+      catch (Standard_Failure) { 
+        TCollection_ExtendedString aMsg("Warning: could not read the modification counter\0");
+        if(!aMsgDriver.IsNull()) 
+          aMsgDriver->Write(aMsg.ToExtString());
+      }
+    }
     
     if(anInfo == END_REF)
       isRef = Standard_False;
index 08a4a53..5bfcbb1 100644 (file)
@@ -25,6 +25,7 @@
 #include <XmlObjMgt_Element.hxx>
 #include <Standard_Boolean.hxx>
 #include <Standard_Integer.hxx>
+#include <Storage_Data.hxx>
 class XmlMDF_ADriverTable;
 class TCollection_ExtendedString;
 class PCDM_Document;
@@ -53,6 +54,11 @@ public:
   Standard_EXPORT virtual Handle(CDM_Document) CreateDocument() Standard_OVERRIDE;
   
   Standard_EXPORT virtual void Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, const Handle(CDM_Application)& theApplication) Standard_OVERRIDE;
+
+  Standard_EXPORT virtual void Read (Standard_IStream&               theIStream,
+                                     const Handle(Storage_Data)&     theStorageData,
+                                     const Handle(CDM_Document)&     theDoc,
+                                     const Handle(CDM_Application)&  theApplication) Standard_OVERRIDE;
   
   Standard_EXPORT virtual Handle(XmlMDF_ADriverTable) AttributeDrivers (const Handle(CDM_MessageDriver)& theMsgDriver);
 
index 454faac..e4cb4c7 100644 (file)
@@ -101,12 +101,39 @@ void XmlLDrivers_DocumentStorageDriver::AddNamespace
 //function : Write
 //purpose  : 
 //=======================================================================
-void XmlLDrivers_DocumentStorageDriver::Write
-                          (const Handle(CDM_Document)&       theDocument,
-                           const TCollection_ExtendedString& theFileName)
+void XmlLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)&       theDocument,
+                                               const TCollection_ExtendedString& theFileName)
 {
-  Handle(CDM_MessageDriver) aMessageDriver =
-    theDocument -> Application() -> MessageDriver();
+  myFileName = theFileName;
+
+  std::ofstream aFileStream;
+  OSD_OpenStream (aFileStream, theFileName, std::ios::out);
+
+  if (aFileStream.is_open() && aFileStream.good())
+  {
+    Write (theDocument, aFileStream);
+  }
+  else
+  {
+    SetIsError (Standard_True);
+    SetStoreStatus(PCDM_SS_WriteFailure);
+    
+    TCollection_ExtendedString aMsg = TCollection_ExtendedString("Error: the file ") +
+                                      theFileName + " cannot be opened for writing";
+
+    theDocument->Application()->MessageDriver()->Write (aMsg.ToExtString());
+    Standard_Failure::Raise("File cannot be opened for writing");
+  }
+}
+
+//=======================================================================
+//function : Write
+//purpose  : 
+//=======================================================================
+Standard_EXPORT void XmlLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)& theDocument,
+                                                               Standard_OStream&           theOStream)
+{
+  Handle(CDM_MessageDriver) aMessageDriver = theDocument->Application()->MessageDriver();
   ::take_time (~0, " +++++ Start STORAGE procedures ++++++", aMessageDriver);
 
   // Create new DOM_Document
@@ -115,26 +142,28 @@ void XmlLDrivers_DocumentStorageDriver::Write
   // Fill the document with data
   XmlObjMgt_Element anElement = aDOMDoc.getDocumentElement();
 
-  if (WriteToDomDocument (theDocument, anElement, theFileName) == Standard_False) {
-    // Write DOM_Document into XML file,
-    FILE * aFile = OSD_OpenFile(theFileName, "wt");
-
-    if (aFile) {
-      LDOM_XmlWriter aWriter (aFile);
-      aWriter.SetIndentation(1);
-      aWriter << aDOMDoc;
-      fclose(aFile);
-      ::take_time (0, " +++++ Fin formatting to XML : ", aMessageDriver);
+  if (WriteToDomDocument (theDocument, anElement) == Standard_False) {
 
-    }else{
+    LDOM_XmlWriter aWriter;
+    aWriter.SetIndentation(1);
+  
+    if (theOStream.good())
+    {
+      aWriter.Write (theOStream, aDOMDoc);
+    }
+    else
+    {
       SetIsError (Standard_True);
       SetStoreStatus(PCDM_SS_WriteFailure);
-      TCollection_ExtendedString aMsg =
-        TCollection_ExtendedString("Error: the file ") + theFileName +
-          " cannot be opened for writing";
-      aMessageDriver -> Write (aMsg.ToExtString());
-        Standard_Failure::Raise("File cannot be opened for writing");
+
+      TCollection_ExtendedString aMsg = TCollection_ExtendedString("Error: the stream is bad and") +
+                                        " cannot be used for writing";
+      theDocument->Application()->MessageDriver()->Write (aMsg.ToExtString());
+      
+      Standard_Failure::Raise("File cannot be opened for writing");
     }
+
+    ::take_time (0, " +++++ Fin formatting to XML : ", aMessageDriver);
   }
 }
 
@@ -145,10 +174,8 @@ void XmlLDrivers_DocumentStorageDriver::Write
 //           data to XML, this method should be reimplemented avoiding step 3
 //=======================================================================
 
-Standard_Boolean XmlLDrivers_DocumentStorageDriver::WriteToDomDocument
-                                  (const Handle(CDM_Document)&  theDocument,
-                                   XmlObjMgt_Element&           theElement,
-                                  const TCollection_ExtendedString& theFileName)
+Standard_Boolean XmlLDrivers_DocumentStorageDriver::WriteToDomDocument (const Handle(CDM_Document)&  theDocument,
+                                                                        XmlObjMgt_Element&           theElement)
 {
   SetIsError(Standard_False);
   Handle(CDM_MessageDriver) aMessageDriver =
@@ -256,7 +283,7 @@ Standard_Boolean XmlLDrivers_DocumentStorageDriver::WriteToDomDocument
   Handle(Storage_Data) theData = new Storage_Data;
   //PCDM_ReadWriter::WriteFileFormat( theData, theDocument );
   PCDM_ReadWriter::Writer()->WriteReferenceCounter(theData,theDocument);
-  PCDM_ReadWriter::Writer()->WriteReferences(theData,theDocument,theFileName);
+  PCDM_ReadWriter::Writer()->WriteReferences(theData,theDocument, myFileName);
   PCDM_ReadWriter::Writer()->WriteExtensions(theData,theDocument);
   PCDM_ReadWriter::Writer()->WriteVersion(theData,theDocument);
 
index 2b08c90..621c53f 100644 (file)
@@ -48,6 +48,8 @@ public:
   Standard_EXPORT virtual TCollection_ExtendedString SchemaName() const Standard_OVERRIDE;
   
   Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, const TCollection_ExtendedString& theFileName) Standard_OVERRIDE;
+
+  Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) Standard_OVERRIDE;
   
   Standard_EXPORT virtual Handle(XmlMDF_ADriverTable) AttributeDrivers (const Handle(CDM_MessageDriver)& theMsgDriver);
 
@@ -59,7 +61,7 @@ public:
 protected:
 
   
-  Standard_EXPORT virtual Standard_Boolean WriteToDomDocument (const Handle(CDM_Document)& theDocument, XmlObjMgt_Element& thePDoc, const TCollection_ExtendedString& theFileName);
+  Standard_EXPORT virtual Standard_Boolean WriteToDomDocument (const Handle(CDM_Document)& theDocument, XmlObjMgt_Element& thePDoc);
   
   Standard_EXPORT virtual Standard_Integer MakeDocument (const Handle(CDM_Document)& theDocument, XmlObjMgt_Element& thePDoc);
   
@@ -76,6 +78,7 @@ private:
 
   XmlLDrivers_SequenceOfNamespaceDef mySeqOfNS;
   TCollection_ExtendedString myCopyright;
+  TCollection_ExtendedString myFileName;
 
 
 };
diff --git a/tests/bugs/caf/bug26229_1 b/tests/bugs/caf/bug26229_1
new file mode 100644 (file)
index 0000000..18a99a5
--- /dev/null
@@ -0,0 +1,44 @@
+puts "================"
+puts "OCC26229"
+puts "================"
+puts ""
+###################################################################################################
+# Add the possibility in OCAF to open/save a document from/to a stream object (BinOcaf format)
+###################################################################################################
+
+pload DCAF
+
+NewDocument D BinOcaf
+
+# Add an attribute to a data framework
+set aSetAttr1 100
+set aLabel 0:2
+SetInteger D ${aLabel} ${aSetAttr1}
+
+# Close/Open the transaction
+NewCommand D
+
+# Save the document
+set aFile ${imagedir}/${casename}.cbf
+file delete ${aFile}
+SaveAs D ${aFile} -stream
+if { ![file exists ${aFile}] } {
+   puts "Error: there is not ${aFile} file; SaveAs command"
+   return
+}
+
+
+# Restore the document
+Close D
+Open ${aFile} DD -stream
+
+# Get a value of the attribute
+set IsDone [catch {set aGetAttr3 [GetInteger DD ${aLabel}]} aResult]
+if { ${IsDone} != 0 ||
+   ${aSetAttr1}!=${aGetAttr3} } {
+   puts ${aResult}
+   puts "aSetAttr1=${aSetAttr1} aGetAttr3=${aGetAttr3}"
+   puts "Error: get a value of TDataStd_Integer attribute from Streamed restoring document"
+} else {
+   puts "Get a value of TDataStd_Integer attribute from Streamed restoring document: OK"
+}
\ No newline at end of file
diff --git a/tests/bugs/caf/bug26229_2 b/tests/bugs/caf/bug26229_2
new file mode 100644 (file)
index 0000000..c206695
--- /dev/null
@@ -0,0 +1,44 @@
+puts "================"
+puts "OCC26229"
+puts "================"
+puts ""
+###################################################################################################
+# Add the possibility in OCAF to open/save a document from/to a stream object (XmlOcaf format)
+###################################################################################################
+
+pload DCAF
+
+NewDocument D XmlOcaf
+
+# Add an attribute to a data framework
+set aSetAttr1 100
+set aLabel 0:2
+SetInteger D ${aLabel} ${aSetAttr1}
+
+# Close/Open the transaction
+NewCommand D
+
+# Save the document
+set aFile ${imagedir}/${casename}.xml
+file delete ${aFile}
+SaveAs D ${aFile} -stream
+if { ![file exists ${aFile}] } {
+   puts "Error: there is not ${aFile} file; SaveAs command"
+   return
+}
+
+
+# Restore the document
+Close D
+Open ${aFile} DD -stream
+
+# Get a value of the attribute
+set IsDone [catch {set aGetAttr3 [GetInteger DD ${aLabel}]} aResult]
+if { ${IsDone} != 0 ||
+   ${aSetAttr1}!=${aGetAttr3} } {
+   puts ${aResult}
+   puts "aSetAttr1=${aSetAttr1} aGetAttr3=${aGetAttr3}"
+   puts "Error: get a value of TDataStd_Integer attribute from Streamed restoring document"
+} else {
+   puts "Get a value of TDataStd_Integer attribute from Streamed restoring document: OK"
+}
\ No newline at end of file