X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMEDS%2FSALOMEDS_StudyBuilder_i.cxx;h=492a911dd43385eb76aaf23b481606c8624f3952;hb=f01a3911fa7b074af7e1ac958be5763aeed5d056;hp=42aefe220b73c65b09706de678d7ddaa08d4bfa8;hpb=2634c26b9d43e701191b55f4474890a3c799e50a;p=modules%2Fkernel.git diff --git a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx index 42aefe220..492a911dd 100644 --- a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx +++ b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx @@ -1,73 +1,49 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + // File : SALOMEDS_StudyBuilder_i.cxx -// Author : Yves FRICAUD +// Author : Seregy RUIN // Module : SALOME -// $Header$ - +// +#include "utilities.h" #include "SALOMEDS_StudyBuilder_i.hxx" -#include "SALOMEDS_StudyManager_i.hxx" #include "SALOMEDS_Study_i.hxx" - #include "SALOMEDS_SObject_i.hxx" #include "SALOMEDS_SComponent_i.hxx" -#include "SALOMEDS_ChildIterator_i.hxx" - -#include "SALOMEDS_TargetAttribute.hxx" -#include "SALOMEDS_IORAttribute.hxx" -#include "SALOMEDS_PersRefAttribute.hxx" -#include "SALOMEDS_LocalIDAttribute.hxx" -#include "SALOMEDS_StudyPropertiesAttribute.hxx" +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS.hxx" -#include "SALOMEDS_Tool.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" #include "Utils_CorbaException.hxx" #include "Utils_ExceptHandlers.hxx" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include +#include +#include #include -#define USE_CASE_LABEL_TAG 2 -#define DIRECTORYID 16661 -#define FILELOCALID 26662 - -#include "utilities.h" - -using namespace std; - UNEXPECT_CATCH(SBSalomeException, SALOME::SALOME_Exception); UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection); @@ -76,11 +52,11 @@ UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection); * Purpose : */ //============================================================================ -SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument): - _study(theStudy), - _doc(theDocument) +SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDSImpl_StudyBuilder* theImpl, + CORBA::ORB_ptr orb) { + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; } //============================================================================ @@ -89,54 +65,24 @@ SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDS_Study_i* theStudy, */ //============================================================================ SALOMEDS_StudyBuilder_i::~SALOMEDS_StudyBuilder_i() -{ -} - - -//============================================================================ -CORBA::ORB_var SALOMEDS_StudyBuilder_i::GetORB() const -{ - return _study->GetORB(); -} - - -//============================================================================ -PortableServer::POA_var SALOMEDS_StudyBuilder_i::GetPOA() const -{ - return _study->GetPOA(); -} - +{} //============================================================================ /*! Function : NewComponent * Purpose : Create a new component (Scomponent) */ //============================================================================ -SALOMEDS::SComponent_ptr -SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) +SALOMEDS::SComponent_ptr SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) { + SALOMEDS::Locker lock; CheckLocked(); - //Always create component under main label. - TDF_Label L = _doc->Main(); - - // YFR DEBUG : 13/02/2002 TDF_Label NL = L.NewChild(); - - Standard_Integer imax = 0; - for (TDF_ChildIterator it(L); it.More(); it.Next()) { - if (it.Value().Tag() > imax) - imax = it.Value().Tag(); - } - imax++; - TDF_Label NL = L.FindChild(imax); - - TDataStd_Comment::Set(NL,Standard_CString(DataType)); - // TDataStd_Comment::Set(NL,Standard_CString(CORBA::string_dup(DataType))); + //char* aDataType = CORBA::string_dup(DataType); + SALOMEDSImpl_SComponent aSCO = _impl->NewComponent(std::string(DataType)); + //CORBA::free_string(aDataType); + if(aSCO.IsNull()) return SALOMEDS::SComponent::_nil(); - SALOMEDS::SComponent_var aSComponent = SALOMEDS_SComponent_i::NewRef(_study,NL); - - OnAddSObject(aSComponent); - - return aSComponent._retn(); + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO,_orb); + return sco._retn(); } //============================================================================ @@ -144,22 +90,16 @@ SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) * Purpose : Add IOR attribute of a Scomponent */ //============================================================================ -void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr theComponent, - CORBA::Object_ptr theObject) +void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr aComponent, + CORBA::Object_ptr IOR) { + SALOMEDS::Locker lock; CheckLocked(); + CORBA::String_var anID=aComponent->GetID(); + SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(anID.in()); - if(CORBA::is_nil(theComponent) || CORBA::is_nil(theObject)) - return; - - //Find label - TDF_Label Lab; - CORBA::String_var aString = theComponent->GetID(); - TDF_Tool::Label(_doc->GetData(),const_cast(aString.in()),Lab); - - //add theObject definition - aString = GetORB()->object_to_string(theObject); - SALOMEDS_IORAttribute::Set(Lab,const_cast(aString.in()),_study); + CORBA::String_var iorstr = _orb->object_to_string(IOR); + _impl->DefineComponentInstance(aSCO, (char*)iorstr.in()); } //============================================================================ @@ -167,11 +107,14 @@ void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr t * Purpose : Delete a Scomponent */ //============================================================================ -void -SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr theComponent) +void SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr aComponent) { + SALOMEDS::Locker lock; CheckLocked(); - RemoveObject(theComponent); + ASSERT(!CORBA::is_nil(aComponent)); + CORBA::String_var cid=aComponent->GetID(); + SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(cid.in()); + _impl->RemoveComponent(aSCO); } //============================================================================ @@ -179,36 +122,19 @@ SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr theComponent) * Purpose : Create a new SObject */ //============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) +SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theFatherObject)) - return SALOMEDS::SObject::_nil(); - - //Find label of father - TDF_Label aLabel; - TCollection_AsciiString anEntry; - - CORBA::String_var aFatherID = theFatherObject->GetID(); - TDF_Tool::Label(_doc->GetData(),aFatherID,aLabel); - - //Create a new label - //YFR DEBUG : 13/02/2002 TDF_Label NewLab = Lab.NewChild(); - Standard_Integer imax = 0; - for (TDF_ChildIterator it(aLabel); it.More(); it.Next()) { - if (it.Value().Tag() > imax) - imax = it.Value().Tag(); - } - imax++; - TDF_Label aNewLabel = aLabel.FindChild(imax); - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(_study,aNewLabel); - - OnAddSObject(aSObject); + SALOMEDSImpl_SObject aFO, aSO; + CORBA::String_var anID=theFatherObject->GetID(); + aFO = _impl->GetOwner()->GetSObject(anID.in()); + aSO = _impl->NewObject(aFO); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO,_orb); - return aSObject._retn(); + return so._retn(); } //============================================================================ @@ -216,28 +142,17 @@ SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) * Purpose : */ //============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, - CORBA::Long theTag) +SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, + CORBA::Long atag) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theFatherObject)) - return SALOMEDS::SObject::_nil(); - - //Find label of father - TDF_Label Lab; - CORBA::String_var aFatherID = theFatherObject->GetID(); - TDF_Tool::Label(_doc->GetData(),aFatherID,Lab); - - //Create or find label - TDF_Label aNewLab = Lab.FindChild(theTag,1); - - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(_study,aNewLab); - - OnAddSObject(aSObject); - - return aSObject._retn(); + SALOMEDSImpl_SObject aFO, aSO; + aFO = _impl->GetOwner()->GetSObject(theFatherObject->GetID()); + aSO = _impl->NewObjectToTag(aFO, atag); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -245,28 +160,13 @@ SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr theSObject) -{ - RemoveSObject(theSObject); -} - -SALOMEDS_SObject_i* -SALOMEDS_StudyBuilder_i::RemoveSObject(SALOMEDS::SObject_ptr theSObject, - bool theIsForgetAllAttributes) +void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr anObject) { + SALOMEDS::Locker lock; CheckLocked(); - - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theSObject)){ - OnRemoveSObject(theSObject); - aSObject->OnRemove(); - if(theIsForgetAllAttributes){ - TDF_Label aLabel = aSObject->GetLabel(); - aLabel.ForgetAllAttributes(); - } - return aSObject; - } - - return NULL; + CORBA::String_var anID=anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->RemoveObject(aSO); } //============================================================================ @@ -274,53 +174,13 @@ SALOMEDS_StudyBuilder_i::RemoveSObject(SALOMEDS::SObject_ptr theSObject, * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr theSObject) +void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject) { - if(SALOMEDS_SObject_i* aSObject = RemoveSObject(theSObject,false)){ - SALOMEDS_ChildIterator_i aChildIter(_study,aSObject->GetLabel(),true); - for(; aChildIter.More(); aChildIter.Next()){ - if(SALOMEDS_SObject_i* aSObj = aChildIter.GetValue()) - aSObj->OnRemove(); - } - TDF_Label aLabel = aSObject->GetLabel(); - aLabel.ForgetAllAttributes(Standard_True); - } -} - -//============================================================================ -/*! Function : Translate_persistentID_to_IOR - * Purpose : - */ -//============================================================================ -static void Translate_persistentID_to_IOR(TDF_Label theLabel, - SALOMEDS::Driver_ptr theDriver, - SALOMEDS_Study_i* theStudy, - CORBA::Boolean theIsMultiFile, - CORBA::Boolean theIsASCII) -{ - if(CORBA::is_nil(theDriver)) - return; - - for (TDF_ChildIterator aChildIter (theLabel); aChildIter.More(); aChildIter.Next()){ - TDF_Label aCurrentLabel = aChildIter.Value(); - Handle(TDF_Attribute) anAttr; - if(aCurrentLabel.FindAttribute(SALOMEDS_PersRefAttribute::GetID(),anAttr)){ - Handle(SALOMEDS_LocalIDAttribute) anID; - if (aCurrentLabel.FindAttribute(SALOMEDS_LocalIDAttribute::GetID(),anID)) - if (anID->Get() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it - - TCollection_ExtendedString res = Handle(TDataStd_Comment)::DownCast(anAttr)->Get(); - TCollection_AsciiString ch(res); - - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(theStudy,aCurrentLabel); - - CORBA::String_var anIOR = - theDriver->LocalPersistentIDToIOR(aSObject,ch.ToCString(),theIsMultiFile,theIsASCII); - SALOMEDS_IORAttribute::Set(aCurrentLabel,const_cast(anIOR.in()),theStudy); - } - - Translate_persistentID_to_IOR(aCurrentLabel,theDriver,theStudy,theIsMultiFile,theIsASCII); - } + SALOMEDS::Locker lock; + CheckLocked(); + CORBA::String_var anID=anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->RemoveObjectWithChildren(aSO); } //============================================================================ @@ -328,153 +188,21 @@ static void Translate_persistentID_to_IOR(TDF_Label theLabel, * Purpose : */ //============================================================================ - -//============================================================================ -void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr theSComponent, - SALOMEDS::Driver_ptr theDriver) - throw(SALOME::SALOME_Exception) +void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO, + SALOMEDS::Driver_ptr aDriver) throw(SALOME::SALOME_Exception) { + SALOMEDS::Locker lock; Unexpect aCatch(SBSalomeException); - if(CORBA::is_nil(theSComponent)) - return; + CORBA::String_var anID=anSCO->GetID(); + SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(anID.in()); + SALOMEDS_Driver_i* driver = new SALOMEDS_Driver_i(aDriver, _orb); + bool isDone = _impl->LoadWith(aSCO, driver); + delete driver; - TDF_Label Lab; - CORBA::String_var aString = theSComponent->GetID(); - TDF_Tool::Label(_doc->GetData(),const_cast(aString.in()),Lab); - - //Find the current Url of the study - Handle(TDF_Attribute) Att; - if (_doc->Main().FindAttribute(SALOMEDS_PersRefAttribute::GetID(),Att)) { - if(CORBA::is_nil(theDriver)) - return; - - int aLocked = _study->GetProperties()->IsLocked(); - if(aLocked) - _study->GetProperties()->SetLocked(false); - - // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again - if (Lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), Att)) { - if(aLocked) - _study->GetProperties()->SetLocked(true); - return; - } - DefineComponentInstance (theSComponent,theDriver); - - TCollection_AsciiString aHDFPath(Handle(TDataStd_Comment)::DownCast(Att)->Get()); - - bool isASCII = false; - std::ostringstream anURLStream; - if(HDFascii::isASCII(aHDFPath.ToCString())){ - isASCII = true; - auto_ptr aResultPath(HDFascii::ConvertFromASCIIToHDF(aHDFPath.ToCString())); - anURLStream< hdf_file(new HDFfile(const_cast(aHDFUrl.c_str()))); - - char aMultifileState[2]; - char ASCIIfileState[2]; - try { - CORBA::String_var scoid = theSComponent->GetID(); - hdf_file->OpenOnDisk(HDF_RDONLY); - HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file.get()); - hdf_group->OpenOnDisk(); - HDFgroup *hdf_sco_group = new HDFgroup(scoid, hdf_group); - hdf_sco_group->OpenOnDisk(); - - SALOMEDS::TMPFile_var aStreamFile; - if (hdf_sco_group->ExistInternalObject("FILE_STREAM")) { - HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group); - hdf_dataset->OpenOnDisk(); - int aStreamSize = hdf_dataset->GetSize(); - unsigned char* aBuffer = new unsigned char[aStreamSize]; - if(aBuffer == NULL) - throw HDFexception("Unable to open dataset FILE_STREAM"); - hdf_dataset->ReadFromDisk(aBuffer); - aStreamFile = new SALOMEDS::TMPFile(aStreamSize, aStreamSize, aBuffer, 1); - hdf_dataset->CloseOnDisk(); - hdf_dataset = 0; - } else - aStreamFile = new SALOMEDS::TMPFile(0); - - HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group); - multifile_hdf_dataset->OpenOnDisk(); - multifile_hdf_dataset->ReadFromDisk(aMultifileState); - - HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group); - ascii_hdf_dataset->OpenOnDisk(); - ascii_hdf_dataset->ReadFromDisk(ASCIIfileState); - - // set path without file name from URL - std::string aDir(aHDFPath.ToCString()); - aDir = aDir.substr(0,aDir.rfind('/') + 1); - - CORBA::Boolean aResult = (ASCIIfileState[0]=='A')? - theDriver->LoadASCII(theSComponent, aStreamFile.in(), aDir.c_str(), aMultifileState[0]=='M'): - theDriver->Load(theSComponent, aStreamFile.in(), aDir.c_str(), aMultifileState[0]=='M'); - if(!aResult) { - RemoveAttribute( theSComponent, "AttributeIOR" ); - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - MESSAGE("Can't load component"); - THROW_SALOME_CORBA_EXCEPTION("Unable to load component data",SALOME::BAD_PARAM); - } - - multifile_hdf_dataset->CloseOnDisk(); - multifile_hdf_dataset = 0; - ascii_hdf_dataset->CloseOnDisk(); - ascii_hdf_dataset = 0; - hdf_sco_group->CloseOnDisk(); - hdf_sco_group = 0; - hdf_group->CloseOnDisk(); - hdf_group = 0; - hdf_file->CloseOnDisk(); - - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - } - catch (HDFexception) { - INFOS("No persistent file Name"); - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - if(aLocked) - _study->GetProperties()->SetLocked(true); - THROW_SALOME_CORBA_EXCEPTION("No persistent file Name found",SALOME::BAD_PARAM); - } - - try { - Translate_persistentID_to_IOR(Lab,theDriver,_study,aMultifileState[0]=='M',ASCIIfileState[0] == 'A'); - } catch (SALOME::SALOME_Exception) { - INFOS("Can't translate PersRef to IOR"); - if (aLocked) - _study->GetProperties()->SetLocked(true); - THROW_SALOME_CORBA_EXCEPTION("Unable to convert component persistent data to the transient",SALOME::BAD_PARAM); - // throw HDFexception("Unable to load component data"); - } - if(aLocked) - _study->GetProperties()->SetLocked(true); - } else - MESSAGE("No persistent file Name"); + if(!isDone && _impl->IsError()) { + THROW_SALOME_CORBA_EXCEPTION(_impl->GetErrorCode().c_str(),SALOME::BAD_PARAM); + } } @@ -494,30 +222,48 @@ void SALOMEDS_StudyBuilder_i::Load(SALOMEDS::SObject_ptr sco) * existing one */ //============================================================================ -SALOMEDS::GenericAttribute_ptr -SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr theObject, - const char* theTypeOfAttribute) +SALOMEDS::GenericAttribute_ptr SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr anObject, + const char* aTypeOfAttribute) { - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theObject)) - return aSObject->FindOrCreateAttribute(theTypeOfAttribute); + SALOMEDS::Locker lock; + CORBA::String_var anID = anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.inout()); + DF_Attribute* anAttr; + try { + anAttr = _impl->FindOrCreateAttribute(aSO, std::string(aTypeOfAttribute)); + } + catch (...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + + SALOMEDS::GenericAttribute_var anAttribute; + + if(anAttr) + anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb); - return SALOMEDS::GenericAttribute::_nil(); + return anAttribute._retn(); } //============================================================================ /*! Function : FindAttribute - * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found + * Purpose : Find attribute of given type assigned SObject, returns true if it is found */ //============================================================================ -CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr theObject, - SALOMEDS::GenericAttribute_out theAttr, - const char* theTypeOfAttribute) +CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject, + SALOMEDS::GenericAttribute_out anAttribute, + const char* aTypeOfAttribute) { - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theObject)) - return aSObject->FindAttribute(theAttr,theTypeOfAttribute); + SALOMEDS::Locker lock; + ASSERT(!CORBA::is_nil(anObject)); + CORBA::String_var anID = anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + DF_Attribute* anAttr; - return Standard_False; + if(!_impl->FindAttribute(aSO, anAttr, std::string(aTypeOfAttribute))) return false; + + anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb); + return true; } //============================================================================ @@ -526,27 +272,15 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr theO */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr theSObject, - const char* aTypeOfAttribute) +void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject, + const char* aTypeOfAttribute) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theSObject)) - return; - - TDF_Label Lab; - CORBA::String_var anobid = theSObject->GetID(); - TDF_Tool::Label(_doc->GetData(),anobid,Lab); - - if (strcmp(aTypeOfAttribute, "AttributeIOR") == 0) { // postponed removing of CORBA objects - Handle(SALOMEDS_IORAttribute) anAttr; - if (Lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), anAttr)) - _study->AddPostponed(TCollection_AsciiString(anAttr->Get()).ToCString()); - else - return; - } - - Lab.ForgetAttribute(SALOMEDS::GetGUID(aTypeOfAttribute)); + ASSERT(!CORBA::is_nil(anObject)); + CORBA::String_var anID = anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->RemoveAttribute(aSO, std::string(aTypeOfAttribute)); } //============================================================================ @@ -554,27 +288,20 @@ void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr theSObject, * Purpose : */ //============================================================================ -void -SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, - SALOMEDS::SObject_ptr theReferencedObject) +void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, + SALOMEDS::SObject_ptr theReferencedObject) { + SALOMEDS::Locker lock; CheckLocked(); - if(CORBA::is_nil(me) || CORBA::is_nil(theReferencedObject)) - return; - - TDF_Label Lab; - CORBA::String_var meid = me->GetID(); - TDF_Tool::Label(_doc->GetData(),meid,Lab); - - TDF_Label RefLab; - CORBA::String_var roid = theReferencedObject->GetID(); - TDF_Tool::Label(_doc->GetData(),roid,RefLab); - - TDF_Reference::Set(Lab,RefLab); - SALOMEDS_TargetAttribute::Set(RefLab)->Append(Lab); - - if(Lab.IsDescendant(_doc->Main())) - OnRemoveSObject(me); + ASSERT(!CORBA::is_nil(me)); + ASSERT(!CORBA::is_nil(theReferencedObject)); + + SALOMEDSImpl_SObject aSO, aRefSO; + CORBA::String_var anID = me->GetID(); + aSO = _impl->GetOwner()->GetSObject(anID.in()); + anID=theReferencedObject->GetID(); + aRefSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->Addreference(aSO, aRefSO); } //============================================================================ @@ -584,28 +311,15 @@ SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, //============================================================================ void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me) { - SALOMEDS::SObject_var theReferencedObject; - if(!me->ReferencedObject(theReferencedObject)) return; //No reference is found - - if(CORBA::is_nil(me) || CORBA::is_nil(theReferencedObject)) - return; - + SALOMEDS::Locker lock; CheckLocked(); - TDF_Label Lab; - CORBA::String_var meid = me->GetID(); - TDF_Tool::Label(_doc->GetData(),meid,Lab); - - Lab.ForgetAttribute(TDF_Reference::GetID()); - - TDF_Label RefLab; - CORBA::String_var roid = theReferencedObject->GetID(); - TDF_Tool::Label(_doc->GetData(),roid,RefLab); - - RemoveAttribute(theReferencedObject, "AttributeTarget"); + ASSERT(!CORBA::is_nil(me)); + CORBA::String_var anID = me->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->RemoveReference(aSO); } - //============================================================================ /*! Function : AddDirectory * Purpose : adds a new directory with a path = thePath @@ -613,62 +327,15 @@ void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me) //============================================================================ void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) { + SALOMEDS::Locker lock; CheckLocked(); if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory(); - - TCollection_AsciiString aPath(CORBA::string_dup(thePath)), aContext(""), aFatherPath; - Handle(TDataStd_Name) aName; - TDF_Label aLabel; - SALOMEDS::SObject_var anObject = SALOMEDS_SObject_i::NewRef(_study,_doc->Main()); - - try { - anObject = _study->FindObjectByPath(thePath); //Check if the directory already exists - } - catch(...) { } - - if(!anObject->_is_nil()) throw SALOMEDS::Study::StudyNameAlreadyUsed(); - - if(aPath.Value(1) != '/') { //Relative path - aPath.Prepend('/'); - aPath = TCollection_AsciiString(_study->GetContext()) + aPath; - } - - TCollection_AsciiString aToken = aPath.Token("/", 1); - if(aToken.Length() == 0) aFatherPath = "/"; - - int i = 1; - while(aToken.Length() != 0) { - if(aPath.Token("/", i+1).Length() > 0) { - aFatherPath += "/"; - aFatherPath += aToken; - } - aToken = aPath.Token("/", ++i); - } - - anObject = SALOMEDS::SObject::_nil(); - try { - anObject = _study->FindObjectByPath(aFatherPath.ToCString()); //Check if the father directory exists - } - catch(...) { ; } - if(anObject->_is_nil()) - throw SALOMEDS::Study::StudyInvalidDirectory(); - - SALOMEDS::SObject_var aNewObject = NewObject(anObject); - TDF_Tool::Label(_doc->GetData(), aNewObject->GetID(), aLabel); - if(aLabel.IsNull()) { - MESSAGE("### NULL label"); - throw SALOMEDS::Study::StudyInvalidComponent(); + if(!_impl->AddDirectory(std::string(thePath))) { + std::string anErrorCode = _impl->GetErrorCode(); + if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed(); + if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory(); + if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent(); } - - TDataStd_Name::Set(aLabel, aPath.Token("/", i-1)); - - //Set LocalID attribute to identify the directory object - SALOMEDS::GenericAttribute_var anAttr = FindOrCreateAttribute(aNewObject, "AttributeLocalID"); - SALOMEDS::AttributeLocalID_var aPersRef = SALOMEDS::AttributeLocalID::_narrow(anAttr); - if(aPersRef->_is_nil()) - throw SALOMEDS::Study::StudyInvalidDirectory(); - - aPersRef->SetValue(DIRECTORYID); } @@ -679,15 +346,12 @@ void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) //============================================================================ void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(anObject)) - return; - - TDF_Label aLabel; - CORBA::String_var anEntry = anObject->GetID(); - TDF_Tool::Label(_doc->GetData(), anEntry, aLabel); - TDataStd_UAttribute::Set(aLabel, (char*)theGUID); + ASSERT(!CORBA::is_nil(anObject)); + CORBA::String_var anID=anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->SetGUID(aSO, std::string(theGUID)); } //============================================================================ @@ -697,13 +361,11 @@ void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char //============================================================================ bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID) { - if(CORBA::is_nil(anObject)) - return false; - - TDF_Label aLabel; - CORBA::String_var anEntry = anObject->GetID(); - TDF_Tool::Label(_doc->GetData(), anEntry, aLabel); - return aLabel.IsAttribute((char*)theGUID); + SALOMEDS::Locker lock; + ASSERT(!CORBA::is_nil(anObject)); + CORBA::String_var anID=anObject->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + return _impl->IsGUID(aSO, std::string(theGUID)); } @@ -714,15 +376,8 @@ bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* //============================================================================ void SALOMEDS_StudyBuilder_i::NewCommand() { - // mpv: for SAL2114 - unset "lock changed" flag at the operation start - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); - } - anAttr->IsLockChanged(true); - - _doc->NewCommand(); + SALOMEDS::Locker lock; + _impl->NewCommand(); } //============================================================================ @@ -732,23 +387,14 @@ void SALOMEDS_StudyBuilder_i::NewCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); + try { + _impl->CommitCommand(); } - if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) { + catch(...) { MESSAGE("Locked document modification !!!"); - AbortCommand(); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _study->RemovePostponed(_doc->GetUndoLimit()); - - int aModif = anAttr->GetModified(); - if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero - anAttr->SetModified(aModif+1); - _doc->CommitCommand(); } } @@ -759,7 +405,8 @@ void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::Loc //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand() { - return _doc->HasOpenCommand(); + SALOMEDS::Locker lock; + return _impl->HasOpenCommand(); } //============================================================================ @@ -769,9 +416,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::AbortCommand() { - _study->UndoPostponed(0); - - _doc->AbortCommand(); + SALOMEDS::Locker lock; + _impl->AbortCommand(); } //============================================================================ @@ -781,19 +427,14 @@ void SALOMEDS_StudyBuilder_i::AbortCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); - } - if (anAttr->IsLocked()) { + try { + _impl->Undo(); + } + catch(...) { MESSAGE("Locked document modification !!!"); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _study->UndoPostponed(1); - _doc->Undo(); - anAttr->SetModified(anAttr->GetModified()-1); } } @@ -804,22 +445,16 @@ void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtecti //============================================================================ void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); + try { + _impl->Redo(); } - - if (anAttr->IsLocked()) { + catch(...) { MESSAGE("Locked document modification !!!"); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _doc->Redo(); - _study->UndoPostponed(-1); - anAttr->SetModified(anAttr->GetModified()+1); } - } +} //============================================================================ /*! Function : GetAvailableUndos @@ -828,7 +463,8 @@ void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtecti //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos() { - return _doc->GetAvailableUndos(); + SALOMEDS::Locker lock; + return _impl->GetAvailableUndos(); } //============================================================================ @@ -838,7 +474,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos() //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos() { - return _doc->GetAvailableRedos(); + SALOMEDS::Locker lock; + return _impl->GetAvailableRedos(); } //============================================================================ @@ -848,7 +485,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos() //============================================================================ CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit() { - return _doc->GetUndoLimit(); + SALOMEDS::Locker lock; + return _impl->UndoLimit(); } //============================================================================ @@ -858,38 +496,9 @@ CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit() //============================================================================ void SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n) { + SALOMEDS::Locker lock; CheckLocked(); - _doc->SetUndoLimit (n); -} - -//============================================================================ -/*! Function : SetOnAddSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_StudyBuilder_i::SetOnAddSObject(SALOMEDS::Callback_ptr theCallback) -{ - return _study->SetOnAddSObject(theCallback); -} - -void SALOMEDS_StudyBuilder_i::OnAddSObject(SALOMEDS::SObject_ptr theObject) -{ - _study->OnAddSObject(theObject); -} - -//============================================================================ -/*! Function : SetOnNewSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_StudyBuilder_i::SetOnRemoveSObject(SALOMEDS::Callback_ptr theCallback) -{ - return _study->SetOnRemoveSObject(theCallback); -} - -void SALOMEDS_StudyBuilder_i::OnRemoveSObject(SALOMEDS::SObject_ptr theObject) -{ - _study->OnRemoveSObject(theObject); + _impl->UndoLimit(n); } //============================================================================ @@ -897,8 +506,16 @@ void SALOMEDS_StudyBuilder_i::OnRemoveSObject(SALOMEDS::SObject_ptr theObject) * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) { - _study->CheckLocked(); +void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) +{ + SALOMEDS::Locker lock; + Unexpect aCatch(SBLockProtection); + try { + _impl->CheckLocked(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } } //============================================================================ @@ -909,17 +526,13 @@ void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockP void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - TDataStd_Name::Set(aLabel, (char*)theValue); + + CORBA::String_var anID=theSO->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->SetName(aSO, std::string(theValue)); } //============================================================================ @@ -928,19 +541,15 @@ void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* t */ //============================================================================ void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue) - throw(SALOMEDS::StudyBuilder::LockProtection) + throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - TDataStd_Comment::Set(aLabel, (char*)theValue); + CORBA::String_var anID=theSO->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->SetComment(aSO, std::string(theValue)); } //============================================================================ @@ -951,15 +560,11 @@ void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - SALOMEDS_IORAttribute::Set(aLabel, TCollection_ExtendedString((char*)theValue),_study); + CORBA::String_var anID=theSO->GetID(); + SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in()); + _impl->SetIOR(aSO, std::string(theValue)); }