X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMEDS%2FSALOMEDS_SObject_i.cxx;h=ea5f8845c5844d1ad0bb44cd4c6c5e169bc64f92;hb=48d150b078ab63d77fbed4de1f8dbd7d3a8767da;hp=5f5ddded8977a4af4324f3905c2e1d3135c4516f;hpb=83abcf69126ce0eebb0b43e50d9a200e54a5df3f;p=modules%2Fkernel.git diff --git a/src/SALOMEDS/SALOMEDS_SObject_i.cxx b/src/SALOMEDS/SALOMEDS_SObject_i.cxx index 5f5ddded8..ea5f8845c 100644 --- a/src/SALOMEDS/SALOMEDS_SObject_i.cxx +++ b/src/SALOMEDS/SALOMEDS_SObject_i.cxx @@ -1,772 +1,356 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server +// Copyright (C) 2007-2014 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, or (at your option) any later version. // +// 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_SObject_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - +// +#include "utilities.h" #include "SALOMEDS_SObject_i.hxx" - -//SALOMEDS Headers -#include "SALOMEDS_Study_i.hxx" -#include "SALOMEDS_StudyManager_i.hxx" #include "SALOMEDS_SComponent_i.hxx" - -#include "SALOMEDS_AttributeComment_i.hxx" - -#include "SALOMEDS_AttributeTreeNode_i.hxx" -#include "SALOMEDS_AttributeUserID_i.hxx" - -#include "SALOMEDS_AttributePersistentRef_i.hxx" -#include "SALOMEDS_AttributeIOR_i.hxx" -#include "SALOMEDS_AttributeExternalFileDef_i.hxx" -#include "SALOMEDS_AttributeFileType_i.hxx" -#include "SALOMEDS_AttributeName_i.hxx" -#include "SALOMEDS_AttributeSequenceOfInteger_i.hxx" -#include "SALOMEDS_AttributeSequenceOfReal_i.hxx" -#include "SALOMEDS_AttributeTableOfInteger_i.hxx" -#include "SALOMEDS_AttributeTableOfReal_i.hxx" -#include "SALOMEDS_AttributeTableOfString_i.hxx" -#include "SALOMEDS_AttributeInteger_i.hxx" -#include "SALOMEDS_AttributeReal_i.hxx" -#include "SALOMEDS_AttributeDrawable_i.hxx" -#include "SALOMEDS_AttributeSelectable_i.hxx" -#include "SALOMEDS_AttributeExpandable_i.hxx" -#include "SALOMEDS_AttributeOpened_i.hxx" -#include "SALOMEDS_AttributeTextColor_i.hxx" -#include "SALOMEDS_AttributeTextHighlightColor_i.hxx" -#include "SALOMEDS_AttributePixMap_i.hxx" -#include "SALOMEDS_AttributeTarget_i.hxx" -#include "SALOMEDS_AttributeLocalID_i.hxx" -#include "SALOMEDS_AttributeStudyProperties_i.hxx" -#include "SALOMEDS_AttributePythonObject_i.hxx" - -#include "SALOMEDS_AttributeGraphic_i.hxx" -#include "SALOMEDS_AttributeFlags_i.hxx" - -#include "Utils_ExceptHandlers.hxx" -UNEXPECT_CATCH(GALockProtection, SALOMEDS::GenericAttribute::LockProtection); - -#include "utilities.h" - -using namespace std; -using namespace SALOMEDS; - - -inline bool operator<(const Standard_GUID& theLeft, const Standard_GUID& theRight) +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_StudyManager_i.hxx" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include "Basics_Utils.hxx" + +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +SALOMEDS::SObject_ptr SALOMEDS_SObject_i::New(const SALOMEDSImpl_SObject& theImpl, CORBA::ORB_ptr theORB) { - char aLeft[40] = ""; - theLeft.ToCString(aLeft); + SALOMEDS_SObject_i* so_servant = new SALOMEDS_SObject_i(theImpl, theORB); - char aRight[40] = ""; - theRight.ToCString(aRight); - - return strcmp(aLeft,aRight) < 0; + return so_servant->_this(); } -namespace SALOMEDS{ - - const char* Str(const TCollection_ExtendedString& theString) - { - return TCollection_AsciiString(theString).ToCString(); - } - - typedef std::string TAttributeID; - - typedef Standard_GUID (*TGetGUID)(); - typedef bool (*TIsCheckLockedStudy)(); - typedef Handle(TDF_Attribute) (*TNewAttribute)(); - typedef SALOMEDS_GenericAttribute_i* (*TNewInstance)(const Handle(TDF_Attribute)&, SALOMEDS_SObject_i*); - - struct TAttrFun{ - TAttrFun(const TGetGUID& theGetGUID, - const TIsCheckLockedStudy& theIsCheckLockedStudy, - const TNewAttribute& theNewAttribute, - const TNewInstance& theNewInstance): - myGetGUID(theGetGUID), - myIsCheckLockedStudy(theIsCheckLockedStudy), - myNewAttribute(theNewAttribute), - myNewInstance(theNewInstance) - { - } - - TGetGUID myGetGUID; - TIsCheckLockedStudy myIsCheckLockedStudy; - TNewAttribute myNewAttribute; - TNewInstance myNewInstance; - }; - - typedef std::map TAttrID2FunMap; - static TAttrID2FunMap __AttrID2FunMap__; - - - typedef std::map TGUID2AttrIDMap; - static TGUID2AttrIDMap __GUID2AttrIDMap__; - - bool Init() - { - -#define ADD_ATTRID2FUNMAP_ITEM(theName) \ - __AttrID2FunMap__.insert( \ - TAttrID2FunMap::value_type(#theName,TAttrFun( \ - &(SALOMEDS_##theName##_i::GetGUID), \ - &(SALOMEDS_##theName##_i::IsCheckLockedStudy), \ - &(SALOMEDS_##theName##_i::NewAttribute), \ - &(SALOMEDS_##theName##_i::NewInstance) \ - ))) - - ADD_ATTRID2FUNMAP_ITEM(AttributeName); - ADD_ATTRID2FUNMAP_ITEM(AttributeComment); - ADD_ATTRID2FUNMAP_ITEM(AttributeIOR); - ADD_ATTRID2FUNMAP_ITEM(AttributeReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeSequenceOfInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeSequenceOfReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfString); - ADD_ATTRID2FUNMAP_ITEM(AttributeLocalID); - ADD_ATTRID2FUNMAP_ITEM(AttributePythonObject); - - ADD_ATTRID2FUNMAP_ITEM(AttributeUserID); - ADD_ATTRID2FUNMAP_ITEM(AttributeTreeNode); - - ADD_ATTRID2FUNMAP_ITEM(AttributePersistentRef); - ADD_ATTRID2FUNMAP_ITEM(AttributeDrawable); - ADD_ATTRID2FUNMAP_ITEM(AttributeSelectable); - ADD_ATTRID2FUNMAP_ITEM(AttributeExpandable); - ADD_ATTRID2FUNMAP_ITEM(AttributeOpened); - ADD_ATTRID2FUNMAP_ITEM(AttributeTextColor); - ADD_ATTRID2FUNMAP_ITEM(AttributeTextHighlightColor); - ADD_ATTRID2FUNMAP_ITEM(AttributePixMap); - ADD_ATTRID2FUNMAP_ITEM(AttributeTarget); - ADD_ATTRID2FUNMAP_ITEM(AttributeStudyProperties); - ADD_ATTRID2FUNMAP_ITEM(AttributeExternalFileDef); - ADD_ATTRID2FUNMAP_ITEM(AttributeFileType); - - ADD_ATTRID2FUNMAP_ITEM(AttributeGraphic); - ADD_ATTRID2FUNMAP_ITEM(AttributeFlags); - - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.begin(); - TAttrID2FunMap::const_iterator anEnd = __AttrID2FunMap__.end(); - for(; anIter != anEnd; anIter++){ - const TAttrID2FunMap::key_type& aKey = anIter->first; - const TAttrID2FunMap::data_type& aValue = anIter->second; - __GUID2AttrIDMap__[aValue.myGetGUID()] = aKey; - }; - -#undef ADD_ATTRID2FUNMAP_ITEM - return true; - } - - - static bool __IsInitilized__ = Init(); - - - //============================================================================ - bool GetAttrFun(const Standard_GUID& theGUID, TAttrFun& theAttrFun) - { - TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(theGUID); - if(anIter != __GUID2AttrIDMap__.end()) - { - const TAttributeID& anAttributeID = anIter->second; - TAttrID2FunMap::const_iterator anIter2 = __AttrID2FunMap__.find(anAttributeID); - if(anIter2 != __AttrID2FunMap__.end()) - { - theAttrFun = anIter2->second; - return true; - } - } - return false; - } - - - //============================================================================ - Standard_GUID GetGUID(const char* theType) - { - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::data_type& aValue = anIter->second; - return aValue.myGetGUID(); - } - // create tree node GUID by name - if(strncmp(theType,"AttributeTreeNodeGUID",21) == 0){ - char aGUIDString[40] = ""; - sprintf(aGUIDString,&theType[21]); - return aGUIDString; - } - - return Standard_GUID(); - } - - - //============================================================================ - std::string GetType(const Handle(TDF_Attribute)& theAttr) - { - if(theAttr.IsNull()) - return CORBA::string_dup(""); - - Standard_GUID aGUID = theAttr->ID(); - TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(aGUID); - if(anIter != __GUID2AttrIDMap__.end()) - { - const TAttributeID& anAttributeID = anIter->second; - return anAttributeID; - } - - char aType[60] = ""; - { - Handle(TDataStd_TreeNode) anAttr = Handle(TDataStd_TreeNode)::DownCast(theAttr); - if (!anAttr.IsNull()) { - char aGUID[40] = ""; - anAttr->ID().ToCString(aGUID); - sprintf(aType, "AttributeTreeNodeGUID%s",aGUID); - return aType; - } - } - { - Handle(TDataStd_UAttribute) anAttr = Handle(TDataStd_UAttribute)::DownCast(theAttr); - if (!anAttr.IsNull()) { - char aGUID[40] = ""; - anAttr->ID().ToCString(aGUID); - sprintf(aType, "AttributeUserID_%s",aGUID); - return aType; - } - } - return aType; - } - -} - -//============================================================================ -SALOMEDS_Study_i::TSObjectHolder -SALOMEDS_SObject_i::New(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) -{ - SALOMEDS_Study_i::TSObjectHolder aSObjectHolder; - SALOMEDS_Study_i::TSObjectMap& anSObjectMap = theStudy->GetSObjectMap(); - SALOMEDS_Study_i::TSObjectMap::const_iterator anIter = anSObjectMap.find(theLabel); - if(anIter != anSObjectMap.end()) - aSObjectHolder = anIter->second; - else{ - SALOMEDS_SObject_i* aSObject = new SALOMEDS_SObject_i(theStudy,theLabel); - aSObjectHolder.first = aSObject; - aSObjectHolder.second = aSObject->_this(); - anSObjectMap[theLabel] = aSObjectHolder; - - //TCollection_AsciiString anEntry; - //TDF_Tool::Entry(theLabel,anEntry); - //cout<<"APO - SALOMEDS_SObject_i::New - anEntry = "<GetORB(); + if(_impl) delete _impl; } +//================================================================================ +/*! + * \brief Returns true if the %SObject does not belong to any %Study + */ +//================================================================================ -//============================================================================ -PortableServer::POA_var SALOMEDS_SObject_i::GetPOA() const +CORBA::Boolean SALOMEDS_SObject_i::IsNull() { - return _study->GetPOA(); + SALOMEDS::Locker lock; + return !_impl || _impl->IsNull(); } - //============================================================================ -/*! Function : - * Purpose : +/*! Function :GetID + * Purpose : */ //============================================================================ char* SALOMEDS_SObject_i::GetID() { - TCollection_AsciiString anEntry; - TDF_Tool::Entry(_lab,anEntry); - return CORBA::string_dup(anEntry.ToCString()); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetID().c_str()); } - + //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetFatherComponent + * Purpose : */ //============================================================================ SALOMEDS::SComponent_ptr SALOMEDS_SObject_i::GetFatherComponent() { - TDF_Label aSCompLabel = _lab; - while(!SALOMEDS_SComponent_i::IsA(aSCompLabel) && !aSCompLabel.IsRoot()){ - aSCompLabel = aSCompLabel.Father(); - } - return SALOMEDS_SComponent_i::NewRef(_study,aSCompLabel)._retn(); + SALOMEDS::Locker lock; + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (_impl->GetFatherComponent(), _orb); + return sco._retn(); } - + //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetFather + * Purpose : */ //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_SObject_i::GetFather() { - return SALOMEDS_SObject_i::NewRef(_study,_lab.Father())._retn(); + SALOMEDS::Locker lock; + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (_impl->GetFather(), _orb); + return so._retn(); } //============================================================================ /*! Function : - * Purpose : + * Purpose : */ //============================================================================ SALOMEDS::Study_ptr SALOMEDS_SObject_i::GetStudy() { - return _study->_this(); + SALOMEDS::Locker lock; + SALOMEDSImpl_Study* aStudy = _impl->GetStudy(); + if(!aStudy) { + MESSAGE("Problem GetStudy"); + return SALOMEDS::Study::_nil(); + } + + std::string IOR = aStudy->GetTransientReference(); + CORBA::Object_var obj = _orb->string_to_object(IOR.c_str()); + SALOMEDS::Study_var Study = SALOMEDS::Study::_narrow(obj) ; + ASSERT(!CORBA::is_nil(Study)); + return SALOMEDS::Study::_duplicate(Study); } //============================================================================ -/*! Function : ReferencedObject - * Purpose : +/*! Function : FindAttribute + * Purpose : Find attribute of given type on this SObject */ //============================================================================ -CORBA::Boolean SALOMEDS_SObject_i::ReferencedObject(SALOMEDS::SObject_out theSObject) +CORBA::Boolean SALOMEDS_SObject_i::FindAttribute (SALOMEDS::GenericAttribute_out anAttribute, + const char* aTypeOfAttribute) { - Handle(TDF_Reference) aRef; - if (!_lab.FindAttribute(TDF_Reference::GetID(),aRef)) - return false; - - theSObject = SALOMEDS_SObject_i::NewRef(_study,aRef->Get())._retn(); - return true; + SALOMEDS::Locker lock; + DF_Attribute* anAttr = NULL; + if(_impl->FindAttribute(anAttr, (char*)aTypeOfAttribute)) { + anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb); + return true; + } + + return false; } //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetAllAttributes + * Purpose : Returns list of all attributes for this sobject */ //============================================================================ -CORBA::Boolean SALOMEDS_SObject_i::FindSubObject(CORBA::Long theTag, SALOMEDS::SObject_out theSObject) -{ - TDF_Label aLabel = _lab.FindChild(theTag,false); - if(aLabel.IsNull()) - return false; - - theSObject = SALOMEDS_SObject_i::NewRef(_study,aLabel)._retn(); - return true; -} -//============================================================================ -/*! Function : - * Purpose : - */ -//============================================================================ -char* SALOMEDS_SObject_i::Name() +SALOMEDS::ListOfAttributes* SALOMEDS_SObject_i::GetAllAttributes() { - return CORBA::string_dup(_name.c_str()); + SALOMEDS::Locker lock; + std::vector aSeq = _impl->GetAllAttributes(); + SALOMEDS::ListOfAttributes_var SeqOfAttr = new SALOMEDS::ListOfAttributes; + int length = aSeq.size(); + + SeqOfAttr->length(length); + + if (length != 0) { + for(int i = 0; i < length; i++) { + SALOMEDSImpl_GenericAttribute* anAttr = dynamic_cast(aSeq[i]); + SALOMEDS::GenericAttribute_var anAttribute; + anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb); + if (!CORBA::is_nil(anAttribute)) { + SeqOfAttr[i] = anAttribute; + } + } + } + return SeqOfAttr._retn(); } - + + //============================================================================ -/*! Function : - * Purpose : +/*! Function : ReferencedObject + * Purpose : */ //============================================================================ -void SALOMEDS_SObject_i::Name(const char* theName) +CORBA::Boolean SALOMEDS_SObject_i::ReferencedObject(SALOMEDS::SObject_out obj) { - _name = theName; + SALOMEDS::Locker lock; + SALOMEDSImpl_SObject aRefObj; + if(!_impl->ReferencedObject(aRefObj)) return false; + + obj = SALOMEDS_SObject_i::New (aRefObj, _orb); + return true; } - + //============================================================================ -/*! Function : - * Purpose : +/*! Function : FindSubObject + * Purpose : */ //============================================================================ -CORBA::Short SALOMEDS_SObject_i::Tag() +CORBA::Boolean SALOMEDS_SObject_i::FindSubObject(CORBA::Long atag, SALOMEDS::SObject_out obj) { - return _lab.Tag(); + SALOMEDS::Locker lock; + SALOMEDSImpl_SObject aSubObj; + if(!_impl->FindSubObject(atag, aSubObj)) return false; + + obj = SALOMEDS_SObject_i::New (aSubObj, _orb); + return true; + } //============================================================================ -/*! Function : - * Purpose : +/*! Function : Name + * Purpose : gets a name */ //============================================================================ -CORBA::Short SALOMEDS_SObject_i::Depth() +char* SALOMEDS_SObject_i::Name() { - return _lab.Depth(); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->Name().c_str()); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : Name + * Purpose : sets a name */ //============================================================================ -CORBA::Object_ptr SALOMEDS_SObject_i::GetObject() +void SALOMEDS_SObject_i::Name(const char* name) { - try { - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - CORBA::ORB_var anORB = _study->GetStudyManager()->GetORB(); - return anORB->string_to_object(Str(anAttr->Get())); - } - }catch(...){ - } - return CORBA::Object::_nil(); + SALOMEDS::Locker lock; + std::string aName((char*)name); + _impl->Name(aName); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : Tag + * Purpose : */ //============================================================================ -char* SALOMEDS_SObject_i::GetName() { - Handle(TDataStd_Name) anAttr; - if(_lab.FindAttribute(TDataStd_Name::GetID(),anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); +CORBA::Short SALOMEDS_SObject_i::Tag() +{ + SALOMEDS::Locker lock; + return _impl->Tag(); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : Depth + * Purpose : */ //============================================================================ -char* SALOMEDS_SObject_i::GetComment() { - Handle(TDataStd_Comment) anAttr; - if(_lab.FindAttribute(TDataStd_Comment::GetID(), anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); +CORBA::Short SALOMEDS_SObject_i::Depth() +{ + SALOMEDS::Locker lock; + return _impl->Depth(); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetObject + * Purpose : */ //============================================================================ -char* SALOMEDS_SObject_i::GetIOR() { - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); +CORBA::Object_ptr SALOMEDS_SObject_i::GetObject() +{ + SALOMEDS::Locker lock; + CORBA::Object_ptr obj = CORBA::Object::_nil(); + try { + std::string IOR = _impl->GetIOR(); + char* c_ior = CORBA::string_dup(IOR.c_str()); + obj = _orb->string_to_object(c_ior); + CORBA::string_free(c_ior); + } catch(...) {} + return obj; } - //============================================================================ -/*! Function : GetAllAttributes - * Purpose : Returns list of all attributes for this sobject +/*! Function : GetName + * Purpose : */ //============================================================================ -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_FindGenAttribute(const Handle(TDF_Attribute)& theAttr) +char* SALOMEDS_SObject_i::GetName() { - TAttrHolder anGenAttr; - - Standard_GUID aGUID = theAttr->ID(); - - TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(aGUID); - if(anIter != __GUID2AttrIDMap__.end()){ - const TAttributeID& anAttributeID = anIter->second; - anGenAttr = _FindGenAttribute(anAttributeID.c_str()); - } - - return anGenAttr; + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetName().c_str()); + return aStr._retn(); } - -SALOMEDS::ListOfAttributes* SALOMEDS_SObject_i::GetAllAttributes() -{ - SALOMEDS::ListOfAttributes_var aSeqOfAttr = new SALOMEDS::ListOfAttributes; - if(_lab.NbAttributes() > 0){ - Standard_Integer i = 0; - for(TDF_AttributeIterator iter(_lab); iter.More(); iter.Next()) { - Handle(TDF_Attribute) anAttr = iter.Value(); - TAttrHolder anAttrHolder = _FindGenAttribute(anAttr); - SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - { - aSeqOfAttr->length(++i); - aSeqOfAttr[i-1] = anGenAttr._retn(); - } - } - } - - return aSeqOfAttr._retn(); -} - - //============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject +/*! Function : GetComment + * Purpose : */ //============================================================================ -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_CreateGenAttribute(const Handle(TDF_Attribute)& theAttr, - const char* theType) +char* SALOMEDS_SObject_i::GetComment() { - SALOMEDS_GenericAttribute_i* anAttr; - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::data_type& aValue = anIter->second; - - if(aValue.myIsCheckLockedStudy()) - _study->CheckLocked(); - - anAttr = aValue.myNewInstance(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - if(strncmp(theType,"AttributeTreeNode",17) == 0){ - anAttr = new SALOMEDS_AttributeTreeNode_i(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - if(strncmp(theType,"AttributeUserID",15) == 0){ - anAttr = new SALOMEDS_AttributeUserID_i(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - return TAttrHolder(); -} - - -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_FindGenAttribute(const char* theType) -{ - TAttrHolder anAttrHolder; - TAttrMap::const_iterator anIter = myAttrMap.find(theType); - if(anIter != myAttrMap.end()) - anAttrHolder = anIter->second; - - Standard_GUID aGUID = ::GetGUID(theType); - Handle(TDF_Attribute) anAttr; - - if(_lab.FindAttribute(aGUID,anAttr)){ - SALOMEDS_GenericAttribute_i* aGenAttr = anAttrHolder.first; - if(aGenAttr != NULL){ - if(aGenAttr->GetAttribute() != anAttr) - aGenAttr->SetAttribute(anAttr); - }else{ - anAttrHolder = _CreateGenAttribute(anAttr,theType); - } - aGenAttr = anAttrHolder.first; - if(aGenAttr != NULL) - myAttrMap[theType] = anAttrHolder; - }else{ - //myAttrMap.erase(theType); - //if(anGenAttr != NULL) - // anGenAttr->Destroy(); - return TAttrHolder(); - } - - return anAttrHolder; + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetComment().c_str()); + return aStr._retn(); } - -SALOMEDS::GenericAttribute_ptr -SALOMEDS_SObject_i::_FindCORBAAttribute(const char* theType) -{ - TAttrHolder anAttr = _FindGenAttribute(theType); - SALOMEDS::GenericAttribute_var anGenAttr = anAttr.second; - if(!CORBA::is_nil(anGenAttr)){ - return anGenAttr._retn(); - } - - return SALOMEDS::GenericAttribute::_nil(); -} - - -CORBA::Boolean -SALOMEDS_SObject_i::FindAttribute(SALOMEDS::GenericAttribute_out theAttribute, - const char* theType) -{ - theAttribute = _FindCORBAAttribute(theType); - return !CORBA::is_nil(theAttribute); -} - - //============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject +/*! Function : GetIOR + * Purpose : */ //============================================================================ -Handle(TDF_Attribute) - SALOMEDS_SObject_i::_AddAttribute(const char* theType) +char* SALOMEDS_SObject_i::GetIOR() { - Handle(TDF_Attribute) anAttr; - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::data_type& aValue = anIter->second; - - if(aValue.myIsCheckLockedStudy()) - _study->CheckLocked(); - - anAttr = aValue.myNewAttribute(); - _lab.AddAttribute(anAttr); - return anAttr; - } - - if(strncmp(theType, "AttributeTreeNode",17) == 0){ - Standard_GUID aGUID; - if(strcmp(theType, "AttributeTreeNode") == 0){ - aGUID = TDataStd_TreeNode::GetDefaultTreeID(); - }else{ - char aString[40] = ""; - sprintf(aString, &theType[21]); - aGUID = Standard_GUID(aString); // create tree node GUID by name - } - if(!_lab.FindAttribute(aGUID,anAttr)){ - _study->CheckLocked(); - anAttr = TDataStd_TreeNode::Set(_lab,aGUID); - _lab.AddAttribute(anAttr); - return anAttr; - } - } - - if(strncmp(theType, "AttributeUserID",15) == 0){ - Standard_GUID aGUID = SALOMEDS_AttributeUserID_i::GetGUID(); - if(!_lab.FindAttribute(aGUID,anAttr)){ - _study->CheckLocked(); - anAttr = TDataStd_UAttribute::Set(_lab,aGUID); - _lab.AddAttribute(anAttr); - return anAttr; - } - } - - - return anAttr; -} - - -SALOMEDS::GenericAttribute_ptr -SALOMEDS_SObject_i::FindOrCreateAttribute(const char* theType) -{ - TAttrHolder anAttrHolder = _FindGenAttribute(theType); - SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - return anGenAttr._retn(); - - Handle(TDF_Attribute) anAttr = _AddAttribute(theType); - if(!anAttr.IsNull()){ - anAttrHolder = _CreateGenAttribute(anAttr,theType); - anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - return anGenAttr._retn(); - } - - return SALOMEDS::GenericAttribute::_nil(); + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetIOR().c_str()); + return aStr._retn(); } - //============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject +/*! Function : SetAttrString + * Purpose : */ //============================================================================ -void SALOMEDS_SObject_i::RemoveAttribute(const char* theType) +void SALOMEDS_SObject_i::SetAttrString(const char* name, const char* value) { - _study->CheckLocked(); - if(strcmp(theType, "AttributeIOR") == 0) { // postponed removing of CORBA objects - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), anAttr)) - _study->AddPostponed(Str(anAttr->Get())); - else - return; - } - TAttrMap::iterator anIter = myAttrMap.find(theType); - if(anIter != myAttrMap.end()){ - //myAttrMap.erase(anIter); - } - _lab.ForgetAttribute(::GetGUID(theType)); + SALOMEDS::Locker lock; + _impl->SetAttrString(name,value); } - -void SALOMEDS_SObject_i::OnRemove() +//=========================================================================== +// PRIVATE FUNCTIONS +//=========================================================================== +CORBA::LongLong SALOMEDS_SObject_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) { - Handle(TDF_Reference) aReference; - if(_lab.FindAttribute(TDF_Reference::GetID(),aReference)){ - Handle(SALOMEDS_TargetAttribute) aTarget; - if(aReference->Get().FindAttribute(SALOMEDS_TargetAttribute::GetID(),aTarget)) - aTarget->Remove(_lab); - } - - Handle(SALOMEDS_IORAttribute) anAttr; // postponed removing of CORBA objects - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - _study->AddPostponed(TCollection_AsciiString(anAttr->Get()).ToCString()); - } - - //myAttrMap.clear(); - - //SALOMEDS_Study_i::TSObjectMap& anSObjectMap = _study->GetSObjectMap(); - //anSObjectMap.erase(_lab); +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, Kernel_Utils::GetHostname().c_str()) == 0 && pid == thePID)?1:0; + return reinterpret_cast(_impl); }