X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=application%2Fhub%2Fmain%2Flistener%2Fclass_BaseListener.php;h=b81ffd2027d98f28c52c1a78a443f4fb2b481cad;hb=c2dac8c1ddfb2ae0ee6ceea404a3997238539e05;hp=8b28acd0c16b4fc2c252463792c0b093c7c57de5;hpb=7f7e5ad573215142fe99eff69051e141737291ca;p=hub.git diff --git a/application/hub/main/listener/class_BaseListener.php b/application/hub/main/listener/class_BaseListener.php index 8b28acd0c..b81ffd202 100644 --- a/application/hub/main/listener/class_BaseListener.php +++ b/application/hub/main/listener/class_BaseListener.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Hub Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Hub Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -23,12 +23,13 @@ */ class BaseListener extends BaseHubSystem implements Visitable { // Exception code constants - const EXCEPTION_INVALID_SOCKET = 0xa00; + const EXCEPTION_INVALID_SOCKET = 0xa00; + const EXCEPTION_SOCKET_ALREADY_REGISTERED = 0xa01; /** * Used protocol (Default: invalid, which is indeed invalid...) */ - private $protcol = 'invalid'; + private $protocol = 'invalid'; /** * Address (IP mostly) we shall listen on @@ -46,20 +47,10 @@ class BaseListener extends BaseHubSystem implements Visitable { private $blockingMode = false; /** - * Socket resource - */ - private $socketResource = false; - - /** - * A client pool instance + * A peer pool instance */ private $poolInstance = null; - /** - * A network package handler instance - */ - private $packageInstance = null; - /** * Protected constructor * @@ -71,6 +62,30 @@ class BaseListener extends BaseHubSystem implements Visitable { parent::__construct($className); } + /** + * Checks wether the given socket resource is a server socket + * + * @param $socketResource A valid socket resource + * @return $isServerSocket Wether the socket resource is a server socket + */ + protected function isServerSocketResource ($socketResource) { + // Check it + $isServerSocket = ((is_resource($socketResource)) && (!@socket_getpeername($socketResource, $peerName))); + + // We need to clear the error here if it is a resource + if ($isServerSocket === true) { + // Clear the error + //* DEBUG: */ $this->debugOutput('socketResource[]=' . gettype($socketResource)); + socket_clear_error($socketResource); + } // END - if + + // Check peer name, it must be empty + $isServerSocket = (($isServerSocket) && (empty($peerName))); + + // Return result + return $isServerSocket; + } + /** * Setter for listen address * @@ -109,6 +124,15 @@ class BaseListener extends BaseHubSystem implements Visitable { return $this->listenPort; } + /** + * Getter for port number to satify ProtocolHandler + * + * @return $port The port number + */ + public final function getPort () { + return $this->getListenPort(); + } + /** * "Setter" to set listen address from configuration entry * @@ -168,71 +192,93 @@ class BaseListener extends BaseHubSystem implements Visitable { } /** - * Setter for socket resource + * Setter for peer pool instance * - * @param $socketResource The socket resource we shall set + * @param $poolInstance The peer pool instance we shall set * @return void */ - protected final function setSocketResource ($socketResource) { - $this->socketResource = $socketResource; + protected final function setPoolInstance (PoolablePeer $poolInstance) { + $this->poolInstance = $poolInstance; } /** - * Getter for socket resource + * Getter for peer pool instance * - * @return $socketResource The socket resource we shall set + * @return $poolInstance The peer pool instance we shall set */ - protected final function getSocketResource () { - return $this->socketResource; + public final function getPoolInstance () { + return $this->poolInstance; } /** - * Setter for client pool instance + * Registeres the given socket resource for "this" listener instance. This + * will be done in a seperate class to allow package writers to use it + * again. * - * @param $poolInstance The client pool instance we shall set + * @param $socketResource A valid server socket resource * @return void + * @throws InvalidServerSocketException If the given resource is no server socket + * @throws SocketAlreadyRegisteredException If the given resource is already registered */ - protected final function setPoolInstance (PoolableClient $poolInstance) { - $this->poolInstance = $poolInstance; - } + protected function registerServerSocketResource ($socketResource) { + // First check if it is valid + if (!$this->isServerSocketResource($socketResource)) { + // No server socket + throw new InvalidServerSocketException(array($this, $socketResource), self::EXCEPTION_INVALID_SOCKET); + } elseif ($this->isServerSocketRegistered($socketResource)) { + // Already registered + throw new SocketAlreadyRegisteredException($this, self::EXCEPTION_SOCKET_ALREADY_REGISTERED); + } - /** - * Getter for client pool instance - * - * @return $poolInstance The client pool instance we shall set - */ - protected final function getPoolInstance () { - return $this->poolInstance; + // Get a socket registry instance (singleton) + $registryInstance = SocketRegistryFactory::createSocketRegistryInstance(); + + // Register the socket + $registryInstance->registerSocket($this, $socketResource); } /** - * Setter for network package handler instance + * Checks wether given socket resource is registered in socket registry * - * @param $packageInstance The network package handler instance we shall set - * @return void + * @param $socketResource A valid server socket resource + * @return $isRegistered Wether given server socket is registered */ - protected final function setPackageInstance (Networkable $packageInstance) { - $this->packageInstance = $packageInstance; + protected function isServerSocketRegistered ($socketResource) { + // Get a socket registry instance (singleton) + $registryInstance = SocketRegistryFactory::createSocketRegistryInstance(); + + // Check it + $isRegistered = $registryInstance->isSocketRegistered($this, $socketResource); + + // Return result + return $isRegistered; } /** - * Getter for network package handler instance + * Getter for "this" socket resource * - * @return $packageInstance The network package handler instance we shall set + * @return $socketResource A valid socket resource */ - protected final function getPackageInstance () { - return $this->packageInstance; + public final function getSocketResource () { + // Get a socket registry instance (singleton) + $registryInstance = SocketRegistryFactory::createSocketRegistryInstance(); + + // Get the socket resource + $socketResource = $registryInstance->getRegisteredSocketResource($this); + + // Return it + return $socketResource; } /** - * Accepts the visitor to rpocess the visit "request" + * Accepts the visitor to process the visit "request" * * @param $visitorInstance An instance of a Visitor class * @return void */ public function accept (Visitor $visitorInstance) { // Debug message - //* DEBUG: */ $this->debugOutput('LISTENER: ' . $visitorInstance->__toString() . ' has visited - START'); + //* DEBUG: */ $this->debugOutput(strtoupper($this->getProtocol()) . '-LISTENER: ' . $visitorInstance->__toString() . ' has visited ' . $this->__toString() . ' - START'); // Visit this listener $visitorInstance->visitListener($this); @@ -243,7 +289,20 @@ class BaseListener extends BaseHubSystem implements Visitable { } // END - if // Debug message - //* DEBUG: */ $this->debugOutput('LISTENER: ' . $visitorInstance->__toString() . ' has visited - FINISHED'); + //* DEBUG: */ $this->debugOutput(strtoupper($this->getProtocol()) . '-LISTENER: ' . $visitorInstance->__toString() . ' has visited ' . $this->__toString() . ' - FINISHED'); + } + + /** + * Monitors incoming raw data from the handler and transfers it to the + * given receiver instance. This method should not be called, please call + * the decorator's version instead to seperator node/client traffic. + * + * @param $receiverInstance An instance of a Receivable class + * @return void + * @throws UnsupportedOperatorException If this method is called by a mistake + */ + public function monitorIncomingRawData (Receivable $receiverInstance) { + throw new UnsupportedOperationException(array($this, __FUNCTION__, $receiverInstance), self::EXCEPTION_UNSPPORTED_OPERATION); } }