0025524: XmlTObjDrivers_ModelDriver::Paste will cause crash when saving model.
[occt.git] / src / XmlTObjDrivers / XmlTObjDrivers_ModelDriver.cxx
1 // Created on: 2004-11-24
2 // Created by: Edward AGAPOV
3 // Copyright (c) 2004-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 // The original implementation Copyright: (C) RINA S.p.A
17
18
19 #include "XmlTObjDrivers_ModelDriver.hxx"
20
21 #include <CDM_MessageDriver.hxx>
22 #include <XmlObjMgt_Persistent.hxx>
23 #include <XmlObjMgt_RRelocationTable.hxx>
24 #include <XmlObjMgt.hxx>
25 #include <Standard_GUID.hxx>
26 #include <TDF_Attribute.hxx>
27
28 #include <TObj_TModel.hxx>
29 #include <TObj_Model.hxx>
30 #include <TObj_Assistant.hxx>
31
32 IMPLEMENT_STANDARD_HANDLE(XmlTObjDrivers_ModelDriver,XmlMDF_ADriver)
33 IMPLEMENT_STANDARD_RTTIEXT(XmlTObjDrivers_ModelDriver,XmlMDF_ADriver);
34
35 //=======================================================================
36 //function : XmlTObjDrivers_ModelDriver
37 //purpose  : constructor
38 //=======================================================================
39
40 XmlTObjDrivers_ModelDriver::XmlTObjDrivers_ModelDriver
41                          (const Handle(CDM_MessageDriver)& theMessageDriver)
42 : XmlMDF_ADriver( theMessageDriver, NULL)
43 {
44 }
45
46 //=======================================================================
47 //function : NewEmpty
48 //purpose  : Creates a new attribute
49 //=======================================================================
50
51 Handle(TDF_Attribute) XmlTObjDrivers_ModelDriver::NewEmpty() const
52 {
53   return new TObj_TModel;
54 }
55
56 //=======================================================================
57 //function : Paste
58 //purpose  : Translate the contents of <aSource> and put it
59 //           into <aTarget>, using the relocation table
60 //           <aRelocTable> to keep the sharings.
61 //           Set CurrentModel of TObj_Assistant into Target TObj_TModel
62 //           if its GUID and GUID stored in Source are same
63 //=======================================================================
64
65 Standard_Boolean XmlTObjDrivers_ModelDriver::Paste
66                          (const XmlObjMgt_Persistent&  Source,
67                           const Handle(TDF_Attribute)& Target,
68                           XmlObjMgt_RRelocationTable&  /*RelocTable*/) const
69 {
70   TCollection_ExtendedString aString;
71   if (XmlObjMgt::GetExtendedString (Source, aString))
72   {
73     Standard_GUID aGUID (aString.ToExtString());
74     Handle(TObj_Model) aCurrentModel = TObj_Assistant::GetCurrentModel();
75     if (aGUID == aCurrentModel->GetGUID()) 
76     {
77       Handle(TObj_TModel) aTModel = Handle(TObj_TModel)::DownCast( Target );
78       aCurrentModel->SetLabel ( aTModel->Label() );
79       aTModel->Set( aCurrentModel );
80       return Standard_True;
81     }
82     WriteMessage("TObj_TModel retrieval: wrong model GUID");
83     return Standard_False;
84   }
85   WriteMessage("error retrieving ExtendedString for type TObj_TModel");
86   return Standard_False;
87 }
88
89 //=======================================================================
90 //function : Paste
91 //purpose  : Translate the contents of <aSource> and put it
92 //           into <aTarget>, using the relocation table
93 //           <aRelocTable> to keep the sharings.
94 //           a Model is stored as its GUID
95 //=======================================================================
96
97 void XmlTObjDrivers_ModelDriver::Paste
98                          (const Handle(TDF_Attribute)& Source,
99                           XmlObjMgt_Persistent&        Target,
100                           XmlObjMgt_SRelocationTable&  /*RelocTable*/) const
101 {
102   Handle(TObj_TModel) aTModel =
103     Handle(TObj_TModel)::DownCast( Source );
104   Handle(TObj_Model) aModel = aTModel->Model();
105
106   // Store model GUID.
107   Standard_PCharacter aPGuidString = new Standard_Character[256];
108   aModel->GetGUID().ToCString( aPGuidString );
109   XmlObjMgt::SetExtendedString (Target, aPGuidString);
110   delete []aPGuidString;
111 }