X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=d42cfc3968cf0c06554df81e1d23c10c3dbb2015;hp=acea78ded4ebb8c49137d5e5648f86ea11c55906;hb=4d4f379499f2e2eb9061924c5576063a698ed88b;hpb=bfb4fbd86ac6561ce9ac7160e6ef05b1653c1e6a diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index acea78de..d42cfc39 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -5,7 +5,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007 - 2009 Roland Haeder, this is free software + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -23,75 +23,176 @@ * along with this program. If not, see . */ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { + /** + * The real class name + */ + private $realClass = 'BaseFrameworkSystem'; + /** * 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; + 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; /** - * The real class name + * 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 $realClass = "FrameworkSystem"; + private $protocolInstance = NULL; /** - * Thousands seperator + * A database wrapper instance */ - private $thousands = "."; // German + private $databaseInstance = NULL; /** - * Decimal seperator + * A helper instance for the form */ - private $decimals = ","; // German + 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; + + /** + * An instance of a database wrapper class + */ + private $wrapperInstance = NULL; + + /** + * Thousands separator + */ + private $thousands = '.'; // German + + /** + * Decimal separator + */ + private $decimals = ','; // German + + /** + * Socket resource + */ + private $socketResource = false; + + /** + * Package data + */ + 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; @@ -118,7 +219,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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; @@ -137,8 +238,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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; @@ -152,29 +252,54 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040; /** - * 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 + * 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 + ); + + /** + * 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' ); + /** + * Startup time in miliseconds + */ + private static $startupTime = 0; + /** * Protected super constructor * @@ -185,18 +310,23 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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 @@ -209,42 +339,63 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) { // Already destructed object $this->debugOutput(sprintf("[%s:] The object %s 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 @@ -255,42 +406,66 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { )); // 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 + )); + } + + /** + * Setter for the real class name + * + * @param $realClass Class name (string) + * @return void + */ + public final function setRealClass ($realClass) { + // Set real class + $this->realClass = (string) $realClass; } /** @@ -373,7 +548,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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) { @@ -383,7 +558,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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; @@ -403,11 +578,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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; } /** @@ -426,14 +601,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * @return $debugInstance Instance to class DebugConsoleOutput or DebugWebOutput */ public final function getDebugInstance () { + // Get debug instance $debugInstance = Registry::getRegistry()->getInstance('debug'); + + // Return it return $debugInstance; } /** * Setter for web output instance * - * @param $webInstance The instance for web output class + * @param $webInstance The instance for web output class * @return void */ public final function setWebOutputInstance (OutputStreamer $webInstance) { @@ -453,36 +631,30 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * 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('db_instance', $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('db_instance'); - } // END - if + // Get instance + $databaseInstance = Registry::getRegistry()->getInstance('db_instance'); // Return instance - return $dbInstance; + return $databaseInstance; } /** * Setter for compressor channel * - * @param $compressorInstance An instance of CompressorChannel + * @param $compressorInstance An instance of CompressorChannel * @return void */ public final function setCompressorChannel (CompressorChannel $compressorInstance) { @@ -558,275 +730,630 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * Getter for $realClass + * Private getter for language instance * - * @return $realClass The name of the real class (not BaseFrameworkSystem) + * @return $langInstance An instance to the language sub-system */ - public final function __toString () { - return $this->realClass; + protected final function getLanguageInstance () { + $langInstance = Registry::getRegistry()->getInstance('language'); + return $langInstance; } /** - * Setter for the real class name + * Setter for language instance * - * @param $realClass Class name (string) + * @param $langInstance An instance to the language sub-system * @return void + * @see LanguageSystem */ - public final function setRealClass ($realClass) { - // Cast to string - $realClass = (string) $realClass; - - // Set real class - $this->realClass = $realClass; + public final function setLanguageInstance (ManageableLanguage $langInstance) { + Registry::getRegistry()->addInstance('language', $langInstance); } /** - * Compare class name of this and given class name + * Private getter for file IO instance * - * @param $className The class name as string from the other class - * @return boolean The result of comparing both class names + * @return $fileIoInstance An instance to the file I/O sub-system */ - public final function isClass ($className) { - return ($this->__toString() == $className); + protected final function getFileIoInstance () { + return $this->fileIoInstance; } /** - * Stub method (only real cabins shall override it) + * Setter for file I/O instance * - * @return boolean false = is no cabin, true = is a cabin - * @deprecated + * @param $fileIoInstance An instance to the file I/O sub-system + * @return void */ - public function isCabin () { - return false; + public final function setFileIoInstance (FileIoHandler $fileIoInstance) { + $this->fileIoInstance = $fileIoInstance; } /** - * Stub method for tradeable objects + * Protected setter for user instance * - * @return boolean false = is not tradeable by the Merchant class, - * true = is a tradeable object - * @deprecated + * @param $userInstance An instance of a user class + * @return void */ - public function isTradeable () { - return false; + protected final function setUserInstance (ManageableAccount $userInstance) { + $this->userInstance = $userInstance; } /** - * Formats computer generated price values into human-understandable formats - * with thousand and decimal seperators. + * Getter for user instance * - * @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 - * is missing + * @return $userInstance An instance of a user class */ - 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); - } - - // Cast the number - $value = (float) $value; - - // Reformat the US number - $price = sprintf("%s %s", - number_format($value, $decNum, $this->decimals, $this->thousands), - $currency - ); - - // Return as string... - return $price; + public final function getUserInstance () { + return $this->userInstance; } /** - * Removes number formating characters + * Setter for controller instance (this surely breaks a bit the MVC patterm) * + * @param $controllerInstance An instance of the controller * @return void */ - public final function removeNumberFormaters () { - unset($this->thousands); - unset($this->decimals); + public final function setControllerInstance (Controller $controllerInstance) { + $this->controllerInstance = $controllerInstance; } /** - * Private getter for language instance + * Getter for controller instance (this surely breaks a bit the MVC patterm) * - * @return $langInstance An instance to the language sub-system + * @return $controllerInstance An instance of the controller */ - protected final function getLanguageInstance () { - $langInstance = Registry::getRegistry()->getInstance('language'); - return $langInstance; + public final function getControllerInstance () { + return $this->controllerInstance; } /** - * Setter for language instance + * Setter for RNG instance * - * @param $langInstance An instance to the language sub-system + * @param $rngInstance An instance of a random number generator (RNG) * @return void - * @see LanguageSystem */ - public final function setLanguageInstance (ManageableLanguage $langInstance) { - Registry::getRegistry()->addInstance('language', $langInstance); + protected final function setRngInstance (RandomNumberGenerator $rngInstance) { + $this->rngInstance = $rngInstance; } /** - * Remove the $systemClasses array from memory + * Getter for RNG instance * - * @return void + * @return $rngInstance An instance of a random number generator (RNG) */ - public final function removeSystemArray () { - unset($this->systemClasses); + public final function getRngInstance () { + return $this->rngInstance; } /** - * Appends a trailing slash to a string + * Setter for Cryptable instance * - * @param $str A string (maybe) without trailing slash - * @return $str A string with an auto-appended trailing slash + * @param $cryptoInstance An instance of a Cryptable class + * @return void */ - public final function addMissingTrailingSlash ($str) { - // Is there a trailing slash? - if (substr($str, -1, 1) != "/") $str .= "/"; - return $str; + protected final function setCryptoInstance (Cryptable $cryptoInstance) { + $this->cryptoInstance = $cryptoInstance; } /** - * Private getter for file IO instance + * Getter for Cryptable instance * - * @return $fileIoInstance An instance to the file I/O sub-system + * @return $cryptoInstance An instance of a Cryptable class */ - protected final function getFileIoInstance () { - return $this->fileIoInstance; + public final function getCryptoInstance () { + return $this->cryptoInstance; } /** - * Setter for file I/O instance + * Setter for the list instance * - * @param $fileIoInstance An instance to the file I/O sub-system + * @param $listInstance A list of Listable * @return void */ - public final function setFileIoInstance (FileIoHandler $fileIoInstance) { - $this->fileIoInstance = $fileIoInstance; + protected final function setListInstance (Listable $listInstance) { + $this->listInstance = $listInstance; } /** - * Prepare the template engine (WebTemplateEngine by default) for a given - * application helper instance (ApplicationHelper by default). + * Getter for the list instance * - * @param $appInstance 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 - * @throws NullPointerException If the discovered application - * instance is still null + * @return $listInstance A list of Listable */ - protected function prepareTemplateInstance (BaseFrameworkSystem $appInstance=null) { - // Is the application instance set? - if (is_null($appInstance)) { - // Get the current instance - $appInstance = $this->getApplicationInstance(); - - // Still null? - if (is_null($appInstance)) { - // 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())); - - // Return the prepared instance - return $templateInstance; + protected final function getListInstance () { + return $this->listInstance; } /** - * Debugs this instance by putting out it's full content + * Setter for the menu instance * - * @param $message Optional message to show in debug output + * @param $menuInstance A RenderableMenu instance * @return void */ - 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 = ""; + protected final function setMenuInstance (RenderableMenu $menuInstance) { + $this->menuInstance = $menuInstance; + } - // Is a message set? - if (!empty($message)) { - // Construct message - $content = sprintf("
Message: %s
\n", $message); - } // END - if + /** + * Getter for the menu instance + * + * @return $menuInstance A RenderableMenu instance + */ + protected final function getMenuInstance () { + return $this->menuInstance; + } - // Generate the output - $content .= sprintf("
%s
", - trim( - htmlentities( - print_r($this, true) - ) - ) - ); + /** + * Setter for image instance + * + * @param $imageInstance An instance of an image + * @return void + */ + public final function setImageInstance (BaseImage $imageInstance) { + $this->imageInstance = $imageInstance; + } - // Output it - ApplicationEntryPoint::app_die(sprintf("
%s debug output:
%s
\nLoaded includes:
%s
", - $this->__toString(), - $content, - ClassLoader::getInstance()->getPrintableIncludeList() - )); + /** + * Getter for image instance + * + * @return $imageInstance An instance of an image + */ + public final function getImageInstance () { + return $this->imageInstance; } /** - * Output a partial stub message for the caller method + * Setter for stacker instance * - * @param $message An optional message to display + * @param $stackerInstance An instance of an stacker * @return void */ - protected function partialStub ($message = "") { - // Get the backtrace - $backtrace = debug_backtrace(); + public final function setStackerInstance (Stackable $stackerInstance) { + $this->stackerInstance = $stackerInstance; + } - // Generate the class::method string - $methodName = "UnknownClass->unknownMethod"; + /** + * 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; + } + + + /** + * 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; + } + + /** + * Checks whether an object equals this object. You should overwrite this + * method to implement own equality checks + * + * @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() + )); + + // Return the result + return $equals; + } + + /** + * 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 $hashCode A generic hash code respresenting this whole class + */ + public function hashCode () { + // Simple hash code + return crc32($this->__toString()); + } + + /** + * Formats computer generated price values into human-understandable formats + * 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 MissingDecimalsThousandsSeparatorException If decimals or + * thousands separator + * is missing + */ + public function formatCurrency ($value, $currency = '€', $decNum = 2) { + // Are all required attriutes set? + if ((!isset($this->decimals)) || (!isset($this->thousands))) { + // Throw an exception + throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); + } // END - if + + // Cast the number + $value = (float) $value; + + // Reformat the US number + $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency; + + // Return as string... + return $price; + } + + /** + * 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 + */ + public final function addMissingTrailingSlash ($str) { + // Is there a trailing slash? + if (substr($str, -1, 1) != '/') { + $str .= '/'; + } // END - if + + // Return string with trailing slash + return $str; + } + + /** + * Prepare the template engine (WebTemplateEngine by default) for a given + * application helper instance (ApplicationHelper by default). + * + * @param $applicationInstance An application helper instance or + * null if we shall use the default + * @return $templateInstance The template engine instance + * @throws NullPointerException If the discovered application + * instance is still null + */ + protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) { + // Is the application instance set? + if (is_null($applicationInstance)) { + // Get the current instance + $applicationInstance = $this->getApplicationInstance(); + + // Still null? + if (is_null($applicationInstance)) { + // Thrown an exception + throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); + } // END - if + } // END - if + + // Initialize the template engine + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + + // Return the prepared instance + return $templateInstance; + } + + /** + * Debugs this instance by putting out it's full content + * + * @param $message Optional message to show in debug output + * @return void + */ + 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 = ''; + + // Is a message set? + if (!empty($message)) { + // Construct message + $content = sprintf("
Message: %s
\n", $message); + } // END - if + + // Generate the output + $content .= sprintf("
%s
", + trim( + htmlentities( + print_r($this, true) + ) + ) + ); + + // Output it + ApplicationEntryPoint::app_die(sprintf("
%s debug output:
%s
\nLoaded includes:
%s
", + $this->__toString(), + $content, + 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 = '') { + // Get the backtrace + $backtrace = debug_backtrace(); + + // Generate the class::method string + $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 - $stubMessage = sprintf("[%s:] Partial stub!", + $stubMessage = sprintf('[%s:] Partial stub!', $methodName ); // Is the extra message given? if (!empty($message)) { // Then add it as well - $stubMessage .= sprintf(" Message: %s", $message); + $stubMessage .= sprintf(' Message: %s', $message); } // END - if // Debug instance is there? @@ -835,28 +1362,39 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->debugOutput($stubMessage); } else { // Trigger an error - trigger_error($stubMessage."
\n"); + trigger_error($stubMessage . '
' . chr(10)); } } /** * Outputs a debug backtrace and stops further script execution * + * @param $message An optional message to output + * @param $doExit Whether exit the program (true is default) * @return void */ - public function debugBackTrace () { + public function debugBackTrace ($message = '', $doExit = true) { // Sorry, there is no other way getting this nice backtrace - print("
\n");
+		if (!empty($message)) {
+			// Output message
+			printf('Message: %s
' . chr(10), $message); + } // END - if + + print('
');
 		debug_print_backtrace();
-		print("
"); - exit(); + print('
'); + + // Exit program? + if ($doExit === true) { + exit(); + } // END - if } /** - * 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) { @@ -867,13 +1405,27 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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() !!! + /* + * BIG FAT NOTE: Do NEVER rewrite this to app_die(), this will + * cause an endless loop. + */ die($message); } } @@ -887,13 +1439,13 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ 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 @@ -902,6 +1454,20 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 * @@ -910,7 +1476,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ public function markupCode ($phpCode) { // Init marked code - $markedCode = ""; + $markedCode = ''; // Get last error $errorArray = error_get_last(); @@ -918,7 +1484,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Init the code with error message if (is_array($errorArray)) { // Get error infos - $markedCode = sprintf("
File: %s, Line: %s, Message: %s, Type: %s
", + $markedCode = sprintf('
File: %s, Line: %s, Message: %s, Type: %s
', basename($errorArray['file']), $errorArray['line'], $errorArray['message'], @@ -927,9 +1493,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // 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("%s: %s\n", + $markedCode .= sprintf('%s: %s' . chr(10), ($lineNo + 1), htmlentities($code, ENT_QUOTES) ); @@ -949,7 +1515,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ public function doFilterFormatTimestamp ($timestamp) { // Default value to return - $readable = "???"; + $readable = '???'; // Is the timestamp null? if (is_null($timestamp)) { @@ -957,14 +1523,14 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $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], @@ -977,13 +1543,35 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 * @@ -1025,7 +1613,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ public final function getField ($fieldName) { // Default field value - $fieldValue = null; + $fieldValue = NULL; // Get result instance $resultInstance = $this->getResultInstance(); @@ -1038,75 +1626,410 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Get current array $fieldArray = $resultInstance->current(); + //* DEBUG: */ $this->debugOutput($fieldName.':
'.print_r($fieldArray, true).'
'); // Does the field exist? if (isset($fieldArray[$fieldName])) { // Get it $fieldValue = $fieldArray[$fieldName]; - } // END - if + } else { + // Missing field entry, may require debugging + $this->debugOutput($this->__toString() . ':fieldname=' . $fieldName . ' not found!'); + } // Return it return $fieldValue; } /** - * Protected setter for user instance + * Flushs all pending updates to the database layer * - * @param $userInstance An instance of a user class * @return void */ - protected final function setUserInstance (ManageableAccount $userInstance) { - $this->userInstance = $userInstance; + 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 } /** - * Getter for user instance + * Outputs a deprecation warning to the developer. * - * @return $userInstance An instance of a user class + * @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 . "
\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 getUserInstance () { - return $this->userInstance; + public final function isPhpExtensionLoaded ($phpExtension) { + // Is it loaded? + $isLoaded = in_array($phpExtension, get_loaded_extensions()); + + // Return result + return $isLoaded; } /** - * Setter for controller instance (this surely breaks a bit the MVC patterm) + * "Getter" as a time() replacement but with milliseconds. You should use this + * method instead of the encapsulated getimeofday() function. * - * @param $controllerInstance An instance of the controller - * @return void + * @return $milliTime Timestamp with milliseconds */ - public final function setControllerInstance (Controller $controllerInstance) { - $this->controllerInstance = $controllerInstance; + public function getMilliTime () { + // Get the time of day as float + $milliTime = gettimeofday(true); + + // Return it + return $milliTime; } /** - * Getter for controller instance (this surely breaks a bit the MVC patterm) + * Idles (sleeps) for given milliseconds * - * @return $controllerInstance An instance of the controller + * @return $hasSlept Whether it goes fine */ - public final function getControllerInstance () { - return $this->controllerInstance; + 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; + } + /** + * 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: + * + * + * @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; } /** - * Flushs all pending updates to the database layer + * Converts even very large decimal numbers, also with negative sign, to a + * hexadecimal string. * - * @return void + * This work is based on comment #97756 on php.net documentation page at: + * + * + * @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 */ - public function flushPendingUpdates () { - // Get result instance - $resultInstance = $this->getResultInstance(); + protected function asc2dec ($asc) { + // Convert it into a hexadecimal number + $hex = bin2hex($asc); - // Do we have data to update? - if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) { - // Get wrapper class name config entry - $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry(); + // And back into a decimal number + $dec = $this->hex2dec($hex); - // Create object instance - $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry); + // Return it + return $dec; + } - // Yes, then send the whole result to the database layer - $wrapperInstance->doUpdateByResult($this->getResultInstance()); + /** + * 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; } }