<?php
/**
- * A RawDataInputStream class
+ * A class for handling incoming (encoded) raw data with start and end markers.
+ * The "stream" is being verified by its length (if modulo 4 of it is always
+ * zero) and if the "stream" contains all valid characters (the BASE64
+ * "alphabet").
*
- * @author Roland Haeder <webmaster@ship-simu.org>
+ * Since the latest refacturing this class works "handler-less".
+ *
+ * @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 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
* 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 RawDataInputStream extends BaseStream implements InputStreamable {
+class RawDataInputStream extends BaseStream implements InputStream {
/**
* Protected constructor
*
/**
* Creates an instance of this node class
*
- * @param $handlerInstance An instance of a Networkable class
* @return $streamInstance An instance of this node class
*/
- public final static function createRawDataInputStream (Networkable $handlerInstance) {
+ public final static function createRawDataInputStream () {
// Get a new instance
$streamInstance = new RawDataInputStream();
- // Set the handler instance
- $streamInstance->setHandlerInstance($handlerInstance);
-
// Return the instance
return $streamInstance;
}
* @param $data The data (string mostly) to "stream"
* @return $data The data (string mostly) to "stream"
* @todo Do we need to do something more here?
+ * @throws Base64EncodingModuloException If the data's length modulo 4 is not zero
+ * @throws Base64EncodingBadException If the data contains characters which are not in the "alphabet" of BASE64 messages.
+ * @throws MultipleMessageSentException If the sender has sent two messages and both end up here
*/
public function streamData ($data) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('RAW-INPUT-STREAM[' . __METHOD__ . ':' . __LINE__ . ': data(' . strlen($data) . ')=' . $data);
+
+ // Do we have start and end marker again?
+ assert($this->ifStartEndMarkersSet($data));
+
+ // Count of start and end markers must be the same
+ assert(substr_count($data, BaseRawDataHandler::STREAM_START_MARKER) == substr_count($data, BaseRawDataHandler::STREAM_END_MARKER));
+
+ // Check if more than two start markers exist and if so, split it.
+ if (substr_count($data, BaseRawDataHandler::STREAM_START_MARKER) > 1) {
+ // Please do it outside this method
+ throw new MultipleMessageSentException(array($this, $data), BaseHubSystem::EXCEPTION_MULTIPLE_MESSAGE_SENT);
+ } // END - if
+
+ // Remove both
+ $data = substr($data, strlen(BaseRawDataHandler::STREAM_START_MARKER), -1 * strlen(BaseRawDataHandler::STREAM_END_MARKER));
+
// Can it be validated?
if ((strlen($data) % 4) != 0) {
// Length modulo 4 must be zero, else it is an invalid Base64 message
- $this->getHandlerInstance()->setErrorCode(BaseRawDataHandler::SOCKET_ERROR_INVALID_BASE64_MODULO);
- $data = false;
+ throw new Base64EncodingModuloException(array($this, $data), BaseHubSystem::EXCEPTION_BASE64_ENCODING_NOT_MODULO_4);
} elseif (!$this->isBase64Encoded($data)) {
// Is not a valid Base64-encoded message
- $this->getHandlerInstance()->setErrorCode(BaseRawDataHandler::SOCKET_ERROR_INVALID_BASE64_MESSAGE);
- $data = false;
+ throw new Base64EncodingBadException(array($this, $data), BaseHubSystem::EXCEPTION_BASE64_BAD_ENCODING);
} else {
// Decode the data with BASE64-encoding
$data = base64_decode($data);
}
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('RAW-INPUT-STREAM: Length of data is now ' . strlen($data) . ' Bytes.');
+
// Return it
return $data;
}