X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FModule.hh;h=a2741ec9546accd65eac2c8c0ad05b0e1e16b9bd;hb=55b4c5a3afcf821031cef2ca7089fbdfd77d513a;hp=e4f25997bfab6287a9cd5ea0c45b7ab81fcbb230;hpb=26610f603ebdd465307b9621f532c1fe19fd5571;p=senf.git diff --git a/senf/PPI/Module.hh b/senf/PPI/Module.hh index e4f2599..a2741ec 100644 --- a/senf/PPI/Module.hh +++ b/senf/PPI/Module.hh @@ -2,26 +2,31 @@ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Stefan Bund // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. +// The contents of this file are subject to the Fraunhofer FOKUS Public License +// Version 1.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// http://senf.berlios.de/license.html // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// The Fraunhofer FOKUS Public License Version 1.0 is based on, +// but modifies the Mozilla Public License Version 1.1. +// See the full license text for the amendments. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the License. +// +// The Original Code is Fraunhofer FOKUS code. +// +// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. +// (registered association), Hansastraße 27 c, 80686 Munich, Germany. +// All Rights Reserved. +// +// Contributor(s): +// Stefan Bund /** \file - \brief Module public header + \brief Module public header */ #ifndef HH_SENF_PPI_Module_ @@ -36,21 +41,24 @@ #include "ModuleManager.hh" //#include "Module.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { namespace ppi { + + namespace detail { class EventBindingBase; } + namespace module { /** \namespace senf::ppi::module \brief PPI Modules - + The modules build the PPI core. The PPI provides a set of general purpose infrastructure modules. For concrete applications, additional application specific processing modules need to be implemented. \section module_impl Implementing Modules - + All modules derive from senf::ppi::module::Module. See this class for a documentation on how to write new modules. @@ -85,7 +93,7 @@ namespace module { senf::ppi::Module is the base-class of all PPI modules. It provides the module implementation with interfaces to several PPI facilities: - + \li Connector management \li Flow management (routing) \li Event handling @@ -108,8 +116,8 @@ namespace module { senf::ppi::connector::PassiveInput<> input; senf::ppi::connector::ActiveOutput<> output; - SomeModule(senf::FileHandle h) - : handle ( h ), + SomeModule(senf::FileHandle h) + : handle ( h ), event ( handle, senf::ppi::IOEvent::Read ) { // Set up routing. If some connector is not routed you need to explicitly state this @@ -181,10 +189,7 @@ namespace module { protected: Module(); -#ifndef DOXYGEN - template - Route & route(Source & source, Target & target); -#else +#ifdef DOXYGEN Route & route(connector::InputConnector & input, connector::OutputConnector & output); ///< Define flow information @@ -210,10 +215,8 @@ namespace module { incoming data (connector or event) \param[in] output Data target, object which controls outgoing data (connector or event) - \returns Route instance describing this route - \see \ref ppi_throttling - \note The real implementation is not provided by three - overloads but by a single template member */ + \returns Route instance describing this route + \see \ref ppi_throttling */ Route & route(connector::InputConnector & input, EventDescriptor & output); @@ -227,7 +230,7 @@ namespace module { event is signaled.). This event routing allows to automatically - enable/disable the event on throttling notifications. + enable/disable the event on throttling notifications. \see \ref route() */ @@ -242,9 +245,24 @@ namespace module { generated whenever the event is signaled). This event routing allows to automatically - enable/disable the event on throttling notifications. + enable/disable the event on throttling notifications. \see \ref route() */ +#else +# define route_decl(Source, Target) \ + Route & \ + route(Source & source, Target & target); + + route_decl( connector::GenericPassiveInput, connector::GenericActiveOutput); + route_decl( connector::GenericPassiveInput, connector::GenericPassiveOutput); + route_decl( connector::GenericActiveInput, connector::GenericPassiveOutput); + route_decl( connector::GenericActiveInput, connector::GenericActiveOutput); + route_decl( connector::GenericPassiveInput, EventDescriptor); + route_decl( connector::GenericActiveInput, EventDescriptor); + route_decl( EventDescriptor, connector::GenericPassiveOutput); + route_decl( EventDescriptor, connector::GenericActiveOutput); + +#undef Route_decl #endif void noroute(connector::Connector & connector); ///< Define terminal connectors @@ -255,7 +273,7 @@ namespace module { information for terminal connectors. See the route() documentation for more on routing - + \param[in] connector Terminal connector to declare */ #ifndef DOXYGEN @@ -279,7 +297,7 @@ namespace module { \param[in] target The handler to call whenever the event is signaled - \param[in] descriptor The type of event to register + \param[in] descriptor The type of event to register \note The real implementation has the second arguments type as an additional template parameter. */ #endif @@ -298,7 +316,7 @@ namespace module { virtual void v_init(); ///< Called after module setup /**< This member is called directly before the PPI (resumes) execution. It is called after connections have been - setup before entering the PPI main loop. + setup before entering the PPI main loop. You may overload this member. Your overload should always call the base-class implementation. */ @@ -307,12 +325,15 @@ namespace module { public: #endif void destroy(); - + private: EventManager & eventManager() const; ModuleManager & moduleManager() const; - + void registerConnector(connector::Connector & connector); + void unregisterConnector(connector::Connector & connector); + void unregisterEvent(EventDescriptor & event); + RouteBase & addRoute(std::auto_ptr route); typedef std::vector ConnectorRegistry; @@ -324,11 +345,13 @@ namespace module { template friend class detail::RouteHelper; friend class senf::ppi::ModuleManager; + friend class connector::Connector; + friend class senf::ppi::detail::EventBindingBase; }; /** \brief Define PPI Module - Every module must begin by using this macro. + Every module must begin by using this macro. \see senf::ppi::module::Module */ @@ -340,7 +363,7 @@ namespace module { }}} -///////////////////////////////hh.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #include "Module.cci" #include "Module.ct" //#include "Module.cti"