0025812: Replace dynamic loading mechanism of OCAF persistence with dynamic-link one
[occt.git] / src / TObj / TObj_Application.cxx
1 // Created on: 2004-11-23
2 // Created by: Pavel TELKOV
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 #include <TObj_Application.hxx>
19
20 #include <Standard_SStream.hxx>
21 #include <Standard_ErrorHandler.hxx>
22 #include <TCollection_ExtendedString.hxx>
23 #include <TColStd_SequenceOfExtendedString.hxx>
24 #include <CDM_COutMessageDriver.hxx>
25 #include <Message_Msg.hxx>
26 #include <Resource_Manager.hxx>
27
28 #include <stdio.h>
29
30 IMPLEMENT_STANDARD_RTTIEXT(TObj_Application,TDocStd_Application)
31
32 //=======================================================================
33 //function : GetInstance
34 //purpose  :
35 //=======================================================================
36
37 Handle(TObj_Application) TObj_Application::GetInstance()
38 {
39   static Handle(TObj_Application) anInstance = new TObj_Application;
40   return anInstance;
41 }
42
43 //=======================================================================
44 //function : TObj_Application
45 //purpose  : 
46 //=======================================================================
47
48 TObj_Application::TObj_Application () : myIsError(Standard_False)
49 {
50   myMessenger = new Message_Messenger;
51   myIsVerbose = Standard_False;
52 }
53
54 //=======================================================================
55 //function : ResourcesName
56 //purpose  : 
57 //=======================================================================
58
59 Standard_CString TObj_Application::ResourcesName()
60 {
61   return Standard_CString("TObj");
62 }
63
64 //=======================================================================
65 //function : SaveDocument
66 //purpose  : Saving the OCAF document
67 //=======================================================================
68
69 Standard_Boolean TObj_Application::SaveDocument
70                         (const Handle(TDocStd_Document)&   theSourceDoc,
71                          const char*                       theTargetFile)
72 {
73   myIsError = Standard_False;
74   TCollection_ExtendedString aPath ((const Standard_CString)theTargetFile);
75
76   PCDM_StoreStatus aStatus = SaveAs (theSourceDoc, aPath);
77   myIsError = aStatus != PCDM_SS_OK;
78   if (myIsError)
79   {
80     switch (aStatus)
81     {
82     case PCDM_SS_DriverFailure:
83       ErrorMessage (Message_Msg("TObj_Appl_SDriverFailure") << aPath);
84       break;
85     case PCDM_SS_WriteFailure:
86       ErrorMessage (Message_Msg("TObj_Appl_SWriteFailure") << aPath);
87       break;
88     case PCDM_SS_Failure:
89       ErrorMessage (Message_Msg("TObj_Appl_SFailure") << aPath);
90       break;
91     case PCDM_SS_Doc_IsNull:
92       ErrorMessage (Message_Msg("TObj_Appl_SDocIsNull") << aPath);
93       break;
94     case PCDM_SS_No_Obj:
95       ErrorMessage (Message_Msg("TObj_Appl_SNoObj") << aPath);
96       break;
97     case PCDM_SS_Info_Section_Error:
98       ErrorMessage (Message_Msg("TObj_Appl_SInfoSectionError") << aPath);
99       break;
100     default:
101       ErrorMessage (Message_Msg("TObj_Appl_SUnknownFailure") << aPath);
102       break;
103     }
104   }
105
106   // Release free memory
107   Standard::Purge();
108   return myIsError ? Standard_False : Standard_True;
109 }
110
111 //=======================================================================
112 //function : LoadDocument
113 //purpose  : Loading the OCAF document
114 //=======================================================================
115
116 Standard_Boolean TObj_Application::LoadDocument
117                         (const char*                       theSourceFile,
118                          Handle(TDocStd_Document)&         theTargetDoc)
119 {
120   myIsError = Standard_False;
121   TCollection_ExtendedString aPath ((const Standard_CString)theSourceFile);
122
123   PCDM_ReaderStatus aStatus = PCDM_RS_ReaderException;
124   {
125     try
126     {
127       aStatus = Open (aPath, theTargetDoc);
128     }
129     catch (Standard_Failure)
130     {
131 #ifdef OCCT_DEBUG
132       ErrorMessage (Message_Msg("TObj_Appl_Exception") << 
133                     Standard_Failure::Caught()->GetMessageString());
134 #endif
135     }
136   }
137   myIsError = aStatus != PCDM_RS_OK;
138   if (myIsError)
139   {
140     switch (aStatus)
141     {
142     case PCDM_RS_UnknownDocument:
143       ErrorMessage (Message_Msg("TObj_Appl_RUnknownDocument") << aPath);
144       break;
145     case PCDM_RS_AlreadyRetrieved:
146       ErrorMessage (Message_Msg("TObj_Appl_RAlreadyRetrieved") << aPath);
147       break;
148     case PCDM_RS_AlreadyRetrievedAndModified:
149       ErrorMessage (Message_Msg("TObj_Appl_RAlreadyRetrievedAndModified") << aPath);
150       break;
151     case PCDM_RS_NoDriver:
152       ErrorMessage (Message_Msg("TObj_Appl_RNoDriver") << aPath);
153       break;
154     case PCDM_RS_UnknownFileDriver:
155       ErrorMessage (Message_Msg("TObj_Appl_RNoDriver") << aPath);
156       break;
157     case PCDM_RS_OpenError:
158       ErrorMessage (Message_Msg("TObj_Appl_ROpenError") << aPath);
159       break;
160     case PCDM_RS_NoVersion:
161       ErrorMessage (Message_Msg("TObj_Appl_RNoVersion") << aPath);
162       break;
163     case PCDM_RS_NoModel:
164       ErrorMessage (Message_Msg("TObj_Appl_RNoModel") << aPath);
165       break;
166     case PCDM_RS_NoDocument:
167       ErrorMessage (Message_Msg("TObj_Appl_RNoDocument") << aPath);
168       break;
169     case PCDM_RS_FormatFailure:
170       ErrorMessage (Message_Msg("TObj_Appl_RFormatFailure") << aPath);
171       break;
172     case PCDM_RS_TypeNotFoundInSchema:
173       ErrorMessage (Message_Msg("TObj_Appl_RTypeNotFound") << aPath);
174       break;
175     case PCDM_RS_UnrecognizedFileFormat:
176       ErrorMessage (Message_Msg("TObj_Appl_RBadFileFormat") << aPath);
177       break;
178     case PCDM_RS_MakeFailure:
179       ErrorMessage (Message_Msg("TObj_Appl_RMakeFailure") << aPath);
180       break;
181     case PCDM_RS_PermissionDenied:
182       ErrorMessage (Message_Msg("TObj_Appl_RPermissionDenied") << aPath);
183       break;
184     case PCDM_RS_DriverFailure:
185       ErrorMessage (Message_Msg("TObj_Appl_RDriverFailure") << aPath);
186       break;
187     case PCDM_RS_ReaderException:
188       ErrorMessage (Message_Msg("TObj_Appl_RException") << aPath);
189       break;
190     default:
191       ErrorMessage (Message_Msg("TObj_Appl_RUnknownFail") << aPath);
192       break;
193     }
194   }
195
196   // Release free memory
197   Standard::Purge();
198   return myIsError ? Standard_False : Standard_True;
199 }
200
201 //=======================================================================
202 //function : CreateNewDocument
203 //purpose  : 
204 //=======================================================================
205
206 Standard_Boolean TObj_Application::CreateNewDocument
207                         (Handle(TDocStd_Document)&         theDoc,
208                          const TCollection_ExtendedString& theFormat)
209 {
210   myIsError = Standard_False;
211
212   // Create the Document
213   NewDocument (theFormat, theDoc);
214
215   return myIsError ? Standard_False : Standard_True;
216 }
217
218 //=======================================================================
219 //function : ErrorMessage
220 //purpose  : 
221 //=======================================================================
222
223 void TObj_Application::ErrorMessage (const TCollection_ExtendedString &theMsg,
224                                          const Message_Gravity theLevel)
225 {
226   myMessenger->Send ( theMsg, theLevel );
227 }
228