*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Hub Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
*/
class SocketRegistry extends BaseRegistry implements Register, RegisterableSocket {
// Exception constants
- const SOCKET_NOT_REGISTERED = 0xd00;
+ const SOCKET_NOT_REGISTERED = 0xd200;
/**
* Instance of this class
* @return $key A string representation of the socket for the registry
*/
private function getSubRegistryKey (ProtocolHandler $protocolInstance) {
+ // Default address is invalid
+ $address = '*invalid*';
+
+ // Which instance is it?
+ // @TODO Tested again base class, rewrite it to a generic interface!
+ if ($protocolInstance instanceof BaseConnectionHelper) {
+ // Get address
+ $address = $protocolInstance->getAddress();
+ } elseif ($protocolInstance instanceof BaseListener) {
+ // Get listen address
+ $address = $protocolInstance->getListenAddress();
+ } else {
+ // Not supported!
+ $this->debugBackTrace('Unsupported protocolInstance=' . $protocolInstance->__toString() . ' detected. Please fix this!');
+ }
+
// Get protocol and port number and add both together
- $key = sprintf("%s:%s:%s",
+ $key = sprintf("%s:%s:%s:%s",
$protocolInstance->__toString(),
$protocolInstance->getProtocol(),
+ $address,
$protocolInstance->getPort()
);
* @return $isRegistered Whether the protocol is registered
*/
private function isProtocolRegistered (ProtocolHandler $protocolInstance) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ' - ENTERED!');
+
// Get the key
$key = $this->getRegistryKeyFromProtocol($protocolInstance);
// Determine it
$isRegistered = $this->instanceExists($key);
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ',isRegistered=' . intval($isRegistered) . ' - EXIT!');
+
// Return result
return $isRegistered;
}
/**
* Checks whether given socket resource is registered. If $socketResource is
- * false only the instance will be checked.
+ * FALSE only the instance will be checked.
*
* @param $protocolInstance An instance of a ProtocolHandler class
* @param $socketResource A valid socket resource
* @return $isRegistered Whether the given socket resource is registered
*/
public function isSocketRegistered (ProtocolHandler $protocolInstance, $socketResource) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ' - ENTERED!');
+
// Default is not registered
- $isRegistered = false;
+ $isRegistered = FALSE;
// First, check for the instance, there can be only once
if ($this->isProtocolRegistered($protocolInstance)) {
// That one is found so "get" a registry key from it
$key = $this->getRegistryKeyFromProtocol($protocolInstance);
+ // Debug message
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ',key=' . $key . ' - Trying to get instance ...');
+
// Get the registry
$registryInstance = $this->getInstance($key);
// "Get" a key for the socket
$socketKey = $this->getSubRegistryKey($protocolInstance);
- // And simply ask it
- $isRegistered = $registryInstance->instanceExists($socketKey);
+ // Debug message
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ',key=' . $key . ',socketKey=' . $socketKey . ' - Checking existence ...');
+
+ // Is it there?
+ if ($registryInstance->instanceExists($socketKey)) {
+ // Debug message
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: Found instance for socketKey=' . $socketKey . ':' . $registryInstance->getInstance($socketKey));
+
+ // Get the instance
+ $registeredInstance = $registryInstance->getInstance($socketKey);
+
+ // Is it SocketContainer and same socket?
+ $isRegistered = (($registeredInstance instanceof SocketContainer) && ($registeredInstance->ifSocketResourceMatches($socketResource)));
+
+ // Debug message
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: Final result: isRegistered(' . $socketResource . ')=' . intval($isRegistered));
+ } // END - if
} // END - if
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ',isRegistered=' . intval($isRegistered) . ' - EXIT!');
+
// Return the result
return $isRegistered;
}
* @return void
*/
public function registerSocket (ProtocolHandler $protocolInstance, $socketResource, array $packageData = array()) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ' - ENTERED!');
+
// Is the socket already registered?
if ($this->isSocketRegistered($protocolInstance, $socketResource)) {
// Throw the exception
$socketInstance = ObjectFactory::CreateObjectByConfiguredName('socket_container_class', array($socketResource, $protocolInstance, $packageData));
// We have a sub-registry, the socket key and the socket, now we need to put all together
- /* DEBUG: */ $this->debugOutput('SOCKET-REGISTRY: socketKey=' . $socketKey . ',socketResource=' . $socketResource . ' - adding socket container instance ...');
+ /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: socketKey=' . $socketKey . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ' - adding socket container instance ...');
$registryInstance->addInstance($socketKey, $socketInstance);
}
* @throws NoSocketRegisteredException If the requested socket is not registered
*/
public function getRegisteredSocketResource (ProtocolHandler $protocolInstance) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ' - ENTERED!');
+
// The socket must be registered before we can return it
- if (!$this->isSocketRegistered($protocolInstance, false)) {
+ if (!$this->isProtocolRegistered($protocolInstance)) {
// Throw the exception
throw new NoSocketRegisteredException ($protocolInstance, self::SOCKET_NOT_REGISTERED);
} // END - if
// And the final socket resource
$socketResource = $registryInstance->getInstance($socketKey)->getSocketResource();
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(__METHOD__ . ':protocol=' . $protocolInstance->getProtocol() . ',socketResource[' . gettype($socketResource) . ']=' . $socketResource . ' - EXIT!');
+
// Return the resource
return $socketResource;
}
$protocolInstance = NULL;
// Get all keys and check them
- foreach ($this->getInstanceRegistry() as $key=>$registryInstance) {
+ foreach ($this->getInstanceRegistry() as $key => $registryInstance) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: key=' . $key . ',registryInstance=' . $registryInstance->__toString());
+
// This is always a SubRegistry instance
- foreach ($registryInstance->getInstanceRegistry() as $subKey=>$containerInstance) {
- // This is a SocketContainer instance, so does the recipient match?
- if ($containerInstance->ifAddressMatches($packageData[NetworkPackage::PACKAGE_DATA_RECIPIENT])) {
+ foreach ($registryInstance->getInstanceRegistry() as $subKey => $containerInstance) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SOCKET-REGISTRY[' . __LINE__ . ']: key=' . $key . ',subKey=' . $subKey . ',containerInstance=' . $containerInstance->__toString());
+
+ // Is this a SocketContainer instance and is the address the same?
+ if (($containerInstance instanceof SocketContainer) && ($containerInstance->ifAddressMatches($packageData[NetworkPackage::PACKAGE_DATA_RECIPIENT]))) {
// Found one, so get the protocol instance and abort any further search
$protocolInstance = $containerInstance->getProtocolInstance();
break;