1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/TDocStd/TDocStd_Application.cxx

433 lines
13 KiB
C++
Executable File

// File: TDocStd_Application.cxx
// Created: Wed Jun 30 12:40:45 1999
// Author: Denis PASCAL
// <dp@dingox.paris1.matra-dtv.fr>
#include <TDocStd_Application.ixx>
#include <CDF_Session.hxx>
#include <CDF_DirectoryIterator.hxx>
#include <CDF_Directory.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_NotImplemented.hxx>
#include <Standard_DomainError.hxx>
#include <Plugin_Failure.hxx>
#include <TDF_Label.hxx>
#include <CDF_Store.hxx>
#include <TDocStd_PathParser.hxx>
#include <CDM_MessageDriver.hxx>
// The improvement concerns returning value of the methods Open(), Save() and SaveAs():
#define BUC60867
// TDocStd_Owner attribute have pointer of closed TDocStd_Document
#define OCC159
#ifdef OCC159
#include <TDocStd_Owner.hxx>
#endif
//=======================================================================
//function : TDocStd_Application
//purpose :
//=======================================================================
TDocStd_Application::TDocStd_Application()
: myIsDriverLoaded (Standard_True)
{
Handle(CDF_Session) S;
if (!CDF_Session::Exists()) S = new CDF_Session();
else S = CDF_Session::CurrentSession();
S->SetCurrentApplication(this);
try
{
OCC_CATCH_SIGNALS
S->LoadDriver();
}
catch (Plugin_Failure)
{
myIsDriverLoaded = Standard_False;
}
}
//=======================================================================
//function : IsDriverLoaded
//purpose :
//=======================================================================
Standard_Boolean TDocStd_Application::IsDriverLoaded() const
{
return myIsDriverLoaded;
}
//=======================================================================
//function : Resources
//purpose :
//=======================================================================
Handle(Resource_Manager) TDocStd_Application::Resources() {
if (myResources.IsNull()) {
myResources = new Resource_Manager(ResourcesName());
}
return myResources;
}
//=======================================================================
//function : NbDocuments
//purpose :
//=======================================================================
Standard_Integer TDocStd_Application::NbDocuments() const
{
if (!CDF_Session::Exists())
Standard_DomainError::Raise("TDocStd_Application::NbDocuments");
Handle(CDF_Session) S = CDF_Session::CurrentSession();
return S->Directory()->Length();
}
//=======================================================================
//function : GetDocument
//purpose :
//=======================================================================
void TDocStd_Application::GetDocument(const Standard_Integer index,Handle(TDocStd_Document)& aDoc) const
{
if (!CDF_Session::Exists())
Standard_DomainError::Raise("TDocStd_Application::NbDocuments");
Handle(CDF_Session) S = CDF_Session::CurrentSession();
CDF_DirectoryIterator it (S->Directory());
Standard_Integer current = 0;
for (;it.MoreDocument();it.NextDocument()) {
current++;
if (index == current) {
Handle(TDocStd_Document) D =
Handle(TDocStd_Document)::DownCast(it.Document());
aDoc = D;
return;
}
}
}
//=======================================================================
//function : NewDocument
//purpose :
//=======================================================================
void TDocStd_Application::NewDocument(const TCollection_ExtendedString& format,Handle(TDocStd_Document)& aDoc)
{
Handle(TDocStd_Document) D = new TDocStd_Document(format);
InitDocument (D);
CDF_Application::Open(D); // add the document in the session
aDoc = D;
}
//=======================================================================
//function : InitDocument
//purpose : do nothing
//=======================================================================
void TDocStd_Application::InitDocument(const Handle(TDocStd_Document)& /*aDoc*/) const
{
}
#ifdef OCC159
//=======================================================================
//function : Close
//purpose :
//=======================================================================
void TDocStd_Application::Close(const Handle(TDocStd_Document)& aDoc)
{
Handle(TDocStd_Owner) Owner;
if (aDoc->Main().Root().FindAttribute(TDocStd_Owner::GetID(),Owner)) {
Handle(TDocStd_Document) emptyDoc;
Owner->SetDocument(emptyDoc);
}
CDF_Application::Close(aDoc);
}
#endif
//=======================================================================
//function : IsInSession
//purpose :
//=======================================================================
Standard_Integer TDocStd_Application::IsInSession (const TCollection_ExtendedString& path) const
{
Standard_Integer nbdoc = NbDocuments();
Handle(TDocStd_Document) D;
for (Standard_Integer i = 1; i <= nbdoc; i++) {
GetDocument(i,D);
if (D->IsSaved()) {
if (path == D->GetPath()) return i;
}
}
return 0;
}
//=======================================================================
//function : Open
//purpose :
//=======================================================================
PCDM_ReaderStatus TDocStd_Application::Open(const TCollection_ExtendedString& path,Handle(TDocStd_Document)& aDoc) {
PCDM_ReaderStatus status = PCDM_RS_DriverFailure;
TDocStd_PathParser tool (path);
TCollection_ExtendedString directory = tool.Trek();
TCollection_ExtendedString file = tool.Name();
file+=".";
file+=tool.Extension();
#ifdef BUC60867
status = CanRetrieve(directory,file);
if (status != PCDM_RS_OK) return status;
#endif
try {
OCC_CATCH_SIGNALS
Handle(TDocStd_Document) D =
Handle(TDocStd_Document)::DownCast(Retrieve(directory,file));
CDF_Application::Open(D);
aDoc = D;
}
catch (Standard_Failure) {
// status = GetRetrieveStatus();
Handle(Standard_Failure) F = Standard_Failure::Caught();
if (!F.IsNull() && !MessageDriver().IsNull()) {
// Standard_SStream aMsg;
// aMsg << Standard_Failure::Caught() << endl;
// cout << "TDocStd_Application::Open(): " << aMsg.rdbuf()->str() << endl;
TCollection_ExtendedString aString (F->GetMessageString());
MessageDriver()->Write(aString.ToExtString());
}
}
status = GetRetrieveStatus();
#ifdef DEB
cout<<"TDocStd_Application::Open(): The status = "<<status<<endl;
#endif
return status;
}
//=======================================================================
//function : SaveAs
//purpose :
//=======================================================================
PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,const TCollection_ExtendedString& path) {
TDocStd_PathParser tool (path);
TCollection_ExtendedString directory = tool.Trek();
TCollection_ExtendedString file = tool.Name();
file+=".";
file+=tool.Extension();
D->Open(this);
CDF_Store storer (D);
#ifdef BUC60867
if (!storer.SetFolder(directory))
{
TCollection_ExtendedString aMsg ("TDocStd_Application::SaveAs() - folder ");
aMsg += directory;
aMsg += " does not exist";
if(!MessageDriver().IsNull())
MessageDriver()->Write(aMsg.ToExtString());
return storer.StoreStatus(); //CDF_SS_Failure;
}
#endif
storer.SetName (file);
try {
OCC_CATCH_SIGNALS
storer.Realize();
}
catch (Standard_Failure) {
Handle(Standard_Failure) F = Standard_Failure::Caught();
if (!F.IsNull() && !MessageDriver().IsNull()) {
TCollection_ExtendedString aString (F->GetMessageString());
MessageDriver()->Write(aString.ToExtString());
}
}
if(storer.StoreStatus() == PCDM_SS_OK)
D->SetSaved();
#ifdef BUC60867
#ifdef DEB
cout<<"TDocStd_Application::SaveAs(): The status = "<<storer.StoreStatus()<<endl;
#endif
return storer.StoreStatus();
#endif
}
//=======================================================================
//function : Save
//purpose :
//=======================================================================
PCDM_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D) {
#ifdef BUC60867
PCDM_StoreStatus status = PCDM_SS_OK;
#endif
if (D->IsSaved()) {
CDF_Store storer (D);
try{
OCC_CATCH_SIGNALS
storer.Realize();
}
catch (Standard_Failure) {
Handle(Standard_Failure) F = Standard_Failure::Caught();
if (!F.IsNull() && !MessageDriver().IsNull()) {
TCollection_ExtendedString aString (F->GetMessageString());
MessageDriver()->Write(aString.ToExtString());
}
}
if(storer.StoreStatus() == PCDM_SS_OK)
D->SetSaved();
#ifdef BUC60867
status = storer.StoreStatus();
#endif
} else {
if(!MessageDriver().IsNull()) {
TCollection_ExtendedString aMsg("Document has not been saved yet");
MessageDriver()->Write(aMsg.ToExtString());
}
status = PCDM_SS_Failure;
}
#ifdef BUC60867
#ifdef DEB
cout<<"TDocStd_Application::Save(): The status = "<<status<<endl;
#endif
return status;
#endif
}
//=======================================================================
//function : SetViewer
//purpose :
//=======================================================================
// void TDocStd_Application::SetViewer(const Handle(TDocStd_Document)& D,
// const Handle(V3d_Viewer)& viewer)
// {
// TPrsStd_AISViewer::New (D->Main(),viewer);
// InitViewer(D);
// }
//=======================================================================
//function : SetViewer
//purpose :
//=======================================================================
// void TDocStd_Application::SetViewer(const Handle(TDocStd_Document)& D,
// const Handle(AIS_InteractiveContext)& IC)
// {
// TPrsStd_AISViewer::New (D->Main(),IC);
// InitViewer(D);
// }
//=======================================================================
//function : SaveAs
//purpose :
//=======================================================================
PCDM_StoreStatus TDocStd_Application::SaveAs(const Handle(TDocStd_Document)& D,
const TCollection_ExtendedString& path,
TCollection_ExtendedString& theStatusMessage)
{
TDocStd_PathParser tool (path);
PCDM_StoreStatus aStatus = PCDM_SS_Failure;
TCollection_ExtendedString directory = tool.Trek();
TCollection_ExtendedString file = tool.Name();
file+=".";
file+=tool.Extension();
D->Open(this);
CDF_Store storer (D);
if (storer.SetFolder(directory)) {
storer.SetName (file);
try {
OCC_CATCH_SIGNALS
storer.Realize();
}
catch (Standard_Failure) {
Handle(Standard_Failure) F = Standard_Failure::Caught();
if (!F.IsNull() && !MessageDriver().IsNull()) {
TCollection_ExtendedString aString (F->GetMessageString());
MessageDriver()->Write(aString.ToExtString());
}
}
if(storer.StoreStatus() == PCDM_SS_OK)
D->SetSaved();
theStatusMessage = storer.AssociatedStatusText();
aStatus = storer.StoreStatus();
} else {
theStatusMessage =
TCollection_ExtendedString("TDocStd_Application::SaveAs"
": No such directory ") + directory;
aStatus = PCDM_SS_Failure;
}
return aStatus;
}
//=======================================================================
//function : Save
//purpose :
//=======================================================================
PCDM_StoreStatus TDocStd_Application::Save (const Handle(TDocStd_Document)& D,
TCollection_ExtendedString& theStatusMessage)
{
PCDM_StoreStatus status = PCDM_SS_OK;
if (D->IsSaved()) {
CDF_Store storer (D);
try {
OCC_CATCH_SIGNALS
storer.Realize();
}
catch (Standard_Failure) {
Handle(Standard_Failure) F = Standard_Failure::Caught();
if (!F.IsNull() && !MessageDriver().IsNull()) {
TCollection_ExtendedString aString (F->GetMessageString());
MessageDriver()->Write(aString.ToExtString());
}
}
if(storer.StoreStatus() == PCDM_SS_OK)
D->SetSaved();
status = storer.StoreStatus();
theStatusMessage = storer.AssociatedStatusText();
} else {
theStatusMessage = "TDocStd_Application::the document has not been saved yet";
status = PCDM_SS_Failure;
}
return status;
}
//=======================================================================
//function : OnOpenTransaction
//purpose :
//=======================================================================
void TDocStd_Application::OnOpenTransaction (const Handle(TDocStd_Document)&)
{
// nothing to do on this level
}
//=======================================================================
//function : OnAbortTransaction
//purpose :
//=======================================================================
void TDocStd_Application::OnAbortTransaction (const Handle(TDocStd_Document)&)
{
// nothing to do on this level
}
//=======================================================================
//function : OnCommitTransaction
//purpose :
//=======================================================================
void TDocStd_Application::OnCommitTransaction (const Handle(TDocStd_Document)&)
{
// nothing to do on this level
}