// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-#include <PCDM.ixx>
+
+#include <CDM_Application.hxx>
+#include <CDM_Document.hxx>
+#include <FSD_BinaryFile.hxx>
+#include <FSD_CmpFile.hxx>
+#include <FSD_File.hxx>
+#include <PCDM.hxx>
+#include <PCDM_StorageDriver.hxx>
#include <Plugin.hxx>
-#include <Standard_SStream.hxx>
-#include <Standard_NoSuchObject.hxx>
#include <Resource_Manager.hxx>
#include <Standard_GUID.hxx>
+#include <Standard_NoSuchObject.hxx>
+#include <Standard_SStream.hxx>
+#include <Storage_Schema.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <TCollection_ExtendedString.hxx>
#include <UTL.hxx>
-#include <FSD_CmpFile.hxx>
-#include <FSD_File.hxx>
-#include <FSD_BinaryFile.hxx>
-
-//=======================================================================
-//function : StorageDriver
-//purpose : gets in the EuclidDesktop resource the plugin
-// identifier of the driver plugs the driver.
-//=======================================================================
-
-Handle(PCDM_StorageDriver) PCDM::StorageDriver(const Handle(CDM_Document)& aDocument) {
-
- if(!PCDM::FindStorageDriver(aDocument)) {
- Standard_SStream aMsg; aMsg << "could not find the storage driver plugin resource for the format: " << aDocument->StorageFormat()<<(char) 0;
- Standard_NoSuchObject::Raise(aMsg);
- }
- //return Handle(PCDM_StorageDriver)::DownCast(Plugin::Load(aDocument->StoragePlugin()));
- Handle(PCDM_StorageDriver) DRIVER =
- Handle(PCDM_StorageDriver)::DownCast(Plugin::Load(aDocument->StoragePlugin()));
- if (!DRIVER.IsNull()) DRIVER->SetFormat(aDocument->StorageFormat());
- return DRIVER;
-}
-
-//=======================================================================
-//function : FindStorageDriver
-//purpose :
-//=======================================================================
-
-Standard_Boolean PCDM::FindStorageDriver(const Handle(CDM_Document)& aDocument) {
-
- return aDocument->FindStoragePlugin();
-}
-
-//=======================================================================
-//function : Schema
-//purpose : returns a schema to be used during a Store or Retrieve
-// operation.
-// Schema will plug the schema defined by
-// the SchemaName method.
-//=======================================================================
-
-Handle(Storage_Schema) PCDM::Schema(const TCollection_ExtendedString& aSchemaName, const Handle(CDM_Application)& anApplication) {
-
- Handle(Resource_Manager) r = anApplication->Resources();
- if(!UTL::Find(r,aSchemaName)) {
- Standard_SStream aMsg; aMsg << "could not find the plugin resource for the schema: " << TCollection_ExtendedString(aSchemaName) << (char)0;
- Standard_NoSuchObject::Raise(aMsg);
- }
- Handle(Standard_Transient) t = Plugin::Load(UTL::GUID(UTL::Value(r,aSchemaName)));
- return *((Handle(Storage_Schema)*)&t);
-
-}
//=======================================================================
//function : FileDriverType
//purpose :
//=======================================================================
-PCDM_TypeOfFileDriver PCDM::FileDriverType(const TCollection_AsciiString& aFileName, PCDM_BaseDriverPointer& aBaseDriver) {
+PCDM_TypeOfFileDriver PCDM::FileDriverType(const TCollection_AsciiString& aFileName, Handle(Storage_BaseDriver)& aBaseDriver)
+{
if(FSD_CmpFile::IsGoodFileType(aFileName) == Storage_VSOk) {
aBaseDriver=new FSD_CmpFile;
return PCDM_TOFD_CmpFile;
return PCDM_TOFD_Unknown;
}
}
+
+//=======================================================================
+//function : FileDriverType
+//purpose :
+//=======================================================================
+
+PCDM_TypeOfFileDriver PCDM::FileDriverType (Standard_IStream& theIStream, Handle(Storage_BaseDriver)& theBaseDriver)
+{
+ TCollection_AsciiString aReadMagicNumber;
+
+ // read magic number from the file
+ if (theIStream.good())
+ {
+ aReadMagicNumber = Storage_BaseDriver::ReadMagicNumber (theIStream);
+ }
+
+ 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;
+ }
+ else if (aReadMagicNumber.Search ("<?xml") != -1)
+ {
+ // skip xml declaration
+ char aChar = ' ';
+ while (theIStream.good() && !theIStream.eof() && aChar != '>')
+ {
+ theIStream.get(aChar);
+ }
+
+ return PCDM_TOFD_XmlFile;
+ }
+
+ theBaseDriver = NULL;
+ return PCDM_TOFD_Unknown;
+}
+