/**
* A general Handler for raw data from sockets
*
- * @author Roland Haeder <webmaster@ship-simu.org>
+ * @author Roland Haeder <webmaster@shipsimu.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 - 2015 Hub Developer Team
* @license GNU GPL 3.0 or any newer version
- * @link http://www.ship-simu.org
+ * @link http://www.shipsimu.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
// - 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_EMPTY_DATA = 'empty_data'; // Other peer has sent nothing
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_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_ERROR_CONNECTION_RESET_BY_PEER = 'connection_reset_by_peer'; // Connection reset by peer
+ const SOCKET_ERROR_BROKEN_PIPE = 'broken_pipe'; // Broken pipe
const SOCKET_CONNECTED = 'connected'; // Nothing errorous happens, socket is connected
// - Package errors
const PACKAGE_LEVEL_CHECK_OKAY = 'checked_package'; // Package is fine
// Package data
- const PACKAGE_DECODED_DATA = 'decoded_data';
- const PACKAGE_ERROR_CODE = 'error_code';
+ 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 decoded data
+ * Stacker for raw data
*/
- const STACKER_NAME_DECODED_DATA = 'decoded_data';
+ const STACKER_NAME_RAW_DATA = 'raw_data';
/**
* Error code from socket
// Set error code to 'unknown'
$this->setErrorCode(self::SOCKET_ERROR_UNKNOWN);
- // Get an input stream instance
- $streamInstance = ObjectFactory::createObjectByConfiguredName('node_raw_data_input_stream_class', array($this));
-
- // Set it in this network-package handler
- $this->setInputStreamInstance($streamInstance);
-
// Init stacker instance for processed raw data
- $stackerInstance = ObjectFactory::createObjectByConfiguredName('node_raw_data_stacker_class');
+ $stackInstance = ObjectFactory::createObjectByConfiguredName('node_raw_data_stacker_class');
// Remember this in this package handler
- $this->setStackerInstance($stackerInstance);
+ $this->setStackInstance($stackInstance);
// Init stacker
- $this->initStacker();
+ $this->initStack();
}
/**
*
* @return void
*/
- protected function initStacker () {
- $this->getStackerInstance()->initStacker(self::STACKER_NAME_DECODED_DATA);
+ protected function initStack () {
+ $this->getStackInstance()->initStack(self::STACKER_NAME_RAW_DATA);
}
/**
- * Adds given decoded data to the raw data stacker
+ * Adds given raw data to the raw data stacker
*
- * @param $decodedData Decoded data from the socket resource
+ * @param $rawData raw data from the socket resource
* @return void
*/
- protected function addDecodedDataToStacker ($decodedData) {
+ 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_DECODED_DATA, array(
- self::PACKAGE_DECODED_DATA => $decodedData,
- self::PACKAGE_ERROR_CODE => $this->getErrorCode()
+ $this->getStackInstance()->pushNamed(self::STACKER_NAME_RAW_DATA, array(
+ self::PACKAGE_RAW_DATA => $rawData,
+ self::PACKAGE_ERROR_CODE => $this->getErrorCode()
));
}
/**
- * Checks wether decoded data is pending for further processing.
+ * Checks whether raw data is pending for further processing.
*
- * @return $isPending Wether decoded data is pending
+ * @return $isPending Whether raw data is pending
*/
- public function isDecodedDataPending () {
+ public function isRawDataPending () {
// Does the stacker have some entries (not empty)?
- $isPending = (!$this->getStackerInstance()->isStackEmpty(self::STACKER_NAME_DECODED_DATA));
+ $isPending = (!$this->getStackInstance()->isStackEmpty(self::STACKER_NAME_RAW_DATA));
// Return it
return $isPending;
}
/**
- * "Getter" for next decoded data from the stacker
+ * "Getter" for next raw data from the stacker
*
- * @return $decodedData Decoded data from the stacker
+ * @return $rawData Raw data from the stacker
*/
- public function getNextDecodedData () {
- // "Pop" the decoded data from the stacker
- $decodedData = $this->getStackerInstance()->popNamed(self::STACKER_NAME_DECODED_DATA);
+ public function getNextRawData () {
+ // "Pop" the raw data from the stacker
+ $rawData = $this->getStackInstance()->popNamed(self::STACKER_NAME_RAW_DATA);
// And return it
- return $decodedData;
+ return $rawData;
}
/**
- * Checks wether the 'recipient' field matches our own address:port
- * combination.
+ * Checks whether the 'recipient' field matches our own an universal node
+ * locator.
*
* @param $packageData Raw package data
- * @return $matches Wether it matches
+ * @return $matches Whether it matches
* @todo This method will be moved to a better place
*/
- protected function ifRecipientMatchesOwnAddress (array $packageData) {
+ protected function ifRecipientMatchesOwnUniversalNodeLocator (array $packageData) {
// Construct own address first
- $ownAddress = Registry::getRegistry()->getInstance('node')->getAddressPort($this);
+ $ownAddress = NodeObjectFactory::createNodeInstance()->determineUniversalNodeLocator();
// Does it match?
- // @TODO Numeric or alpha-numeric index?
$matches = ($ownAddress === $packageData[NetworkPackage::PACKAGE_DATA_RECIPIENT]);
// Return result
* @param $errorCode The error code we shall set
* @return void
*/
- protected final function setErrorCode ($errorCode) {
+ public final function setErrorCode ($errorCode) {
$this->errorCode = $errorCode;
}