Integration of OCCT 6.5.0 from SVN
[occt.git] / src / TDocStd / TDocStd_Application.cxx
1 // File:        TDocStd_Application.cxx
2 // Created:     Wed Jun 30 12:40:45 1999
3 // Author:      Denis PASCAL
4 //              <dp@dingox.paris1.matra-dtv.fr>
5
6
7 #include <TDocStd_Application.ixx>
8
9 #include <CDF_Session.hxx>
10 #include <CDF_DirectoryIterator.hxx>
11 #include <CDF_Directory.hxx>
12
13 #include <Standard_ErrorHandler.hxx>
14 #include <Standard_NotImplemented.hxx>
15 #include <Standard_DomainError.hxx>
16 #include <Plugin_Failure.hxx>
17 #include <TDF_Label.hxx>
18 #include <CDF_Store.hxx>
19 #include <TDocStd_PathParser.hxx>
20
21 #include <CDM_MessageDriver.hxx>
22
23 // The improvement concerns returning value of the methods Open(), Save() and SaveAs():
24 #define BUC60867
25
26 // TDocStd_Owner attribute have pointer of closed TDocStd_Document
27 #define OCC159
28
29 #ifdef OCC159
30 #include <TDocStd_Owner.hxx>
31 #endif
32
33 //=======================================================================
34 //function : TDocStd_Application
35 //purpose  :
36 //=======================================================================
37
38 TDocStd_Application::TDocStd_Application()
39      : myIsDriverLoaded (Standard_True)
40 {
41   Handle(CDF_Session) S;
42   if (!CDF_Session::Exists()) S = new CDF_Session();
43   else S = CDF_Session::CurrentSession();
44   S->SetCurrentApplication(this);
45   try
46   {
47     OCC_CATCH_SIGNALS
48     S->LoadDriver();
49   }
50   catch (Plugin_Failure)
51   {
52     myIsDriverLoaded = Standard_False;
53   }
54 }
55
56
57 //=======================================================================
58 //function : IsDriverLoaded
59 //purpose  :
60 //=======================================================================
61 Standard_Boolean TDocStd_Application::IsDriverLoaded() const
62 {
63   return myIsDriverLoaded;
64 }
65
66 //=======================================================================
67 //function : Resources
68 //purpose  :
69 //=======================================================================
70
71 Handle(Resource_Manager)  TDocStd_Application::Resources()  {
72   if (myResources.IsNull()) {
73     myResources = new Resource_Manager(ResourcesName());
74   }
75   return myResources;
76 }
77
78
79 //=======================================================================
80 //function : NbDocuments
81 //purpose  :
82 //=======================================================================
83
84 Standard_Integer TDocStd_Application::NbDocuments() const
85 {
86   if (!CDF_Session::Exists())
87     Standard_DomainError::Raise("TDocStd_Application::NbDocuments");
88   Handle(CDF_Session) S = CDF_Session::CurrentSession();
89   return S->Directory()->Length();
90 }
91
92 //=======================================================================
93 //function : GetDocument
94 //purpose  :
95 //=======================================================================
96
97 void TDocStd_Application::GetDocument(const Standard_Integer index,Handle(TDocStd_Document)& aDoc) const
98 {
99   if (!CDF_Session::Exists())
100     Standard_DomainError::Raise("TDocStd_Application::NbDocuments");
101   Handle(CDF_Session) S = CDF_Session::CurrentSession();
102   CDF_DirectoryIterator it (S->Directory());
103   Standard_Integer current = 0;
104   for (;it.MoreDocument();it.NextDocument()) {
105     current++;
106     if (index == current) {
107       Handle(TDocStd_Document) D =
108         Handle(TDocStd_Document)::DownCast(it.Document());
109       aDoc = D;
110       return;
111     }
112   }
113 }
114
115 //=======================================================================
116 //function : NewDocument
117 //purpose  :
118 //=======================================================================
119
120 void TDocStd_Application::NewDocument(const TCollection_ExtendedString& format,Handle(TDocStd_Document)& aDoc)
121 {
122   Handle(TDocStd_Document) D = new TDocStd_Document(format);
123   InitDocument (D);
124   CDF_Application::Open(D); // add the document in the session
125   aDoc = D;
126 }
127
128 //=======================================================================
129 //function : InitDocument
130 //purpose  : do nothing
131 //=======================================================================
132
133 void TDocStd_Application::InitDocument(const Handle(TDocStd_Document)& /*aDoc*/) const
134 {
135 }
136
137 #ifdef OCC159
138 //=======================================================================
139 //function : Close
140 //purpose  :
141 //=======================================================================
142
143 void TDocStd_Application::Close(const Handle(TDocStd_Document)& aDoc)
144 {
145   Handle(TDocStd_Owner) Owner;
146   if (aDoc->Main().Root().FindAttribute(TDocStd_Owner::GetID(),Owner)) {
147     Handle(TDocStd_Document) emptyDoc;
148     Owner->SetDocument(emptyDoc);
149   }
150   CDF_Application::Close(aDoc);
151 }
152 #endif
153
154 //=======================================================================
155 //function : IsInSession
156 //purpose  :
157 //=======================================================================
158
159 Standard_Integer TDocStd_Application::IsInSession (const TCollection_ExtendedString& path) const
160 {
161   Standard_Integer nbdoc = NbDocuments();
162   Handle(TDocStd_Document) D;
163   for (Standard_Integer i = 1; i <= nbdoc; i++) {
164     GetDocument(i,D);
165     if (D->IsSaved()) {
166       if (path == D->GetPath()) return i;
167     }
168   }
169   return 0;
170 }
171
172 //=======================================================================
173 //function : Open
174 //purpose  :
175 //=======================================================================
176
177 CDF_RetrievableStatus TDocStd_Application::Open(const TCollection_ExtendedString& path,Handle(TDocStd_Document)& aDoc) {
178   CDF_RetrievableStatus status = CDF_RS_DriverFailure;
179   TDocStd_PathParser tool (path);
180   TCollection_ExtendedString directory = tool.Trek();
181   TCollection_ExtendedString file = tool.Name();
182   file+=".";
183   file+=tool.Extension();
184 #ifdef BUC60867
185   status = CanRetrieve(directory,file);
186   if (status != CDF_RS_OK) return status;
187 #endif
188   try {
189     OCC_CATCH_SIGNALS
190     Handle(TDocStd_Document) D =
191       Handle(TDocStd_Document)::DownCast(Retrieve(directory,file));
192     CDF_Application::Open(D);
193     aDoc = D;
194   }
195   catch (Standard_Failure) {
196 //    status = GetRetrieveStatus();
197     Handle(Standard_Failure) F = Standard_Failure::Caught();
198     if (!F.IsNull() && !MessageDriver().IsNull()) {
199 //      Standard_SStream aMsg;
200 //      aMsg << Standard_Failure::Caught() << endl;
201 //      cout << "TDocStd_Application::Open(): " << aMsg.rdbuf()->str() << endl;
202       TCollection_ExtendedString aString (F->GetMessageString());
203       MessageDriver()->Write(aString.ToExtString());
204     }
205   }
206   status = GetRetrieveStatus();
207 #ifdef DEB
208   cout<<"TDocStd_Application::Open(): The status = "<<status<<endl;
209 #endif
210   return status;
211 }
212
213 //=======================================================================
214 //function : SaveAs
215 //purpose  :
216 //=======================================================================
217
218 CDF_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,const TCollection_ExtendedString& path) {
219   TDocStd_PathParser tool (path);
220   TCollection_ExtendedString directory = tool.Trek();
221   TCollection_ExtendedString file = tool.Name();
222   file+=".";
223   file+=tool.Extension();
224   D->Open(this);
225   CDF_Store storer (D);
226 #ifdef BUC60867
227   if (!storer.SetFolder(directory))
228   {
229     TCollection_ExtendedString aMsg ("TDocStd_Application::SaveAs() - folder ");
230     aMsg += directory;
231     aMsg += " does not exist";
232     if(!MessageDriver().IsNull())
233       MessageDriver()->Write(aMsg.ToExtString());
234     return storer.StoreStatus(); //CDF_SS_Failure;
235   }
236 #endif
237   storer.SetName (file);
238   try {
239     OCC_CATCH_SIGNALS
240     storer.Realize();
241   }
242   catch (Standard_Failure) {
243     Handle(Standard_Failure) F = Standard_Failure::Caught();
244     if (!F.IsNull() && !MessageDriver().IsNull()) {
245       TCollection_ExtendedString aString (F->GetMessageString());
246       MessageDriver()->Write(aString.ToExtString());
247     }
248   }
249   if(storer.StoreStatus() == CDF_SS_OK)
250     D->SetSaved();
251 #ifdef BUC60867
252 #ifdef DEB
253   cout<<"TDocStd_Application::SaveAs(): The status = "<<storer.StoreStatus()<<endl;
254 #endif
255   return storer.StoreStatus();
256 #endif
257 }
258
259 //=======================================================================
260 //function : Save
261 //purpose  :
262 //=======================================================================
263
264 CDF_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D) {
265 #ifdef BUC60867
266   CDF_StoreStatus status = CDF_SS_OK;
267 #endif
268   if (D->IsSaved()) {
269     CDF_Store storer (D);
270     try{
271       OCC_CATCH_SIGNALS
272       storer.Realize();
273     }
274     catch (Standard_Failure) {
275       Handle(Standard_Failure) F = Standard_Failure::Caught();
276       if (!F.IsNull() && !MessageDriver().IsNull()) {
277         TCollection_ExtendedString aString (F->GetMessageString());
278         MessageDriver()->Write(aString.ToExtString());
279       }
280     }
281     if(storer.StoreStatus() == CDF_SS_OK)
282       D->SetSaved();
283 #ifdef BUC60867
284     status = storer.StoreStatus();
285 #endif
286   } else {
287 //    Standard_DomainError::Raise ("TDocStd_Application::Save document is not already saved");
288     if(!MessageDriver().IsNull()) {
289       TCollection_ExtendedString aMsg("Document is already saved");
290       MessageDriver()->Write(aMsg.ToExtString());
291     }
292     status = CDF_SS_Failure;
293   }
294 #ifdef BUC60867
295 #ifdef DEB
296   cout<<"TDocStd_Application::Save(): The status = "<<status<<endl;
297 #endif
298   return status;
299 #endif
300 }
301
302 //=======================================================================
303 //function : SetViewer
304 //purpose  :
305 //=======================================================================
306
307 // void TDocStd_Application::SetViewer(const Handle(TDocStd_Document)& D,
308 //                                  const Handle(V3d_Viewer)& viewer)
309 // {
310 //   TPrsStd_AISViewer::New (D->Main(),viewer);
311 //   InitViewer(D);
312 // }
313
314
315 //=======================================================================
316 //function : SetViewer
317 //purpose  :
318 //=======================================================================
319
320 // void TDocStd_Application::SetViewer(const Handle(TDocStd_Document)& D,
321 //                                  const Handle(AIS_InteractiveContext)& IC)
322 // {
323 //   TPrsStd_AISViewer::New (D->Main(),IC);
324 //   InitViewer(D);
325 // }
326
327
328 //=======================================================================
329 //function : SaveAs
330 //purpose  : 
331 //=======================================================================
332
333 CDF_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,
334                                               const TCollection_ExtendedString& path,
335                                               TCollection_ExtendedString& theStatusMessage) 
336
337   TDocStd_PathParser tool (path);
338   CDF_StoreStatus aStatus = CDF_SS_Failure;
339   TCollection_ExtendedString directory = tool.Trek();   
340   TCollection_ExtendedString file = tool.Name();   
341   file+=".";   
342   file+=tool.Extension();
343   D->Open(this);
344   CDF_Store storer (D);  
345   if (storer.SetFolder(directory)) {
346     storer.SetName (file);
347     try {
348       OCC_CATCH_SIGNALS
349       storer.Realize();
350     }
351     catch (Standard_Failure) {
352       Handle(Standard_Failure) F = Standard_Failure::Caught();
353       if (!F.IsNull() && !MessageDriver().IsNull()) {
354         TCollection_ExtendedString aString (F->GetMessageString());
355         MessageDriver()->Write(aString.ToExtString());
356       }
357     }
358     if(storer.StoreStatus() == CDF_SS_OK)
359       D->SetSaved();
360     theStatusMessage = storer.AssociatedStatusText();
361     aStatus = storer.StoreStatus();
362   } else {
363     theStatusMessage =
364       TCollection_ExtendedString("TDocStd_Application::SaveAs"
365                                  ": No such directory ") + directory;
366     aStatus = CDF_SS_Failure;
367   }
368   return aStatus;
369 }
370
371 //=======================================================================
372 //function : Save
373 //purpose  : 
374 //=======================================================================
375
376 CDF_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D,
377                                            TCollection_ExtendedString& theStatusMessage)
378 {  
379   CDF_StoreStatus status = CDF_SS_OK;
380   if (D->IsSaved()) {  
381     CDF_Store storer (D);  
382     try {
383       OCC_CATCH_SIGNALS
384       storer.Realize(); 
385     }
386     catch (Standard_Failure) {
387       Handle(Standard_Failure) F = Standard_Failure::Caught();
388       if (!F.IsNull() && !MessageDriver().IsNull()) {
389         TCollection_ExtendedString aString (F->GetMessageString());
390         MessageDriver()->Write(aString.ToExtString());
391       }
392     }
393     if(storer.StoreStatus() == CDF_SS_OK)
394       D->SetSaved();
395     status = storer.StoreStatus();
396     theStatusMessage = storer.AssociatedStatusText();
397   } else {
398     Standard_DomainError::Raise ("TDocStd_Application::Save"
399                                  " document is not already saved");
400     theStatusMessage = "TDocStd_Application::the document is not already saved";
401   }
402   return status;
403 }
404
405
406 //=======================================================================
407 //function : OnOpenTransaction
408 //purpose  : 
409 //=======================================================================
410
411 void TDocStd_Application::OnOpenTransaction (const Handle(TDocStd_Document)&)
412 {
413   // nothing to do on this level
414 }
415
416 //=======================================================================
417 //function : OnAbortTransaction
418 //purpose  : 
419 //=======================================================================
420
421 void TDocStd_Application::OnAbortTransaction (const Handle(TDocStd_Document)&)
422 {
423   // nothing to do on this level
424 }
425
426 //=======================================================================
427 //function : OnCommitTransaction
428 //purpose  : 
429 //=======================================================================
430
431 void TDocStd_Application::OnCommitTransaction (const Handle(TDocStd_Document)&)
432 {
433   // nothing to do on this level
434 }