// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-#include <XmlLDrivers_DocumentRetrievalDriver.ixx>
-#include <XmlLDrivers.hxx>
-#include <XmlMDF.hxx>
-#include <XmlObjMgt_RRelocationTable.hxx>
-#include <XmlObjMgt_Document.hxx>
-#include <XmlObjMgt.hxx>
-#include <XmlMDataStd.hxx>
-#include <LDOM_LDOMImplementation.hxx>
+#include <CDM_Application.hxx>
+#include <CDM_Document.hxx>
+#include <CDM_MessageDriver.hxx>
+#include <CDM_MetaData.hxx>
#include <LDOM_DocumentType.hxx>
+#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>
#include <TDF_Data.hxx>
-#include <TDocStd_Owner.hxx>
#include <TDocStd_Document.hxx>
-#include <CDM_MessageDriver.hxx>
-#include <CDM_MetaData.hxx>
-#include <TCollection_AsciiString.hxx>
+#include <TDocStd_Owner.hxx>
#include <UTL.hxx>
-#include <OSD_Path.hxx>
+#include <XmlLDrivers.hxx>
+#include <XmlLDrivers_DocumentRetrievalDriver.hxx>
+#include <XmlMDataStd.hxx>
+#include <XmlMDF.hxx>
+#include <XmlMDF_ADriver.hxx>
+#include <XmlMDF_ADriverTable.hxx>
+#include <XmlObjMgt.hxx>
+#include <XmlObjMgt_Document.hxx>
+#include <XmlObjMgt_RRelocationTable.hxx>
-#ifdef WNT
+IMPLEMENT_STANDARD_RTTIEXT(XmlLDrivers_DocumentRetrievalDriver,PCDM_RetrievalDriver)
+
+#ifdef _MSC_VER
# include <tchar.h>
-#endif // WNT
+#endif // _MSC_VER
#include <locale.h>
#include <Standard_Failure.hxx>
#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 *,
Standard_Integer i, j, len ;
len = aString.Length() ;
-#ifdef WNT
+#ifdef _WIN32
// Case of network path, such as \\MACHINE\dir
for (i = j = 2 ; j <= len ; i++,j++) {
#else
TCollection_AsciiString theCFile=UTL::CString(aFileName);
TCollection_AsciiString theDirectory;
Standard_Integer i=theCFile.SearchFromEnd("/");
-#ifdef WNT
+#ifdef _WIN32
// if(i==-1) i=theCFile.SearchFromEnd("\\");
if(theCFile.SearchFromEnd("\\") > i)
i=theCFile.SearchFromEnd("\\");
const TCollection_AsciiString& aRelFilePath)
{
TCollection_AsciiString EmptyString = "" ;
-#ifdef WNT
+#ifdef _WIN32
if (aRelFilePath.Search(":") == 2 ||
(aRelFilePath.Search("\\") == 1 && aRelFilePath.Value(2) == '\\'))
#else
TCollection_AsciiString DirPath = aDirPath, RelFilePath = aRelFilePath ;
Standard_Integer i,len ;
-#ifdef WNT
+#ifdef _WIN32
if(DirPath.Search(":") != 2 &&
(DirPath.Search("\\") != 1 || DirPath.Value(2) != '\\'))
#else
#endif
return EmptyString ;
-#ifdef WNT
+#ifdef _WIN32
DirPath.ChangeAll('\\','/') ;
RelFilePath.ChangeAll('\\','/') ;
#endif
return new TDocStd_Document(PCDM_RetrievalDriver::GetFormat());
}
-//=======================================================================
-//function : SchemaName
-//purpose : pure virtual method definition
-//=======================================================================
-TCollection_ExtendedString XmlLDrivers_DocumentRetrievalDriver::SchemaName() const
-{
- TCollection_ExtendedString schemaname;
- return schemaname;
-}
-
-//=======================================================================
-//function : Make
-//purpose : pure virtual method definition
-//=======================================================================
-void XmlLDrivers_DocumentRetrievalDriver::Make (const Handle(PCDM_Document)&,
- const Handle(CDM_Document&))
-{
-}
-
//=======================================================================
//function : Read
//purpose :
{
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());
+ throw Standard_Failure("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 myFileName is not empty, "document" tag is required to be read
+ // from the received document
+ Standard_Boolean aWithoutRoot = myFileName.IsEmpty();
+
+ if (aParser.parse(theIStream, Standard_False, aWithoutRoot))
{
TCollection_AsciiString aData;
cout << aParser.GetError(aData) << ": " << aData << endl;
// oan: OCC22305 - check a document verison and if it's greater than
// current version of storage driver set an error status and return
- if( aCurDocVersion > XmlLDrivers::StorageVersion().IntegerValue() )
+ if( aCurDocVersion > XmlLDrivers::StorageVersion() )
{
TCollection_ExtendedString aMsg =
TCollection_ExtendedString ("error: wrong file version: ") +
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;
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;
TCollection_ExtendedString theFolder,theName;
//TCollection_ExtendedString theFile=myReferences(myIterator).FileName();
TCollection_ExtendedString f(aPath);
-#ifndef WNT
+#ifndef _WIN32
Standard_Integer i= f.SearchFromEnd("/");
TCollection_ExtendedString n = f.Split(i);
chr = dir.Value ( i );
switch ( chr ) {
-
- case _TEXT( '|' ):
- dirRet += _TEXT( "/" );
+
+ case '|':
+ dirRet += "/";
break;
-
- case _TEXT( '^' ):
-
- dirRet += _TEXT( ".." );
+
+ case '^':
+
+ dirRet += "..";
break;
default:
}
theFolder = dirRet;
theName = UTL::Name(p); theName+= UTL::Extension(p);
-#endif // WNT
+#endif // _WIN32
Handle(CDM_MetaData) aMetaData = CDM_MetaData::LookUp(theFolder,theName,aPath,aPath,UTL::IsReadOnly(aFileName));
////////////
try
{
OCC_CATCH_SIGNALS
-#if defined(DEB) && !defined(TAKE_TIMES)
+#ifdef OCCT_DEBUG
TCollection_ExtendedString aMessage ("PasteDocument");
aMsgDriver -> Write (aMessage.ToExtString());
#endif
else
myReaderStatus = PCDM_RS_OK;
}
- catch (Standard_Failure)
+ catch (Standard_Failure const& anException)
{
- TCollection_ExtendedString anErrorString (Standard_Failure::Caught()->GetMessageString());
+ TCollection_ExtendedString anErrorString (anException.GetMessageString());
aMsgDriver -> Write (anErrorString.ToExtString());
}
#include <sys/timeb.h>
#include <sys/types.h>
#include <stdio.h>
-#ifndef WNT
+#ifndef _WIN32
extern "C" int ftime (struct timeb *tp);
#endif
extern struct timeb tmbuf0;