0022573: Extend the range of status values returned by the method TDocStd_Application...
[occt.git] / src / CDF / CDF_Application.cxx
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>
18 #include <PCDM_ReaderStatus.hxx>
19 #include <PCDM_ReadWriter.hxx>
20 #include <PCDM_RetrievalDriver.hxx>
21 #include <PCDM_StorageDriver.hxx>
22
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 //=======================================================================
36 CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) {}
37
38 //=======================================================================
39 //function : Load
40 //purpose  : 
41 //=======================================================================
42 Handle(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 //=======================================================================
50 void 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 //=======================================================================
60 CDM_CanCloseStatus CDF_Application::CanClose(const Handle(CDM_Document)& aDocument) {
61   return aDocument->CanClose();
62 }
63
64 //=======================================================================
65 //function : Close
66 //purpose  : 
67 //=======================================================================
68 void 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 //=======================================================================
77 Handle(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 //=======================================================================
88 Handle(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 //=======================================================================
131 PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString&  aName) {
132  TCollection_ExtendedString aVersion;
133  return CanRetrieve(aFolder,aName,aVersion);
134 }
135
136 //=======================================================================
137 //function : CanRetrieve
138 //purpose  : 
139 //=======================================================================
140 PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString&  aFolder, const TCollection_ExtendedString&  aName, const TCollection_ExtendedString&  aVersion) {
141   
142 #ifdef DEB
143   CDF_Timer theTimer;
144 #endif
145
146   if (!theMetaDataDriver->Find(aFolder,aName,aVersion))
147     return PCDM_RS_UnknownDocument;
148   else if (!theMetaDataDriver->HasReadPermission(aFolder,aName,aVersion))
149     return PCDM_RS_PermissionDenied;
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()
163         ? PCDM_RS_AlreadyRetrievedAndModified : PCDM_RS_AlreadyRetrieved;
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
175           return PCDM_RS_UnrecognizedFileFormat;
176       }
177       if(!FindReaderFromFormat(theFormat)) return PCDM_RS_NoDriver;
178     }
179   }
180   return PCDM_RS_OK;
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) {
191 void CDF_Application::Activate(const Handle(CDM_Document)& ,const CDF_TypeOfActivation ) {
192 }
193
194 //=======================================================================
195 //function : DefaultFolder
196 //purpose  : 
197 //=======================================================================
198 Standard_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 //=======================================================================
209 Standard_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 //=======================================================================
219 Standard_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 //=======================================================================
240 Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration) {
241   return Retrieve(aMetaData,UseStorageConfiguration,Standard_True);
242
243
244 //=======================================================================
245 //function : Retrieve
246 //purpose  : 
247 //=======================================================================
248 Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration, const Standard_Boolean IsComponent) {
249   
250   Handle(CDM_Document) theDocumentToReturn;
251   myRetrievableStatus = PCDM_RS_DriverFailure;
252   if(IsComponent) {
253     Standard_SStream aMsg;
254     switch (CanRetrieve(aMetaData)) {
255     case PCDM_RS_UnknownDocument: 
256       aMsg << "could not find the referenced document: " << aMetaData->Path() << "; not found."  <<(char)0 << endl;
257       myRetrievableStatus = PCDM_RS_UnknownDocument;
258       Standard_Failure::Raise(aMsg);
259       break;
260     case PCDM_RS_PermissionDenied:      
261       aMsg << "Could not find the referenced document: " << aMetaData->Path() << "; permission denied. " <<(char)0 << endl;
262       myRetrievableStatus = PCDM_RS_PermissionDenied;
263       Standard_Failure::Raise(aMsg);
264       break;
265     default:
266       break;
267     }
268     
269   }
270   Standard_Boolean AlreadyRetrieved=aMetaData->IsRetrieved();
271   if(AlreadyRetrieved) myRetrievableStatus = PCDM_RS_AlreadyRetrieved;
272   Standard_Boolean Modified=AlreadyRetrieved && aMetaData->Document()->IsModified();
273   if(Modified) myRetrievableStatus = PCDM_RS_AlreadyRetrievedAndModified;
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) {
298       myRetrievableStatus = theReader->GetStatus();
299       if(myRetrievableStatus  > PCDM_RS_AlreadyRetrieved){
300         Standard_SStream aMsg;
301         aMsg << Standard_Failure::Caught() << endl;
302         Standard_Failure::Raise(aMsg);
303       } 
304     }
305     myRetrievableStatus = theReader->GetStatus();    
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 //=======================================================================
320 Standard_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 //=======================================================================
329 CDF_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 //=======================================================================
351 Standard_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 //=======================================================================
361 Handle(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 //=======================================================================
376 Standard_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 //=======================================================================
387 Handle(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;
393     myRetrievableStatus = PCDM_RS_WrongResource;
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) {
402     myRetrievableStatus = PCDM_RS_WrongResource;
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 
412     myRetrievableStatus = PCDM_RS_WrongResource;
413   return R;
414 }
415
416 //=======================================================================
417 //function : FindReader
418 //purpose  : 
419 //=======================================================================
420 Standard_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 //=======================================================================
443 Standard_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 //=======================================================================
466 Standard_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 //=======================================================================
482 PCDM_ReaderStatus CDF_Application::CanRetrieve(const Handle(CDM_MetaData)& aMetaData) {
483   if(aMetaData->HasVersion())
484     return CanRetrieve(aMetaData->Folder(),aMetaData->Name(),aMetaData->Version());
485   else
486     return CanRetrieve(aMetaData->Folder(),aMetaData->Name());
487 }