removed some useless spaces; not very important, I know :)
[senf.git] / PPI / detail / EventBinding.hh
index 10959d7..93089de 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,7 @@
 #define HH_EventBinding_ 1
 
 // Custom includes
-#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include "../../Scheduler/ClockService.hh"
 #include "../predecl.hh"
 #include "Callback.hh"
 
@@ -38,37 +38,77 @@ namespace senf {
 namespace ppi {
 namespace detail {
 
+    /** \brief Internal: Association Event - Module - Handler, base-class */
     class EventBindingBase
     {
+    public:
+        ~EventBindingBase();
+
+        EventManager & manager() const;
+        module::Module & module() const;
+        
     protected:
         EventBindingBase(EventManager & manager, module::Module & module, 
                          EventDescriptor & descriptor);
 
-        void eventTime(boost::posix_time::ptime time);
+        void eventTime(ClockService::clock_type time);
 
     private:
         EventManager * manager_;
         module::Module * module_;
         EventDescriptor * descriptor_;
+
+        friend class senf::ppi::EventManager;
     };
 
+    /** \brief Internal: Callback forwarders
+     */
+    template <class EventType, class Self>
+    class EventBindingHelper
+    {
+    public:
+        typedef typename detail::EventArgType<EventType>::type EventArg;
+
+        void callback(EventArg event, ClockService::clock_type time);
+        void callback(EventArg event);
+        
+    private:
+        Self & self();
+    };
+
+#ifndef DOXYGEN
+
+    template <class Self>
+    class EventBindingHelper<void,Self>
+    {
+    public:
+        void callback(ClockService::clock_type time);
+        void callback();
+        
+    private:
+        Self & self();
+    };
+
+#endif
+
+    /** \brief Internal: Association Event - Module - Handler, event type specific */
     template <class EventType>
     class EventBinding
-        : public EventBindingBase
+        : public EventBindingBase, 
+          public EventBindingHelper<EventType, EventBinding<EventType> >
     {
     public:
         typedef EventType Event;
         typedef typename detail::EventArgType<Event>::type EventArg;
-        typedef typename detail::Callback<Event const &>::type Callback;
+        typedef typename detail::Callback<EventArg>::type Callback;
 
         EventBinding(EventManager & manager, module::Module & module, Callback callback,
                      EventDescriptor & descriptor);
 
-        void callback(EventArg event, boost::posix_time::ptime time);
-        void callback(EventArg event);
-
     private:
         Callback callback_;
+
+        friend class EventBindingHelper<EventType, EventBinding<EventType> >;
     };
 
 }}}