Utils/Console: Add short help to 'ls' output
[senf.git] / PPI / Connectors.cci
index a046feb..3f24b5d 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
@@ -24,6 +24,8 @@
     \brief Connectors inline non-template implementation */
 
 // Custom includes
+#include "../Utils/TypeInfo.hh"
+#include "../Utils/senfassert.hh"
 
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
 prefix_ senf::ppi::connector::Connector & senf::ppi::connector::Connector::peer()
     const
 {
-    BOOST_ASSERT(peer_);
+    // The connector is not connected
+    SENF_ASSERT(peer_);
     return *peer_;
 }
 
 prefix_ senf::ppi::module::Module & senf::ppi::connector::Connector::module()
     const
 {
-    BOOST_ASSERT(module_);
+    // The connector is not registered in the module -> probably a route() or noroute() statement is
+    // missing.
+    SENF_ASSERT(module_);
     return *module_;
 }
 
@@ -53,12 +58,18 @@ prefix_ senf::ppi::connector::Connector::Connector()
 {}
 
 prefix_ senf::ppi::connector::Connector::~Connector()
-{}
+{
+    if (connected()) {
+        Connector & peer (*peer_);
+        peer_->peer_ = 0;
+        peer.v_init();
+    }
+}
 
-prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
+prefix_ bool senf::ppi::connector::Connector::connected()
+    const
 {
-    peer_ = & target;
-    target.peer_ = this;
+    return peer_;
 }
 
 ////////////////////////////////////////
@@ -72,12 +83,52 @@ prefix_ void senf::ppi::connector::Connector::setModule(module::Module & module)
 ///////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::PassiveConnector
 
+prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
+    const
+{
+    return dynamic_cast<ActiveConnector&>(Connector::peer());
+}
+
 prefix_ bool senf::ppi::connector::PassiveConnector::throttled()
     const
 {
     return nativeThrottled_ || remoteThrottled_;
 }
 
+////////////////////////////////////////
+// private members
+
+prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
+{
+    if (connected())
+        peer().notifyThrottle();
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
+{
+    if (connected()) {
+        peer().notifyUnthrottle();
+        v_unthrottleEvent();
+    }
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle()
+{
+    if (!throttled()) {
+        remoteThrottled_ = true;
+        emitThrottle();
+    }
+    else
+        remoteThrottled_ = true;
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route)
+{
+    routes_.push_back(&route);
+}
+
+// public members 
+
 prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled()
     const
 {
@@ -86,9 +137,10 @@ prefix_ bool senf::ppi::connector::PassiveConnector::nativeThrottled()
 
 prefix_ void senf::ppi::connector::PassiveConnector::throttle()
 {
-    if (!throttled())
+    if (!throttled()) {
+        nativeThrottled_ = true;
         emitThrottle();
-    nativeThrottled_ = true;
+    }
 }
 
 prefix_ void senf::ppi::connector::PassiveConnector::unthrottle()
@@ -101,12 +153,6 @@ prefix_ void senf::ppi::connector::PassiveConnector::unthrottle()
 
 }
 
-prefix_ senf::ppi::connector::ActiveConnector & senf::ppi::connector::PassiveConnector::peer()
-    const
-{
-    return dynamic_cast<ActiveConnector&>(Connector::peer());
-}
-
 ////////////////////////////////////////
 // protected members
 
@@ -116,43 +162,12 @@ prefix_ senf::ppi::connector::PassiveConnector::PassiveConnector()
 
 prefix_ void senf::ppi::connector::PassiveConnector::emit()
 {
-    BOOST_ASSERT(callback_);
+    // No event callback has been registered (onEvent() call missing)
+    SENF_ASSERT(callback_);
     if (!throttled())
         callback_();
 }
 
-////////////////////////////////////////
-// private members
-
-prefix_ void senf::ppi::connector::PassiveConnector::notifyThrottle()
-{
-    if (!throttled()) {
-        remoteThrottled_ = true;
-        emitThrottle();
-    } 
-    else 
-        remoteThrottled_ = true;
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::emitThrottle()
-{
-    peer().notifyThrottle();
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::emitUnthrottle()
-{
-    peer().notifyUnthrottle();
-    v_unthrottleEvent();
-}
-
-prefix_ void senf::ppi::connector::PassiveConnector::v_unthrottleEvent()
-{}
-
-prefix_ void senf::ppi::connector::PassiveConnector::registerRoute(ForwardingRoute & route)
-{
-    routes_.push_back(&route);
-}
-
 ///////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::ActiveConnector
 
@@ -175,19 +190,24 @@ prefix_ void senf::ppi::connector::ActiveConnector::onUnthrottle()
 prefix_ bool senf::ppi::connector::ActiveConnector::throttled()
     const
 {
-    return peer().throttled();
+    return ! connected() || peer().throttled();
 }
 
 ////////////////////////////////////////
 // protected members
 
 prefix_ senf::ppi::connector::ActiveConnector::ActiveConnector()
-    : throttleCallback_(), unthrottleCallback_(), notifyRoutes_()
+    : throttleCallback_(), unthrottleCallback_(), notifyRoutes_(), throttled_(false)
 {}
 
 ///////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::InputConnector
 
+prefix_ senf::Packet senf::ppi::connector::InputConnector::read()
+{
+    return operator()();
+}
+
 prefix_ senf::ppi::connector::OutputConnector & senf::ppi::connector::InputConnector::peer()
     const
 {
@@ -211,7 +231,8 @@ senf::ppi::connector::InputConnector::end()
 prefix_ senf::Packet senf::ppi::connector::InputConnector::peek()
     const
 {
-    BOOST_ASSERT( ! queue_.empty() );
+    // Cannot peek() head of empty queue
+    SENF_ASSERT( ! queue_.empty() );
     return queue_.back();
 }
 
@@ -237,7 +258,7 @@ prefix_ senf::ppi::connector::InputConnector::InputConnector()
 ////////////////////////////////////////
 // private members
 
-prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet p)
+prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet const & p)
 {
     queue_.push_front(p);
     v_enqueueEvent();
@@ -246,17 +267,23 @@ prefix_ void senf::ppi::connector::InputConnector::enqueue(Packet p)
 ///////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::OutputConnector
 
-prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet p)
-{
-    peer().enqueue(p);
-}
-
 prefix_ senf::ppi::connector::InputConnector & senf::ppi::connector::OutputConnector::peer()
     const
 {
     return dynamic_cast<InputConnector&>(Connector::peer());
 }
 
+prefix_ void senf::ppi::connector::OutputConnector::operator()(Packet const & p)
+{
+    if (connected())
+        peer().enqueue(p);
+}
+
+prefix_ void senf::ppi::connector::OutputConnector::write(Packet const & p)
+{
+    operator()(p);
+}
+
 ////////////////////////////////////////
 // protected members
 
@@ -264,84 +291,94 @@ prefix_ senf::ppi::connector::OutputConnector::OutputConnector()
 {}
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::PassiveInput
+// senf::ppi::connector::GenericPassiveInput
 
-prefix_ senf::ppi::connector::PassiveInput::PassiveInput()
+prefix_ senf::ppi::connector::GenericPassiveInput::GenericPassiveInput()
     : qdisc_(new ThresholdQueueing(1,0))
 {}
 
-prefix_ senf::ppi::connector::ActiveOutput & senf::ppi::connector::PassiveInput::peer()
+prefix_ senf::ppi::connector::GenericActiveOutput & senf::ppi::connector::GenericPassiveInput::peer()
     const
 {
-    return dynamic_cast<ActiveOutput&>(Connector::peer());
+    return dynamic_cast<GenericActiveOutput&>(Connector::peer());
 }
 
-prefix_ bool senf::ppi::connector::PassiveInput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericPassiveInput::boolean_test()
     const
 {
     return ! empty();
 }
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::PassiveOutput
+// senf::ppi::connector::GenericPassiveOutput
 
-prefix_ senf::ppi::connector::ActiveInput & senf::ppi::connector::PassiveOutput::peer()
+prefix_ senf::ppi::connector::GenericActiveInput & senf::ppi::connector::GenericPassiveOutput::peer()
     const
 {
-    return dynamic_cast<ActiveInput&>(Connector::peer());
+    return dynamic_cast<GenericActiveInput&>(Connector::peer());
 }
 
-prefix_ bool senf::ppi::connector::PassiveOutput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericPassiveOutput::boolean_test()
     const
 {
     return  true;
 }
 
-prefix_ void senf::ppi::connector::PassiveOutput::connect(ActiveInput & target)
+prefix_ void senf::ppi::connector::GenericPassiveOutput::connect(GenericActiveInput & target)
 {
     Connector::connect(target);
 }
 
+prefix_ senf::ppi::connector::GenericPassiveOutput::GenericPassiveOutput()
+{}
+
 ///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::ActiveInput
+// senf::ppi::connector::GenericActiveInput
 
-prefix_ senf::ppi::connector::PassiveOutput & senf::ppi::connector::ActiveInput::peer()
+prefix_ senf::ppi::connector::GenericPassiveOutput & senf::ppi::connector::GenericActiveInput::peer()
     const
 {
-    return dynamic_cast<PassiveOutput&>(Connector::peer());
+    return dynamic_cast<GenericPassiveOutput&>(Connector::peer());
 }
 
-prefix_ bool senf::ppi::connector::ActiveInput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericActiveInput::boolean_test()
     const
 {
-    return ! empty() || ! peer().throttled();
+    return ! empty() || (connected() && ! peer().throttled());
 }
 
-prefix_ void senf::ppi::connector::ActiveInput::request()
+prefix_ void senf::ppi::connector::GenericActiveInput::request()
 {
-    peer().emit();
+    if (connected())
+        peer().emit();
 }
 
+prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput()
+{}
+
 ///////////////////////////////////////////////////////////////////////////
-// senf::ppi::connector::ActiveOutput
+// senf::ppi::connector::GenericActiveOutput
 
-prefix_ senf::ppi::connector::PassiveInput & senf::ppi::connector::ActiveOutput::peer()
+prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer()
     const
 {
-    return dynamic_cast<PassiveInput&>(Connector::peer());
+    return dynamic_cast<GenericPassiveInput&>(Connector::peer());
 }
 
-prefix_ bool senf::ppi::connector::ActiveOutput::boolean_test()
+prefix_ bool senf::ppi::connector::GenericActiveOutput::boolean_test()
     const
 {
-    return ! peer().throttled();
+    return connected() && ! peer().throttled();
 }
 
-prefix_ void senf::ppi::connector::ActiveOutput::connect(PassiveInput & target)
+prefix_ void senf::ppi::connector::GenericActiveOutput::connect(GenericPassiveInput & target)
 {
     Connector::connect(target);
 }
 
+prefix_ senf::ppi::connector::GenericActiveOutput::GenericActiveOutput()
+{}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_