switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / PPI / MonitorModule.hh
1 // $Id$
2 //
3 // Copyright (C) 2009
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 MonitorModule public header */
30
31 #ifndef HH_SENF_PPI_MonitorModule_
32 #define HH_SENF_PPI_MonitorModule_ 1
33
34 // Custom includes
35 #include "Module.hh"
36 #include "Connectors.hh"
37
38 //#include "MonitorModule.mpp"
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40
41 namespace senf {
42 namespace ppi {
43 namespace module {
44
45     /** \brief Base class providing simple monitor %module support
46
47         A monitor %module is a \ref senf::ppi::module::Module "module" which needs information
48         about traversing packets but does not really act on the packets. Because of this, it is
49         \e optional to connect the output: If the output is not connected, the packets will be
50         silently dropped.
51
52         This allows to add monitor modules either into an existing chain or add them using an
53         ActiveDuplicator.
54
55         To write a monitor %module, derive from senf::ppi::module::MonitorModule instead of
56         senf::ppi::module and implement v_handlePacket():
57
58         \code
59         class CountPackets
60             : public senf::ppi::module::MonitorModule<>
61         {
62             SENF_PPI_MODULE(CountPackets);
63         public:
64             CountPackets() : counter_ (0u) {}
65
66         private:
67             virtual void v_handlePacket(Packet const & p)
68             { ++ counter_; }
69
70             unsigned counter_;
71         };
72         \endcode
73
74         You may of course add events (or even further connectors besides \c input and \c output
75         provided by MonitorModule) to the %module.
76
77         \tparam PacketType type of packet expected on input and sent on output. This is also the
78             type of the v_handlePacket() argument.
79      */
80     template <class PacketType=Packet>
81     class MonitorModule : public Module
82     {
83     public:
84         senf::ppi::connector::PassiveInput<PacketType> input;
85         senf::ppi::connector::ActiveOutput<PacketType> output;
86
87     protected:
88         MonitorModule();
89
90         virtual void v_handlePacket(PacketType const & p) = 0; ///< Called for each packet
91
92     private:
93         void request();
94         void throttle();
95         void unthrottle();
96     };
97
98
99 }}}
100
101 //-/////////////////////////////////////////////////////////////////////////////////////////////////
102 //#include "MonitorModule.cci"
103 #include "MonitorModule.ct"
104 #include "MonitorModule.cti"
105 #endif
106
107 \f
108 // Local Variables:
109 // mode: c++
110 // fill-column: 100
111 // comment-column: 40
112 // c-file-style: "senf"
113 // indent-tabs-mode: nil
114 // ispell-local-dictionary: "american"
115 // compile-command: "scons -u test"
116 // End: