*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, this is free software
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
- /**
- * Instance to an application helper class
- */
- private static $applicationInstance = null;
-
- /**
- * The language instance for the template loader
- */
- private static $langInstance = null;
-
- /**
- * Debug instance
- */
- private static $debugInstance = null;
-
/**
* Instance of a request class
*/
- private $requestInstance = null;
+ private $requestInstance = NULL;
/**
* Instance of a response class
*/
- private $responseInstance = null;
+ private $responseInstance = NULL;
/**
* Search criteria instance
*/
- private $searchInstance = null;
+ private $searchInstance = NULL;
+
+ /**
+ * Update criteria instance
+ */
+ private $updateInstance = NULL;
/**
* The file I/O instance for the template loader
*/
- private $fileIoInstance = null;
+ private $fileIoInstance = NULL;
/**
* Resolver instance
*/
- private $resolverInstance = null;
+ private $resolverInstance = NULL;
/**
* Template engine instance
*/
- private $templateInstance = null;
+ private $templateInstance = NULL;
/**
* Database result instance
*/
- private $resultInstance = null;
+ private $resultInstance = NULL;
/**
* Instance for user class
*/
- private $userInstance = null;
+ private $userInstance = NULL;
/**
* A controller instance
*/
- private $controllerInstance = null;
+ private $controllerInstance = NULL;
+
+ /**
+ * Instance of a RNG
+ */
+ private $rngInstance = NULL;
+
+ /**
+ * Instance of a crypto helper
+ */
+ private $cryptoInstance = NULL;
+
+ /**
+ * Instance of an Iterator class
+ */
+ private $iteratorInstance = NULL;
+
+ /**
+ * Instance of the list
+ */
+ private $listInstance = NULL;
+
+ /**
+ * Instance of a menu
+ */
+ private $menuInstance = NULL;
+
+ /**
+ * Instance of the image
+ */
+ private $imageInstance = NULL;
+
+ /**
+ * Instance of the stacker
+ */
+ private $stackerInstance = NULL;
+
+ /**
+ * A Compressor instance
+ */
+ private $compressorInstance = NULL;
+
+ /**
+ * A Parseable instance
+ */
+ private $parserInstance = NULL;
+
+ /**
+ * A ProtocolHandler instance
+ */
+ private $protocolInstance = NULL;
+
+ /**
+ * A database wrapper instance
+ */
+ private $databaseInstance = NULL;
+
+ /**
+ * A helper instance for the form
+ */
+ private $helperInstance = NULL;
+
+ /**
+ * An instance of a Sourceable class
+ */
+ private $sourceInstance = NULL;
+
+ /**
+ * An instance of a InputStreamable class
+ */
+ private $inputStreamInstance = NULL;
+
+ /**
+ * An instance of a OutputStreamable class
+ */
+ private $outputStreamInstance = NULL;
+
+ /**
+ * Networkable handler instance
+ */
+ private $handlerInstance = NULL;
+
+ /**
+ * Visitor handler instance
+ */
+ private $visitorInstance = NULL;
/**
* The real class name
*/
- private $realClass = "FrameworkSystem";
+ private $realClass = 'BaseFrameworkSystem';
+
+ /**
+ * An instance of a database wrapper class
+ */
+ private $wrapperInstance = NULL;
+
+ /**
+ * Thousands separator
+ */
+ private $thousands = '.'; // German
+
+ /**
+ * Decimal separator
+ */
+ private $decimals = ','; // German
/**
- * Thousands seperator
+ * Socket resource
*/
- private $thousands = "."; // German
+ private $socketResource = false;
/**
- * Decimal seperator
+ * Package data
*/
- private $decimals = ","; // German
+ private $packageData = array();
/***********************
* Exception codes.... *
***********************/
+ // @todo Try to clean these constants up
const EXCEPTION_IS_NULL_POINTER = 0x001;
const EXCEPTION_IS_NO_OBJECT = 0x002;
const EXCEPTION_IS_NO_ARRAY = 0x003;
const EXCEPTION_WRITE_PROTECED_PATH = 0x018;
const EXCEPTION_DIR_POINTER_INVALID = 0x019;
const EXCEPTION_FILE_POINTER_INVALID = 0x01a;
- const EXCEPTION_INVALID_DIRECTORY_POINTER = 0x01b;
+ const EXCEPTION_INVALID_RESOURCE = 0x01b;
const EXCEPTION_UNEXPECTED_OBJECT = 0x01c;
const EXCEPTION_LIMIT_ELEMENT_IS_UNSUPPORTED = 0x01d;
const EXCEPTION_GETTER_IS_MISSING = 0x01e;
const EXCEPTION_ATTRIBUTES_ARE_MISSING = 0x02b;
const EXCEPTION_ARRAY_ELEMENTS_MISSING = 0x02c;
const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED = 0x02d;
- const EXCEPTION_MISSING_LANGUAGE_HANDLER = 0x02e;
- const EXCEPTION_MISSING_FILE_IO_HANDLER = 0x02f;
+ const EXCEPTION_UNSPPORTED_OPERATION = 0x02e;
const EXCEPTION_MISSING_ELEMENT = 0x030;
const EXCEPTION_HEADERS_ALREADY_SENT = 0x031;
const EXCEPTION_DEFAULT_CONTROLLER_GONE = 0x032;
const EXCEPTION_ASSERTION_FAILED = 0x037;
const EXCEPTION_FILE_CANNOT_BE_READ = 0x038;
const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
+ const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040;
+
+ /**
+ * Hexadecimal->Decimal translation array
+ */
+ private static $hexdec = array(
+ '0' => 0,
+ '1' => 1,
+ '2' => 2,
+ '3' => 3,
+ '4' => 4,
+ '5' => 5,
+ '6' => 6,
+ '7' => 7,
+ '8' => 8,
+ '9' => 9,
+ 'a' => 10,
+ 'b' => 11,
+ 'c' => 12,
+ 'd' => 13,
+ 'e' => 14,
+ 'f' => 15
+ );
/**
- * In the super constructor these system classes shall be ignored or else
- * we would get an endless calling loop.
- *
- *---------------------------------------------------------------------*
- * ATTENTION: IF YOU REMOVE ONE OF THEM YOU WILL RUN YOUR SERVER IN AN *
- * ENDLESS LOOP !!! *
- *---------------------------------------------------------------------*
- */
- private $systemClasses = array(
- "DebugMiddleware", // Debug middleware output sub-system
- "Registry", // Object registry
- "ObjectFactory", // Object factory
- "DebugWebOutput", // Debug web output sub-system
- "WebOutput", // Web output sub-system
- "CompressorChannel", // Compressor sub-system
- "DebugConsoleOutput", // Debug console output sub-system
- "DebugErrorLogOutput", // Debug error_log() output sub-system
- "FrameworkDirectoryPointer", // Directory handler sub-system
- "NullCompressor", // Null compressor
- "Bzip2Compressor", // BZIP2 compressor
- "GzipCompressor", // GZIP compressor
+ * Decimal->hexadecimal translation array
+ */
+ private static $dechex = array(
+ 0 => '0',
+ 1 => '1',
+ 2 => '2',
+ 3 => '3',
+ 4 => '4',
+ 5 => '5',
+ 6 => '6',
+ 7 => '7',
+ 8 => '8',
+ 9 => '9',
+ 10 => 'a',
+ 11 => 'b',
+ 12 => 'c',
+ 13 => 'd',
+ 14 => 'e',
+ 15 => 'f'
);
- /* No longer used:
- */
+ /**
+ * Startup time in miliseconds
+ */
+ private static $startupTime = 0;
/**
- * Private super constructor
+ * Protected super constructor
*
* @param $className Name of the class
* @return void
// Set real class
$this->setRealClass($className);
- // Initialize the class if class Registry is there
- if ((class_exists('Registry')) && (Registry::isInitialized() === false)) {
- // Initialize the registry automatically
- $this->initInstance();
+ // Set configuration instance if no registry ...
+ if (!$this instanceof Register) {
+ // ... because registries doesn't need to be configured
+ $this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
+ } // END - if
+
+ // Is the startup time set? (0 cannot be true anymore)
+ if (self::$startupTime == 0) {
+ // Then set it
+ self::$startupTime = microtime(true);
} // END - if
}
/**
- * Destructor reached...
+ * Destructor for all classes
*
* @return void
- * @todo This is old code. Do we still need this old lost code?
*/
public function __destruct() {
+ // Flush any updated entries to the database
+ $this->flushPendingUpdates();
+
// Is this object already destroyed?
if ($this->__toString() != 'DestructedObject') {
// Destroy all informations about this class but keep some text about it alive
} elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) {
// Already destructed object
$this->debugOutput(sprintf("[%s:] The object <span class=\"object_name\">%s</span> is already destroyed.",
- __CLASS__, $this->__toString()
+ __CLASS__,
+ $this->__toString()
));
}
}
/**
- * The call method where all non-implemented methods end up
+ * The __call() method where all non-implemented methods end up
*
+ * @param $methodName Name of the missing method
+ * @args $args Arguments passed to the method
* @return void
*/
public final function __call ($methodName, $args) {
// Implode all given arguments
- $argsString = "";
+ $argsString = '';
if (empty($args)) {
// No arguments
- $argsString = "NULL";
+ $argsString = 'NULL';
} elseif (is_array($args)) {
// Some arguments are there
foreach ($args as $arg) {
- // Add the type
- $argsString .= $arg." (".gettype($arg);
-
- // Add length if type is string
- if (gettype($arg) == 'string') $argsString .= ", ".strlen($arg);
+ // Add the value itself if not array. This prevents 'array to string conversion' message
+ if (is_array($arg)) {
+ $argsString .= 'Array';
+ } else {
+ $argsString .= $arg;
+ }
+
+ // Add data about the argument
+ $argsString .= ' (' . gettype($arg);
+
+ if (is_string($arg)) {
+ // Add length for strings
+ $argsString .= ', '.strlen($arg);
+ } elseif (is_array($arg)) {
+ // .. or size if array
+ $argsString .= ', '.count($arg);
+ } elseif ($arg === true) {
+ // ... is boolean 'true'
+ $argsString .= ', true';
+ } elseif ($arg === false) {
+ // ... is boolean 'true'
+ $argsString .= ', false';
+ }
// Closing bracket
- $argsString .= "), ";
+ $argsString .= '), ';
} // END - foreach
// Remove last comma
- if (substr($argsString, -2, 1) === ",") {
+ if (substr($argsString, -2, 1) == ',') {
$argsString = substr($argsString, 0, -2);
} // END - if
} else {
// Invalid arguments!
- $argsString = sprintf("!INVALID:%s!", $args);
+ $argsString = '!INVALID:' . gettype($args) . '!';
}
// Output stub message
));
// Return nothing
- return null;
+ return NULL;
+ }
+
+ /**
+ * Getter for $realClass
+ *
+ * @return $realClass The name of the real class (not BaseFrameworkSystem)
+ */
+ public function __toString () {
+ return $this->realClass;
}
/**
- * Private initializer for this class
+ * Magic function to catch setting of missing but set class fields/attributes
*
+ * @param $name Name of the field/attribute
+ * @param $value Value to store
* @return void
*/
- private final function initInstance () {
- // Is this a system class?
- if (!in_array($this->__toString(), $this->systemClasses)) {
- // Set configuration instance
- $this->setConfigInstance(FrameworkConfiguration::getInstance());
-
- // Add application helper to our class
- $this->systemclasses[] = $this->getConfigInstance()->readConfig('app_helper_class');
-
- // Set debug instance
- $this->setDebugInstance(DebugMiddleware::createDebugMiddleware($this->getConfigInstance()->readConfig('debug_class')));
-
- // Get output instance and set it
- $outputInstance = ObjectFactory::createObjectByConfiguredName('web_engine', array($this->getConfigInstance()->readConfig('web_content_type')));
- $this->setWebOutputInstance($outputInstance);
-
- // Set the compressor channel
- $this->setCompressorChannel(CompressorChannel::createCompressorChannel(sprintf("%s%s",
- $this->getConfigInstance()->readConfig('base_path'),
- $this->getConfigInstance()->readConfig('compressor_base_path')
- )));
-
- // Initialization done! :D
- Registry::isInitialized('OK');
- } elseif ($this->__toString() == 'DebugMiddleware') {
- // Set configuration instance
- $this->setConfigInstance(FrameworkConfiguration::getInstance());
- }
+ public final function __set ($name, $value) {
+ $this->debugBackTrace(sprintf("Tried to set a missing field. name=%s, value[%s]=%s",
+ $name,
+ gettype($value),
+ $value
+ ));
+ }
+
+ /**
+ * Magic function to catch getting of missing fields/attributes
+ *
+ * @param $name Name of the field/attribute
+ * @return void
+ */
+ public final function __get ($name) {
+ $this->debugBackTrace(sprintf("Tried to get a missing field. name=%s",
+ $name
+ ));
+ }
+
+ /**
+ * Magic function to catch unsetting of missing fields/attributes
+ *
+ * @param $name Name of the field/attribute
+ * @return void
+ */
+ public final function __unset ($name) {
+ $this->debugBackTrace(sprintf("Tried to unset a missing field. name=%s",
+ $name
+ ));
}
/**
return $this->searchInstance;
}
+ /**
+ * Setter for update instance
+ *
+ * @param $updateInstance Searchable criteria instance
+ * @return void
+ */
+ public final function setUpdateInstance (LocalUpdateCriteria $updateInstance) {
+ $this->updateInstance = $updateInstance;
+ }
+
+ /**
+ * Getter for update instance
+ *
+ * @return $updateInstance Updateable criteria instance
+ */
+ public final function getUpdateInstance () {
+ return $this->updateInstance;
+ }
+
/**
* Setter for resolver instance
*
- * @param $resolverInstance Instance of a command resolver class
+ * @param $resolverInstance Instance of a command resolver class
* @return void
*/
public final function setResolverInstance (Resolver $resolverInstance) {
/**
* Getter for resolver instance
*
- * @return $resolverInstance Instance of a command resolver class
+ * @return $resolverInstance Instance of a command resolver class
*/
public final function getResolverInstance () {
return $this->resolverInstance;
/**
* Getter for configuration instance
*
- * @return $cfgInstance Configuration instance
+ * @return $configInstance Configuration instance
*/
public final function getConfigInstance () {
- $cfgInstance = Registry::getRegistry()->getInstance('config');
- return $cfgInstance;
+ $configInstance = Registry::getRegistry()->getInstance('config');
+ return $configInstance;
}
/**
* @return void
*/
public final function setDebugInstance (DebugMiddleware $debugInstance) {
- self::$debugInstance = $debugInstance;
+ Registry::getRegistry()->addInstance('debug', $debugInstance);
}
/**
* @return $debugInstance Instance to class DebugConsoleOutput or DebugWebOutput
*/
public final function getDebugInstance () {
- return self::$debugInstance;
+ // Get debug instance
+ $debugInstance = Registry::getRegistry()->getInstance('debug');
+
+ // Return it
+ return $debugInstance;
}
/**
/**
* Getter for web output instance
*
- * @return $webOutput - Instance to class WebOutput
+ * @return $webOutputInstance - Instance to class WebOutput
*/
public final function getWebOutputInstance () {
- return Registry::getRegistry()->getInstance('web_output');
+ $webOutputInstance = Registry::getRegistry()->getInstance('web_output');
+ return $webOutputInstance;
}
/**
* Setter for database instance
*
- * @param $dbInstance The instance for the database connection
- * (forced DatabaseConnection)
+ * @param $databaseInstance The instance for the database connection (forced DatabaseConnection)
* @return void
*/
- public final function setDatabaseInstance (DatabaseConnection $dbInstance) {
- Registry::getRegistry()->addInstance('dbInstance', $dbInstance);
+ public final function setDatabaseInstance (DatabaseConnection $databaseInstance) {
+ Registry::getRegistry()->addInstance('db_instance', $databaseInstance);
}
/**
* Getter for database layer
*
- * @return $dbInstance The database layer instance
+ * @return $databaseInstance The database layer instance
*/
public final function getDatabaseInstance () {
- // Default is invalid db instance
- $dbInstance = null;
-
- // Is the registry there and initialized?
- if ((class_exists('Registry')) && (Registry::isInitialized() === true)) {
- $dbInstance = Registry::getRegistry()->getInstance('dbInstance');
- } // END - if
+ // Get instance
+ $databaseInstance = Registry::getRegistry()->getInstance('db_instance');
// Return instance
- return $dbInstance;
+ return $databaseInstance;
}
/**
* Setter for compressor channel
*
- * @param $compressorChannel An instance of CompressorChannel
+ * @param $compressorInstance An instance of CompressorChannel
* @return void
*/
- public final function setCompressorChannel (CompressorChannel $compressorChannel) {
- Registry::getRegistry()->addInstance('compressor', $compressorChannel);
+ public final function setCompressorChannel (CompressorChannel $compressorInstance) {
+ Registry::getRegistry()->addInstance('compressor', $compressorInstance);
}
/**
* Getter for compressor channel
*
- * @return $compressor The compressor channel
+ * @return $compressorInstance The compressor channel
*/
public final function getCompressorChannel () {
- return Registry::getRegistry()->getInstance('compressor');
+ $compressorInstance = Registry::getRegistry()->getInstance('compressor');
+ return $compressorInstance;
}
/**
* @return $applicationInstance An instance of a manageable application helper class
*/
protected final function getApplicationInstance () {
- return self::$applicationInstance;
+ $applicationInstance = Registry::getRegistry()->getInstance('application');
+ return $applicationInstance;
}
/**
* @return void
*/
public final function setApplicationInstance (ManageableApplication $applicationInstance) {
- self::$applicationInstance = $applicationInstance;
+ Registry::getRegistry()->addInstance('application', $applicationInstance);
}
/**
return $this->responseInstance;
}
- /**
- * Getter for $realClass
- *
- * @return $realClass The name of the real class (not BaseFrameworkSystem)
- */
- public final function __toString () {
- return $this->realClass;
- }
-
/**
* Setter for the real class name
*
- * @param $realClass Class name (string)
+ * @param $realClass Class name (string)
* @return void
*/
public final function setRealClass ($realClass) {
}
/**
- * Compare class name of this and given class name
+ * Checks whether an object equals this object. You should overwrite this
+ * method to implement own equality checks
*
- * @param $className The class name as string from the other class
- * @return boolean The result of comparing both class names
- */
- public final function isClass ($className) {
- return ($this->__toString() == $className);
- }
+ * @param $objectInstance An instance of a FrameworkInterface object
+ * @return $equals Whether both objects equals
+ */
+ public function equals (FrameworkInterface $objectInstance) {
+ // Now test it
+ $equals = ((
+ $this->__toString() == $objectInstance->__toString()
+ ) && (
+ $this->hashCode() == $objectInstance->hashCode()
+ ));
- /**
- * Stub method (only real cabins shall override it)
- *
- * @return boolean false = is no cabin, true = is a cabin
- * @deprecated
- */
- public function isCabin () {
- return false;
+ // Return the result
+ return $equals;
}
/**
- * Stub method for tradeable objects
+ * Generates a generic hash code of this class. You should really overwrite
+ * this method with your own hash code generator code. But keep KISS in mind.
*
- * @return boolean false = is not tradeable by the Merchant class,
- * true = is a tradeable object
- * @deprecated
+ * @return $hashCode A generic hash code respresenting this whole class
*/
- public function isTradeable () {
- return false;
+ public function hashCode () {
+ // Simple hash code
+ return crc32($this->__toString());
}
/**
* Formats computer generated price values into human-understandable formats
- * with thousand and decimal seperators.
+ * with thousand and decimal separators.
*
* @param $value The in computer format value for a price
* @param $currency The currency symbol (use HTML-valid characters!)
* @param $decNum Number of decimals after commata
* @return $price The for the current language formated price string
- * @throws MissingDecimalsThousandsSeperatorException If decimals or
- * thousands seperator
+ * @throws MissingDecimalsThousandsSeparatorException If decimals or
+ * thousands separator
* is missing
*/
- public function formatCurrency ($value, $currency = "€", $decNum = 2) {
+ public function formatCurrency ($value, $currency = '€', $decNum = 2) {
// Are all required attriutes set?
if ((!isset($this->decimals)) || (!isset($this->thousands))) {
// Throw an exception
- throw new MissingDecimalsThousandsSeperatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING);
- }
+ throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING);
+ } // END - if
// Cast the number
$value = (float) $value;
// Reformat the US number
- $price = sprintf("%s %s",
- number_format($value, $decNum, $this->decimals, $this->thousands),
- $currency
- );
+ $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency;
// Return as string...
return $price;
}
- /**
- * Removes number formating characters
- *
- * @return void
- */
- public final function removeNumberFormaters () {
- unset($this->thousands);
- unset($this->decimals);
- }
-
/**
* Private getter for language instance
*
* @return $langInstance An instance to the language sub-system
*/
protected final function getLanguageInstance () {
- return self::$langInstance;
+ $langInstance = Registry::getRegistry()->getInstance('language');
+ return $langInstance;
}
/**
* @see LanguageSystem
*/
public final function setLanguageInstance (ManageableLanguage $langInstance) {
- self::$langInstance = $langInstance;
- }
-
- /**
- * Remove the $systemClasses array from memory
- *
- * @return void
- */
- public final function removeSystemArray () {
- unset($this->systemClasses);
+ Registry::getRegistry()->addInstance('language', $langInstance);
}
/**
* Appends a trailing slash to a string
*
- * @param $str A string (maybe) without trailing slash
- * @return $str A string with an auto-appended trailing slash
+ * @param $str A string (maybe) without trailing slash
+ * @return $str A string with an auto-appended trailing slash
*/
public final function addMissingTrailingSlash ($str) {
// Is there a trailing slash?
- if (substr($str, -1, 1) != "/") $str .= "/";
+ if (substr($str, -1, 1) != '/') {
+ $str .= '/';
+ } // END - if
+
+ // Return string with trailing slash
return $str;
}
/**
* Private getter for file IO instance
*
- * @return $fileIoInstance An instance to the file I/O sub-system
+ * @return $fileIoInstance An instance to the file I/O sub-system
*/
protected final function getFileIoInstance () {
return $this->fileIoInstance;
/**
* Setter for file I/O instance
*
- * @param $fileIoInstance An instance to the file I/O sub-system
+ * @param $fileIoInstance An instance to the file I/O sub-system
* @return void
*/
public final function setFileIoInstance (FileIoHandler $fileIoInstance) {
* Prepare the template engine (WebTemplateEngine by default) for a given
* application helper instance (ApplicationHelper by default).
*
- * @param $appInstance An application helper instance or
+ * @param $applicationInstance An application helper instance or
* null if we shall use the default
- * @return $templateInstance The template engine instance
- * @throws NullPointerException If the template engine could not
- * be initialized
- * @throws UnsupportedTemplateEngineException If $templateInstance is an
- * unsupported template engine
- * @throws MissingLanguageHandlerException If the language sub-system
- * is not yet initialized
+ * @return $templateInstance The template engine instance
* @throws NullPointerException If the discovered application
* instance is still null
*/
- protected function prepareTemplateInstance (BaseFrameworkSystem $appInstance=null) {
+ protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) {
// Is the application instance set?
- if (is_null($appInstance)) {
+ if (is_null($applicationInstance)) {
// Get the current instance
- $appInstance = $this->getApplicationInstance();
+ $applicationInstance = $this->getApplicationInstance();
// Still null?
- if (is_null($appInstance)) {
+ if (is_null($applicationInstance)) {
// Thrown an exception
throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
} // END - if
} // END - if
- // Generate FQFN for all application templates
- $fqfn = sprintf("%s%s/%s",
- $this->getConfigInstance()->readConfig('application_path'),
- strtolower($appInstance->getAppShortName()),
- $this->getConfigInstance()->readConfig('tpl_base_path')
- );
-
- // Are both instances set?
- if ($appInstance->getLanguageInstance() === null) {
- // Invalid language instance
- throw new MissingLanguageHandlerException($appInstance, self::EXCEPTION_MISSING_LANGUAGE_HANDLER);
- } elseif ($appInstance->getFileIoInstance() === null) {
- // Invalid language instance
- throw new MissingFileIoHandlerException($appInstance, self::EXCEPTION_MISSING_FILE_IO_HANDLER);
- }
-
// Initialize the template engine
- $templateInstance = ObjectFactory::createObjectByConfiguredName('template_class', array($fqfn, $appInstance->getLanguageInstance(), $appInstance->getFileIoInstance()));
+ $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class');
// Return the prepared instance
return $templateInstance;
* @param $message Optional message to show in debug output
* @return void
*/
- public final function debugInstance ($message = "") {
+ public final function debugInstance ($message = '') {
// Restore the error handler to avoid trouble with missing array elements or undeclared variables
restore_error_handler();
// Init content
- $content = "";
+ $content = '';
// Is a message set?
if (!empty($message)) {
ApplicationEntryPoint::app_die(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
$this->__toString(),
$content,
- ClassLoader::getInstance()->getPrintableIncludeList()
+ ClassLoader::getSelfInstance()->getPrintableIncludeList()
));
}
+ /**
+ * Replaces control characters with printable output
+ *
+ * @param $str String with control characters
+ * @return $str Replaced string
+ */
+ protected function replaceControlCharacters ($str) {
+ // Replace them
+ $str = str_replace(
+ chr(13), '[r]', str_replace(
+ chr(10), '[n]', str_replace(
+ chr(9) , '[t]',
+ $str
+ )));
+
+ // Return it
+ return $str;
+ }
+
/**
* Output a partial stub message for the caller method
*
* @param $message An optional message to display
* @return void
*/
- protected function partialStub ($message = "") {
+ protected function partialStub ($message = '') {
// Get the backtrace
$backtrace = debug_backtrace();
// Generate the class::method string
- $methodName = "UnknownClass->unknownMethod";
+ $methodName = 'UnknownClass->unknownMethod';
if ((isset($backtrace[1]['class'])) && (isset($backtrace[1]['function']))) {
- $methodName = $backtrace[1]['class']."->".$backtrace[1]['function'];
+ $methodName = $backtrace[1]['class'] . '->' . $backtrace[1]['function'];
} // END - if
// Construct the full message
// Is the extra message given?
if (!empty($message)) {
// Then add it as well
- $stubMessage .= sprintf(" Message: <span id=\"stub_message\">%s</span>", $message);
+ $stubMessage .= sprintf(' Message: <span id="stub_message">%s</span>', $message);
} // END - if
// Debug instance is there?
$this->debugOutput($stubMessage);
} else {
// Trigger an error
- trigger_error($stubMessage."<br />\n");
+ trigger_error($stubMessage . '<br />' + chr(10));
}
}
/**
* Outputs a debug backtrace and stops further script execution
*
+ * @param $message An optional message to output
* @return void
*/
- public function debugBackTrace () {
+ public function debugBackTrace ($message = '') {
// Sorry, there is no other way getting this nice backtrace
- print("<pre>\n");
+ if (!empty($message)) {
+ // Output message
+ printf("Message: %s<br />\n", $message);
+ } // END - if
+
+ print('<pre>');
debug_print_backtrace();
- print("</pre>");
+ print('</pre>');
exit();
}
/**
- * Outputs a debug message wether to debug instance (should be set!) or dies with or pints the message
+ * Outputs a debug message whether to debug instance (should be set!) or dies with or pints the message
*
* @param $message Message we shall send out...
- * @param $doPrint Wether we shall print or die here which first is the default
+ * @param $doPrint Whether we shall print or die here which first is the default
* @return void
*/
public function debugOutput ($message, $doPrint = true) {
if (is_object($debugInstance)) {
// Use debug output handler
$debugInstance->output($message);
- if ($doPrint === false) die(); // Die here if not printed
+
+ if ($doPrint === false) {
+ // Die here if not printed
+ die();
+ } // END - if
} else {
// Put directly out
- if ($doPrint) {
- print($message);
+ if ($doPrint === true) {
+ // Are debug times enabled?
+ if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') {
+ // Output it first
+ print($this->getPrintableExecutionTime());
+ } // END - if
+
+ // Print message
+ print($message . chr(10));
} else {
// DO NOT REWRITE THIS TO app_die() !!!
die($message);
*/
public function convertToClassName ($str) {
// Init class name
- $className = "";
+ $className = '';
// Convert all dashes in underscores
- $str = str_replace("-", "_", $str);
+ $str = $this->convertDashesToUnderscores($str);
// Now use that underscores to get classname parts for hungarian style
- foreach (explode("_", $str) as $strPart) {
+ foreach (explode('_', $str) as $strPart) {
// Make the class name part lower case and first upper case
$className .= ucfirst(strtolower($strPart));
} // END - foreach
return $className;
}
+ /**
+ * Converts dashes to underscores, e.g. useable for configuration entries
+ *
+ * @param $str The string with maybe dashes inside
+ * @return $str The converted string with no dashed, but underscores
+ */
+ public final function convertDashesToUnderscores ($str) {
+ // Convert them all
+ $str = str_replace('-', '_', $str);
+
+ // Return converted string
+ return $str;
+ }
+
/**
* Marks up the code by adding e.g. line numbers
*
*/
public function markupCode ($phpCode) {
// Init marked code
- $markedCode = "";
+ $markedCode = '';
// Get last error
$errorArray = error_get_last();
// Init the code with error message
if (is_array($errorArray)) {
// Get error infos
- $markedCode = sprintf("<div id=\"error_header\">File: <span id=\"error_data\">%s</span>, Line: <span id=\"error_data\">%s</span>, Message: <span id=\"error_data\">%s</span>, Type: <span id=\"error_data\">%s</span></div>",
+ $markedCode = sprintf('<div id="error_header">File: <span id="error_data">%s</span>, Line: <span id="error_data">%s</span>, Message: <span id="error_data">%s</span>, Type: <span id="error_data">%s</span></div>',
basename($errorArray['file']),
$errorArray['line'],
$errorArray['message'],
} // END - if
// Add line number to the code
- foreach (explode("\n", $phpCode) as $lineNo => $code) {
+ foreach (explode(chr(10), $phpCode) as $lineNo => $code) {
// Add line numbers
- $markedCode .= sprintf("<span id=\"code_line\">%s</span>: %s\n",
+ $markedCode .= sprintf('<span id="code_line">%s</span>: %s' + chr(10),
($lineNo + 1),
htmlentities($code, ENT_QUOTES)
);
*/
public function doFilterFormatTimestamp ($timestamp) {
// Default value to return
- $readable = "???";
+ $readable = '???';
// Is the timestamp null?
if (is_null($timestamp)) {
$readable = $this->getLanguageInstance()->getMessage('null_timestamp');
} else {
switch ($this->getLanguageInstance()->getLanguageCode()) {
- case "de": // German format is a bit different to default
+ case 'de': // German format is a bit different to default
// Split the GMT stamp up
- $dateTime = explode(" ", $timestamp);
- $dateArray = explode("-", $dateTime[0]);
- $timeArray = explode(":", $dateTime[1]);
+ $dateTime = explode(' ', $timestamp );
+ $dateArray = explode('-', $dateTime[0]);
+ $timeArray = explode(':', $dateTime[1]);
// Construct the timestamp
- $readable = sprintf($this->getConfigInstance()->readConfig('german_date_time'),
+ $readable = sprintf($this->getConfigInstance()->getConfigEntry('german_date_time'),
$dateArray[0],
$dateArray[1],
$dateArray[2],
default: // Default is pass-through
$readable = $timestamp;
break;
- }
+ } // END - switch
}
// Return the stamp
return $readable;
}
+ /**
+ * Filter a given number into a localized number
+ *
+ * @param $value The raw value from e.g. database
+ * @return $localized Localized value
+ */
+ public function doFilterFormatNumber ($value) {
+ // Generate it from config and localize dependencies
+ switch ($this->getLanguageInstance()->getLanguageCode()) {
+ case 'de': // German format is a bit different to default
+ $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), ',', '.');
+ break;
+
+ default: // US, etc.
+ $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), '.', ',');
+ break;
+ } // END - switch
+
+ // Return it
+ return $localized;
+ }
+
/**
* "Getter" for databse entry
*
*/
public final function getField ($fieldName) {
// Default field value
- $fieldValue = null;
+ $fieldValue = NULL;
// Get result instance
$resultInstance = $this->getResultInstance();
// Get current array
$fieldArray = $resultInstance->current();
+ //* DEBUG: */ $this->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
// Does the field exist?
if (isset($fieldArray[$fieldName])) {
public final function getControllerInstance () {
return $this->controllerInstance;
}
+
+ /**
+ * Flushs all pending updates to the database layer
+ *
+ * @return void
+ */
+ public function flushPendingUpdates () {
+ // Get result instance
+ $resultInstance = $this->getResultInstance();
+
+ // Do we have data to update?
+ if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) {
+ // Get wrapper class name config entry
+ $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry();
+
+ // Create object instance
+ $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry);
+
+ // Yes, then send the whole result to the database layer
+ $wrapperInstance->doUpdateByResult($this->getResultInstance());
+ } // END - if
+ }
+
+ /**
+ * Outputs a deprecation warning to the developer.
+ *
+ * @param $message The message we shall output to the developer
+ * @return void
+ * @todo Write a logging mechanism for productive mode
+ */
+ public function deprecationWarning ($message) {
+ // Is developer mode active?
+ if (defined('DEVELOPER')) {
+ // Debug instance is there?
+ if (!is_null($this->getDebugInstance())) {
+ // Output stub message
+ $this->debugOutput($message);
+ } else {
+ // Trigger an error
+ trigger_error($message . "<br />\n");
+ }
+ } else {
+ // @TODO Finish this part!
+ $this->partialStub('Developer mode inactive. Message:' . $message);
+ }
+ }
+
+ /**
+ * Checks whether the given PHP extension is loaded
+ *
+ * @param $phpExtension The PHP extension we shall check
+ * @return $isLoaded Whether the PHP extension is loaded
+ */
+ public final function isPhpExtensionLoaded ($phpExtension) {
+ // Is it loaded?
+ $isLoaded = in_array($phpExtension, get_loaded_extensions());
+
+ // Return result
+ return $isLoaded;
+ }
+
+ /**
+ * Setter for RNG instance
+ *
+ * @param $rngInstance An instance of a random number generator (RNG)
+ * @return void
+ */
+ protected final function setRngInstance (RandomNumberGenerator $rngInstance) {
+ $this->rngInstance = $rngInstance;
+ }
+
+ /**
+ * Getter for RNG instance
+ *
+ * @return $rngInstance An instance of a random number generator (RNG)
+ */
+ public final function getRngInstance () {
+ return $this->rngInstance;
+ }
+
+ /**
+ * Setter for Cryptable instance
+ *
+ * @param $cryptoInstance An instance of a Cryptable class
+ * @return void
+ */
+ protected final function setCryptoInstance (Cryptable $cryptoInstance) {
+ $this->cryptoInstance = $cryptoInstance;
+ }
+
+ /**
+ * Getter for Cryptable instance
+ *
+ * @return $cryptoInstance An instance of a Cryptable class
+ */
+ public final function getCryptoInstance () {
+ return $this->cryptoInstance;
+ }
+
+ /**
+ * Setter for Iterator instance
+ *
+ * @param $iteratorInstance An instance of an Iterator
+ * @return void
+ */
+ protected final function setIteratorInstance (Iterator $iteratorInstance) {
+ $this->iteratorInstance = $iteratorInstance;
+ }
+
+ /**
+ * Getter for Iterator instance
+ *
+ * @return $iteratorInstance An instance of an Iterator
+ */
+ public final function getIteratorInstance () {
+ return $this->iteratorInstance;
+ }
+
+ /**
+ * "Getter" as a time() replacement but with milliseconds. You should use this
+ * method instead of the encapsulated getimeofday() function.
+ *
+ * @return $milliTime Timestamp with milliseconds
+ */
+ public function getMilliTime () {
+ // Get the time of day as float
+ $milliTime = gettimeofday(true);
+
+ // Return it
+ return $milliTime;
+ }
+
+ /**
+ * Idles (sleeps) for given milliseconds
+ *
+ * @return $hasSlept Whether it goes fine
+ */
+ public function idle ($milliSeconds) {
+ // Sleep is fine by default
+ $hasSlept = true;
+
+ // Idle so long with found function
+ if (function_exists('time_sleep_until')) {
+ // Get current time and add idle time
+ $sleepUntil = $this->getMilliTime() + abs($milliSeconds) / 1000;
+
+ // New PHP 5.1.0 function found, ignore errors
+ $hasSlept = @time_sleep_until($sleepUntil);
+ } else {
+ /*
+ * My Sun station doesn't have that function even with latest PHP
+ * package. :(
+ */
+ usleep($milliSeconds * 1000);
+ }
+
+ // Return result
+ return $hasSlept;
+ }
+
+ /**
+ * Setter for the list instance
+ *
+ * @param $listInstance A list of Listable
+ * @return void
+ */
+ protected final function setListInstance (Listable $listInstance) {
+ $this->listInstance = $listInstance;
+ }
+
+ /**
+ * Getter for the list instance
+ *
+ * @return $listInstance A list of Listable
+ */
+ protected final function getListInstance () {
+ return $this->listInstance;
+ }
+
+ /**
+ * Setter for the menu instance
+ *
+ * @param $menuInstance A RenderableMenu instance
+ * @return void
+ */
+ protected final function setMenuInstance (RenderableMenu $menuInstance) {
+ $this->menuInstance = $menuInstance;
+ }
+
+ /**
+ * Getter for the menu instance
+ *
+ * @return $menuInstance A RenderableMenu instance
+ */
+ protected final function getMenuInstance () {
+ return $this->menuInstance;
+ }
+
+ /**
+ * Setter for image instance
+ *
+ * @param $imageInstance An instance of an image
+ * @return void
+ */
+ public final function setImageInstance (BaseImage $imageInstance) {
+ $this->imageInstance = $imageInstance;
+ }
+
+ /**
+ * Getter for image instance
+ *
+ * @return $imageInstance An instance of an image
+ */
+ public final function getImageInstance () {
+ return $this->imageInstance;
+ }
+
+ /**
+ * Setter for stacker instance
+ *
+ * @param $stackerInstance An instance of an stacker
+ * @return void
+ */
+ public final function setStackerInstance (Stackable $stackerInstance) {
+ $this->stackerInstance = $stackerInstance;
+ }
+
+ /**
+ * Getter for stacker instance
+ *
+ * @return $stackerInstance An instance of an stacker
+ */
+ public final function getStackerInstance () {
+ return $this->stackerInstance;
+ }
+
+ /**
+ * Setter for compressor instance
+ *
+ * @param $compressorInstance An instance of an compressor
+ * @return void
+ */
+ public final function setCompressorInstance (Compressor $compressorInstance) {
+ $this->compressorInstance = $compressorInstance;
+ }
+
+ /**
+ * Getter for compressor instance
+ *
+ * @return $compressorInstance An instance of an compressor
+ */
+ public final function getCompressorInstance () {
+ return $this->compressorInstance;
+ }
+
+ /**
+ * Setter for Parseable instance
+ *
+ * @param $parserInstance An instance of an Parseable
+ * @return void
+ */
+ public final function setParserInstance (Parseable $parserInstance) {
+ $this->parserInstance = $parserInstance;
+ }
+
+ /**
+ * Getter for Parseable instance
+ *
+ * @return $parserInstance An instance of an Parseable
+ */
+ public final function getParserInstance () {
+ return $this->parserInstance;
+ }
+
+ /**
+ * Setter for ProtocolHandler instance
+ *
+ * @param $protocolInstance An instance of an ProtocolHandler
+ * @return void
+ */
+ public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) {
+ $this->protocolInstance = $protocolInstance;
+ }
+
+ /**
+ * Getter for ProtocolHandler instance
+ *
+ * @return $protocolInstance An instance of an ProtocolHandler
+ */
+ public final function getProtocolInstance () {
+ return $this->protocolInstance;
+ }
+
+ /**
+ * Setter for BaseDatabaseWrapper instance
+ *
+ * @param $wrapperInstance An instance of an BaseDatabaseWrapper
+ * @return void
+ */
+ public final function setWrapperInstance (BaseDatabaseWrapper $wrapperInstance) {
+ $this->wrapperInstance = $wrapperInstance;
+ }
+
+ /**
+ * Getter for BaseDatabaseWrapper instance
+ *
+ * @return $wrapperInstance An instance of an BaseDatabaseWrapper
+ */
+ public final function getWrapperInstance () {
+ return $this->wrapperInstance;
+ }
+
+ /**
+ * Setter for socket resource
+ *
+ * @param $socketResource A valid socket resource
+ * @return void
+ */
+ public final function setSocketResource ($socketResource) {
+ $this->socketResource = $socketResource;
+ }
+
+ /**
+ * Getter for socket resource
+ *
+ * @return $socketResource A valid socket resource
+ */
+ public function getSocketResource () {
+ return $this->socketResource;
+ }
+
+ /**
+ * Setter for helper instance
+ *
+ * @param $helperInstance An instance of a helper class
+ * @return void
+ */
+ protected final function setHelperInstance (Helper $helperInstance) {
+ $this->helperInstance = $helperInstance;
+ }
+
+ /**
+ * Getter for helper instance
+ *
+ * @return $helperInstance An instance of a helper class
+ */
+ public final function getHelperInstance () {
+ return $this->helperInstance;
+ }
+
+ /**
+ * Setter for a Sourceable instance
+ *
+ * @param $sourceInstance The Sourceable instance
+ * @return void
+ */
+ protected final function setSourceInstance (Sourceable $sourceInstance) {
+ $this->sourceInstance = $sourceInstance;
+ }
+
+ /**
+ * Getter for a Sourceable instance
+ *
+ * @return $sourceInstance The Sourceable instance
+ */
+ protected final function getSourceInstance () {
+ return $this->sourceInstance;
+ }
+
+ /**
+ * Getter for a InputStreamable instance
+ *
+ * @param $inputStreamInstance The InputStreamable instance
+ */
+ protected final function getInputStreamInstance () {
+ return $this->inputStreamInstance;
+ }
+
+ /**
+ * Setter for a InputStreamable instance
+ *
+ * @param $inputStreamInstance The InputStreamable instance
+ * @return void
+ */
+ protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) {
+ $this->inputStreamInstance = $inputStreamInstance;
+ }
+
+ /**
+ * Getter for a OutputStreamable instance
+ *
+ * @param $outputStreamInstance The OutputStreamable instance
+ */
+ protected final function getOutputStreamInstance () {
+ return $this->outputStreamInstance;
+ }
+
+ /**
+ * Setter for a OutputStreamable instance
+ *
+ * @param $outputStreamInstance The OutputStreamable instance
+ * @return void
+ */
+ protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
+ $this->outputStreamInstance = $outputStreamInstance;
+ }
+
+ /**
+ * Setter for handler instance
+ *
+ * @param $handlerInstance An instance of a Handleable class
+ * @return void
+ */
+ protected final function setHandlerInstance (Handleable $handlerInstance) {
+ $this->handlerInstance = $handlerInstance;
+ }
+
+ /**
+ * Getter for handler instance
+ *
+ * @return $handlerInstance A Networkable instance
+ */
+ protected final function getHandlerInstance () {
+ return $this->handlerInstance;
+ }
+
+ /**
+ * Setter for visitor instance
+ *
+ * @param $visitorInstance A Visitor instance
+ * @return void
+ */
+ protected final function setVisitorInstance (Visitor $visitorInstance) {
+ $this->visitorInstance = $visitorInstance;
+ }
+
+ /**
+ * Getter for visitor instance
+ *
+ * @return $visitorInstance A Visitor instance
+ */
+ protected final function getVisitorInstance () {
+ return $this->visitorInstance;
+ }
+
+ /**
+ * Setter for raw package Data
+ *
+ * @param $packageData Raw package Data
+ * @return void
+ */
+ public final function setPackageData (array $packageData) {
+ $this->packageData = $packageData;
+ }
+
+ /**
+ * Getter for raw package Data
+ *
+ * @return $packageData Raw package Data
+ */
+ public function getPackageData () {
+ return $this->packageData;
+ }
+
+ /**
+ * Converts a hexadecimal string, even with negative sign as first string to
+ * a decimal number using BC functions.
+ *
+ * This work is based on comment #86673 on php.net documentation page at:
+ * <http://de.php.net/manual/en/function.dechex.php#86673>
+ *
+ * @param $hex Hexadecimal string
+ * @return $dec Decimal number
+ */
+ protected function hex2dec ($hex) {
+ // Convert to all lower-case
+ $hex = strtolower($hex);
+
+ // Detect sign (negative/positive numbers)
+ $sign = '';
+ if (substr($hex, 0, 1) == '-') {
+ $sign = '-';
+ $hex = substr($hex, 1);
+ } // END - if
+
+ // Decode the hexadecimal string into a decimal number
+ $dec = 0;
+ for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
+ $factor = self::$hexdec[substr($hex, $i, 1)];
+ $dec = bcadd($dec, bcmul($factor, $e));
+ } // END - for
+
+ // Return the decimal number
+ return $sign . $dec;
+ }
+
+ /**
+ * Converts even very large decimal numbers, also with negative sign, to a
+ * hexadecimal string.
+ *
+ * This work is based on comment #97756 on php.net documentation page at:
+ * <http://de.php.net/manual/en/function.hexdec.php#97756>
+ *
+ * @param $dec Decimal number, even with negative sign
+ * @param $maxLength Optional maximum length of the string
+ * @return $hex Hexadecimal string
+ */
+ protected function dec2hex ($dec, $maxLength = 0) {
+ // maxLength can be zero or devideable by 2
+ assert(($maxLength == 0) || (($maxLength % 2) == 0));
+
+ // Detect sign (negative/positive numbers)
+ $sign = '';
+ if ($dec < 0) {
+ $sign = '-';
+ $dec = abs($dec);
+ } // END - if
+
+ // Encode the decimal number into a hexadecimal string
+ $hex = '';
+ do {
+ $hex = self::$dechex[($dec % 16)] . $hex;
+ $dec /= 16;
+ } while ($dec >= 1);
+
+ /*
+ * We need hexadecimal strings with leading zeros if the length cannot
+ * be divided by 2
+ */
+ if ($maxLength > 0) {
+ // Prepend more zeros
+ $hex = $this->prependStringToString($hex, '0', $maxLength);
+ } elseif ((strlen($hex) % 2) != 0) {
+ $hex = '0' . $hex;
+ }
+
+ // Return the hexadecimal string
+ return $sign . $hex;
+ }
+
+ /**
+ * Converts a ASCII string (0 to 255) into a decimal number.
+ *
+ * @param $asc The ASCII string to be converted
+ * @return $dec Decimal number
+ */
+ protected function asc2dec ($asc) {
+ // Convert it into a hexadecimal number
+ $hex = bin2hex($asc);
+
+ // And back into a decimal number
+ $dec = $this->hex2dec($hex);
+
+ // Return it
+ return $dec;
+ }
+
+ /**
+ * Converts a decimal number into an ASCII string.
+ *
+ * @param $dec Decimal number
+ * @return $asc An ASCII string
+ */
+ protected function dec2asc ($dec) {
+ // First convert the number into a hexadecimal string
+ $hex = $this->dec2hex($dec);
+
+ // Then convert it into the ASCII string
+ $asc = $this->hex2asc($hex);
+
+ // Return it
+ return $asc;
+ }
+
+ /**
+ * Converts a hexadecimal number into an ASCII string. Negative numbers
+ * are not allowed.
+ *
+ * @param $hex Hexadecimal string
+ * @return $asc An ASCII string
+ */
+ protected function hex2asc ($hex) {
+ // Check for length, it must be devideable by 2
+ //* DEBUG: */ $this->debugOutput('hex='.$hex);
+ assert((strlen($hex) % 2) == 0);
+
+ // Walk the string
+ $asc = '';
+ for ($idx = 0; $idx < strlen($hex); $idx+=2) {
+ // Get the decimal number of the chunk
+ $part = hexdec(substr($hex, $idx, 2));
+
+ // Add it to the final string
+ $asc .= chr($part);
+ } // END - for
+
+ // Return the final string
+ return $asc;
+ }
+
+ /**
+ * Prepends a given string $prepend to $str with a given total length
+ *
+ * @param $str Given original string which should be prepended
+ * @param $prepend The string to prepend
+ * @param $length Total length of the final string
+ * @return $strFinal Final prepended string
+ */
+ protected function prependStringToString ($str, $prepend, $length) {
+ // Set final string to original string by default
+ $strFinal = $str;
+
+ // Can it devided
+ if (strlen($str) < $length) {
+ // Difference between total length and length of original string
+ $diff = $length - strlen($str);
+
+ // Prepend the string
+ $prepend = str_repeat($prepend, ($diff / strlen($prepend) + 1));
+
+ // Make sure it will definedly fit
+ assert(strlen($prepend) >= $diff);
+
+ // Cut it a little down
+ $prepend = substr($prepend, 0, $diff);
+ //* DEBUG: */ $this->debugOutput('prepend('.strlen($prepend).')='.$prepend.',diff='.$diff.',length='.$length);
+
+ // Construct the final prepended string
+ $strFinal = $prepend . $str;
+ } // END - if
+
+ // Return it
+ return $strFinal;
+ }
+
+ /**
+ * Checks whether the given encoded data was encoded with Base64
+ *
+ * @param $encodedData Encoded data we shall check
+ * @return $isBase64 Whether the encoded data is Base64
+ */
+ protected function isBase64Encoded ($encodedData) {
+ // Determine it
+ $isBase64 = (@base64_decode($encodedData, true) !== false);
+
+ // Return it
+ return $isBase64;
+ }
+
+ /**
+ * "Getter" to get response/request type from analysis of the system.
+ *
+ * @return $responseType Analyzed response type
+ */
+ protected function getResponseTypeFromSystem () {
+ // Default is console
+ $responseType = 'console';
+
+ // Is 'HTTP_HOST' set?
+ if (isset($_SERVER['HTTP_HOST'])) {
+ // Then it is a HTTP response/request
+ $responseType = 'http';
+ } // END - if
+
+ // Return it
+ return $responseType;
+ }
+
+ /**
+ * Gets a cache key from Criteria instance
+ *
+ * @param $criteriaInstance An instance of a Criteria class
+ * @param $onlyKeys Only use these keys for a cache key
+ * @return $cacheKey A cache key suitable for lookup/storage purposes
+ */
+ protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
+ // Generate it
+ $cacheKey = sprintf("%s@%s",
+ $this->__toString(),
+ $criteriaInstance->getCacheKey($onlyKeys)
+ );
+
+ // And return it
+ //* NOISY-DEBUG: */ $this->debugOutput($this->__toString() . ': cacheKey=' . $cacheKey);
+ return $cacheKey;
+ }
+
+ /**
+ * Getter for startup time in miliseconds
+ *
+ * @return $startupTime Startup time in miliseconds
+ */
+ protected function getStartupTime () {
+ return self::$startupTime;
+ }
+
+ /**
+ * "Getter" for a printable currently execution time in nice braces
+ *
+ * @return $executionTime Current execution time in nice braces
+ */
+ protected function getPrintableExecutionTime () {
+ // Caculate the execution time
+ $executionTime = microtime(true) - $this->getStartupTime();
+
+ // Pack it in nice braces
+ $executionTime = sprintf('[ %01.5f ] ', $executionTime);
+
+ // And return it
+ return $executionTime;
+ }
+
+ /**
+ * Hashes a given string with a simple but stronger hash function (no salts)
+ *
+ * @param $str The string to be hashed
+ * @return $hash The hash from string $str
+ */
+ public function hashString ($str) {
+ // Hash given string with (better secure) hasher
+ $hash = mhash(MHASH_SHA256, $str);
+
+ // Return it
+ return $hash;
+ }
+
+ /**
+ * Checks whether the given number is really a number (only chars 0-9).
+ *
+ * @param $num A string consisting only chars between 0 and 9
+ * @param $castValue Whether to cast the value to double. Do only use this to secure numbers from Requestable classes.
+ * @param $assertMismatch Whether to assert mismatches
+ * @return $ret The (hopefully) secured numbered value
+ */
+ public function bigintval ($num, $castValue = true, $assertMismatch = false) {
+ // Filter all numbers out
+ $ret = preg_replace('/[^0123456789]/', '', $num);
+
+ // Shall we cast?
+ if ($castValue === true) {
+ // Cast to biggest numeric type
+ $ret = (double) $ret;
+ } // END - if
+
+ // Assert only if requested
+ if ($assertMismatch === true) {
+ // Has the whole value changed?
+ assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
+ } // END - if
+
+ // Return result
+ return $ret;
+ }
}
// [EOF]