Salome HOME
Merge branch 'master' into agr/start_procedure
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_SObject_i.cxx
index 5f5ddded8977a4af4324f3905c2e1d3135c4516f..ea5f8845c5844d1ad0bb44cd4c6c5e169bc64f92 100644 (file)
-//  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 <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)
+#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)
 {
-  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<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)
-{
-  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*
-SALOMEDS_SObject_i::NewPtr(SALOMEDS_Study_i* theStudy,
-                          const TDF_Label& theLabel)
-{
-  return New(theStudy,theLabel).first;
-}
-
-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)
-{
-  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<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  :
  */
 //============================================================================
-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<CORBA::LongLong>(_impl);
 }