0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / BinMDF / BinMDF_ReferenceDriver.cxx
1 // Created on: 2002-10-30
2 // Created by: Michael SAZONOV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <BinMDF_ReferenceDriver.hxx>
18 #include <BinObjMgt_Persistent.hxx>
19 #include <Message_Messenger.hxx>
20 #include <Standard_Type.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_Reference.hxx>
23
24 IMPLEMENT_STANDARD_RTTIEXT(BinMDF_ReferenceDriver,BinMDF_ADriver)
25
26 //=======================================================================
27 //function : BinMDF_ReferenceDriver
28 //purpose  : Constructor
29 //=======================================================================
30 BinMDF_ReferenceDriver::BinMDF_ReferenceDriver
31                         (const Handle(Message_Messenger)& theMsgDriver)
32      : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDF_Reference)->Name())
33 {
34 }
35
36 //=======================================================================
37 //function : NewEmpty
38 //purpose  : 
39 //=======================================================================
40
41 Handle(TDF_Attribute) BinMDF_ReferenceDriver::NewEmpty() const
42 {
43   return new TDF_Reference();
44 }
45
46 //=======================================================================
47 //function : Paste
48 //purpose  : persistent -> transient (retrieve)
49 //=======================================================================
50
51 Standard_Boolean BinMDF_ReferenceDriver::Paste
52                 (const BinObjMgt_Persistent&   theSource,
53                  const Handle(TDF_Attribute)&  theTarget,
54                  BinObjMgt_RRelocationTable&   ) const
55 {
56   Handle(TDF_Reference) aRef = Handle(TDF_Reference)::DownCast(theTarget);
57
58   TDF_Label tLab; // Null label.
59   if (!theSource.GetLabel(aRef->Label().Data(), tLab))
60     return Standard_False;
61
62   // set referenced label
63   aRef->Set(tLab);
64   return Standard_True;
65 }
66
67 //=======================================================================
68 //function : Paste
69 //purpose  : transient -> persistent (store)
70 //=======================================================================
71
72 void BinMDF_ReferenceDriver::Paste (const Handle(TDF_Attribute)&  theSource,
73                                     BinObjMgt_Persistent&         theTarget,
74                                     BinObjMgt_SRelocationTable&   ) const
75 {
76   Handle(TDF_Reference) aRef = Handle(TDF_Reference)::DownCast(theSource);
77   if (!aRef.IsNull()) {
78     const TDF_Label& lab = aRef->Label();
79     const TDF_Label& refLab = aRef->Get();
80     if (!lab.IsNull() && !refLab.IsNull()) {
81       if (lab.IsDescendant(refLab.Root())) {   // Internal reference
82         theTarget << refLab;
83       }
84     }
85   }
86 }