fcca5da58e6d6276173e3b98c7ff1b99f105f65d
[senf.git] / senf / PPI / EventManager.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief EventManager public header */
30
31 #ifndef HH_SENF_PPI_EventManager_
32 #define HH_SENF_PPI_EventManager_ 1
33
34 // Custom includes
35 #include <boost/ptr_container/ptr_vector.hpp>
36 #include <senf/Scheduler/ClockService.hh>
37 #include "predecl.hh"
38 #include "detail/Callback.hh"
39 #include "detail/EventBinding.hh"
40
41 //#include "EventManager.mpp"
42 //-/////////////////////////////////////////////////////////////////////////////////////////////////
43
44 namespace senf {
45 namespace ppi {
46
47     /** \brief Event registry and control
48
49         The EventManager control event registration and manages global event parameters. The
50         EventManager controls event dispatch but does \e not control event generation. This is the
51         responsibility of an external component (the Scheduler)
52       */
53     class EventManager
54     {
55     public:
56         //-////////////////////////////////////////////////////////////////////////
57         // Types
58
59 #ifndef DOXYGEN
60         // Somehow doxygen barfs on this definition
61         template <class Descriptor>
62         struct Callback
63             : public detail::Callback<typename Descriptor::EventArg>
64         {};
65 #endif
66
67         //-////////////////////////////////////////////////////////////////////////
68         ///\name Structors and default members
69         //\{
70
71         static EventManager & instance();
72
73         // default default constructor
74         // default copy constructor
75         // default copy assignment
76         // default destructor
77
78         // no conversion constructors
79
80         //\}
81         //-////////////////////////////////////////////////////////////////////////
82
83         ClockService::clock_type now(); ///< Current time at last event dispatch
84         ClockService::clock_type time(); ///< Expected time of the last event
85
86     protected:
87
88     private:
89         template <class Descriptor>
90         void registerEvent(module::Module & module,
91                            typename Callback<Descriptor>::type callback,
92                            Descriptor & descriptor);
93
94         void destroyModule(module::Module & module);
95         void destroyEvent(EventDescriptor & event);
96
97         typedef boost::ptr_vector<detail::EventBindingBase> EventRegistrations;
98         EventRegistrations registrations_;
99
100         void eventTime(ClockService::clock_type time);
101
102         ClockService::clock_type eventTime_;
103
104         friend class detail::EventBindingBase;
105         friend class module::Module;
106         friend class EventDescriptor;
107     };
108
109 }}
110
111 //-/////////////////////////////////////////////////////////////////////////////////////////////////
112 #include "EventManager.cci"
113 #include "EventManager.ct"
114 //#include "EventManager.cti"
115 #endif
116
117 \f
118 // Local Variables:
119 // mode: c++
120 // fill-column: 100
121 // comment-column: 40
122 // c-file-style: "senf"
123 // indent-tabs-mode: nil
124 // ispell-local-dictionary: "american"
125 // compile-command: "scons -u test"
126 // End: