0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / TDocStd / TDocStd_Application.cxx
1 // Created on: 1999-06-30
2 // Created by: Denis PASCAL
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <TDocStd_Application.hxx>
18
19 #include <CDF_Directory.hxx>
20 #include <CDF_DirectoryIterator.hxx>
21 #include <CDF_Session.hxx>
22 #include <CDF_Store.hxx>
23 #include <PCDM_RetrievalDriver.hxx>
24 #include <PCDM_StorageDriver.hxx>
25 #include <Plugin.hxx>
26 #include <Plugin_Failure.hxx>
27 #include <Resource_Manager.hxx>
28 #include <Standard_DomainError.hxx>
29 #include <Standard_Dump.hxx>
30 #include <Standard_ErrorHandler.hxx>
31 #include <Standard_NoSuchObject.hxx>
32 #include <Standard_NotImplemented.hxx>
33 #include <TCollection_ExtendedString.hxx>
34 #include <TDocStd_Document.hxx>
35 #include <TDocStd_Owner.hxx>
36 #include <TDocStd_PathParser.hxx>
37
38 IMPLEMENT_STANDARD_RTTIEXT(TDocStd_Application,CDF_Application)
39
40 // TDocStd_Owner attribute have pointer of closed TDocStd_Document
41 //=======================================================================
42 //function : TDocStd_Application
43 //purpose  :
44 //=======================================================================
45 TDocStd_Application::TDocStd_Application()
46         : myIsDriverLoaded (Standard_True)
47 {
48   myMessageDriver = CDM_Application::MessageDriver();
49   Handle(CDF_Session) S;
50   if (!CDF_Session::Exists()) S = new CDF_Session();
51   else S = CDF_Session::CurrentSession();
52   S->SetCurrentApplication(this);
53   try
54   {
55     OCC_CATCH_SIGNALS
56     S->LoadDriver();
57   }
58   catch (Plugin_Failure const&)
59   {
60     myIsDriverLoaded = Standard_False;
61   }
62 }
63
64
65 //=======================================================================
66 //function : IsDriverLoaded
67 //purpose  :
68 //=======================================================================
69 Standard_Boolean TDocStd_Application::IsDriverLoaded() const
70 {
71   return myIsDriverLoaded;
72 }
73
74 //=======================================================================
75 //function : MessageDriver
76 //purpose  :
77 //=======================================================================
78 Handle(Message_Messenger) TDocStd_Application::MessageDriver()
79 {
80   return myMessageDriver;
81 }
82
83 //=======================================================================
84 //function : Resources
85 //purpose  :
86 //=======================================================================
87
88 Handle(Resource_Manager)  TDocStd_Application::Resources()  {
89   if (myResources.IsNull()) {
90     myResources = new Resource_Manager(ResourcesName());
91   }
92   return myResources;
93 }
94
95 //=======================================================================
96 //function : ResourcesName
97 //purpose  :
98 //=======================================================================
99
100 Standard_CString TDocStd_Application::ResourcesName()
101 {
102   return "";
103 }
104
105 //=======================================================================
106 //function : DefineFormat
107 //purpose  : 
108 //=======================================================================
109 void TDocStd_Application::DefineFormat (const TCollection_AsciiString& theFormat,
110                                         const TCollection_AsciiString& theDescription,
111                                         const TCollection_AsciiString& theExtension,
112                                         const Handle(PCDM_RetrievalDriver)& theReader,
113                                         const Handle(PCDM_StorageDriver)& theWriter)
114 {
115   // register resources for CDM mechanics to work
116   Handle(Resource_Manager) aResources = Resources();
117   aResources->SetResource ((theFormat + ".Description"  ).ToCString(), theDescription.ToCString());
118   aResources->SetResource ((theFormat + ".FileExtension").ToCString(), theExtension.ToCString());
119   aResources->SetResource ((theExtension + ".FileFormat").ToCString(), theFormat.ToCString());
120
121   // set format ID in the drivers to allow them putting it in
122   // the OCAF documents opened by these drivers
123   if (!theReader.IsNull())
124     theReader->SetFormat(theFormat);
125   if (!theWriter.IsNull())
126     theWriter->SetFormat(theFormat);
127
128   // register drivers
129   myReaders.Add(theFormat, theReader);
130   myWriters.Add(theFormat, theWriter);
131 }
132
133 //=======================================================================
134 //function : ReadingFormats
135 //purpose  :
136 //=======================================================================
137
138 void TDocStd_Application::ReadingFormats(TColStd_SequenceOfAsciiString &theFormats)
139 {
140         theFormats.Clear();
141
142   NCollection_IndexedDataMap<TCollection_ExtendedString, Handle(PCDM_RetrievalDriver)>::Iterator
143     anIter(myReaders);
144   for (; anIter.More(); anIter.Next()) {
145     Handle(PCDM_RetrievalDriver) aDriver = anIter.Value();
146     if (aDriver.IsNull() == Standard_False) {
147       theFormats.Append(anIter.Key());
148     }
149   }
150 }
151
152 //=======================================================================
153 //function : WritingFormats
154 //purpose  :
155 //=======================================================================
156
157 void TDocStd_Application::WritingFormats(TColStd_SequenceOfAsciiString &theFormats)
158 {
159   theFormats.Clear();
160
161   NCollection_IndexedDataMap<TCollection_ExtendedString, Handle(PCDM_StorageDriver)>::Iterator
162     anIter(myWriters);
163   for (; anIter.More(); anIter.Next()) {
164     Handle(PCDM_StorageDriver) aDriver = anIter.Value();
165     if (aDriver.IsNull() == Standard_False) {
166       theFormats.Append(anIter.Key());
167     }
168   }
169 }
170
171 //=======================================================================
172 //function : NbDocuments
173 //purpose  :
174 //=======================================================================
175
176 Standard_Integer TDocStd_Application::NbDocuments() const
177 {
178   if (!CDF_Session::Exists())
179     throw Standard_DomainError("TDocStd_Application::NbDocuments");
180   Handle(CDF_Session) S = CDF_Session::CurrentSession();
181   return S->Directory()->Length();
182 }
183
184 //=======================================================================
185 //function : GetDocument
186 //purpose  :
187 //=======================================================================
188
189 void TDocStd_Application::GetDocument(const Standard_Integer index,Handle(TDocStd_Document)& aDoc) const
190 {
191   if (!CDF_Session::Exists())
192     throw Standard_DomainError("TDocStd_Application::NbDocuments");
193   Handle(CDF_Session) S = CDF_Session::CurrentSession();
194   CDF_DirectoryIterator it (S->Directory());
195   Standard_Integer current = 0;
196   for (;it.MoreDocument();it.NextDocument()) {
197     current++;
198     if (index == current) {
199       Handle(TDocStd_Document) D =
200         Handle(TDocStd_Document)::DownCast(it.Document());
201       aDoc = D;
202       return;
203     }
204   }
205 }
206
207 //=======================================================================
208 //function : NewDocument
209 //purpose  :
210 //=======================================================================
211
212 void TDocStd_Application::NewDocument(const TCollection_ExtendedString& format,Handle(TDocStd_Document)& aDoc)
213 {
214   Handle(TDocStd_Document) D = new TDocStd_Document(format);
215   InitDocument (D);
216   CDF_Application::Open(D); // add the document in the session
217   aDoc = D;
218 }
219
220 //=======================================================================
221 //function : InitDocument
222 //purpose  : do nothing
223 //=======================================================================
224
225 void TDocStd_Application::InitDocument(const Handle(TDocStd_Document)& /*aDoc*/) const
226 {
227 }
228
229 //=======================================================================
230 //function : Close
231 //purpose  :
232 //=======================================================================
233
234 void TDocStd_Application::Close(const Handle(TDocStd_Document)& aDoc)
235 {
236   if (aDoc.IsNull())
237   {
238     return;
239   }
240
241   Handle(TDocStd_Owner) Owner;
242   if (aDoc->Main().Root().FindAttribute(TDocStd_Owner::GetID(),Owner)) {
243     Handle(TDocStd_Document) emptyDoc;
244     Owner->SetDocument(emptyDoc);
245   }
246   aDoc->BeforeClose();
247   CDF_Application::Close(aDoc);
248 }
249
250 //=======================================================================
251 //function : IsInSession
252 //purpose  :
253 //=======================================================================
254
255 Standard_Integer TDocStd_Application::IsInSession (const TCollection_ExtendedString& path) const
256 {
257     TCollection_ExtendedString unifiedPath(path);
258     unifiedPath.ChangeAll('/', '|');
259     unifiedPath.ChangeAll('\\', '|');
260
261     Standard_Integer nbdoc = NbDocuments();
262     Handle(TDocStd_Document) D;
263     for (Standard_Integer i = 1; i <= nbdoc; i++) 
264     {
265         GetDocument(i,D);
266         if (D->IsSaved()) 
267         {
268             TCollection_ExtendedString unifiedDocPath(D->GetPath());
269             unifiedDocPath.ChangeAll('/', '|');
270             unifiedDocPath.ChangeAll('\\', '|');
271
272             if (unifiedPath == unifiedDocPath) 
273                 return i;
274         }
275     }
276     return 0;
277 }
278
279 //=======================================================================
280 //function : Open
281 //purpose  :
282 //=======================================================================
283
284 PCDM_ReaderStatus TDocStd_Application::Open(const TCollection_ExtendedString& path,Handle(TDocStd_Document)& aDoc) {
285   PCDM_ReaderStatus status = PCDM_RS_DriverFailure;
286   TDocStd_PathParser tool (path);
287   TCollection_ExtendedString directory = tool.Trek();
288   TCollection_ExtendedString file = tool.Name();
289   file+=".";
290   file+=tool.Extension();
291   status = CanRetrieve(directory,file);
292   if (status != PCDM_RS_OK) return status;
293   try {
294     OCC_CATCH_SIGNALS
295     Handle(TDocStd_Document) D =
296       Handle(TDocStd_Document)::DownCast(Retrieve(directory,file));
297     CDF_Application::Open(D);
298     aDoc = D;
299   }
300   catch (Standard_Failure const& anException) {
301 //    status = GetRetrieveStatus();
302     if (!MessageDriver().IsNull()) {
303 //      Standard_SStream aMsg;
304 //      aMsg << Standard_Failure::Caught() << std::endl;
305 //      std::cout << "TDocStd_Application::Open(): " << aMsg.rdbuf()->str() << std::endl;
306       TCollection_ExtendedString aString (anException.GetMessageString());
307       MessageDriver()->Send(aString.ToExtString(), Message_Fail);
308     }
309   }
310   status = GetRetrieveStatus();
311 #ifdef OCCT_DEBUG
312   std::cout<<"TDocStd_Application::Open(): The status = "<<status<<std::endl;
313 #endif
314   return status;
315 }
316
317 //=======================================================================
318 //function : Open
319 //purpose  :
320 //=======================================================================
321 PCDM_ReaderStatus TDocStd_Application::Open (Standard_IStream& theIStream, Handle(TDocStd_Document)& theDoc)
322
323   try
324   {
325     OCC_CATCH_SIGNALS
326
327     Handle(TDocStd_Document) D = Handle(TDocStd_Document)::DownCast (Read (theIStream));
328     if (!D.IsNull())
329     {
330       CDF_Application::Open(D);
331       theDoc = D;
332     }
333   }
334   catch (Standard_Failure const& anException)
335   {
336     if (!MessageDriver().IsNull())
337     {
338       TCollection_ExtendedString aFailureMessage (anException.GetMessageString());
339       MessageDriver()->Send (aFailureMessage.ToExtString(), Message_Fail);
340     }
341   }
342
343   return GetRetrieveStatus();
344 }
345
346 //=======================================================================
347 //function : SaveAs
348 //purpose  :
349 //=======================================================================
350
351 PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,const TCollection_ExtendedString& path) {
352   TDocStd_PathParser tool (path);
353   TCollection_ExtendedString directory = tool.Trek();
354   TCollection_ExtendedString file = tool.Name();
355   file+=".";
356   file+=tool.Extension();
357   D->Open(this);
358   CDF_Store storer (D);
359   if (!storer.SetFolder(directory))
360   {
361     TCollection_ExtendedString aMsg ("TDocStd_Application::SaveAs() - folder ");
362     aMsg += directory;
363     aMsg += " does not exist";
364     if(!MessageDriver().IsNull())
365       MessageDriver()->Send(aMsg.ToExtString(), Message_Fail);
366     return storer.StoreStatus(); //CDF_SS_Failure;
367   }
368   storer.SetName (file);
369   try {
370     OCC_CATCH_SIGNALS
371     storer.Realize();
372   }
373   catch (Standard_Failure const& anException) {
374     if (!MessageDriver().IsNull()) {
375       TCollection_ExtendedString aString (anException.GetMessageString());
376       MessageDriver()->Send(aString.ToExtString(), Message_Fail);
377     }
378   }
379   if(storer.StoreStatus() == PCDM_SS_OK)
380     D->SetSaved();
381 #ifdef OCCT_DEBUG
382   std::cout<<"TDocStd_Application::SaveAs(): The status = "<<storer.StoreStatus()<<std::endl;
383 #endif
384   return storer.StoreStatus();
385 }
386
387 //=======================================================================
388 //function : SaveAs
389 //purpose  :
390 //=======================================================================
391 PCDM_StoreStatus TDocStd_Application::SaveAs (const Handle(TDocStd_Document)& theDoc, Standard_OStream& theOStream)
392 {
393   try
394   {
395     Handle(PCDM_StorageDriver) aDocStorageDriver = WriterFromFormat(theDoc->StorageFormat());
396
397     if (aDocStorageDriver.IsNull())
398     {
399       return PCDM_SS_DriverFailure;
400     }
401
402     aDocStorageDriver->SetFormat(theDoc->StorageFormat());
403     aDocStorageDriver->Write(theDoc, theOStream);
404
405     if (aDocStorageDriver->GetStoreStatus() == PCDM_SS_OK)
406     {
407       theDoc->SetSaved();
408     }
409
410     return aDocStorageDriver->GetStoreStatus();
411   }
412   catch (Standard_Failure const& anException)
413   {
414     if (!MessageDriver().IsNull())
415     {
416       TCollection_ExtendedString aString(anException.GetMessageString());
417       MessageDriver()->Send(aString.ToExtString(), Message_Fail);
418     }
419   }
420   return PCDM_SS_Failure;
421 }
422
423 //=======================================================================
424 //function : Save
425 //purpose  :
426 //=======================================================================
427
428 PCDM_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D) {
429   PCDM_StoreStatus status = PCDM_SS_OK;
430   if (D->IsSaved()) {
431     CDF_Store storer (D);
432     try{
433       OCC_CATCH_SIGNALS
434       storer.Realize();
435     }
436     catch (Standard_Failure const& anException) {
437       if (!MessageDriver().IsNull()) {
438         TCollection_ExtendedString aString (anException.GetMessageString());
439         MessageDriver()->Send(aString.ToExtString(), Message_Fail);
440       }
441     }
442     if(storer.StoreStatus() == PCDM_SS_OK)
443       D->SetSaved();
444     status = storer.StoreStatus();
445   } else {
446     if(!MessageDriver().IsNull()) {
447       TCollection_ExtendedString aMsg("Document has not been saved yet");
448       MessageDriver()->Send(aMsg.ToExtString(), Message_Fail);
449     }
450     status = PCDM_SS_Failure;
451   }
452 #ifdef OCCT_DEBUG
453   std::cout<<"TDocStd_Application::Save(): The status = "<<status<<std::endl;
454 #endif
455   return status;
456 }
457
458 //=======================================================================
459 //function : SaveAs
460 //purpose  : 
461 //=======================================================================
462
463 PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,
464                                              const TCollection_ExtendedString& path,
465                                              TCollection_ExtendedString& theStatusMessage) 
466
467   TDocStd_PathParser tool (path);
468   PCDM_StoreStatus aStatus = PCDM_SS_Failure;
469   TCollection_ExtendedString directory = tool.Trek();   
470   TCollection_ExtendedString file = tool.Name();   
471   file+=".";   
472   file+=tool.Extension();
473   D->Open(this);
474   CDF_Store storer (D);  
475   if (storer.SetFolder(directory)) {
476     storer.SetName (file);
477     try {
478       OCC_CATCH_SIGNALS
479       storer.Realize();
480     }
481     catch (Standard_Failure const& anException) {
482       if (!MessageDriver().IsNull()) {
483         TCollection_ExtendedString aString (anException.GetMessageString());
484         MessageDriver()->Send(aString.ToExtString(), Message_Fail);
485       }
486     }
487     if(storer.StoreStatus() == PCDM_SS_OK)
488       D->SetSaved();
489     theStatusMessage = storer.AssociatedStatusText();
490     aStatus = storer.StoreStatus();
491   } else {
492     theStatusMessage =
493       TCollection_ExtendedString("TDocStd_Application::SaveAs"
494                                  ": No such directory ") + directory;
495     aStatus = PCDM_SS_Failure;
496   }
497   return aStatus;
498 }
499
500 //=======================================================================
501 //function : SaveAs
502 //purpose  : 
503 //=======================================================================
504
505 PCDM_StoreStatus TDocStd_Application::SaveAs (const Handle(TDocStd_Document)& theDoc,
506                                               Standard_OStream&               theOStream,
507                                               TCollection_ExtendedString&     theStatusMessage) 
508
509   try
510   {
511     Handle(PCDM_StorageDriver) aDocStorageDriver = WriterFromFormat (theDoc->StorageFormat());
512     if (aDocStorageDriver.IsNull())
513     {
514       theStatusMessage = TCollection_ExtendedString("TDocStd_Application::SaveAs: no storage driver");
515       return PCDM_SS_DriverFailure;
516     }
517
518     aDocStorageDriver->SetFormat(theDoc->StorageFormat());
519     aDocStorageDriver->Write(theDoc, theOStream);
520         
521     if (aDocStorageDriver->GetStoreStatus() == PCDM_SS_OK)
522     {
523       theDoc->SetSaved();
524     }
525
526     return aDocStorageDriver->GetStoreStatus();
527   }
528   catch (Standard_Failure const& anException)
529   {
530     if (!MessageDriver().IsNull())
531     {
532       TCollection_ExtendedString aString(anException.GetMessageString());
533       MessageDriver()->Send(aString.ToExtString(), Message_Fail);
534     }
535   }
536   return PCDM_SS_Failure;
537 }
538
539 //=======================================================================
540 //function : Save
541 //purpose  : 
542 //=======================================================================
543
544 PCDM_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D,
545                                             TCollection_ExtendedString& theStatusMessage)
546 {  
547   PCDM_StoreStatus status = PCDM_SS_OK;
548   if (D->IsSaved()) {  
549     CDF_Store storer (D);  
550     try {
551       OCC_CATCH_SIGNALS
552       storer.Realize(); 
553     }
554     catch (Standard_Failure const& anException) {
555       if (!MessageDriver().IsNull()) {
556         TCollection_ExtendedString aString (anException.GetMessageString());
557         MessageDriver()->Send(aString.ToExtString(), Message_Fail);
558       }
559     }
560     if(storer.StoreStatus() == PCDM_SS_OK)
561       D->SetSaved();
562     status = storer.StoreStatus();
563     theStatusMessage = storer.AssociatedStatusText();
564   } else {
565     theStatusMessage = "TDocStd_Application::the document has not been saved yet";
566     status = PCDM_SS_Failure;
567   }
568   return status;
569 }
570
571
572 //=======================================================================
573 //function : OnOpenTransaction
574 //purpose  : 
575 //=======================================================================
576
577 void TDocStd_Application::OnOpenTransaction (const Handle(TDocStd_Document)&)
578 {
579   // nothing to do on this level
580 }
581
582 //=======================================================================
583 //function : OnAbortTransaction
584 //purpose  : 
585 //=======================================================================
586
587 void TDocStd_Application::OnAbortTransaction (const Handle(TDocStd_Document)&)
588 {
589   // nothing to do on this level
590 }
591
592 //=======================================================================
593 //function : OnCommitTransaction
594 //purpose  : 
595 //=======================================================================
596
597 void TDocStd_Application::OnCommitTransaction (const Handle(TDocStd_Document)&)
598 {
599   // nothing to do on this level
600 }
601
602 //=======================================================================
603 //function : DumpJson
604 //purpose  : 
605 //=======================================================================
606 void TDocStd_Application::DumpJson (Standard_OStream& theOStream, Standard_Integer) const
607 {
608   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
609
610   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsDriverLoaded)
611 }