0024927: Getting rid of "Persistent" functionality -- Code
[occt.git] / src / MDocStd / MDocStd_DocumentStorageDriver.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <MDocStd_DocumentStorageDriver.ixx>
15
16 #include <CDM_MessageDriver.hxx>
17 #include <TDocStd_Application.hxx>
18 #include <TDocStd_Document.hxx>
19 #include <MDF.hxx>
20 #include <MDF_SRelocationTable.hxx>
21 #include <MDF_TypeASDriverMap.hxx>
22 #include <PDF_Data.hxx>
23 #include <PDocStd_Document.hxx>
24
25 #include <TDF_Tool.hxx>
26 #include <UTL.hxx>
27 #include <Resource_Manager.hxx>
28 #include <Plugin.hxx>
29
30
31 #include <CDF_Application.hxx>
32 #include <CDF_Session.hxx>
33
34
35 //=======================================================================
36 //function : MDocStd_DocumentStorageDriver
37 //purpose  : 
38 //=======================================================================
39
40 MDocStd_DocumentStorageDriver::MDocStd_DocumentStorageDriver () {}
41
42
43 //=======================================================================
44 //function : Paste
45 //purpose  : paste Transient Document in Persistant Document
46 //=======================================================================
47
48 void MDocStd_DocumentStorageDriver::Paste (const Handle(TDocStd_Document)& TDOC,
49                                    const Handle(PDocStd_Document)& PDOC,
50                                    const Handle(MDF_SRelocationTable)& Reloc)
51 {
52   Handle(TDF_Data) aTDF = TDOC->GetData(); 
53   Handle(PDF_Data) aPDF; //  = new PDF_Data(); fait par MDF
54   if (myDrivers.IsNull()) myDrivers = AttributeDrivers(TDOC->Application()->MessageDriver());
55   Standard_Integer DFSchemaVersion = 0;
56   MDF::FromTo(aTDF, aPDF, myDrivers, Reloc,DFSchemaVersion); 
57   PDOC->SetData(aPDF);
58 }
59
60 //=======================================================================
61 //function : CreateDocument
62 //purpose  : 
63 //=======================================================================
64
65 Handle(PCDM_Document) MDocStd_DocumentStorageDriver::CreateDocument() {
66   return new PDocStd_Document ();
67 }
68
69 //=======================================================================
70 //function : Make
71 //purpose  : 
72 //=======================================================================
73
74 Handle(PCDM_Document) MDocStd_DocumentStorageDriver::Make(const Handle(CDM_Document)& aDocument) 
75 {  
76   Handle(TDocStd_Document) TDOC = Handle(TDocStd_Document)::DownCast(aDocument);  
77   Handle(PDocStd_Document) PDOC = Handle(PDocStd_Document)::DownCast(CreateDocument());
78   if (!TDOC.IsNull() && !PDOC.IsNull()) {
79     Handle(MDF_SRelocationTable) Reloc = new MDF_SRelocationTable();
80     Paste (TDOC,PDOC,Reloc);
81   }
82   return PDOC;
83 }
84
85 //=======================================================================
86 //function : SchemaName
87 //purpose  : 
88 //=======================================================================
89
90 TCollection_ExtendedString MDocStd_DocumentStorageDriver::SchemaName() const 
91 {
92   TCollection_ExtendedString schemaname = PCDM_StorageDriver::GetFormat();
93   schemaname+="Schema";
94   return schemaname; 
95 }
96
97 //=======================================================================
98 //function : AttributeDrivers
99 //purpose  : 
100 //=======================================================================
101
102 Handle(MDF_ASDriverTable) MDocStd_DocumentStorageDriver::AttributeDrivers(const Handle(CDM_MessageDriver)& theMsgDriver)
103 {   
104   Handle(MDF_ASDriverTable) drivers;
105   //
106   Handle(CDF_Application) TheApplication;  
107   if (CDF_Session::Exists()) {
108     Handle(CDF_Session) TheSession = CDF_Session::CurrentSession();   
109     if (TheSession->HasCurrentApplication()) {
110       TheApplication = TheSession->CurrentApplication();
111     } 
112   }
113   if (!TheApplication.IsNull()) {
114     Handle(Resource_Manager) resource = TheApplication->Resources();
115     TCollection_ExtendedString pluginNAME;
116     pluginNAME = PCDM_StorageDriver::GetFormat(); 
117     pluginNAME+=".";  
118     pluginNAME+="AttributeStoragePlugin";  
119     TCollection_ExtendedString pluginID;
120     Standard_Boolean found = UTL::Find(resource,pluginNAME);
121     if(found) { 
122       TCollection_ExtendedString value = UTL::Value (resource,pluginNAME);
123       Standard_GUID plugin (UTL::GUID(value));
124       drivers = Handle(MDF_ASDriverTable)::DownCast(Plugin::Load(plugin));
125     }else {
126       TCollection_ExtendedString aMsg("Resource not found: ");
127       aMsg = aMsg.Cat(pluginNAME).Cat("\0");
128       theMsgDriver->Write(aMsg.ToExtString());
129     }
130   }
131   if (drivers.IsNull()) {
132 //    cout  << "MDocStd_DocumentStorageDriver::AttributeDrivers not found" << endl;
133     TCollection_ExtendedString aMsg("AttributeDrivers not found ");
134     aMsg = aMsg.Cat("\0");
135     theMsgDriver->Write(aMsg.ToExtString());
136   }
137   return drivers;
138 }
139
140
141