* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2016 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.shipsimu.org * * 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 3 of the License, or * (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ abstract class BaseListenerDecorator extends BaseDecorator implements Visitable { /** * Listener type */ private $listenerType = 'invalid'; /** * Protected constructor * * @param $className Name of the class * @return void */ protected function __construct ($className) { // Call parent constructor parent::__construct($className); } /** * Getter for listen address * * @return $listenAddress The address this listener should listen on */ public final function getListenAddress () { return $this->getListenerInstance()->getListenAddress(); } /** * Getter for listen port * * @return $listenPort The port this listener should listen on */ public final function getListenPort () { return $this->getListenerInstance()->getListenPort(); } /** * Getter for connection type * * @return $connectionType Connection type for this listener */ public final function getConnectionType () { return $this->getListenerInstance()->getConnectionType(); } /** * Accepts the visitor to process the visit "request" * * @param $visitorInstance An instance of a Visitor class * @return void */ public function accept (Visitor $visitorInstance) { // Visit this decorator $visitorInstance->visitDecorator($this); // Visit the covered class $visitorInstance->visitListener($this->getListenerInstance()); } /** * Getter for listener type. * * @return $listenerType The listener's type (hub/peer) */ public final function getListenerType () { return $this->listenerType; } /** * Setter for listener type. * * @param $listenerType The listener's type (hub/peer) * @return void */ protected final function setListenerType ($listenerType) { $this->listenerType = $listenerType; } /** * Getter for peer pool instance * * @return $poolInstance A peer pool instance */ public final function getPoolInstance () { return $this->getListenerInstance()->getPoolInstance(); } /** * Monitors incoming raw data from the handler and transfers it to the * given receiver instance. * * @return void */ public function monitorIncomingRawData () { // Get the handler instance $handlerInstance = $this->getListenerInstance()->getHandlerInstance(); /* * Does the deocorated listener (or even a decorator again) have a * handler assigned? Remember that a handler will hold all incoming raw * data and not a listener. */ if (!$handlerInstance instanceof Networkable) { // Skip this silently for now. Later on, this will become mandatory! //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('No handler assigned to this listener decorator. this=' . $this->__toString() . ', listenerInstance=' . $this->getListenerInstance()->__toString()); return; } // END - if // Does the handler have some decoded data pending? if (!$handlerInstance->isRawDataPending()) { // No data is pending so skip further code silently return; } // END - if // Get receiver (network package) instance $receiverInstance = NetworkPackageFactory::createNetworkPackageInstance(); /* * There is some decoded data waiting. The receiver instance is an * abstract network package (which can be received and sent out) so * handle the decoded data over. At this moment it is not needed to * know if the decoded data origins from a TCP or UDP connection so it * can just be passed over to the network package receiver. */ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('BASE-LISTENER-DECORATOR[' . __METHOD__ . ':' . __LINE__ . '] Going to handle over some raw data to receiver instance (' . $receiverInstance->__toString() . ') ...'); $receiverInstance->addRawDataToIncomingStack($handlerInstance); } }