X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fclass_BaseFrameworkSystem.php;h=7381073394eb646494a00c1563819eaf651bc5fd;hp=68fd9c69307a2c31afbff2c0831aeb6b5a21d97c;hb=ecf78b6c5d2d935ee62ea5f1deb018f2bd9106a4;hpb=ac03a19e29da74f91113fc6b5ba03883832c5684 diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 68fd9c69..73810733 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, 2008 Roland Haeder, 2009, 2010 Core Developer Team + * @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 * @@ -78,6 +78,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ private $rngInstance = null; + /** + * Instance of a crypto helper + */ + private $cryptoInstance = null; + /** * Instance of an Iterator class */ @@ -123,6 +128,26 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ 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; + /** * The real class name */ @@ -151,6 +176,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /*********************** * Exception codes.... * ***********************/ + // @todo Try to clean these constants up const EXCEPTION_IS_NULL_POINTER = 0x001; const EXCEPTION_IS_NO_OBJECT = 0x002; @@ -197,8 +223,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; @@ -211,6 +236,46 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 + ); + + // 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' + ); + /** * Protected super constructor * @@ -221,9 +286,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Set real class $this->setRealClass($className); - // Set configuration instance if no registry + // Set configuration instance if no registry ... if (!$this instanceof Register) { - // Because registries doesn't need to be configured + // ... because registries doesn't need to be configured $this->setConfigInstance(FrameworkConfiguration::getInstance()); } // END - if } @@ -232,7 +297,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * Destructor reached... * * @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 @@ -252,8 +316,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } /** - * 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) { @@ -269,7 +335,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $argsString .= $this->replaceControlCharacters($arg) . ' (' . gettype($arg); // Add length if type is string - if (gettype($arg) == 'string') $argsString .= ', '.strlen($arg); + if (is_string($arg)) { + $argsString .= ', '.strlen($arg); + } // END - if // Closing bracket $argsString .= '), '; @@ -295,6 +363,54 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { return null; } + /** + * Getter for $realClass + * + * @return $realClass The name of the real class (not BaseFrameworkSystem) + */ + public function __toString () { + return $this->realClass; + } + + /** + * 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 + */ + 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 database result instance * @@ -375,7 +491,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) { @@ -385,7 +501,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; @@ -458,8 +574,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { /** * Setter for database instance * - * @param $dbInstance The instance for the database connection - * (forced DatabaseConnection) + * @param $dbInstance The instance for the database connection (forced DatabaseConnection) * @return void */ public final function setDatabaseInstance (DatabaseConnection $dbInstance) { @@ -557,15 +672,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { return $this->responseInstance; } - /** - * Getter for $realClass - * - * @return $realClass The name of the real class (not BaseFrameworkSystem) - */ - public function __toString () { - return $this->realClass; - } - /** * Setter for the real class name * @@ -596,7 +702,18 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { )); // Return the result - return $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()); } /** @@ -616,7 +733,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { if ((!isset($this->decimals)) || (!isset($this->thousands))) { // Throw an exception throw new MissingDecimalsThousandsSeperatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING); - } + } // END - if // Cast the number $value = (float) $value; @@ -657,7 +774,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { */ 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; } @@ -684,42 +805,27 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { * 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 (FrameworkInterface $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 - // 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('web_template_class', array($appInstance)); + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); // Return the prepared instance return $templateInstance; @@ -793,7 +899,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // 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 @@ -813,17 +919,23 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->debugOutput($stubMessage); } else { // Trigger an error - trigger_error($stubMessage."
\n"); + trigger_error($stubMessage . "
\n"); } } /** * 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 + if (!empty($message)) { + // Output message + printf("Message: %s
\n", $message); + } // END - if + print("
\n");
 		debug_print_backtrace();
 		print("
"); @@ -845,7 +957,11 @@ 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 === true) { @@ -1140,7 +1256,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->debugOutput($message); } else { // Trigger an error - trigger_error($message."
\n"); + trigger_error($message . "
\n"); } } else { // @TODO Finish this part! @@ -1148,17 +1264,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } } - /** - * 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()); - } - /** * Checks wether the given PHP extension is loaded * @@ -1192,6 +1297,25 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 * @@ -1422,6 +1546,73 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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 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 raw package Data * @@ -1440,6 +1631,177 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { 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: + * + * + * @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: + * + * + * @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; + } } // [EOF]