0029195: OCAF - ensure thread safety for different documents.
[occt.git] / src / CDF / CDF_Application.cxx
index ec967fe..cb9f02b 100644 (file)
@@ -18,8 +18,8 @@
 
 #include <CDF_Application.hxx>
 #include <CDF_Directory.hxx>
-#include <CDF_MetaDataDriver.hxx>
 #include <CDF_Session.hxx>
+#include <CDF_FWOSDriver.hxx>
 #include <CDM_CanCloseStatus.hxx>
 #include <CDM_Document.hxx>
 #include <CDM_MetaData.hxx>
 #include <Message_ProgressSentry.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(CDF_Application,CDM_Application)
-
-#define theMetaDataDriver CDF_Session::CurrentSession()->MetaDataDriver()
-
-
 //=======================================================================
 //function : 
 //purpose  : 
 //=======================================================================
-CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) {}
+CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) 
+{
+  myDirectory      = new CDF_Directory();
+  myMetaDataDriver = new CDF_FWOSDriver;
+}
 
 //=======================================================================
 //function : Load
@@ -59,7 +59,7 @@ Handle(CDF_Application) CDF_Application::Load(const Standard_GUID& aGUID) {
 //purpose  : 
 //=======================================================================
 void CDF_Application::Open(const Handle(CDM_Document)& aDocument) {
-  CDF_Session::CurrentSession()->Directory()->Add(aDocument);
+  myDirectory->Add(aDocument);
   aDocument->Open(this);
   Activate(aDocument,CDF_TOA_New);
 }
@@ -77,7 +77,7 @@ CDM_CanCloseStatus CDF_Application::CanClose(const Handle(CDM_Document)& aDocume
 //purpose  : 
 //=======================================================================
 void CDF_Application::Close(const Handle(CDM_Document)& aDocument) {
-  CDF_Session::CurrentSession()->Directory()->Remove(aDocument);
+  myDirectory->Remove(aDocument);
   aDocument->Close();
 }
 
@@ -107,15 +107,15 @@ Handle(CDM_Document)  CDF_Application::Retrieve (const TCollection_ExtendedStrin
   Handle(CDM_MetaData) theMetaData; 
   
   if(aVersion.Length() == 0) 
-    theMetaData=theMetaDataDriver->MetaData(aFolder,aName);
+    theMetaData=myMetaDataDriver->MetaData(aFolder,aName);
   else 
-    theMetaData=theMetaDataDriver->MetaData(aFolder,aName,aVersion);
+    theMetaData=myMetaDataDriver->MetaData(aFolder,aName,aVersion);
 
   CDF_TypeOfActivation theTypeOfActivation=TypeOfActivation(theMetaData);
   Handle(CDM_Document) theDocument = Retrieve(theMetaData, UseStorageConfiguration,
                                               Standard_False, theProgress);
 
-  CDF_Session::CurrentSession()->Directory()->Add(theDocument);
+  myDirectory->Add(theDocument);
   Activate(theDocument,theTypeOfActivation);
 
   theDocument->Open(this);
@@ -137,12 +137,12 @@ PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString&
 //=======================================================================
 PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString&  aFolder, const TCollection_ExtendedString&  aName, const TCollection_ExtendedString&  aVersion) {
   
-  if (!theMetaDataDriver->Find(aFolder,aName,aVersion))
+  if (!myMetaDataDriver->Find(aFolder,aName,aVersion))
     return PCDM_RS_UnknownDocument;
-  else if (!theMetaDataDriver->HasReadPermission(aFolder,aName,aVersion))
+  else if (!myMetaDataDriver->HasReadPermission(aFolder,aName,aVersion))
     return PCDM_RS_PermissionDenied;
   else {
-    Handle(CDM_MetaData) theMetaData = theMetaDataDriver->MetaData(aFolder,aName,aVersion);
+    Handle(CDM_MetaData) theMetaData = myMetaDataDriver->MetaData(aFolder,aName,aVersion);
 
     if(theMetaData->IsRetrieved()) {
       return theMetaData->Document()->IsModified()
@@ -190,7 +190,7 @@ void CDF_Application::Activate(const Handle(CDM_Document)& ,const CDF_TypeOfActi
 //=======================================================================
 Standard_ExtString CDF_Application::DefaultFolder(){
   if(myDefaultFolder.Length() == 0) {
-    myDefaultFolder=CDF_Session::CurrentSession()->MetaDataDriver()->DefaultFolder();
+    myDefaultFolder=myMetaDataDriver->DefaultFolder();
   }
   return myDefaultFolder.ToExtString();
 }
@@ -200,7 +200,7 @@ Standard_ExtString CDF_Application::DefaultFolder(){
 //purpose  : 
 //=======================================================================
 Standard_Boolean CDF_Application::SetDefaultFolder(const Standard_ExtString aFolder) {
-  Standard_Boolean found = CDF_Session::CurrentSession()->MetaDataDriver()->FindFolder(aFolder);
+  Standard_Boolean found = myMetaDataDriver->FindFolder(aFolder);
   if(found) myDefaultFolder=aFolder;
   return found;
 }
@@ -271,7 +271,7 @@ Handle(CDM_Document) CDF_Application::Retrieve (const Handle(CDM_MetaData)& aMet
     SetReferenceCounter(theDocument,PCDM_RetrievalDriver::ReferenceCounter(aMetaData->FileName(), MessageDriver()));
     
     SetDocumentVersion(theDocument,aMetaData);
-    theMetaDataDriver->ReferenceIterator()->LoadReferences(theDocument,aMetaData,this,UseStorageConfiguration);
+    myMetaDataDriver->ReferenceIterator()->LoadReferences(theDocument,aMetaData,this,UseStorageConfiguration);
 
     try {    
       OCC_CATCH_SIGNALS
@@ -530,3 +530,12 @@ PCDM_ReaderStatus CDF_Application::CanRetrieve(const Handle(CDM_MetaData)& aMeta
   else
     return CanRetrieve(aMetaData->Folder(),aMetaData->Name());
 }
+
+//=======================================================================
+//function : MetaDataDriver
+//purpose  :
+//=======================================================================
+Handle(CDF_MetaDataDriver) CDF_Application::MetaDataDriver() const {
+  Standard_NoSuchObject_Raise_if(myMetaDataDriver.IsNull(), "no metadatadriver has been provided; this application is not able to store or retrieve files.");
+  return myMetaDataDriver;
+}