added unit test to demonstrate Jack <->Multiconnector problem
[senf.git] / senf / PPI / Connectors.cc
index 2a876b6..9b0232d 100644 (file)
 #include "Connectors.ih"
 
 // Custom includes
-#include "Route.hh"
-#include "Module.hh"
 #include "ModuleManager.hh"
-#include <senf/Utils/Console/Console.hh>
+#include <senf/Utils/Console/ParsedCommand.hh>
 
 //#include "Connectors.mpp"
 #define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::Connector
 
 prefix_ senf::ppi::connector::Connector::~Connector()
@@ -68,6 +66,7 @@ prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
     SENF_ASSERT( ! target.peer_,
                  "senf::ppi::connector::Connector::connect(): (target) "
                  "duplicate connection" );
+
     if (! (packetTypeID() == typeid(void) ||
            target.packetTypeID() == typeid(void) ||
            packetTypeID() == target.packetTypeID()) )
@@ -84,6 +83,10 @@ prefix_ void senf::ppi::connector::Connector::connect(Connector & target)
         enqueueInitializable();
     if (! peer().initializationScheduled())
         peer().enqueueInitializable();
+
+    v_connected();
+    peer_->v_connected();
+
 }
 
 senf::ppi::connector::Connector::TraceState senf::ppi::connector::Connector::traceState_ (
@@ -201,11 +204,24 @@ prefix_ std::type_info const & senf::ppi::connector::Connector::packetTypeID()
     return typeid(void);
 }
 
+prefix_ void senf::ppi::connector::Connector::unregisterConnector()
+{
+    if (module_)
+        module_->unregisterConnector(*this);
+}
+
+prefix_ void senf::ppi::connector::Connector::setModule(module::Module & module)
+{
+    module_ = &module;
+}
+
 prefix_ void senf::ppi::connector::Connector::v_disconnected()
-    const
 {}
 
-///////////////////////////////////////////////////////////////////////////
+prefix_ void senf::ppi::connector::Connector::v_connected()
+{}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::PassiveConnector
 
 prefix_ senf::ppi::connector::PassiveConnector::~PassiveConnector()
@@ -214,7 +230,19 @@ prefix_ senf::ppi::connector::PassiveConnector::~PassiveConnector()
     unregisterConnector();
 }
 
-////////////////////////////////////////
+prefix_ void senf::ppi::connector::PassiveConnector::v_disconnected()
+{
+    Connector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::PassiveConnector::v_connected()
+{
+    Connector::v_connected();
+    peer_ = & dynamic_cast<ActiveConnector&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::ppi::connector::PassiveConnector::v_init()
@@ -258,7 +286,7 @@ prefix_ void senf::ppi::connector::PassiveConnector::notifyUnthrottle()
         SENF_PPI_THROTTLE_TRACE("OUT", "not forwarding unthrottle event");
 }
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::ActiveConnector
 
 prefix_ senf::ppi::connector::ActiveConnector::~ActiveConnector()
@@ -267,7 +295,19 @@ prefix_ senf::ppi::connector::ActiveConnector::~ActiveConnector()
     unregisterConnector();
 }
 
-////////////////////////////////////////
+prefix_ void senf::ppi::connector::ActiveConnector::v_disconnected()
+{
+    Connector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::ActiveConnector::v_connected()
+{
+    Connector::v_connected();
+    peer_ = & dynamic_cast<PassiveConnector&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::ppi::connector::ActiveConnector::v_init()
@@ -316,7 +356,7 @@ prefix_ void senf::ppi::connector::ActiveConnector::unregisterRoute(ForwardingRo
         notifyRoutes_.erase(i);
 }
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::InputConnector
 
 prefix_ senf::Packet senf::ppi::connector::InputConnector::operator()()
@@ -335,7 +375,19 @@ prefix_ senf::Packet senf::ppi::connector::InputConnector::operator()()
     }
 }
 
-////////////////////////////////////////
+prefix_ void senf::ppi::connector::InputConnector::v_disconnected()
+{
+    Connector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::InputConnector::v_connected()
+{
+    Connector::v_connected();
+    peer_ = & dynamic_cast<OutputConnector&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::ppi::connector::InputConnector::v_requestEvent()
@@ -347,10 +399,25 @@ prefix_ void senf::ppi::connector::InputConnector::v_enqueueEvent()
 prefix_ void senf::ppi::connector::InputConnector::v_dequeueEvent()
 {}
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::ppi::connector::OutputConnector
+
+prefix_ void senf::ppi::connector::OutputConnector::v_disconnected()
+{
+    Connector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::OutputConnector::v_connected()
+{
+    Connector::v_connected();
+    peer_ = & dynamic_cast<InputConnector&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::GenericActiveInput
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::ppi::connector::GenericActiveInput::v_requestEvent()
@@ -358,10 +425,24 @@ prefix_ void senf::ppi::connector::GenericActiveInput::v_requestEvent()
     request();
 }
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::ppi::connector::GenericPassiveInput
 
-////////////////////////////////////////
+prefix_ void senf::ppi::connector::GenericPassiveInput::v_disconnected()
+{
+    PassiveConnector::v_disconnected();
+    InputConnector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::GenericPassiveInput::v_connected()
+{
+    PassiveConnector::v_connected();
+    InputConnector::v_connected();
+    peer_ = & dynamic_cast<GenericActiveOutput&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::ppi::connector::GenericPassiveInput::v_enqueueEvent()
@@ -394,7 +475,59 @@ prefix_ void senf::ppi::connector::GenericPassiveInput::v_unthrottleEvent()
     }
 }
 
-///////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::ppi::connector::GenericPassiveOutput
+
+prefix_ void senf::ppi::connector::GenericPassiveOutput::v_disconnected()
+{
+    PassiveConnector::v_disconnected();
+    OutputConnector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::GenericPassiveOutput::v_connected()
+{
+    PassiveConnector::v_connected();
+    OutputConnector::v_connected();
+    peer_ = & dynamic_cast<GenericActiveInput&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::ppi::connector::GenericActiveInput
+
+prefix_ void senf::ppi::connector::GenericActiveInput::v_disconnected()
+{
+    ActiveConnector::v_disconnected();
+    InputConnector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::GenericActiveInput::v_connected()
+{
+    ActiveConnector::v_connected();
+    InputConnector::v_connected();
+    peer_ = & dynamic_cast<GenericPassiveOutput&>(Connector::peer());
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::ppi::connector::GenericActiveOutput
+
+prefix_ void senf::ppi::connector::GenericActiveOutput::v_disconnected()
+{
+    ActiveConnector::v_disconnected();
+    OutputConnector::v_disconnected();
+    peer_ = 0;
+}
+
+prefix_ void senf::ppi::connector::GenericActiveOutput::v_connected()
+{
+    ActiveConnector::v_connected();
+    OutputConnector::v_connected();
+    peer_ = & dynamic_cast<GenericPassiveInput&>(Connector::peer());
+}
+
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 #undef prefix_
 //#include "Connectors.mpp"