-// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server
+// Copyright (C) 2007-2015 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 <TDF_Tool.hxx>
-#include <TDF_Attribute.hxx>
-#include <TDF_Reference.hxx>
-#include <Standard_GUID.hxx>
-#include <Standard_NoSuchObject.hxx>
-#include <TDataStd_Name.hxx>
-#include <TDataStd_Comment.hxx>
-#include <TDataStd_Integer.hxx>
-#include <TDataStd_Real.hxx>
-#include <TDataStd_TreeNode.hxx>
-#include <TDataStd_UAttribute.hxx>
-
-#include <TCollection_AsciiString.hxx>
-#include <TDF_AttributeIterator.hxx>
-
+//
+#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)
-{
- char aLeft[40] = "";
- theLeft.ToCString(aLeft);
-
- char aRight[40] = "";
- theRight.ToCString(aRight);
-
- return strcmp(aLeft,aRight) < 0;
-}
-
-
-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<TAttributeID,TAttrFun> TAttrID2FunMap;
- static TAttrID2FunMap __AttrID2FunMap__;
-
-
- typedef std::map<Standard_GUID,TAttributeID> 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)
+#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 <map>
+
+#ifdef WIN32
+#include <process.h>
+#else
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+SALOMEDS::SObject_ptr SALOMEDS_SObject_i::New(const SALOMEDSImpl_SObject& theImpl, CORBA::ORB_ptr theORB)
{
- 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 = "<<anEntry.ToCString()<<endl;
- }
- return aSObjectHolder;
-}
+ SALOMEDS_SObject_i* so_servant = new SALOMEDS_SObject_i(theImpl, theORB);
-SALOMEDS_SObject_i*
-SALOMEDS_SObject_i::NewPtr(SALOMEDS_Study_i* theStudy,
- const TDF_Label& theLabel)
-{
- return New(theStudy,theLabel).first;
+ return so_servant->_this();
}
-SALOMEDS::SObject_var
-SALOMEDS_SObject_i::NewRef(SALOMEDS_Study_i* theStudy,
- const TDF_Label& theLabel)
-{
- return New(theStudy,theLabel).second;
-}
//============================================================================
/*! Function : constructor
- * Purpose :
+ * Purpose :
*/
//============================================================================
-SALOMEDS_SObject_i::SALOMEDS_SObject_i(SALOMEDS_Study_i* theStudy,
- const TDF_Label& theLabel):
- _lab(theLabel),
- _study(theStudy)
+SALOMEDS_SObject_i::SALOMEDS_SObject_i(const SALOMEDSImpl_SObject& impl, CORBA::ORB_ptr orb)
{
+ _impl = 0;
+ if(!impl.IsNull()) {
+ if(impl.IsComponent()) {
+ SALOMEDSImpl_SComponent sco = impl;
+ _impl = sco.GetPersistentCopy();
+ }
+ else {
+ _impl = impl.GetPersistentCopy();
+ }
+ }
+ _orb = CORBA::ORB::_duplicate(orb);
+ //SALOME::GenericObj_i::myPOA = SALOMEDS_StudyManager_i::GetPOA(GetStudy());
}
+
//============================================================================
/*! Function : destructor
- * Purpose :
+ * Purpose :
*/
//============================================================================
SALOMEDS_SObject_i::~SALOMEDS_SObject_i()
{
-}
-
-
-//============================================================================
-CORBA::ORB_var SALOMEDS_SObject_i::GetORB() const
-{
- return _study->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)
+
+SALOMEDS::ListOfAttributes* SALOMEDS_SObject_i::GetAllAttributes()
{
- TDF_Label aLabel = _lab.FindChild(theTag,false);
- if(aLabel.IsNull())
- return false;
-
- theSObject = SALOMEDS_SObject_i::NewRef(_study,aLabel)._retn();
- return true;
-}
+ SALOMEDS::Locker lock;
+ std::vector<DF_Attribute*> 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<SALOMEDSImpl_GenericAttribute*>(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 :
*/
//============================================================================
-char* SALOMEDS_SObject_i::Name()
+CORBA::Boolean SALOMEDS_SObject_i::ReferencedObject(SALOMEDS::SObject_out obj)
{
- return CORBA::string_dup(_name.c_str());
+ 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 :
*/
//============================================================================
-void SALOMEDS_SObject_i::Name(const char* theName)
+CORBA::Boolean SALOMEDS_SObject_i::FindSubObject(CORBA::Long atag, SALOMEDS::SObject_out obj)
{
- _name = theName;
+ 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::Tag()
+char* SALOMEDS_SObject_i::Name()
{
- return _lab.Tag();
+ SALOMEDS::Locker lock;
+ return CORBA::string_dup(_impl->Name().c_str());
}
//============================================================================
-/*! Function :
- * Purpose :
+/*! Function : Name
+ * Purpose : sets a name
*/
//============================================================================
-CORBA::Short SALOMEDS_SObject_i::Depth()
+void SALOMEDS_SObject_i::Name(const char* name)
{
- return _lab.Depth();
+ SALOMEDS::Locker lock;
+ std::string aName((char*)name);
+ _impl->Name(aName);
}
//============================================================================
-/*! Function :
- * Purpose :
+/*! Function : Tag
+ * Purpose :
*/
//============================================================================
-CORBA::Object_ptr SALOMEDS_SObject_i::GetObject()
+CORBA::Short SALOMEDS_SObject_i::Tag()
{
- 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;
+ return _impl->Tag();
}
//============================================================================
-/*! Function :
- * Purpose :
+/*! Function : GetLastChildTag
+ * 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::GetLastChildTag()
+{
+ SALOMEDS::Locker lock;
+ return (CORBA::Short) _impl->GetLastChildTag();
}
//============================================================================
-/*! 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<CORBA::LongLong>(_impl);
}