Salome HOME
Updated copyright comment
[modules/kernel.git] / src / SALOMESDS / SALOMESDS_AutoRefCountPtr.hxx
index 021b115dd34103c4ae304a9fc7dbc97ee4a50d53..3ab43ddcc96bb31150138631fd62bf3b4adc18c8 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 
 #include "SALOMESDS_Exception.hxx"
 
+#include "omniORB4/CORBA.h"
+
 namespace SALOMESDS
 {
+  class POAHolder : public virtual PortableServer::ServantBase
+  {
+  public:
+    virtual PortableServer::POA_var getPOA() const = 0;
+    CORBA::Object_var activate()
+    {
+      PortableServer::POA_var poa(getPOA());
+      PortableServer::ObjectId_var id;
+      try
+      {
+          id=poa->activate_object(this);
+      }
+      catch(PortableServer::POA::ServantAlreadyActive& /*e*/) //!< TODO: unused variables
+      {
+          id=poa->servant_to_id(this);
+      }
+      CORBA::Object_var ret(poa->id_to_reference(id));
+      return ret;
+    }
+
+    void enforcedRelease()
+    {
+      PortableServer::POA_var poa(getPOA());
+      PortableServer::ObjectId_var oid(poa->servant_to_id(this));
+      poa->deactivate_object(oid);
+      _remove_ref();
+    }
+  };
+  
   template<class T>
   class AutoRefCountPtr
   {
@@ -51,7 +82,7 @@ namespace SALOMESDS
   };
 
   template<class T, class U>
-  typename SALOMESDS::AutoRefCountPtr<U> DynamicCast(typename SALOMESDS::AutoRefCountPtr<T>& autoSubPtr) throw()
+  typename SALOMESDS::AutoRefCountPtr<U> DynamicCast(typename SALOMESDS::AutoRefCountPtr<T>& autoSubPtr)
   {
     T *subPtr(autoSubPtr);
     U *ptr(dynamic_cast<U *>(subPtr));
@@ -73,6 +104,33 @@ namespace SALOMESDS
       ptr->incrRef();
     return ret;
   }
+
+  template<class T>// T is expected to be a POAHolder subclass
+  class AutoServantPtr
+  {
+  public:
+    AutoServantPtr(T *ptr=0):_ptr(ptr) { }
+    ~AutoServantPtr() { destroyPtr(); }
+    bool operator==(const AutoServantPtr& other) const { return _ptr==other._ptr; }
+    bool operator==(const T *other) const { return _ptr==other; }
+    AutoServantPtr &operator=(T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; } return *this; }
+    T *operator->() { return _ptr ; }
+    const T *operator->() const { return _ptr; }
+    T& operator*() { return *_ptr; }
+    const T& operator*() const { return *_ptr; }
+    operator T *() { return _ptr; }
+    operator const T *() const { return _ptr; }
+    bool isNull() const { return _ptr==NULL; }
+  private:
+    void destroyPtr()
+    {
+      if(!_ptr)
+        return;
+      _ptr->enforcedRelease();
+    }
+  private:
+    T *_ptr;
+  };
 }
 
 #endif