From b1af37ca2cf95dfdf55e2302b8698714d1568d0f Mon Sep 17 00:00:00 2001
From: Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
Date: Sat, 27 Apr 2013 16:03:48 +0000
Subject: [PATCH] Added PyHook.cpp & PyHook.h ...

---
 hurricane/src/isobar/PyHook.cpp               | 184 ++++++++++++++++++
 .../src/isobar/hurricane/isobar/PyHook.h      |  56 ++++++
 2 files changed, 240 insertions(+)
 create mode 100644 hurricane/src/isobar/PyHook.cpp
 create mode 100644 hurricane/src/isobar/hurricane/isobar/PyHook.h

diff --git a/hurricane/src/isobar/PyHook.cpp b/hurricane/src/isobar/PyHook.cpp
new file mode 100644
index 00000000..23b1a3f8
--- /dev/null
+++ b/hurricane/src/isobar/PyHook.cpp
@@ -0,0 +1,184 @@
+
+// -*- C++ -*-
+//
+// This file is part of the Coriolis Software.
+// Copyright (c) UPMC 2013-2013, All Rights Reserved
+//
+// +-----------------------------------------------------------------+ 
+// |                   C O R I O L I S                               |
+// |    I s o b a r  -  Hurricane / Python Interface                 |
+// |                                                                 |
+// |  Author      :                    Jean-Paul Chaput              |
+// |  E-mail      :            Jean-Paul.Chaput@lip6.fr              |
+// | =============================================================== |
+// |  C++ Module  :  "./PyHook.cpp"                                  |
+// +-----------------------------------------------------------------+
+
+
+#include "hurricane/isobar/PyEntity.h"
+#include "hurricane/isobar/PyComponent.h"
+#include "hurricane/isobar/PyHook.h"
+
+
+namespace  Isobar {
+
+using namespace Hurricane;
+
+extern "C" {
+
+
+#define  METHOD_HEAD(function)   GENERIC_METHOD_HEAD(Hook,hook,function)
+
+
+// +=================================================================+
+// |                "PyHook" Python Module Code Part                 |
+// +=================================================================+
+
+#if defined(__PYTHON_MODULE__)
+
+  accessorHook(getNextHook          ,PyHook,Hook)
+  accessorHook(getPreviousHook      ,PyHook,Hook)
+  accessorHook(getMasterHook        ,PyHook,Hook)
+  accessorHook(getNextMasterHook    ,PyHook,Hook)
+  accessorHook(getPreviousMasterHook,PyHook,Hook)
+  DirectGetBoolAttribute(PyHook_isMaster  ,isMaster  ,PyHook,Hook)
+  DirectGetBoolAttribute(PyHook_isAttached,isAttached,PyHook,Hook)
+
+
+  static PyObject* PyHook_getComponent ( PyHook *self )
+  {
+    trace << "PyHook_getComponent()" << endl;
+    METHOD_HEAD ( "Hook.getComponent()" )
+
+    Component* component = NULL;
+    HTRY
+    component = hook->getComponent();
+    HCATCH
+      
+    return (PyObject*)PyEntity_NEW(component);
+  }
+
+
+  static PyObject* PyHook_detach ( PyHook *self )
+  {
+    trace << "PyHook_detach()" << endl;
+    METHOD_HEAD ( "Hook.detach()" )
+
+    PyHook* pyReturnHook = PyObject_NEW ( PyHook, &PyTypeHook );
+    if (pyReturnHook == NULL) return NULL;
+
+    HTRY
+    pyReturnHook->_object = hook->detach();
+    HCATCH
+      
+    return (PyObject*)pyReturnHook;
+  }
+
+
+  static PyObject* PyHook_attach ( PyHook *self, PyObject* args )
+  {
+    trace << "PyHook_attach()" << endl;
+    METHOD_HEAD ( "Hook.attach()" )
+
+    PyHook* pyReturnHook = PyObject_NEW ( PyHook, &PyTypeHook );
+    if (pyReturnHook == NULL) return NULL;
+
+    PyObject* pyMasterHook = NULL;
+    if (not PyArg_ParseTuple(args,"O:Hook.attach", &pyMasterHook))
+      return NULL;
+
+    Hook* masterHook = PYHOOK_O(pyMasterHook);
+    if (masterHook == NULL) {
+      PyErr_SetString ( ConstructorError
+                      , "Hook.attach(): Parameter is not of Hook type" );
+      return NULL;
+    }
+
+    HTRY
+      pyReturnHook->_object = hook->attach( masterHook );
+    HCATCH
+      
+    return (PyObject*)pyReturnHook;
+  }
+
+
+  static PyObject* PyHook_merge ( PyHook *self, PyObject* args )
+  {
+    trace << "PyHook_merge()" << endl;
+    METHOD_HEAD ( "Hook.merge()" )
+
+    PyHook* pyReturnHook = PyObject_NEW ( PyHook, &PyTypeHook );
+    if (pyReturnHook == NULL) return NULL;
+
+    PyObject* pyMasterHook = NULL;
+    if (not PyArg_ParseTuple(args,"O:Hook.merge", &pyMasterHook))
+      return NULL;
+
+    Hook* masterHook = PYHOOK_O(pyMasterHook);
+    if (masterHook == NULL) {
+      PyErr_SetString ( ConstructorError
+                      , "Hook.merge(): Parameter is not of Hook type" );
+      return NULL;
+    }
+
+    HTRY
+      pyReturnHook->_object = hook->merge( masterHook );
+    HCATCH
+      
+    return (PyObject*)pyReturnHook;
+  }
+
+
+  // Standart destroy (Attribute).
+
+
+  PyMethodDef PyHook_Methods[] =
+    { { "getComponent"         , (PyCFunction)PyHook_getComponent         , METH_NOARGS
+                               , "Return the Component into which the Hook is nested." }
+    , { "getNextHook"          , (PyCFunction)PyHook_getNextHook          , METH_NOARGS
+                               , "Return the the next Hook in the ring." }
+    , { "getPreviousHook"      , (PyCFunction)PyHook_getPreviousHook      , METH_NOARGS
+                               , "Return the the previous Hook in the ring (walk trough the whole ring)." }
+    , { "getMasterHook"        , (PyCFunction)PyHook_getMasterHook        , METH_NOARGS
+                               , "Return the master of this Hook." }
+    , { "getNextMasterHook"    , (PyCFunction)PyHook_getNextMasterHook    , METH_NOARGS
+                               , "Return the master hook next to the master of this Hook." }
+    , { "getPreviousMasterHook", (PyCFunction)PyHook_getPreviousMasterHook, METH_NOARGS
+                               , "Return the master hook previous to the master of this Hook (walk trough the whole ring)." }
+    , { "isMaster"             , (PyCFunction)PyHook_isMaster             , METH_NOARGS
+                               , "Tells if this Hook is of master kind" }
+    , { "isAttached"           , (PyCFunction)PyHook_isAttached           , METH_NOARGS
+                               , "Tells if this Hook is inserted in a ring" }
+    , { "detach"               , (PyCFunction)PyHook_detach               , METH_NOARGS
+                               , "Detach a slave from it's ring or detach the whole ring of a master." }
+    , { "attach"               , (PyCFunction)PyHook_attach               , METH_VARARGS
+                               , "Insert this hook (slave) or ring (master) into another ring." }
+    , { "merge"                , (PyCFunction)PyHook_merge                , METH_VARARGS
+                               , "Merge the the two rings of thoses masters." }
+    , {NULL, NULL, 0, NULL}    /* sentinel */
+    };
+
+
+  // ---------------------------------------------------------------
+  // PyHook Type Methods.
+
+
+  PlugDeleteMethod(PyHook_DeAlloc,PyHook)
+  PyTypeObjectLinkPyType(Hook)
+
+
+#else  // End of Python Module Code Part.
+
+
+// +=================================================================+
+// |               "PyHook" Shared Library Code Part                 |
+// +=================================================================+
+
+  PyTypeRootObjectDefinitions(Hook)
+
+
+#endif  // End of Shared Library Code Part.
+
+}  // extern "C".
+
+}  // Isobar namespace. 
diff --git a/hurricane/src/isobar/hurricane/isobar/PyHook.h b/hurricane/src/isobar/hurricane/isobar/PyHook.h
new file mode 100644
index 00000000..9b251b24
--- /dev/null
+++ b/hurricane/src/isobar/hurricane/isobar/PyHook.h
@@ -0,0 +1,56 @@
+
+// -*- C++ -*-
+//
+// This file is part of the Coriolis Software.
+// Copyright (c) UPMC 2013-2013, All Rights Reserved
+//
+// +-----------------------------------------------------------------+ 
+// |                   C O R I O L I S                               |
+// |    I s o b a r  -  Hurricane / Python Interface                 |
+// |                                                                 |
+// |  Author      :                    Jean-Paul Chaput              |
+// |  E-mail      :            Jean-Paul.Chaput@lip6.fr              |
+// | =============================================================== |
+// |  C++ Header  :  "./hurricane/isobar/PyHook.h"                   |
+// +-----------------------------------------------------------------+
+
+
+#ifndef ISOBAR_PYHOOK_H
+#define ISOBAR_PYHOOK_H
+
+#include "hurricane/isobar/PyHurricane.h"
+#include "hurricane/Hook.h"
+
+namespace  Isobar {
+
+using namespace Hurricane;
+
+extern "C" {
+
+// -------------------------------------------------------------------
+// Python Object  :  "PyHook".
+
+  typedef struct {
+      PyObject_HEAD
+      Hook* _object;
+  } PyHook;
+
+
+// -------------------------------------------------------------------
+// Functions & Types exported to "PyHurricane.ccp".
+
+  extern  PyTypeObject  PyTypeHook;
+  extern  PyMethodDef   PyHook_Methods[];
+
+  extern  void      PyHook_LinkPyType     ();
+
+#define IsPyHook(v)    ( (v)->ob_type == &PyTypeHook )
+#define PYHOOK(v)      ( (PyHook*)(v) )
+#define PYHOOK_O(v)    ( PYHOOK(v)->_object )
+
+
+}  // extern "C".
+
+}  // Isobar namespace.
+ 
+#endif