Used more DatabaseWrapperFactory as one instance of each is fine.
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index ae19aeb4938c66af993788a76cfbd9016413b6a0..4205170200d1e544d6e3dfe34aa55a21350f6222 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -129,7 +129,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $parserInstance = NULL;
 
        /**
-        * A ProtocolHandler instance
+        * A HandleableProtocol instance
         */
        private $protocolInstance = NULL;
 
@@ -144,10 +144,15 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $helperInstance = NULL;
 
        /**
-        * An instance of a Sourceable class
+        * An instance of a Source class
         */
        private $sourceInstance = NULL;
 
+       /**
+        * An instance of a UrlSource class
+        */
+       private $urlSourceInstance = NULL;
+
        /**
         * An instance of a InputStream class
         */
@@ -199,10 +204,25 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $minableInstance = NULL;
 
        /**
-        * A Directory instance
+        * A FrameworkDirectory instance
         */
        private $directoryInstance = NULL;
 
+       /**
+        * Listener instance
+        */
+       private $listenerInstance = NULL;
+
+       /**
+        * An instance of a communicator
+        */
+       private $communicatorInstance = NULL;
+
+       /**
+        * State instance
+        */
+       private $stateInstance = NULL;
+
        /**
         * Thousands separator
         */
@@ -218,6 +238,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $socketResource = FALSE;
 
+       /**
+        * Regular expression to use for validation
+        */
+       private $regularExpression = '';
+
        /**
         * Package data
         */
@@ -228,6 +253,49 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $genericArray = array();
 
+       /**
+        * Command name
+        */
+       private $commandName = '';
+
+       /**
+        * Controller name
+        */
+       private $controllerName = '';
+
+       /**
+        * Name of used protocol
+        */
+       private $protocolName = 'invalid';
+
+       /**
+        * Array with bitmasks and such for pack/unpack methods to support both
+        * 32-bit and 64-bit systems
+        */
+       private $packingData = array(
+               32 => array(
+                       'step'   => 3,
+                       'left'   => 0xffff0000,
+                       'right'  => 0x0000ffff,
+                       'factor' => 16,
+                       'format' => 'II',
+               ),
+               64 => array(
+                       'step'   => 7,
+                       'left'   => 0xffffffff00000000,
+                       'right'  => 0x00000000ffffffff,
+                       'factor' => 32,
+                       'format' => 'NN'
+               )
+       );
+
+       /**
+        * Simple 64-bit check, thanks to "Salman A" from stackoverflow.com:
+        *
+        * The integer size is 4 bytes on 32-bit and 8 bytes on a 64-bit system.
+        */
+       private $archArrayElement = FALSE;
+
        /***********************
         * Exception codes.... *
         ***********************/
@@ -288,9 +356,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        const EXCEPTION_FATAL_ERROR                  = 0x035;
        const EXCEPTION_FILE_NOT_FOUND               = 0x036;
        const EXCEPTION_ASSERTION_FAILED             = 0x037;
-       const EXCEPTION_FILE_CANNOT_BE_READ          = 0x038;
-       const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
-       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x03a;
+       const EXCEPTION_FILE_NOT_REACHABLE           = 0x038;
+       const EXCEPTION_FILE_CANNOT_BE_READ          = 0x039;
+       const EXCEPTION_FILE_CANNOT_BE_WRITTEN       = 0x03a;
+       const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x03b;
+       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x03c;
 
        /**
         * Hexadecimal->Decimal translation array
@@ -362,6 +432,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        // Then set it
                        self::$startupTime = microtime(TRUE);
                } // END - if
+
+               // Set array element
+               $this->archArrayElement = (PHP_INT_SIZE === 8 ? 64 : 32);
        }
 
        /**
@@ -412,10 +485,13 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Init argument string
                $argsString = '';
 
-               // Is it empty or an array?
-               if (empty($args)) {
+               // Is it NULL, empty or an array?
+               if (is_null($args)) {
                        // No arguments
                        $argsString = 'NULL';
+               } elseif (empty($args)) {
+                       // Empty arguments
+                       $argsString = '(empty)';
                } elseif (is_array($args)) {
                        // Some arguments are there
                        foreach ($args as $arg) {
@@ -477,7 +553,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch setting of missing but set class fields/attributes
+        * Magic method to catch setting of missing but set class fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @param       $value  Value to store
@@ -492,7 +568,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch getting of missing fields/attributes
+        * Magic method to catch getting of missing fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @return      void
@@ -504,7 +580,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch unsetting of missing fields/attributes
+        * Magic method to catch unsetting of missing fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @return      void
@@ -515,6 +591,36 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                ));
        }
 
+       /**
+        * Magic method to catch object serialization
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __sleep () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
+       /**
+        * Magic method to catch object deserialization
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __wakeup () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
+       /**
+        * Magic method to catch calls when an object instance is called
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __invoke () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
        /**
         * Setter for the real class name
         *
@@ -1018,19 +1124,19 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Setter for ProtocolHandler instance
+        * Setter for HandleableProtocol instance
         *
-        * @param       $protocolInstance       An instance of an ProtocolHandler
+        * @param       $protocolInstance       An instance of an HandleableProtocol
         * @return      void
         */
-       public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) {
+       public final function setProtocolInstance (HandleableProtocol $protocolInstance) {
                $this->protocolInstance = $protocolInstance;
        }
 
        /**
-        * Getter for ProtocolHandler instance
+        * Getter for HandleableProtocol instance
         *
-        * @return      $protocolInstance       An instance of an ProtocolHandler
+        * @return      $protocolInstance       An instance of an HandleableProtocol
         */
        public final function getProtocolInstance () {
                return $this->protocolInstance;
@@ -1076,6 +1182,27 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                return $this->socketResource;
        }
 
+       /**
+        * Setter for regular expression
+        *
+        * @param       $regularExpression      A valid regular expression
+        * @return      void
+        */
+       public final function setRegularExpression ($regularExpression) {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': regularExpression=' . $regularExpression . ',previous[' . gettype($this->regularExpression) . ']=' . $this->regularExpression);
+               $this->regularExpression = $regularExpression;
+       }
+
+       /**
+        * Getter for regular expression
+        *
+        * @return      $regularExpression      A valid regular expression
+        */
+       public final function getRegularExpression () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': regularExpression[' . gettype($this->regularExpression) . ']=' . $this->regularExpression);
+               return $this->regularExpression;
+       }
+
        /**
         * Setter for helper instance
         *
@@ -1096,24 +1223,43 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Setter for a Sourceable instance
+        * Setter for a Source instance
         *
-        * @param       $sourceInstance The Sourceable instance
+        * @param       $sourceInstance         An instance of a Source class
         * @return      void
         */
-       protected final function setSourceInstance (Sourceable $sourceInstance) {
+       protected final function setSourceInstance (Source $sourceInstance) {
                $this->sourceInstance = $sourceInstance;
        }
 
        /**
-        * Getter for a Sourceable instance
+        * Getter for a Source instance
         *
-        * @return      $sourceInstance The Sourceable instance
+        * @return      $sourceInstance         An instance of a Source class
         */
        protected final function getSourceInstance () {
                return $this->sourceInstance;
        }
 
+       /**
+        * Setter for a UrlSource instance
+        *
+        * @param       $sourceInstance         An instance of a UrlSource class
+        * @return      void
+        */
+       protected final function setUrlSourceInstance (UrlSource $urlSourceInstance) {
+               $this->urlSourceInstance = $urlSourceInstance;
+       }
+
+       /**
+        * Getter for a UrlSource instance
+        *
+        * @return      $urlSourceInstance              An instance of a UrlSource class
+        */
+       protected final function getUrlSourceInstance () {
+               return $this->urlSourceInstance;
+       }
+
        /**
         * Getter for a InputStream instance
         *
@@ -1249,24 +1395,40 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Setter for InputOutputPointer instance
+        * Setter for FilePointer instance
         *
-        * @param       $pointerInstance        An instance of an InputOutputPointer class
+        * @param       $pointerInstance        An instance of an FilePointer class
         * @return      void
         */
-       protected final function setPointerInstance (InputOutputPointer $pointerInstance) {
+       protected final function setPointerInstance (FilePointer $pointerInstance) {
                $this->pointerInstance = $pointerInstance;
        }
 
        /**
-        * Getter for InputOutputPointer instance
+        * Getter for FilePointer instance
         *
-        * @return      $pointerInstance        An instance of an InputOutputPointer class
+        * @return      $pointerInstance        An instance of an FilePointer class
         */
        public final function getPointerInstance () {
                return $this->pointerInstance;
        }
 
+       /**
+        * Unsets pointer instance which triggers a call of __destruct() if the
+        * instance is still there. This is surely not fatal on already "closed"
+        * file pointer instances.
+        *
+        * I don't want to mess around with above setter by giving it a default
+        * value NULL as setter should always explicitly only set (existing) object
+        * instances and NULL is NULL.
+        *
+        * @return      void
+        */
+       protected final function unsetPointerInstance () {
+               // Simply it to NULL
+               $this->pointerInstance = NULL;
+       }
+
        /**
         * Setter for Indexable instance
         *
@@ -1325,24 +1487,138 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Setter for Directory instance
+        * Setter for FrameworkDirectory instance
         *
         * @param       $directoryInstance      A FrameworkDirectoryPointer instance
         * @return      void
         */
-       protected final function setDirectoryInstance (Directory $directoryInstance) {
+       protected final function setDirectoryInstance (FrameworkDirectory $directoryInstance) {
                $this->directoryInstance = $directoryInstance;
        }
 
        /**
-        * Getter for directory instance
+        * Getter for FrameworkDirectory instance
         *
-        * @return      $directoryInstance      A Directory instance
+        * @return      $directoryInstance      A FrameworkDirectory instance
         */
        protected final function getDirectoryInstance () {
                return $this->directoryInstance;
        }
 
+       /**
+        * Setter for listener instance
+        *
+        * @param       $listenerInstance       A Listenable instance
+        * @return      void
+        */
+       protected final function setListenerInstance (Listenable $listenerInstance) {
+               $this->listenerInstance = $listenerInstance;
+       }
+
+       /**
+        * Getter for listener instance
+        *
+        * @return      $listenerInstance       A Listenable instance
+        */
+       protected final function getListenerInstance () {
+               return $this->listenerInstance;
+       }
+
+       /**
+        * Getter for communicator instance
+        *
+        * @return      $communicatorInstance   An instance of a Communicator class
+        */
+       public final function getCommunicatorInstance () {
+               return $this->communicatorInstance;
+       }
+
+       /**
+        * Setter for communicator instance
+        *
+        * @param       $communicatorInstance   An instance of a Communicator class
+        * @return      void
+        */
+       protected final function setCommunicatorInstance (Communicator $communicatorInstance) {
+               $this->communicatorInstance = $communicatorInstance;
+       }
+
+       /**
+        * Setter for state instance
+        *
+        * @param       $stateInstance  A Stateable instance
+        * @return      void
+        */
+       public final function setStateInstance (Stateable $stateInstance) {
+               $this->stateInstance = $stateInstance;
+       }
+
+       /**
+        * Getter for state instance
+        *
+        * @return      $stateInstance  A Stateable instance
+        */
+       public final function getStateInstance () {
+               return $this->stateInstance;
+       }
+
+       /**
+        * Setter for command name
+        *
+        * @param       $commandName    Last validated command name
+        * @return      void
+        */
+       protected final function setCommandName ($commandName) {
+               $this->commandName = $commandName;
+       }
+
+       /**
+        * Getter for command name
+        *
+        * @return      $commandName    Last validated command name
+        */
+       protected final function getCommandName () {
+               return $this->commandName;
+       }
+
+       /**
+        * Setter for controller name
+        *
+        * @param       $controllerName Last validated controller name
+        * @return      void
+        */
+       protected final function setControllerName ($controllerName) {
+               $this->controllerName = $controllerName;
+       }
+
+       /**
+        * Getter for controller name
+        *
+        * @return      $controllerName Last validated controller name
+        */
+       protected final function getControllerName () {
+               return $this->controllerName;
+       }
+
+       /**
+        * Getter for protocol name
+        *
+        * @return      $protocolName   Name of used protocol
+        */
+       public final function getProtocolName () {
+               return $this->protocolName;
+       }
+
+       /**
+        * Setter for protocol name
+        *
+        * @param       $protocolName   Name of used protocol
+        * @return      void
+        */
+       protected final function setProtocolName ($protocolName) {
+               $this->protocolName = $protocolName;
+       }
+
        /**
         * Checks whether an object equals this object. You should overwrite this
         * method to implement own equality checks
@@ -1419,7 +1695,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Prepare the template engine (WebTemplateEngine by default) for a given
+        * Prepare the template engine (HtmlTemplateEngine by default) for a given
         * application helper instance (ApplicationHelper by default).
         *
         * @param               $applicationInstance    An application helper instance or
@@ -1442,7 +1718,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } // END - if
 
                // Initialize the template engine
-               $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class');
+               $templateInstance = ObjectFactory::createObjectByConfiguredName('html_template_class');
 
                // Return the prepared instance
                return $templateInstance;
@@ -1580,7 +1856,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        // Try it
                        try {
                                // Get a debugger instance
-                               $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class'));
+                               $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_' . self::getResponseTypeFromSystem() . '_class'));
                        } catch (NullPointerException $e) {
                                // Didn't work, no instance there
                                exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
@@ -1666,12 +1942,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $str            The string, what ever it is needs to be converted
         * @return      $className      Generated class name
         */
-       public function convertToClassName ($str) {
+       public static final function convertToClassName ($str) {
                // Init class name
                $className = '';
 
                // Convert all dashes in underscores
-               $str = $this->convertDashesToUnderscores($str);
+               $str = self::convertDashesToUnderscores($str);
 
                // Now use that underscores to get classname parts for hungarian style
                foreach (explode('_', $str) as $strPart) {
@@ -1689,7 +1965,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $str    The string with maybe dashes inside
         * @return      $str    The converted string with no dashed, but underscores
         */
-       public final function convertDashesToUnderscores ($str) {
+       public static final function convertDashesToUnderscores ($str) {
                // Convert them all
                $str = str_replace('-', '_', $str);
 
@@ -1810,7 +2086,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected final function getDatabaseEntry () {
                // Is there an instance?
-               if (is_null($this->getResultInstance())) {
+               if (!$this->getResultInstance() instanceof SearchableResult) {
                        // Throw an exception here
                        throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
                } // END - if
@@ -1820,7 +2096,8 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 
                // Do we have an entry?
                if ($this->getResultInstance()->valid() === FALSE) {
-                       throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
+                       // @TODO Move the constant to e.g. BaseDatabaseResult when there is a non-cached database result available
+                       throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), CachedDatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
                } // END - if
 
                // Get next entry
@@ -1858,21 +2135,55 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, TRUE).'</pre>');
 
                // Convert dashes to underscore
-               $fieldName = $this->convertDashesToUnderscores($fieldName);
+               $fieldName2 = self::convertDashesToUnderscores($fieldName);
 
                // Does the field exist?
-               if (isset($fieldArray[$fieldName])) {
+               if ($this->isFieldSet($fieldName)) {
                        // Get it
-                       $fieldValue = $fieldArray[$fieldName];
+                       $fieldValue = $fieldArray[$fieldName2];
+               } elseif (defined('DEVELOPER')) {
+                       // Missing field entry, may require debugging
+                       self::createDebugInstance(__CLASS__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldArray<pre>=' . print_r($fieldArray, TRUE) . '</pre>,fieldName=' . $fieldName . ' not found!');
                } else {
                        // Missing field entry, may require debugging
-                       self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ':fieldname=' . $fieldName . ' not found!');
+                       self::createDebugInstance(__CLASS__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . ']:fieldName=' . $fieldName . ' not found!');
                }
 
                // Return it
                return $fieldValue;
        }
 
+       /**
+        * Checks if given field is set
+        *
+        * @param       $fieldName      Field name to check
+        * @return      $isSet          Whether the given field name is set
+        * @throws      NullPointerException    If the result instance is null
+        */
+       public function isFieldSet ($fieldName) {
+               // Get result instance
+               $resultInstance = $this->getResultInstance();
+
+               // Is this instance null?
+               if (is_null($resultInstance)) {
+                       // Then the user instance is no longer valid (expired cookies?)
+                       throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
+               } // END - if
+
+               // Get current array
+               $fieldArray = $resultInstance->current();
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('[' . $this->__toString() . ':' . __LINE__ . '] fieldName=' . $fieldName . ',fieldArray=<pre>'.print_r($fieldArray, TRUE).'</pre>');
+
+               // Convert dashes to underscore
+               $fieldName = self::convertDashesToUnderscores($fieldName);
+
+               // Determine it
+               $isSet = isset($fieldArray[$fieldName]);
+
+               // Return result
+               return $isSet;
+       }
+
        /**
         * Flushs all pending updates to the database layer
         *
@@ -1888,7 +2199,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry();
 
                        // Create object instance
-                       $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry);
+                       $wrapperInstance = DatabaseWrapperFactory::createWrapperByConfiguredName($configEntry);
 
                        // Yes, then send the whole result to the database layer
                        $wrapperInstance->doUpdateByResult($this->getResultInstance());
@@ -2132,14 +2443,17 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         *
         * @return      $responseType   Analyzed response type
         */
-       protected function getResponseTypeFromSystem () {
+       protected static 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';
+                       /*
+                        * Then it is a HTML response/request as RSS and so on may be
+                        * transfered over HTTP as well.
+                        */
+                       $responseType = 'html';
                } // END - if
 
                // Return it
@@ -2858,6 +3172,28 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                return $isValid;
        }
 
+       /**
+        * Initializes the web output instance
+        *
+        * @return      void
+        */
+       protected function initWebOutputInstance () {
+               // Get application instance
+               $applicationInstance = Registry::getRegistry()->getInstance('app');
+
+               // Is this a response instance?
+               if ($this instanceof Responseable) {
+                       // Then set it in application instance
+                       $applicationInstance->setResponseInstance($this);
+               } // END - if
+
+               // Init web output instance
+               $outputInstance = ObjectFactory::createObjectByConfiguredName('output_class', array($applicationInstance));
+
+               // Set it locally
+               $this->setWebOutputInstance($outputInstance);
+       }
+
        /**
         * Translates boolean TRUE to 'Y' and FALSE to 'N'
         *
@@ -2874,6 +3210,126 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // ... and return it
                return $translated;
        }
+
+       /**
+        * Encodes raw data (almost any type) by "serializing" it and then pack it
+        * into a "binary format".
+        *
+        * @param       $rawData        Raw data (almost any type)
+        * @return      $encoded        Encoded data
+        */
+       protected function encodeData ($rawData) {
+               // Make sure no objects or resources pass through
+               assert(!is_object($rawData));
+               assert(!is_resource($rawData));
+
+               // First "serialize" it (json_encode() is faster than serialize())
+               $encoded = $this->packString(json_encode($rawData));
+
+               // And return it
+               return $encoded;
+       }
+
+       /**
+        * Pack a string into a "binary format". Please execuse me that this is
+        * widely undocumented. :-(
+        *
+        * @param       $str            Unpacked string
+        * @return      $packed         Packed string
+        * @todo        Improve documentation
+        */
+       protected function packString ($str) {
+               // Debug message
+               //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('str=' . $str . ' - CALLED!');
+
+               // First compress the string (gzcompress is okay)
+               $str = gzcompress($str);
+
+               // Init variable
+               $packed = '';
+
+               // And start the "encoding" loop
+               for ($idx = 0; $idx < strlen($str); $idx += $this->packingData[$this->archArrayElement]['step']) {
+                       $big = 0;
+                       for ($i = 0; $i < $this->packingData[$this->archArrayElement]['step']; $i++) {
+                               $factor = ($this->packingData[$this->archArrayElement]['step'] - 1 - $i);
+
+                               if (($idx + $i) <= strlen($str)) {
+                                       $ord = ord(substr($str, ($idx + $i), 1));
+
+                                       $add = $ord * pow(256, $factor);
+
+                                       $big += $add;
+
+                                       //print 'idx=' . $idx . ',i=' . $i . ',ord=' . $ord . ',factor=' . $factor . ',add=' . $add . ',big=' . $big . PHP_EOL;
+                               } // END - if
+                       } // END - for
+
+                       $l = ($big & $this->packingData[$this->archArrayElement]['left']) >>$this->packingData[$this->archArrayElement]['factor'];
+                       $r = $big & $this->packingData[$this->archArrayElement]['right'];
+
+                       $chunk = str_pad(pack($this->packingData[$this->archArrayElement]['format'], $l, $r), 8, '0', STR_PAD_LEFT);
+                       //* NOISY-DEBUG */ print 'big=' . $big . ',chunk('.strlen($chunk) . ')='.md5($chunk).PHP_EOL;
+
+                       $packed .= $chunk;
+               } // END - for
+
+               // Return it
+               //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('packed=' . $packed . ' - EXIT!');
+               return $packed;
+       }
+
+       /**
+        * Checks whether the given file/path is in open_basedir(). This does not
+        * gurantee that the file is actually readable and/or writeable. If you need
+        * such gurantee then please use isReadableFile() instead.
+        *
+        * @param       $filePathName   Name of the file/path to be checked
+        * @return      $isReachable    Whether it is within open_basedir()
+        */
+       public static function isReachableFilePath ($filePathName) {
+               // Is not reachable by default
+               $isReachable = FALSE;
+
+               // Get open_basedir parameter
+               $openBaseDir = ini_get('open_basedir');
+
+               // Is it set?
+               if (!empty($openBaseDir)) {
+                       // Check all entries
+                       foreach (explode(PATH_SEPARATOR, $openBaseDir) as $dir) {
+                               // Check on existence
+                               if (substr($filePathName, 0, strlen($dir)) == $dir) {
+                                       // Is reachable
+                                       $isReachable = TRUE;
+                               } // END - if
+                       } // END - foreach
+               } else {
+                       // If open_basedir is not set, all is allowed
+                       $isReachable = TRUE;
+               }
+
+               // Return status
+               return $isReachable;
+       }
+
+       /**
+        * Checks whether the give file is within open_basedir() (done by
+        * isReachableFilePath()), is actually a file and is readable.
+        *
+        * @param       $fileName               Name of the file to be checked
+        * @return      $isReadable             Whether the file is readable (and therefor exists)
+        */
+       public static function isReadableFile ($fileName) {
+               // Default is not readable
+               $isReadable = FALSE;
+
+               // Is within parameters, so check if it is a file and readable
+               $isReadable = ((self::isReachableFilePath($fileName)) && (file_exists($fileName)) && (is_file($fileName)) && (is_readable($fileName)));
+
+               // Return status
+               return $isReadable;
+       }
 }
 
 // [EOF]