0029195: OCAF - ensure thread safety for different documents.
[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 <Standard_Dump.hxx>
23 #include <TCollection_ExtendedString.hxx>
24 #include <TColStd_SequenceOfExtendedString.hxx>
25 #include <Message_Msg.hxx>
26 #include <Message_MsgFile.hxx>
27 #include <Resource_Manager.hxx>
28 #include <CDF_Session.hxx>
29 #include <OSD_Thread.hxx>
30 #include <stdio.h>
31
32 #include "TObj_TObj_msg.pxx"
33
34 IMPLEMENT_STANDARD_RTTIEXT(TObj_Application,TDocStd_Application)
35
36 //=======================================================================
37 //function : GetInstance
38 //purpose  :
39 //=======================================================================
40 Handle(TObj_Application) TObj_Application::GetInstance()
41 {
42   Handle(CDF_Session) aSession = CDF_Session::Create();
43   Handle(CDF_Application) anApp;
44   if (aSession->FindApplication(OSD_Thread::Current(), anApp))
45     return Handle(TObj_Application)::DownCast(anApp);
46   return new TObj_Application;
47 }
48
49 //=======================================================================
50 //function : TObj_Application
51 //purpose  : 
52 //=======================================================================
53
54 TObj_Application::TObj_Application () : myIsError(Standard_False)
55 {
56   if (!Message_MsgFile::HasMsg ("TObj_Appl_SUnknownFailure"))
57   {
58     // load messages into global map on first instantiation
59     Message_MsgFile::LoadFromString (TObj_TObj_msg, sizeof(TObj_TObj_msg) - 1);
60     if (!Message_MsgFile::HasMsg ("TObj_Appl_SUnknownFailure"))
61     {
62       throw Standard_ProgramError("Critical Error - message resources for TObj_Application are invalid or undefined!");
63     }
64   }
65
66   myMessenger = new Message_Messenger;
67   myIsVerbose = Standard_False;
68 }
69
70 //=======================================================================
71 //function : ResourcesName
72 //purpose  : 
73 //=======================================================================
74
75 Standard_CString TObj_Application::ResourcesName()
76 {
77   return Standard_CString("TObj");
78 }
79
80 //=======================================================================
81 //function : SaveDocument
82 //purpose  : Saving the OCAF document
83 //=======================================================================
84
85 Standard_Boolean TObj_Application::SaveDocument
86                         (const Handle(TDocStd_Document)&   theSourceDoc,
87                          const TCollection_ExtendedString& theTargetFile)
88 {
89   myIsError = Standard_False;
90   PCDM_StoreStatus aStatus = SaveAs (theSourceDoc, theTargetFile);
91   myIsError = aStatus != PCDM_SS_OK;
92   if (myIsError)
93   {
94     switch (aStatus)
95     {
96     case PCDM_SS_DriverFailure:
97       ErrorMessage (Message_Msg("TObj_Appl_SDriverFailure") << theTargetFile);
98       break;
99     case PCDM_SS_WriteFailure:
100       ErrorMessage (Message_Msg("TObj_Appl_SWriteFailure") << theTargetFile);
101       break;
102     case PCDM_SS_Failure:
103       ErrorMessage (Message_Msg("TObj_Appl_SFailure") << theTargetFile);
104       break;
105     case PCDM_SS_Doc_IsNull:
106       ErrorMessage (Message_Msg("TObj_Appl_SDocIsNull") << theTargetFile);
107       break;
108     case PCDM_SS_No_Obj:
109       ErrorMessage (Message_Msg("TObj_Appl_SNoObj") << theTargetFile);
110       break;
111     case PCDM_SS_Info_Section_Error:
112       ErrorMessage (Message_Msg("TObj_Appl_SInfoSectionError") << theTargetFile);
113       break;
114     default:
115       ErrorMessage (Message_Msg("TObj_Appl_SUnknownFailure") << theTargetFile);
116       break;
117     }
118   }
119
120   // Release free memory
121   Standard::Purge();
122   return myIsError ? Standard_False : Standard_True;
123 }
124
125 //=======================================================================
126 //function : LoadDocument
127 //purpose  : Loading the OCAF document
128 //=======================================================================
129
130 Standard_Boolean TObj_Application::LoadDocument
131                         (const TCollection_ExtendedString& theSourceFile,
132                          Handle(TDocStd_Document)&         theTargetDoc)
133 {
134   myIsError = Standard_False;
135   PCDM_ReaderStatus aStatus = PCDM_RS_ReaderException;
136   {
137     try
138     {
139       aStatus = Open (theSourceFile, theTargetDoc);
140     }
141     catch (Standard_Failure const& anException) {
142 #ifdef OCCT_DEBUG
143       ErrorMessage (Message_Msg("TObj_Appl_Exception") << 
144                     anException.GetMessageString());
145 #endif
146       (void)anException;
147     }
148   }
149   myIsError = aStatus != PCDM_RS_OK;
150   if (myIsError)
151   {
152     switch (aStatus)
153     {
154     case PCDM_RS_UnknownDocument:
155       ErrorMessage (Message_Msg("TObj_Appl_RUnknownDocument") << theSourceFile);
156       break;
157     case PCDM_RS_AlreadyRetrieved:
158       ErrorMessage (Message_Msg("TObj_Appl_RAlreadyRetrieved") << theSourceFile);
159       break;
160     case PCDM_RS_AlreadyRetrievedAndModified:
161       ErrorMessage (Message_Msg("TObj_Appl_RAlreadyRetrievedAndModified") << theSourceFile);
162       break;
163     case PCDM_RS_NoDriver:
164       ErrorMessage (Message_Msg("TObj_Appl_RNoDriver") << theSourceFile);
165       break;
166     case PCDM_RS_UnknownFileDriver:
167       ErrorMessage (Message_Msg("TObj_Appl_RNoDriver") << theSourceFile);
168       break;
169     case PCDM_RS_OpenError:
170       ErrorMessage (Message_Msg("TObj_Appl_ROpenError") << theSourceFile);
171       break;
172     case PCDM_RS_NoVersion:
173       ErrorMessage (Message_Msg("TObj_Appl_RNoVersion") << theSourceFile);
174       break;
175     case PCDM_RS_NoModel:
176       ErrorMessage (Message_Msg("TObj_Appl_RNoModel") << theSourceFile);
177       break;
178     case PCDM_RS_NoDocument:
179       ErrorMessage (Message_Msg("TObj_Appl_RNoDocument") << theSourceFile);
180       break;
181     case PCDM_RS_FormatFailure:
182       ErrorMessage (Message_Msg("TObj_Appl_RFormatFailure") << theSourceFile);
183       break;
184     case PCDM_RS_TypeNotFoundInSchema:
185       ErrorMessage (Message_Msg("TObj_Appl_RTypeNotFound") << theSourceFile);
186       break;
187     case PCDM_RS_UnrecognizedFileFormat:
188       ErrorMessage (Message_Msg("TObj_Appl_RBadFileFormat") << theSourceFile);
189       break;
190     case PCDM_RS_MakeFailure:
191       ErrorMessage (Message_Msg("TObj_Appl_RMakeFailure") << theSourceFile);
192       break;
193     case PCDM_RS_PermissionDenied:
194       ErrorMessage (Message_Msg("TObj_Appl_RPermissionDenied") << theSourceFile);
195       break;
196     case PCDM_RS_DriverFailure:
197       ErrorMessage (Message_Msg("TObj_Appl_RDriverFailure") << theSourceFile);
198       break;
199     case PCDM_RS_ReaderException:
200       ErrorMessage (Message_Msg("TObj_Appl_RException") << theSourceFile);
201       break;
202     default:
203       ErrorMessage (Message_Msg("TObj_Appl_RUnknownFail") << theSourceFile);
204       break;
205     }
206   }
207
208   // Release free memory
209   Standard::Purge();
210   return myIsError ? Standard_False : Standard_True;
211 }
212
213 //=======================================================================
214 //function : CreateNewDocument
215 //purpose  : 
216 //=======================================================================
217
218 Standard_Boolean TObj_Application::CreateNewDocument
219                         (Handle(TDocStd_Document)&         theDoc,
220                          const TCollection_ExtendedString& theFormat)
221 {
222   myIsError = Standard_False;
223
224   // Create the Document
225   NewDocument (theFormat, theDoc);
226
227   return myIsError ? Standard_False : Standard_True;
228 }
229
230 //=======================================================================
231 //function : ErrorMessage
232 //purpose  : 
233 //=======================================================================
234
235 void TObj_Application::ErrorMessage (const TCollection_ExtendedString &theMsg,
236                                          const Message_Gravity theLevel)
237 {
238   myMessenger->Send ( theMsg, theLevel );
239 }
240
241 //=======================================================================
242 //function : DumpJson
243 //purpose  : 
244 //=======================================================================
245 void TObj_Application::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
246 {
247   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
248
249   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDocStd_Application)
250 }