* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 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 TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Networkable { /** * Protected constructor * * @return void */ protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); } /** * Creates an instance of this class * * @return $handlerInstance An instance of a Networkable class */ public final static function createTcpNetworkPackageHandler () { // Get new instance $handlerInstance = new TcpNetworkPackageHandler(); // Initialize new resolver instance $resolverInstance = ObjectFactory::createObjectByConfiguredName('network_state_resolver_class'); // Set it in this class $handlerInstance->setResolverInstance($resolverInstance); // 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 // Reset error code to unhandled $this->setErrorCode(self::SOCKET_ERROR_UNHANDLED); // Read the raw data from socket $rawData = socket_read($resource, 1500, PHP_BINARY_READ); // Is it valid? if (($rawData === false) || (socket_last_error($resource) > 0)) { // Network error or connection lost $this->setErrorCode(socket_last_error($resource)); } elseif (empty($rawData)) { // The peer did send nothing to us $this->setErrorCode(self::SOCKET_ERROR_EMPTY_DATA); } elseif (!$this->isPackageDataValid($rawData)) { // Invalid package data $this->setErrorCode(self::PACKAGE_ERROR_INVALID_DATA); } else { // Low-level checks are all green $this->setErrorCode(self::PACKAGE_LEVEL_CHECK_OKAY); } // Get a state from the resolver for this package $stateInstance = $this->getResolverInstance()->resolveStateByPackage($this, $rawData); } } // [EOF] ?>