0023593: XCAFDoc_DocumentTool label must be removed from internal map upon closing...
authorRoman Lygin <roman.lygin@gmail.com>
Wed, 28 Nov 2012 09:07:44 +0000 (13:07 +0400)
committerRoman Lygin <roman.lygin@gmail.com>
Fri, 7 Dec 2012 08:12:24 +0000 (12:12 +0400)
src/XCAFDoc/XCAFDoc_DocumentTool.cdl
src/XCAFDoc/XCAFDoc_DocumentTool.cxx

index a73e68b..31488fa 100755 (executable)
@@ -114,4 +114,9 @@ is
     Paste (me; into : mutable Attribute from TDF;
               RT   : mutable RelocationTable from TDF);    
     
+    Destroy (me: mutable) is virtual;
+    ---C++    : alias ~
+    ---Purpose: Unregisters the document holding this attribute from an
+    --          internal global map of XDE documents.
+
 end DocumentTool;
index 0f72b92..464e53f 100755 (executable)
@@ -280,3 +280,23 @@ Standard_Boolean XCAFDoc_DocumentTool::IsXCAFDocument(const  Handle(TDocStd_Docu
 {
   return RootLDocLMap.IsBound(D->Main().Root());
 }
+
+
+//=======================================================================
+//function : Destroy
+//purpose  : Removal of the document from RootLDocLMap is necessary. Otherwise
+//           there remains orphan labels and upon creation of a new
+//           label with XCAFDoc_DocumentTool attribute that
+//           orphan is attempted to get used (when hashes match) causing
+//           an exception when trying to access its data framework.
+//=======================================================================
+
+void XCAFDoc_DocumentTool::Destroy()
+{
+  TDF_Label DocL = Label();
+  if ( ! DocL.IsNull() ) {
+    TDF_Label RootL = DocL.Root();
+    if ( RootLDocLMap.IsBound( RootL ) ) 
+      RootLDocLMap.UnBind( RootL );
+  }
+}