0029195: OCAF - ensure thread safety for different documents.
[occt.git] / src / TDocStd / TDocStd_Application.cxx
index 142c98e..094e6ff 100644 (file)
@@ -34,6 +34,7 @@
 #include <TDocStd_Document.hxx>
 #include <TDocStd_Owner.hxx>
 #include <TDocStd_PathParser.hxx>
+#include <OSD_Thread.hxx>
 
 #include<Message_ProgressSentry.hxx>
 
@@ -47,20 +48,9 @@ IMPLEMENT_STANDARD_RTTIEXT(TDocStd_Application,CDF_Application)
 TDocStd_Application::TDocStd_Application()
         : myIsDriverLoaded (Standard_True)
 {
-  myMessageDriver = CDM_Application::MessageDriver();
-  Handle(CDF_Session) S;
-  if (!CDF_Session::Exists()) S = new CDF_Session();
-  else S = CDF_Session::CurrentSession();
-  S->SetCurrentApplication(this);
-  try
-  {
-    OCC_CATCH_SIGNALS
-    S->LoadDriver();
-  }
-  catch (Plugin_Failure const&)
-  {
+  AddToSession();
+  if(myMetaDataDriver.IsNull())
     myIsDriverLoaded = Standard_False;
-  }
 }
 
 
@@ -74,15 +64,6 @@ Standard_Boolean TDocStd_Application::IsDriverLoaded() const
 }
 
 //=======================================================================
-//function : MessageDriver
-//purpose  :
-//=======================================================================
-Handle(Message_Messenger) TDocStd_Application::MessageDriver()
-{
-  return myMessageDriver;
-}
-
-//=======================================================================
 //function : Resources
 //purpose  :
 //=======================================================================
@@ -179,8 +160,7 @@ Standard_Integer TDocStd_Application::NbDocuments() const
 {
   if (!CDF_Session::Exists())
     throw Standard_DomainError("TDocStd_Application::NbDocuments");
-  Handle(CDF_Session) S = CDF_Session::CurrentSession();
-  return S->Directory()->Length();
+  return this->myDirectory->Length();
 }
 
 //=======================================================================
@@ -192,8 +172,7 @@ void TDocStd_Application::GetDocument(const Standard_Integer index,Handle(TDocSt
 {
   if (!CDF_Session::Exists())
     throw Standard_DomainError("TDocStd_Application::NbDocuments");
-  Handle(CDF_Session) S = CDF_Session::CurrentSession();
-  CDF_DirectoryIterator it (S->Directory());
+  CDF_DirectoryIterator it (myDirectory);
   Standard_Integer current = 0;
   for (;it.MoreDocument();it.NextDocument()) {
     current++;
@@ -624,6 +603,19 @@ void TDocStd_Application::OnCommitTransaction (const Handle(TDocStd_Document)&)
   // nothing to do on this level
 }
 
+//
+void TDocStd_Application::AddToSession()
+{
+  Handle(CDF_Session) S = CDF_Session::Create();
+  S->AddApplication(this, OSD_Thread::Current());
+}
+
+Standard_Boolean TDocStd_Application::RemoveFromSession()
+{
+  Handle(CDF_Session) aSession = CDF_Session::Create();
+  return aSession->RemoveApplication(OSD_Thread::Current());
+}
+
 //=======================================================================
 //function : DumpJson
 //purpose  :