Salome HOME
Merge from branch CCRT_Port_V220.
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_GenericAttribute_i.hxx
index 6d404b71942d8590f927665a9d94742a9d746be1..80a7c96e081a6dc03fa81f8be07b4e7a9e555be3 100644 (file)
 #ifndef _GENERIC_ATTRIBUTE_I_HXX_
 #define _GENERIC_ATTRIBUTE_I_HXX_
 
+#include <TDF_Attribute.hxx>
+#include <Standard_GUID.hxx>
+
 // IDL headers
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOMEDS)
-#include <TDF_Attribute.hxx>
-#include "SALOMEDS_SObject_i.hxx"
-#include "SALOMEDS_IORAttribute.hxx"
 
-class SALOMEDS_GenericAttribute_i: public POA_SALOMEDS::GenericAttribute,
-                                  public PortableServer::RefCountServantBase {
+class SALOMEDS_SObject_i;
+
+class SALOMEDS_GenericAttribute_i:
+  public virtual POA_SALOMEDS::GenericAttribute,
+  public virtual PortableServer::RefCountServantBase 
+{ 
+private: 
+  friend class SALOMEDS_SObject_i;
+
+  SALOMEDS_GenericAttribute_i(); // Not implemented
+  void operator=(const SALOMEDS_GenericAttribute_i&);  //Not implemented
+
 protected:
-  Handle(TDF_Attribute) _myAttr;
-  CORBA::ORB_ptr        _myOrb;
-public:
-  SALOMEDS_GenericAttribute_i() {};
+  SALOMEDS_SObject_i* _mySObject;
+  Handle(TDF_Attribute) _myBasicAttr;
+
+  SALOMEDS_GenericAttribute_i(const Handle(TDF_Attribute)& theAttr,
+                             SALOMEDS_SObject_i* theSObject);
   
-  void CheckLocked() throw (SALOMEDS::GenericAttribute::LockProtection);
+  virtual ~SALOMEDS_GenericAttribute_i();
+
+  void SetBasicAttribute(const Handle(TDF_Attribute)& theAttr){
+    _myBasicAttr = theAttr;
+  }
   
-  ~SALOMEDS_GenericAttribute_i() {};
+public:
+  void Restore(const char*);
+
+  char* Store();
+
+  char* Type();
+  
+  SALOMEDS::SObject_ptr GetSObject();
+
+  void CheckLocked() 
+    throw (SALOMEDS::GenericAttribute::LockProtection);
+
+  virtual void SetAttribute(const Handle(TDF_Attribute)& theAttr) = 0;
+
+  virtual const Handle(TDF_Attribute)& GetAttribute() const = 0;
+
+};
+
 
-//  CORBA::Boolean  GetPtr(SALOMEDS::SObject_out so) {
-//    SALOMEDS_SObject_i* sob_impl = new  SALOMEDS_SObject_i(_myAttr->Label(), _myOrb);
-//    SALOMEDS::SObject_var sob = sob_impl->_this();
-//    return sob._retn();
-//  };
+template<class TDFAttribute, class TStoreTDFAttribute, bool TIsCheckLockedStudy = true>
+class SALOMEDS_TGenericAttribute_i:
+  public virtual SALOMEDS_GenericAttribute_i
+{
+public:
+  typedef TDFAttribute TAttr;
+  typedef TStoreTDFAttribute TStoreAttr;
 
+  virtual void SetAttribute(const Handle(TDF_Attribute)& theAttr){
+    _myAttr = TStoreAttr::DownCast(theAttr);
+    SetBasicAttribute(theAttr);
+  }
+  virtual const Handle(TDF_Attribute)& GetAttribute() const{
+    return _myAttr;
+  }
+  static bool IsCheckLockedStudy(){
+    return TIsCheckLockedStudy;
+  }
+  static Handle(TDF_Attribute) NewAttribute(){
+    return new TAttr;
+  }
+
+protected:
+  TStoreAttr _myAttr;
+
+  SALOMEDS_TGenericAttribute_i(const Handle(TDF_Attribute)& theAttr,
+                              SALOMEDS_SObject_i* theSObject):
+    SALOMEDS_GenericAttribute_i(theAttr,theSObject),
+    _myAttr(TStoreAttr::DownCast(theAttr))
+  {
+  }
+  
+private: 
+  friend class SALOMEDS_SObject_i;
+
+  SALOMEDS_TGenericAttribute_i(); //Not implemented
+  void operator=(const SALOMEDS_TGenericAttribute_i&);  //Not implemented
 
 };
 
+
+#define DEFINE_DERIVED_ATTR(TName,TAttr,TCheck) \
+  typedef SALOMEDS_TGenericAttribute_i<TAttr,Handle_##TAttr,TCheck> \
+    SALOMEDS_T##TName##_i
+
+
+#define DEFINE_DERIVED_ATTR_METH_BASE(TName) \
+public: \
+  friend class SALOMEDS_SObject_i; \
+  static SALOMEDS_GenericAttribute_i* \
+    NewInstance(const Handle(TDF_Attribute)& theAttr, \
+                SALOMEDS_SObject_i* theSObject) \
+      { return new SALOMEDS_##TName##_i(theAttr,theSObject);} \
+private: \
+  SALOMEDS_##TName##_i(const Handle(TDF_Attribute)& theAttr, \
+                       SALOMEDS_SObject_i* theSObject): \
+    SALOMEDS_GenericAttribute_i(theAttr,theSObject), \
+    SALOMEDS_T##TName##_i(theAttr,theSObject) \
+    {} \
+  void operator=(const SALOMEDS_##TName##_i&); \
+  SALOMEDS_##TName##_i()
+
+
+#define DEFINE_DERIVED_ATTR_METH_DEFAULT(TName,TAttr) \
+DEFINE_DERIVED_ATTR_METH_BASE(TName); \
+public: \
+  static Standard_GUID GetGUID(){ return TAttr::GetID(); } \
+private:
+
+
+#define DEFINE_DERIVED_ATTR_METH(TName,theGUID) \
+DEFINE_DERIVED_ATTR_METH_BASE(TName); \
+public: \
+  static Standard_GUID GetGUID(){ return theGUID; } \
+private:
+
+
 #endif