0022312: Translation of french commentaries in OCCT files
[occt.git] / src / CDF / CDF_Application.cxx
CommitLineData
7fd59977 1// File: CDF_Application.cxx
2// Created: Fri Aug 8 07:49:46 1997
3// Author: Jean-Louis Frenkel
4// <rmi@frilox.paris1.matra-dtv.fr>
5// Modified by rmi, Wed Jan 14 08:17:35 1998
6
7
8#include <CDF_Application.ixx>
9#include <Standard_ErrorHandler.hxx>
10#include <TCollection_ExtendedString.hxx>
11#include <Standard_ProgramError.hxx>
12#include <Standard_GUID.hxx>
13#include <CDM_MetaData.hxx>
14#include <CDM_CanCloseStatus.hxx>
15#include <CDF_Session.hxx>
16#include <CDF_Directory.hxx>
17#include <CDF_MetaDataDriver.hxx>
15e8b082 18#include <PCDM_ReaderStatus.hxx>
7fd59977 19#include <PCDM_ReadWriter.hxx>
20#include <PCDM_RetrievalDriver.hxx>
21#include <PCDM_StorageDriver.hxx>
15e8b082 22
7fd59977 23
24#include <Plugin.hxx>
25#include <UTL.hxx>
26
27#include <CDF_Timer.hxx>
28
29#define theMetaDataDriver CDF_Session::CurrentSession()->MetaDataDriver()
30
31
32//=======================================================================
33//function :
34//purpose :
35//=======================================================================
15e8b082 36CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) {}
7fd59977 37
38//=======================================================================
39//function : Load
40//purpose :
41//=======================================================================
42Handle(CDF_Application) CDF_Application::Load(const Standard_GUID& aGUID) {
43 return Handle(CDF_Application)::DownCast(Plugin::Load(aGUID));
44}
45
46//=======================================================================
47//function : Open
48//purpose :
49//=======================================================================
50void CDF_Application::Open(const Handle(CDM_Document)& aDocument) {
51 CDF_Session::CurrentSession()->Directory()->Add(aDocument);
52 aDocument->Open(this);
53 Activate(aDocument,CDF_TOA_New);
54}
55
56//=======================================================================
57//function : CanClose
58//purpose :
59//=======================================================================
60CDM_CanCloseStatus CDF_Application::CanClose(const Handle(CDM_Document)& aDocument) {
61 return aDocument->CanClose();
62}
63
64//=======================================================================
65//function : Close
66//purpose :
67//=======================================================================
68void CDF_Application::Close(const Handle(CDM_Document)& aDocument) {
69 CDF_Session::CurrentSession()->Directory()->Remove(aDocument);
70 aDocument->Close();
71}
72
73//=======================================================================
74//function : Retrieve
75//purpose :
76//=======================================================================
77Handle(CDM_Document) CDF_Application::Retrieve(const TCollection_ExtendedString& aFolder,
78 const TCollection_ExtendedString& aName,
79 const Standard_Boolean UseStorageConfiguration) {
80 TCollection_ExtendedString nullVersion;
81 return Retrieve(aFolder,aName,nullVersion,UseStorageConfiguration);
82}
83
84//=======================================================================
85//function : Retrieve
86//purpose :
87//=======================================================================
88Handle(CDM_Document) CDF_Application::Retrieve(const TCollection_ExtendedString& aFolder,
89 const TCollection_ExtendedString& aName,
90 const TCollection_ExtendedString& aVersion,
91 const Standard_Boolean UseStorageConfiguration) {
92#ifdef DEB
93 CDF_Timer theTimer;
94#endif
95
96 Handle(CDM_MetaData) theMetaData;
97
98 if(aVersion.Length() == 0)
99 theMetaData=theMetaDataDriver->MetaData(aFolder,aName);
100 else
101 theMetaData=theMetaDataDriver->MetaData(aFolder,aName,aVersion);
102
103#ifdef DEB
104 theTimer.ShowAndRestart("Getting MetaData: ");
105#endif
106
107 CDF_TypeOfActivation theTypeOfActivation=TypeOfActivation(theMetaData);
108 Handle(CDM_Document) theDocument=Retrieve(theMetaData,UseStorageConfiguration,Standard_False);
109
110#ifdef DEB
111 theTimer.ShowAndRestart("Creating Transient: ");
112#endif
113
114 CDF_Session::CurrentSession()->Directory()->Add(theDocument);
115 Activate(theDocument,theTypeOfActivation);
116
117#ifdef DEB
118 theTimer.ShowAndStop("Activate: ");
119#endif
120
121 theDocument->Open(this);
122 return theDocument;
123
124
125}
126
127//=======================================================================
128//function : CanRetrieve
129//purpose :
130//=======================================================================
15e8b082 131PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName) {
7fd59977 132 TCollection_ExtendedString aVersion;
133 return CanRetrieve(aFolder,aName,aVersion);
134}
135
136//=======================================================================
137//function : CanRetrieve
138//purpose :
139//=======================================================================
15e8b082 140PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion) {
7fd59977 141
142#ifdef DEB
143 CDF_Timer theTimer;
144#endif
145
146 if (!theMetaDataDriver->Find(aFolder,aName,aVersion))
15e8b082 147 return PCDM_RS_UnknownDocument;
7fd59977 148 else if (!theMetaDataDriver->HasReadPermission(aFolder,aName,aVersion))
15e8b082 149 return PCDM_RS_PermissionDenied;
7fd59977 150 else {
151#ifdef DEB
152 theTimer.ShowAndRestart("theMetaDataDriver->Find: ");
153#endif
154
155 Handle(CDM_MetaData) theMetaData = theMetaDataDriver->MetaData(aFolder,aName,aVersion);
156
157#ifdef DEB
158 theTimer.ShowAndStop("Getting MetaData: ");
159#endif
160
161 if(theMetaData->IsRetrieved()) {
162 return theMetaData->Document()->IsModified()
15e8b082 163 ? PCDM_RS_AlreadyRetrievedAndModified : PCDM_RS_AlreadyRetrieved;
7fd59977 164 }
165 else {
166 TCollection_ExtendedString theFileName=theMetaData->FileName();
167 TCollection_ExtendedString theFormat=PCDM_ReadWriter::FileFormat(theFileName);
168 if(theFormat.Length()==0) {
169 TCollection_ExtendedString ResourceName=UTL::Extension(theFileName);
170 ResourceName+=".FileFormat";
171 if(UTL::Find(Resources(),ResourceName)) {
172 theFormat=UTL::Value(Resources(),ResourceName);
173 }
174 else
15e8b082 175 return PCDM_RS_UnrecognizedFileFormat;
7fd59977 176 }
15e8b082 177 if(!FindReaderFromFormat(theFormat)) return PCDM_RS_NoDriver;
7fd59977 178 }
179 }
15e8b082 180 return PCDM_RS_OK;
7fd59977 181
182}
183
184
185
186//=======================================================================
187//function : Activate
188//purpose :
189//=======================================================================
190//void CDF_Application::Activate(const Handle(CDM_Document)& aDocument,const CDF_TypeOfActivation aTypeOfActivation) {
191void CDF_Application::Activate(const Handle(CDM_Document)& ,const CDF_TypeOfActivation ) {
192}
193
194//=======================================================================
195//function : DefaultFolder
196//purpose :
197//=======================================================================
198Standard_ExtString CDF_Application::DefaultFolder(){
199 if(myDefaultFolder.Length() == 0) {
200 myDefaultFolder=CDF_Session::CurrentSession()->MetaDataDriver()->DefaultFolder();
201 }
202 return myDefaultFolder.ToExtString();
203}
204
205//=======================================================================
206//function : SetDefaultFolder
207//purpose :
208//=======================================================================
209Standard_Boolean CDF_Application::SetDefaultFolder(const Standard_ExtString aFolder) {
210 Standard_Boolean found = CDF_Session::CurrentSession()->MetaDataDriver()->FindFolder(aFolder);
211 if(found) myDefaultFolder=aFolder;
212 return found;
213}
214
215//=======================================================================
216//function : DefaultExtension
217//purpose :
218//=======================================================================
219Standard_ExtString CDF_Application::DefaultExtension() {
220 static TCollection_ExtendedString theDefaultExtension;
221 theDefaultExtension="*";
222 TColStd_SequenceOfExtendedString theFormats;
223 Formats(theFormats);
224
225 for (Standard_Integer i=1; i<= theFormats.Length(); i++) {
226 TCollection_ExtendedString theResource(theFormats(i));
227 theResource+=".FileExtension";
228 if(UTL::Find(Resources(),theResource)) {
229 theDefaultExtension=UTL::Value(Resources(),theResource);
230 return theDefaultExtension.ToExtString();
231 }
232 }
233 return theDefaultExtension.ToExtString();
234}
235
236//=======================================================================
237//function : Retrieve
238//purpose :
239//=======================================================================
240Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration) {
241 return Retrieve(aMetaData,UseStorageConfiguration,Standard_True);
242}
243
7fd59977 244//=======================================================================
245//function : Retrieve
246//purpose :
247//=======================================================================
248Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration, const Standard_Boolean IsComponent) {
249
250 Handle(CDM_Document) theDocumentToReturn;
15e8b082 251 myRetrievableStatus = PCDM_RS_DriverFailure;
7fd59977 252 if(IsComponent) {
253 Standard_SStream aMsg;
254 switch (CanRetrieve(aMetaData)) {
15e8b082 255 case PCDM_RS_UnknownDocument:
7fd59977 256 aMsg << "could not find the referenced document: " << aMetaData->Path() << "; not found." <<(char)0 << endl;
15e8b082 257 myRetrievableStatus = PCDM_RS_UnknownDocument;
7fd59977 258 Standard_Failure::Raise(aMsg);
259 break;
15e8b082 260 case PCDM_RS_PermissionDenied:
7fd59977 261 aMsg << "Could not find the referenced document: " << aMetaData->Path() << "; permission denied. " <<(char)0 << endl;
15e8b082 262 myRetrievableStatus = PCDM_RS_PermissionDenied;
7fd59977 263 Standard_Failure::Raise(aMsg);
264 break;
265 default:
266 break;
267 }
268
269 }
270 Standard_Boolean AlreadyRetrieved=aMetaData->IsRetrieved();
15e8b082 271 if(AlreadyRetrieved) myRetrievableStatus = PCDM_RS_AlreadyRetrieved;
7fd59977 272 Standard_Boolean Modified=AlreadyRetrieved && aMetaData->Document()->IsModified();
15e8b082 273 if(Modified) myRetrievableStatus = PCDM_RS_AlreadyRetrievedAndModified;
7fd59977 274 if(!AlreadyRetrieved || Modified) {
275
276 Handle(PCDM_Reader) theReader=Reader(aMetaData->FileName());
277
278
279 Handle(CDM_Document) theDocument;
280
281 if(Modified) {
282 theDocument=aMetaData->Document();
283 theDocument->RemoveAllReferences();
284 }
285 else
286 theDocument=theReader->CreateDocument();
287
288 SetReferenceCounter(theDocument,PCDM_RetrievalDriver::ReferenceCounter(aMetaData->FileName(), MessageDriver()));
289
290 SetDocumentVersion(theDocument,aMetaData);
291 theMetaDataDriver->ReferenceIterator()->LoadReferences(theDocument,aMetaData,this,UseStorageConfiguration);
292
293 try {
294 OCC_CATCH_SIGNALS
295 theReader->Read(aMetaData->FileName(),theDocument,this);
296 }
297 catch (Standard_Failure) {
15e8b082
M
298 myRetrievableStatus = theReader->GetStatus();
299 if(myRetrievableStatus > PCDM_RS_AlreadyRetrieved){
7fd59977 300 Standard_SStream aMsg;
301 aMsg << Standard_Failure::Caught() << endl;
302 Standard_Failure::Raise(aMsg);
303 }
304 }
15e8b082 305 myRetrievableStatus = theReader->GetStatus();
7fd59977 306 theDocument->SetMetaData(aMetaData);
307
308 theDocumentToReturn=theDocument;
309 }
310 else
311 theDocumentToReturn=aMetaData->Document();
312
313 return theDocumentToReturn;
314}
315
316//=======================================================================
317//function : DocumentVersion
318//purpose :
319//=======================================================================
320Standard_Integer CDF_Application::DocumentVersion(const Handle(CDM_MetaData)& theMetaData) {
321// const Handle(CDM_MessageDriver)& aMsgDriver = MessageDriver();
322 return PCDM_RetrievalDriver::DocumentVersion(theMetaData->FileName(), MessageDriver());
323}
324
325//=======================================================================
326//function : TypeOfActivation
327//purpose :
328//=======================================================================
329CDF_TypeOfActivation CDF_Application::TypeOfActivation(const Handle(CDM_MetaData)& aMetaData) {
330
331 if(aMetaData->IsRetrieved()) {
332 Handle(CDM_Document) theDocument=aMetaData->Document();
333 if(theDocument->IsOpened()) {
334 if(theDocument->IsModified())
335 return CDF_TOA_Modified;
336 else
337 return CDF_TOA_Unchanged;
338 }
339
340 else
341 return CDF_TOA_New;
342 }
343 return CDF_TOA_New;
344}
345
346
347//=======================================================================
348//function : FindReader
349//purpose :
350//=======================================================================
351Standard_Boolean CDF_Application::FindReader(const TCollection_ExtendedString& aFileName) {
352 Standard_GUID voidGUID;
353 TCollection_ExtendedString voidResourceName;
354 return FindReader(aFileName,voidGUID,voidResourceName);
355}
356
357//=======================================================================
358//function : Reader
359//purpose : code dp
360//=======================================================================
361Handle(PCDM_Reader) CDF_Application::Reader (const TCollection_ExtendedString& aFileName) {
362 TCollection_ExtendedString theFormat;
363 if (!Format(aFileName,theFormat)) {
364 Standard_SStream aMsg;
365 aMsg << "Could not found the format" <<(char)0;
366 Standard_NoSuchObject::Raise(aMsg);
367
368 }
369 return ReaderFromFormat (theFormat);
370}
371
372//=======================================================================
373//function : FindReaderFromFormat
374//purpose :
375//=======================================================================
376Standard_Boolean CDF_Application::FindReaderFromFormat(const TCollection_ExtendedString& aFormat) {
377 Standard_GUID voidGUID;
378 TCollection_ExtendedString voidResourceName;
379 return FindReaderFromFormat(aFormat,voidGUID,voidResourceName);
380}
381
382
383//=======================================================================
384//function : ReaderFromFormat
385//purpose :
386//=======================================================================
387Handle(PCDM_Reader) CDF_Application::ReaderFromFormat(const TCollection_ExtendedString& aFormat) {
388 TCollection_ExtendedString UnfoundResourceName;
389 Standard_GUID thePluginId;
390 if(!FindReaderFromFormat(aFormat,thePluginId,UnfoundResourceName)) {
391 Standard_SStream aMsg;
392 aMsg << "Could not found the item:" << UnfoundResourceName <<(char)0;
15e8b082 393 myRetrievableStatus = PCDM_RS_WrongResource;
7fd59977 394 Standard_NoSuchObject::Raise(aMsg);
395 }
396 Handle(PCDM_Reader) R;
397 try {
398 OCC_CATCH_SIGNALS
399 R = Handle(PCDM_Reader)::DownCast(Plugin::Load(thePluginId));
400 }
401 catch (Standard_Failure) {
15e8b082 402 myRetrievableStatus = PCDM_RS_WrongResource;
7fd59977 403 Standard_SStream aMsg;
404 aMsg << Standard_Failure::Caught() << endl;
405 Standard_Failure::Raise(aMsg);
406 }
407 Handle(PCDM_RetrievalDriver) RD = Handle(PCDM_RetrievalDriver)::DownCast(R);
408 if (!RD.IsNull()) {
409 RD->SetFormat(aFormat);
410 return RD;
411 } else
15e8b082 412 myRetrievableStatus = PCDM_RS_WrongResource;
7fd59977 413 return R;
414}
415
416//=======================================================================
417//function : FindReader
418//purpose :
419//=======================================================================
420Standard_Boolean CDF_Application::FindReader(const TCollection_ExtendedString& aFileName, Standard_GUID& thePluginId, TCollection_ExtendedString& ResourceName) {
421
422 TCollection_ExtendedString theFormat=PCDM_ReadWriter::FileFormat(aFileName);
423
424// Si le format est dans le fichier, tant mieux. Sinon on se base sur l'extension.
425
426 if(theFormat.Length()==0) {
427 ResourceName=UTL::Extension(aFileName);
428 ResourceName+=".FileFormat";
429
430 if(UTL::Find(Resources(),ResourceName)) {
431 theFormat=UTL::Value(Resources(),ResourceName);
432 }
433 else
434 return Standard_False;
435 }
436 return FindReaderFromFormat(theFormat,thePluginId,ResourceName);
437}
438
439//=======================================================================
440//function : Format
441//purpose : dp
442//=======================================================================
443Standard_Boolean CDF_Application::Format(const TCollection_ExtendedString& aFileName,
444 TCollection_ExtendedString& theFormat)
445{
446
447 theFormat = PCDM_ReadWriter::FileFormat(aFileName);
448 // Si le format est dans le fichier, tant mieux. Sinon on se base sur l'extension.
449 if(theFormat.Length()==0) {
450 TCollection_ExtendedString ResourceName;
451 ResourceName=UTL::Extension(aFileName);
452 ResourceName+=".FileFormat";
453
454 if(UTL::Find(Resources(),ResourceName)) {
455 theFormat = UTL::Value(Resources(),ResourceName);
456 }
457 else return Standard_False;
458 }
459 return Standard_True;
460}
461
462//=======================================================================
463//function : FindReaderFromFormat
464//purpose :
465//=======================================================================
466Standard_Boolean CDF_Application::FindReaderFromFormat(const TCollection_ExtendedString& aFormat, Standard_GUID& thePluginId, TCollection_ExtendedString& ResourceName) {
467
468 ResourceName=aFormat;
469 ResourceName+=".RetrievalPlugin";
470
471 if(UTL::Find(Resources(),ResourceName)) {
472 thePluginId=UTL::GUID(UTL::Value(Resources(),ResourceName));
473 return Standard_True;
474 }
475 return Standard_False;
476}
477
478//=======================================================================
479//function : CanRetrieve
480//purpose :
481//=======================================================================
15e8b082 482PCDM_ReaderStatus CDF_Application::CanRetrieve(const Handle(CDM_MetaData)& aMetaData) {
7fd59977 483 if(aMetaData->HasVersion())
484 return CanRetrieve(aMetaData->Folder(),aMetaData->Name(),aMetaData->Version());
485 else
486 return CanRetrieve(aMetaData->Folder(),aMetaData->Name());
487}