]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
CCAR: add automatic management of GenericObj in study.
authorcaremoli <caremoli>
Fri, 22 May 2009 08:53:41 +0000 (08:53 +0000)
committercaremoli <caremoli>
Fri, 22 May 2009 08:53:41 +0000 (08:53 +0000)
If a GenericObj id publish in study, its reference count must be incremented (call to Register()).
When it is unpublished, its reference count must be decremented (call to Destroy()).
This was not done when calling SetValue on a AttributeIOR so if someone manages
GenericObj in the right way, the references in study could be lost.

src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx

index 1ca91189e2e9e58faffc93e4d5728a010ed63d52..79aee1e5b17a9ec8a51f09a21e8802589ab13e49 100644 (file)
@@ -36,8 +36,41 @@ char* SALOMEDS_AttributeIOR_i::Value()
   return c_s._retn();
 }
 
+//To disable automatic management of GenericObj, comment the following line
+#define WITHGENERICOBJ
+
 void SALOMEDS_AttributeIOR_i::SetValue(const char* value) 
 {
+#ifdef WITHGENERICOBJ
+  CORBA::Object_var obj;
+  SALOME::GenericObj_var gobj;
+  try
+    {
+      obj = _orb->string_to_object(value);
+      gobj = SALOME::GenericObj::_narrow(obj);
+      if(! CORBA::is_nil(gobj) )
+        gobj->Register();
+    }
+  catch(const CORBA::Exception& e)
+    {
+    }
+  //unregister value
+  try
+    {
+      std::string value=dynamic_cast<SALOMEDSImpl_AttributeIOR*>(_impl)->Value();
+      if(value != "")
+        {
+          obj = _orb->string_to_object(value.c_str());
+          gobj = SALOME::GenericObj::_narrow(obj);
+          if(! CORBA::is_nil(gobj) )
+            gobj->Destroy();
+        }
+    }
+  catch(const CORBA::Exception& e)
+    {
+    }
+#endif
+
   SALOMEDS::Locker lock;
   CheckLocked();
   CORBA::String_var Str = CORBA::string_dup(value);