From e6c597aabca33a0ddff1f3e1c0bf45f10eb51a64 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Wed, 8 Jul 2009 16:38:32 +0000
Subject: [PATCH] Socket exception added, initListener() basicly finished

---
 .gitattributes                                |  2 +
 application/hub/exceptions/socket/.htaccess   |  1 +
 .../socket/class_InvalidSocketException.php   | 48 +++++++++++++++++++
 .../hub/main/listener/class_BaseListener.php  | 46 ++++++++++++++++++
 .../main/listener/tcp/class_TcpListener.php   | 13 ++++-
 .../main/listener/udp/class_UdpListener.php   | 14 +++++-
 6 files changed, 122 insertions(+), 2 deletions(-)
 create mode 100644 application/hub/exceptions/socket/.htaccess
 create mode 100644 application/hub/exceptions/socket/class_InvalidSocketException.php

diff --git a/.gitattributes b/.gitattributes
index a9acfd140..7b6e33dc0 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8,6 +8,8 @@ application/hub/data.php -text
 application/hub/debug.php -text
 application/hub/exceptions.php -text
 application/hub/exceptions/.htaccess -text
+application/hub/exceptions/socket/.htaccess -text
+application/hub/exceptions/socket/class_InvalidSocketException.php -text
 application/hub/init.php -text
 application/hub/interfaces/.htaccess -text
 application/hub/interfaces/connectors/.htaccess -text
diff --git a/application/hub/exceptions/socket/.htaccess b/application/hub/exceptions/socket/.htaccess
new file mode 100644
index 000000000..3a4288278
--- /dev/null
+++ b/application/hub/exceptions/socket/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/application/hub/exceptions/socket/class_InvalidSocketException.php b/application/hub/exceptions/socket/class_InvalidSocketException.php
new file mode 100644
index 000000000..79b3609d2
--- /dev/null
+++ b/application/hub/exceptions/socket/class_InvalidSocketException.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * This exception is thrown when the socket resource is invalid or an error
+ * occurs while socket initialization phase.
+ *
+ * @author		Roland Haeder <webmaster@ship-simu.org>
+ * @version		0.0.0
+ * @copyright	Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
+ * @license		GNU GPL 3.0 or any newer version
+ * @link		http://www.ship-simu.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 <http://www.gnu.org/licenses/>.
+ */
+class InvalidSocketException extends FrameworkException {
+	/**
+	 * A Constructor for this exception
+	 *
+	 * @param		$messageArray	Error message array
+	 * @param		$code			Error code
+	 * @return	void
+	 */
+	public function __construct(array $messageData, $code) {
+		// Construct the message
+		$message = sprintf("[%s:] Invalid socket (type %s != resource). errno=%s, errstr=%s",
+			$messageData[0]->__toString(),
+			$messageData[1],
+			$messageData[2],
+			$messageData[3]
+		);
+
+		// Call parent exception constructor
+		parent::__construct($message, $code);
+	}
+}
+
+// [EOF]
+?>
diff --git a/application/hub/main/listener/class_BaseListener.php b/application/hub/main/listener/class_BaseListener.php
index 81ae85d92..51088aa05 100644
--- a/application/hub/main/listener/class_BaseListener.php
+++ b/application/hub/main/listener/class_BaseListener.php
@@ -22,6 +22,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 class BaseListener extends BaseHubSystem {
+	// Exception code constants
+	const EXCEPTION_INVALID_SOCKET = 0xa00;
+
 	/**
 	 * Used protocol (Default: invalid, which is indeed invalid...)
 	 */
@@ -42,6 +45,11 @@ class BaseListener extends BaseHubSystem {
 	 */
 	private $blockingMode = false;
 
+	/**
+	 * Socket resource
+	 */
+	private $socketResource = null;
+
 	/**
 	 * Protected constructor
 	 *
@@ -129,6 +137,44 @@ class BaseListener extends BaseHubSystem {
 	public final function getProtocol () {
 		return $this->protocol;
 	}
+
+	/**
+	 * Setter for blocking-mode
+	 *
+	 * @param	$blockingMode	Wether blocking-mode is disabled (default) or enabled
+	 * @return	void
+	 */
+	protected final function setBlockingMode ($blockingMode) {
+		$this->blockingMode = (boolean) $blockingMode;
+	}
+
+	/**
+	 * Checks wether blocking-mode is enabled or disabled
+	 *
+	 * @return	$blockingMode	Wether blocking mode is disabled or enabled
+	 */
+	public final function isBlockingModeEnabled () {
+		return $this->blockingMode;
+	}
+
+	/**
+	 * Setter for socket resource
+	 *
+	 * @param	$socketResource		The socket resource we shall set
+	 * @return	void
+	 */
+	protected final function setSocketResource ($socketResource) {
+		$this->setSocketResource = $setSocketResource;
+	}
+
+	/**
+	 * Getter for socket resource
+	 *
+	 * @return	$socketResource		The socket resource we shall set
+	 */
+	protected final function getSocketResource () {
+		return $this->setSocketResource;
+	}
 }
 
 // [EOF]
diff --git a/application/hub/main/listener/tcp/class_TcpListener.php b/application/hub/main/listener/tcp/class_TcpListener.php
index a8a9d3d95..61b3dca83 100644
--- a/application/hub/main/listener/tcp/class_TcpListener.php
+++ b/application/hub/main/listener/tcp/class_TcpListener.php
@@ -56,9 +56,20 @@ class TcpListener extends BaseListener implements Listenable {
 	 * Initializes the listener by setting up the required socket server
 	 *
 	 * @return	void
+	 * @throws	InvalidSocketException	Thrown if the socket could not be initialized
 	 */
 	public function initListener() {
-		$this->partialStub('Need to implement this method.');
+		// Try to open a TCP socket
+		$socket = stream_socket_server('tcp://' . $this->getListenAddress() . ':' . $this->getListenPort(), $errno, $errstr);
+
+		// Is the socket a valid resource or do we have any error?
+		if ((!is_resource($socket)) || ($errno > 0)) {
+			// Then throw an InvalidSocketException
+			throw new InvalidSocketException(array($this, gettype($socket), $errno, $errstr), BaseListener::EXCEPTION_INVALID_SOCKET);
+		} // END - if
+
+		// Remember the socket in our class
+		$this->setSocketResource($socket);
 	}
 }
 
diff --git a/application/hub/main/listener/udp/class_UdpListener.php b/application/hub/main/listener/udp/class_UdpListener.php
index d37980e33..b3583e0c7 100644
--- a/application/hub/main/listener/udp/class_UdpListener.php
+++ b/application/hub/main/listener/udp/class_UdpListener.php
@@ -56,9 +56,21 @@ class UdpListener extends BaseListener implements Listenable {
 	 * Initializes the listener by setting up the required socket server
 	 *
 	 * @return	void
+	 * @throws	InvalidSocketException	Thrown if the socket is invalid or an
+	 *									error was detected.
 	 */
 	public function initListener() {
-		$this->partialStub('Need to implement this method.');
+		// Try to open a UDP socket
+		$socket = stream_socket_server('udp://' . $this->getListenAddress() . ':' . $this->getListenPort(), $errno, $errstr, STREAM_SERVER_BIND);
+
+		// Is the socket a valid resource or do we have any error?
+		if ((!is_resource($socket)) || ($errno > 0)) {
+			// Then throw an InvalidSocketException
+			throw new InvalidSocketException(array($this, gettype($socket), $errno, $errstr), BaseListener::EXCEPTION_INVALID_SOCKET);
+		} // END - if
+
+		// Remember the socket in our class
+		$this->setSocketResource($socket);
 	}
 }
 
-- 
2.39.5