Salome HOME
updated copyright message
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_GenericAttribute_i.cxx
index 8c6f980de6f7fbf2fee85bafc11ce759440294fe..771a115a2301fcc8dbc61b94c98f705fedce8e7c 100644 (file)
-//  SALOME SALOMEDS : data structure of SALOME and sources of Salome data server 
+// Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 //
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
+// 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_GenericAttribute_i.cxx
-//  Author : Mikhail PONIKAROV
+//  Author : Sergey RUIN
 //  Module : SALOME
-//  $Header$
-
-#include <TDataStd_TreeNode.hxx>
-#include <TDataStd_UAttribute.hxx>
-
-#include "SALOMEDS_AttributeDrawable_i.hxx"
-#include "SALOMEDS_AttributeSelectable_i.hxx"
-#include "SALOMEDS_AttributeOpened_i.hxx"
-#include "SALOMEDS_AttributeFlags_i.hxx"
-#include "SALOMEDS_AttributeGraphic_i.hxx"
-#include "SALOMEDS_AttributeTextColor_i.hxx"
-#include "SALOMEDS_AttributeTextHighlightColor_i.hxx"
-#include "SALOMEDS_AttributePixMap_i.hxx"
-#include "SALOMEDS_AttributeExpandable_i.hxx"
-#include "SALOMEDS_AttributeLocalID_i.hxx"
-#include "SALOMEDS_AttributeTarget_i.hxx"
-#include "SALOMEDS_AttributeTableOfInteger_i.hxx"
-#include "SALOMEDS_AttributeTableOfReal_i.hxx"
-#include "SALOMEDS_AttributeTableOfString_i.hxx"
-#include "SALOMEDS_AttributeStudyProperties_i.hxx"
-#include "SALOMEDS_AttributePythonObject_i.hxx"
-#include "SALOMEDS_AttributeTreeNode_i.hxx"
-#include "SALOMEDS_AttributeUserID_i.hxx"
-#include "SALOMEDS_AttributeExternalFileDef_i.hxx"
-#include "SALOMEDS_AttributeFileType_i.hxx"
-#include "SALOMEDS_StudyBuilder_i.hxx"
-
-#include "SALOMEDS_SequenceOfRealAttribute.hxx"
-#include "SALOMEDS_SequenceOfIntegerAttribute.hxx"
-#include "SALOMEDS_IORAttribute.hxx"
-#include "SALOMEDS_PersRefAttribute.hxx"
-#include "SALOMEDS_DrawableAttribute.hxx"
-#include "SALOMEDS_SelectableAttribute.hxx"
-#include "SALOMEDS_ExpandableAttribute.hxx"
-#include "SALOMEDS_OpenedAttribute.hxx"
-#include "SALOMEDS_FlagsAttribute.hxx"
-#include "SALOMEDS_GraphicAttribute.hxx"
-#include "SALOMEDS_TextColorAttribute.hxx"
-#include "SALOMEDS_TextHighlightColorAttribute.hxx"
-#include "SALOMEDS_PixMapAttribute.hxx"
-#include "SALOMEDS_LocalIDAttribute.hxx"
-#include "SALOMEDS_PythonObjectAttribute.hxx"
-#include "SALOMEDS_TargetAttribute.hxx"
-#include "SALOMEDS_StudyPropertiesAttribute.hxx"
-#include "SALOMEDS_TableOfIntegerAttribute.hxx"
-#include "SALOMEDS_TableOfRealAttribute.hxx"
-#include "SALOMEDS_TableOfStringAttribute.hxx"
-#include "SALOMEDS_ExternalFileDef.hxx"
-#include "SALOMEDS_FileType.hxx"
+//
+#include "utilities.h"
+#include "SALOMEDS_GenericAttribute_i.hxx"
+#include "SALOMEDS_Study_i.hxx"
+#include "SALOMEDS_Attributes.hxx"
+#include "SALOMEDS.hxx"
+#include "SALOMEDSImpl_SObject.hxx"
+#include "SALOMEDSImpl_Study.hxx"
 #include "Utils_ExceptHandlers.hxx"
+#include "Basics_Utils.hxx"
+#include <map>
+
+#ifdef WIN32
+#include <process.h>
+#else
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+UNEXPECT_CATCH(GALockProtection, SALOMEDS::GenericAttribute::LockProtection)
+
+SALOMEDS_GenericAttribute_i::SALOMEDS_GenericAttribute_i(DF_Attribute* theImpl, CORBA::ORB_ptr theOrb) :
+  GenericObj_i(SALOMEDS_Study_i::GetThePOA())
+{
+  _orb = CORBA::ORB::_duplicate(theOrb);
+  _impl = theImpl;
+}
+
+SALOMEDS_GenericAttribute_i::~SALOMEDS_GenericAttribute_i()
+{
+}
+
+//============================================================================
+/*!
+  \brief Get default POA for the servant object.
+
+  This function is implicitly called from "_this()" function.
+  Default POA can be set via the constructor.
+
+  \return reference to the default POA for the servant
+*/
+//============================================================================
+PortableServer::POA_ptr SALOMEDS_GenericAttribute_i::_default_POA()
+{
+  myPOA = PortableServer::POA::_duplicate(SALOMEDS_Study_i::GetThePOA());
+  //MESSAGE("SALOMEDS_GenericAttribute_i::_default_POA: " << myPOA);
+  return PortableServer::POA::_duplicate(myPOA);
+}
 
-using namespace std;
-
-#define RegisteredAttributes 28
-
-UNEXPECT_CATCH(GALockProtection, SALOMEDS::GenericAttribute::LockProtection);
-
-const char AttributesTypeNames[RegisteredAttributes][30] = {
-  "AttributeReal", "AttributeInteger",
-  "AttributeSequenceOfReal", "AttributeSequenceOfInteger",
-  "AttributeName", "AttributeComment",
-  "AttributeIOR", "AttributePersistentRef",
-  "AttributeDrawable", "AttributeSelectable",
-  "AttributeExpandable", "AttributeOpened",
-  "AttributeTextColor", "AttributeTextHighlightColor", "AttributePixMap",
-  "AttributeTreeNode", "AttributeLocalID",
-  "AttributeTarget",
-  "AttributeTableOfInteger", "AttributeTableOfReal", "AttributeTableOfString",
-  "AttributeStudyProperties",
-  "AttributePythonObject",
-  "AttributeUserID",
-  "AttributeExternalFileDef", "AttributeFileType",
-  "AttributeFlags",
-  "AttributeGraphic"
-};
-
-const Standard_GUID AttributesGUIDs[RegisteredAttributes] = {
-  TDataStd_Real::GetID(), TDataStd_Integer::GetID(),
-  SALOMEDS_SequenceOfRealAttribute::GetID(), SALOMEDS_SequenceOfIntegerAttribute::GetID(),
-  TDataStd_Name::GetID(), TDataStd_Comment::GetID(),
-  SALOMEDS_IORAttribute::GetID(), SALOMEDS_PersRefAttribute::GetID(),
-  SALOMEDS_DrawableAttribute::GetID(), SALOMEDS_SelectableAttribute::GetID(),
-  SALOMEDS_ExpandableAttribute::GetID(), SALOMEDS_OpenedAttribute::GetID(),
-  SALOMEDS_TextColorAttribute::GetID(), SALOMEDS_TextHighlightColorAttribute::GetID(), SALOMEDS_PixMapAttribute::GetID(),
-  TDataStd_TreeNode::GetDefaultTreeID(), SALOMEDS_LocalIDAttribute::GetID(),
-  SALOMEDS_TargetAttribute::GetID(),
-  SALOMEDS_TableOfIntegerAttribute::GetID(), SALOMEDS_TableOfRealAttribute::GetID(), SALOMEDS_TableOfStringAttribute::GetID(),
-  SALOMEDS_StudyPropertiesAttribute::GetID(),
-  SALOMEDS_PythonObjectAttribute::GetID(),
-  Standard_GUID("FFFFFFFF-D9CD-11d6-945D-1050DA506788"),
-  SALOMEDS_ExternalFileDef::GetID(), SALOMEDS_FileType::GetID(),
-  SALOMEDS_FlagsAttribute::GetID(),
-  SALOMEDS_GraphicAttribute::GetID()
-};
-
-void SALOMEDS_GenericAttribute_i::CheckLocked() throw (SALOMEDS::GenericAttribute::LockProtection) {
+void SALOMEDS_GenericAttribute_i::CheckLocked()
+{
+  SALOMEDS::Locker lock;
   Unexpect aCatch(GALockProtection);
-  if (!_myAttr.IsNull() && _myAttr->IsValid() && !CORBA::is_nil(_myOrb)) {
-    Handle(SALOMEDS_IORAttribute) Att;
-    if (_myAttr->Label().Root().FindAttribute(SALOMEDS_IORAttribute::GetID(),Att)){
-      TCollection_AsciiString ch(Att->Get());
-      char* IOR = CORBA::string_dup(ch.ToCString());
-      CORBA::Object_var obj = _myOrb->string_to_object(IOR);
-      SALOMEDS::Study_ptr aStudy = SALOMEDS::Study::_narrow(obj);
-//     ASSERT(!CORBA::is_nil(aStudy));
-      if (aStudy->NewBuilder()->HasOpenCommand()) return;
-      if (aStudy->GetProperties()->IsLocked()) {
-//       MESSAGE("Locked document modification !!!");
-       throw SALOMEDS::GenericAttribute::LockProtection();
-      }
+
+  if (_impl  && !CORBA::is_nil(_orb)) {
+    try {
+      SALOMEDSImpl_GenericAttribute::Impl_CheckLocked(_impl);
+    }
+    catch (...) {
+      throw SALOMEDS::GenericAttribute::LockProtection();
     }
   }
 }
 
-SALOMEDS::SObject_ptr SALOMEDS_GenericAttribute_i::GetSObject() {
-  if (_myAttr.IsNull() || _myAttr->Label().IsNull()) return SALOMEDS::SObject::_nil();
-  SALOMEDS_SObject_i *  so_servant = new SALOMEDS_SObject_i (_myAttr->Label(),_myOrb);
-  SALOMEDS::SObject_var so = SALOMEDS::SObject::_narrow(so_servant->_this()); 
+SALOMEDS::SObject_ptr SALOMEDS_GenericAttribute_i::GetSObject() 
+{
+  SALOMEDS::Locker lock;
+  if (!_impl || _impl->Label().IsNull()) return SALOMEDS::SObject::_nil();
+  SALOMEDSImpl_SObject so_impl = SALOMEDSImpl_Study::SObject(_impl->Label());
+  SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (so_impl, _orb);
   return so._retn();
 }
 
-Standard_GUID SALOMEDS_GenericAttribute_i::GetGUID(const char* theType) {
-  Standard_Integer i;
-  for(i = 0; i < RegisteredAttributes; i++) {
-    if (strcmp(AttributesTypeNames[i], theType) == 0) return AttributesGUIDs[i];
-  }
 
-  if (strncmp(theType, "AttributeTreeNodeGUID",21) == 0) {
-    char* aGUIDString = new char[40];
-    sprintf(aGUIDString, &(theType[21]));
-    Standard_GUID aGUID = Standard_GUID(aGUIDString); // create tree node GUID by name
-    delete(aGUIDString);
-    return aGUID;
-  }
-  return Standard_GUID();
-}
+char* SALOMEDS_GenericAttribute_i::Type() 
+{
+  SALOMEDS::Locker lock;
+  if (_impl) {
+    std::string type = SALOMEDSImpl_GenericAttribute::Impl_GetType(_impl);
+    return CORBA::string_dup(type.c_str());
+  }    
 
-char* SALOMEDS_GenericAttribute_i::Type() {
-  if (_myAttr.IsNull()) return "";
-  int i;
-  for(i = 0; i < RegisteredAttributes; i++) {
-    if (_myAttr->ID() == AttributesGUIDs[i]) {
-      CORBA::String_var aString(AttributesTypeNames[i]);
-      return aString._retn();
-    }
-  }
-  Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
-  if (!aNode.IsNull()) {
-    char* aNodeName = new char[60];
-    char aGUID[40];
-    aNode->ID().ToCString(aGUID);
-    sprintf(aNodeName, "AttributeTreeNodeGUID%s",aGUID);
-    return aNodeName;
-  }
+  return CORBA::string_dup("");
+}
 
-  Handle(TDataStd_UAttribute) aUAttr = Handle(TDataStd_UAttribute)::DownCast(_myAttr);
-  if (!aUAttr.IsNull()) {
-    char* aUAttrName = new char[60];
-    char aGUID[40];
-    aUAttr->ID().ToCString(aGUID);
-    sprintf(aUAttrName, "AttributeUserID_%s",aGUID); 
-    return aUAttrName;
+char* SALOMEDS_GenericAttribute_i::GetClassType()
+{
+  SALOMEDS::Locker lock;
+  if (_impl) {
+    std::string class_type = SALOMEDSImpl_GenericAttribute::Impl_GetClassType(_impl);
+    return CORBA::string_dup(class_type.c_str());
   }
 
-  return "";
+  return CORBA::string_dup("");
 }
 
-SALOMEDS::GenericAttribute_ptr SALOMEDS_GenericAttribute_i::CreateAttribute(CORBA::ORB_ptr theOrb,
-                                                                           const Handle(TDF_Attribute)& theAttr) {
-
-  __ReturnCORBAAttribute(TDataStd_Real, AttributeReal);
-  __ReturnCORBAAttribute(TDataStd_Integer, AttributeInteger);
-  __ReturnCORBAAttribute(SALOMEDS_SequenceOfRealAttribute, AttributeSequenceOfReal);
-  __ReturnCORBAAttribute(SALOMEDS_SequenceOfIntegerAttribute, AttributeSequenceOfInteger);
-  __ReturnCORBAAttribute(TDataStd_Name, AttributeName);
-  __ReturnCORBAAttribute(TDataStd_Comment, AttributeComment);
-  __ReturnCORBAAttribute(SALOMEDS_IORAttribute, AttributeIOR);
-  __ReturnCORBAAttribute(SALOMEDS_PersRefAttribute, AttributePersistentRef);
-  __ReturnCORBAAttribute(SALOMEDS_DrawableAttribute, AttributeDrawable);
-  __ReturnCORBAAttribute(SALOMEDS_SelectableAttribute, AttributeSelectable);
-  __ReturnCORBAAttribute(SALOMEDS_ExpandableAttribute, AttributeExpandable);
-  __ReturnCORBAAttribute(SALOMEDS_OpenedAttribute, AttributeOpened);
-  __ReturnCORBAAttribute(SALOMEDS_TextColorAttribute, AttributeTextColor);
-  __ReturnCORBAAttribute(SALOMEDS_TextHighlightColorAttribute, AttributeTextHighlightColor);
-  __ReturnCORBAAttribute(SALOMEDS_PixMapAttribute, AttributePixMap);
-  __ReturnCORBAAttribute(SALOMEDS_LocalIDAttribute, AttributeLocalID);
-  __ReturnCORBAAttribute(SALOMEDS_TargetAttribute, AttributeTarget);
-  __ReturnCORBAAttribute(SALOMEDS_TableOfIntegerAttribute, AttributeTableOfInteger);
-  __ReturnCORBAAttribute(SALOMEDS_TableOfRealAttribute, AttributeTableOfReal);
-  __ReturnCORBAAttribute(SALOMEDS_TableOfStringAttribute, AttributeTableOfString);
-  __ReturnCORBAAttribute(SALOMEDS_StudyPropertiesAttribute, AttributeStudyProperties);
-  __ReturnCORBAAttribute(SALOMEDS_PythonObjectAttribute, AttributePythonObject);
-  __ReturnCORBAAttribute(SALOMEDS_ExternalFileDef, AttributeExternalFileDef);
-  __ReturnCORBAAttribute(SALOMEDS_FileType, AttributeFileType);
-  __ReturnCORBAAttribute(SALOMEDS_FlagsAttribute, AttributeFlags);
-  __ReturnCORBAAttribute(SALOMEDS_GraphicAttribute, AttributeGraphic);
-
-  Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(theAttr);
-  if (!aNode.IsNull()) {
-    SALOMEDS_AttributeTreeNode_i* Attr = new SALOMEDS_AttributeTreeNode_i(aNode, theOrb); \
-    return Attr->AttributeTreeNode::_this(); \
-  }
 
-  Handle(TDataStd_UAttribute) aUAttr = Handle(TDataStd_UAttribute)::DownCast(theAttr);
-  if (!aUAttr.IsNull()) {
-    SALOMEDS_AttributeUserID_i* Attr = new SALOMEDS_AttributeUserID_i(aUAttr, theOrb); \
-    return Attr->AttributeUserID::_this(); \
-  }
-  return SALOMEDS::GenericAttribute::_nil();
+SALOMEDS::GenericAttribute_ptr SALOMEDS_GenericAttribute_i::CreateAttribute
+                                                         (DF_Attribute* theAttr,
+                                                          CORBA::ORB_ptr theOrb)
+{
+  SALOMEDS::Locker lock;
+
+  std::string aClassType = dynamic_cast<SALOMEDSImpl_GenericAttribute*>(theAttr)->GetClassType();
+  char* aTypeOfAttribute = (char*)aClassType.c_str();
+  SALOMEDS::GenericAttribute_var anAttribute;
+  SALOMEDS_GenericAttribute_i* attr_servant = NULL;
+  SALOME_UNUSED(attr_servant);
+  __CreateGenericCORBAAttribute
+
+  return anAttribute._retn(); 
+}
+
+//===========================================================================
+//   PRIVATE FUNCTIONS
+//===========================================================================
+CORBA::LongLong SALOMEDS_GenericAttribute_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal)
+{
+#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);
 }