From 5a84efb95503daee6ab6d6ccabe0b0a7ab1e7697 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Tue, 7 Aug 2012 15:41:32 +0000 Subject: [PATCH] Moved generic base classes from 'hub' project to core --- .gitattributes | 6 + .../main/class_BaseFrameworkSystem.php | 14 ++ inc/classes/main/handler/.htaccess | 1 + inc/classes/main/handler/class_ | 53 ++++++ .../main/handler/class_BaseHandler.php | 62 ++++++ inc/classes/main/handler/raw_data/.htaccess | 1 + inc/classes/main/handler/raw_data/class_ | 73 +++++++ .../raw_data/class_BaseRawDataHandler.php | 180 ++++++++++++++++++ 8 files changed, 390 insertions(+) create mode 100644 inc/classes/main/handler/.htaccess create mode 100644 inc/classes/main/handler/class_ create mode 100644 inc/classes/main/handler/class_BaseHandler.php create mode 100644 inc/classes/main/handler/raw_data/.htaccess create mode 100644 inc/classes/main/handler/raw_data/class_ create mode 100644 inc/classes/main/handler/raw_data/class_BaseRawDataHandler.php diff --git a/.gitattributes b/.gitattributes index 6b590104..c43824e7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -409,6 +409,12 @@ inc/classes/main/filter/verifier/class_UserGuestVerifierFilter.php svneol=native inc/classes/main/filter/verifier/class_UserNameVerifierFilter.php svneol=native#text/plain inc/classes/main/filter/verifier/class_UserStatusVerifierFilter.php svneol=native#text/plain inc/classes/main/filter/verifier/class_UserUnconfirmedVerifierFilter.php svneol=native#text/plain +inc/classes/main/handler/.htaccess -text +inc/classes/main/handler/class_ -text +inc/classes/main/handler/class_BaseHandler.php -text +inc/classes/main/handler/raw_data/.htaccess -text +inc/classes/main/handler/raw_data/class_ -text +inc/classes/main/handler/raw_data/class_BaseRawDataHandler.php -text inc/classes/main/helper/.htaccess svneol=native#text/plain inc/classes/main/helper/captcha/.htaccess svneol=native#text/plain inc/classes/main/helper/captcha/class_ svneol=native#text/plain diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index da54f83a..f50930d8 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -2102,6 +2102,20 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Return result return $ret; } + + /** + * Checks whether start/end marker are set + * + * @param $data Data to be checked + * @return $isset Whether start/end marker are set + */ + public final function ifStartEndMarkersSet ($data) { + // Determine it + $isset = ((substr($data, 0, strlen(BaseRawDataHandler::STREAM_START_MARKER)) == BaseRawDataHandler::STREAM_START_MARKER) && (substr($data, -1 * strlen(BaseRawDataHandler::STREAM_END_MARKER), strlen(BaseRawDataHandler::STREAM_END_MARKER)) == BaseRawDataHandler::STREAM_END_MARKER)); + + // ... and return it + return $isset; + } } // [EOF] diff --git a/inc/classes/main/handler/.htaccess b/inc/classes/main/handler/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/handler/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/handler/class_ b/inc/classes/main/handler/class_ new file mode 100644 index 00000000..09fb9fa3 --- /dev/null +++ b/inc/classes/main/handler/class_ @@ -0,0 +1,53 @@ + + * @version 0.0.0 + * @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 + * + * 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 . + */ +class ???Handler extends BaseHandler implements Handleable { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + + // Set handler name + $this->setHandlerName('!!!'); + } + + /** + * Creates an instance of this class + * + * @return $handlerInstance An instance of a !!! class + */ + public final static function create???Handler () { + // Get new instance + $handlerInstance = new ???Handler(); + + // Return the prepared instance + return $handlerInstance; + } +} + +// [EOF] +?> diff --git a/inc/classes/main/handler/class_BaseHandler.php b/inc/classes/main/handler/class_BaseHandler.php new file mode 100644 index 00000000..aebb0562 --- /dev/null +++ b/inc/classes/main/handler/class_BaseHandler.php @@ -0,0 +1,62 @@ + + * @version 0.0.0 + * @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 + * + * 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 . + */ +class BaseHandler extends BaseHubSystem { + /** + * Handler name + */ + private $handlerName = 'invalid'; + + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className) { + // Call parent constructor + parent::__construct($className); + } + + /** + * Getter for handler name + * + * @return $handlerName Name of this handler + */ + public final function getHandlerName () { + return $this->handlerName; + } + + /** + * Setter for handler name + * + * @param $handlerName Name of this handler + * @return void + */ + protected final function setHandlerName ($handlerName) { + $this->handlerName = $handlerName; + } +} + +// [EOF] +?> diff --git a/inc/classes/main/handler/raw_data/.htaccess b/inc/classes/main/handler/raw_data/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/handler/raw_data/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/handler/raw_data/class_ b/inc/classes/main/handler/raw_data/class_ new file mode 100644 index 00000000..3c9e151a --- /dev/null +++ b/inc/classes/main/handler/raw_data/class_ @@ -0,0 +1,73 @@ + + * @version 0.0.0 + * @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 + * + * 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 . + */ +class ???NetworkPackageHandler extends BaseNetworkPackageHandler implements Networkable { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + + // Set handler name + $this->setHandlerName('!!!'); + } + + /** + * Creates an instance of this class + * + * @return $handlerInstance An instance of a Networkable class + */ + public final static function create???NetworkPackageHandler () { + // Get new instance + $handlerInstance = new ???NetworkPackageHandler(); + + // Return the prepared instance + return $handlerInstance; + } + + /** + * Processes a package from given resource. This is mostly useful for TCP + * package handling and is implemented in the TcpListener class + * + * @param $resource A valid resource identifier + * @return void + * @throws InvalidResourceException If the given resource is invalid + * @todo 0% + */ + public function processResourcePackage ($resource) { + // Check the resource + if (!is_resource($resource)) { + // Throw an exception + throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); + } // END - if + + // Implement processing here + $this->partialStub('Please implement this method.'); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/handler/raw_data/class_BaseRawDataHandler.php b/inc/classes/main/handler/raw_data/class_BaseRawDataHandler.php new file mode 100644 index 00000000..96147ecb --- /dev/null +++ b/inc/classes/main/handler/raw_data/class_BaseRawDataHandler.php @@ -0,0 +1,180 @@ + + * @version 0.0.0 + * @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 + * + * 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 . + */ +class BaseRawDataHandler extends BaseHandler { + // Error codes: + // - Socket raw data stream errors + const SOCKET_ERROR_UNKNOWN = 'unknown_error'; // Unknown error (should not happen) + const SOCKET_ERROR_TRANSPORT_ENDPOINT = 'transport_endpoint'; // Transport endpoint has closed + const SOCKET_ERROR_INVALID_BASE64_MODULO = 'base64_modulo'; // Length is not modulo 4 + const SOCKET_ERROR_INVALID_BASE64_MESSAGE = 'base64_message'; // Raw data is not Base64-encoded + const SOCKET_ERROR_UNHANDLED = 'unhandled_package'; // Unhandled raw data (not bad) + const SOCKET_ERROR_CONNECTION_REFUSED = 'connection_refused'; // The name says it: connection refused + const SOCKET_ERROR_CONNECTION_TIMED_OUT = 'connection_timed_out'; // The name says it: connection attempt has timed-out + const SOCKET_ERROR_OPERATION_IN_PROGRESS = 'operation_in_progress'; // 'Operation now in progress' + const SOCKET_ERROR_OPERATION_ALREADY_PROGRESS = 'operation_already_progress'; // 'Operation already in progress' + const SOCKET_ERROR_RESOURCE_UNAVAILABLE = 'resource_unavailable'; // 'Resource temporary unavailable' + const SOCKET_ERROR_NO_ROUTE_TO_HOST = 'no_route_to_host'; // The name says it: no route to host + const SOCKET_CONNECTED = 'connected'; // Nothing errorous happens, socket is connected + + // - Package errors + const PACKAGE_ERROR_INVALID_DATA = 'invalid_data'; // Invalid data in package found + const PACKAGE_ERROR_INCOMPLETE_DATA = 'incomplete_data'; // Incomplete data sent (e.g. field is missing) + const PACKAGE_ERROR_INVALID_CONTENT = 'invalid_content'; // Content is invalid (e.g. not well-formed) + const PACKAGE_ERROR_RECIPIENT_MISMATCH = 'recipient_error'; // Recipient is not us + const PACKAGE_LEVEL_CHECK_OKAY = 'checked_package'; // Package is fine + + // Package data + const PACKAGE_RAW_DATA = 'raw_data'; + const PACKAGE_ERROR_CODE = 'error_code'; + + // Start/end marker + const STREAM_START_MARKER = '[[S]]'; + const STREAM_END_MARKER = '[[E]]'; + + /** + * Stacker for raw data + */ + const STACKER_NAME_RAW_DATA = 'raw_data'; + + /** + * Error code from socket + */ + private $errorCode = -1; + + /** + * Protected constructor + * + * @param $className Name of the class + * @return void + */ + protected function __construct ($className) { + // Call parent constructor + parent::__construct($className); + + // Set error code to 'unknown' + $this->setErrorCode(self::SOCKET_ERROR_UNKNOWN); + + // Init stacker instance for processed raw data + $stackerInstance = ObjectFactory::createObjectByConfiguredName('node_raw_data_stacker_class'); + + // Remember this in this package handler + $this->setStackerInstance($stackerInstance); + + // Init stacker + $this->initStacker(); + } + + /** + * Initializes the stacker for raw data + * + * @return void + */ + protected function initStacker () { + $this->getStackerInstance()->initStacker(self::STACKER_NAME_RAW_DATA); + } + + /** + * Adds given raw data to the raw data stacker + * + * @param $rawData raw data from the socket resource + * @return void + */ + protected function addRawDataToStacker ($rawData) { + /* + * Add the deocoded data and error code to the stacker so other classes + * (e.g. NetworkPackage) can "pop" it from the stacker. + */ + $this->getStackerInstance()->pushNamed(self::STACKER_NAME_RAW_DATA, array( + self::PACKAGE_RAW_DATA => $rawData, + self::PACKAGE_ERROR_CODE => $this->getErrorCode() + )); + } + + /** + * Checks whether raw data is pending for further processing. + * + * @return $isPending Whether raw data is pending + */ + public function isRawDataPending () { + // Does the stacker have some entries (not empty)? + $isPending = (!$this->getStackerInstance()->isStackEmpty(self::STACKER_NAME_RAW_DATA)); + + // Return it + return $isPending; + } + + /** + * "Getter" for next raw data from the stacker + * + * @return $rawData Raw data from the stacker + */ + public function getNextRawData () { + // "Pop" the raw data from the stacker + $rawData = $this->getStackerInstance()->popNamed(self::STACKER_NAME_RAW_DATA); + + // And return it + return $rawData; + } + + /** + * Checks whether the 'recipient' field matches our own address:port + * combination. + * + * @param $packageData Raw package data + * @return $matches Whether it matches + * @todo This method will be moved to a better place + */ + protected function ifRecipientMatchesOwnAddress (array $packageData) { + // Construct own address first + $ownAddress = Registry::getRegistry()->getInstance('node')->getAddressPort($this); + + // Does it match? + $matches = ($ownAddress === $packageData[NetworkPackage::PACKAGE_DATA_RECIPIENT]); + + // Return result + return $matches; + } + + /** + * Setter for error code + * + * @param $errorCode The error code we shall set + * @return void + */ + public final function setErrorCode ($errorCode) { + $this->errorCode = $errorCode; + } + + /** + * Getter for error code + * + * @return $errorCode The error code + */ + public final function getErrorCode () { + return $this->errorCode; + } +} + +// [EOF] +?> -- 2.39.5