And another one needs to be removed.
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index d146ed4b2202a64e491c1502a1ddfcf6caa00779..29d5459ceecb3a56194ca8a5e91f09930a3ba64f 100644 (file)
@@ -3,11 +3,11 @@
  * The simulator system class is the super class of all other classes. This
  * class handles saving of games etc.
  *
- * @author             Roland Haeder <webmaster@ship-simu.org>
+ * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
- * @link               http://www.ship-simu.org
+ * @link               http://www.shipsimu.org
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
+       /**
+        * Length of count
+        */
+       const LENGTH_COUNT = 20;
+
+       /**
+        * Length of position
+        */
+       const LENGTH_POSITION = 20;
+
        /**
         * The real class name
         */
@@ -144,12 +154,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        private $sourceInstance = NULL;
 
        /**
-        * An instance of a InputStreamable class
+        * An instance of a InputStream class
         */
        private $inputStreamInstance = NULL;
 
        /**
-        * An instance of a OutputStreamable class
+        * An instance of a OutputStream class
         */
        private $outputStreamInstance = NULL;
 
@@ -173,6 +183,16 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $wrapperInstance = NULL;
 
+       /**
+        * An instance of a file I/O pointer class (not handler)
+        */
+       private $pointerInstance = NULL;
+
+       /**
+        * An instance of an index
+        */
+       private $indexInstance = NULL;
+
        /**
         * Thousands separator
         */
@@ -198,6 +218,41 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $genericArray = array();
 
+       /**
+        * Length of output from hash()
+        */
+       private static $hashLength = NULL;
+
+       /**
+        * Counter for total entries
+        */
+       private $totalEntries = 0;
+
+       /**
+        * Current seek position
+        */
+       private $seekPosition = 0;
+
+       /**
+        * Size of header
+        */
+       private $headerSize = 0;
+
+       /**
+        * File header
+        */
+       private $header = array();
+
+       /**
+        * Seek positions for gaps ("fragmentation")
+        */
+       private $gaps = array();
+
+       /**
+        * Seek positions for damaged entries (e.g. mismatching hash sum, ...)
+        */
+       private $damagedEntries = array();
+
        /***********************
         * Exception codes.... *
         ***********************/
@@ -249,6 +304,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        const EXCEPTION_ARRAY_ELEMENTS_MISSING       = 0x02c;
        const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED  = 0x02d;
        const EXCEPTION_UNSPPORTED_OPERATION         = 0x02e;
+       const EXCEPTION_FACTORY_REQUIRE_PARAMETER    = 0x02f;
        const EXCEPTION_MISSING_ELEMENT              = 0x030;
        const EXCEPTION_HEADERS_ALREADY_SENT         = 0x031;
        const EXCEPTION_DEFAULT_CONTROLLER_GONE      = 0x032;
@@ -259,7 +315,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        const EXCEPTION_ASSERTION_FAILED             = 0x037;
        const EXCEPTION_FILE_CANNOT_BE_READ          = 0x038;
        const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
-       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x040;
+       const EXCEPTION_FILTER_CHAIN_INTERCEPTED     = 0x03a;
 
        /**
         * Hexadecimal->Decimal translation array
@@ -326,10 +382,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        $this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
                } // END - if
 
-               // Is the startup time set? (0 cannot be true anymore)
+               // Is the startup time set? (0 cannot be TRUE anymore)
                if (self::$startupTime == 0) {
                        // Then set it
-                       self::$startupTime = microtime(true);
+                       self::$startupTime = microtime(TRUE);
                } // END - if
        }
 
@@ -348,10 +404,14 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        $this->setRealClass('DestructedObject');
                } elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) {
                        // Already destructed object
-                       self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[%s:] The object <span class=\"object_name\">%s</span> is already destroyed.",
+                       self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:] The object <span class="object_name">%s</span> is already destroyed.',
                                __CLASS__,
                                $this->__toString()
                        ));
+               } else {
+                       // Do not call this twice
+                       trigger_error(__METHOD__ . ': Called twice.');
+                       exit;
                }
        }
 
@@ -401,11 +461,11 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                                        // .. or size if array
                                        $argsString .= ', ' . count($arg);
                                } elseif ($arg === TRUE) {
-                                       // ... is boolean 'true'
-                                       $argsString .= ', true';
+                                       // ... is boolean 'TRUE'
+                                       $argsString .= ', TRUE';
                                } elseif ($arg === FALSE) {
-                                       // ... is boolean 'true'
-                                       $argsString .= ', false';
+                                       // ... is boolean 'FALSE'
+                                       $argsString .= ', FALSE';
                                }
 
                                // Closing bracket
@@ -423,7 +483,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 
                // Output stub message
                // @TODO __CLASS__ does always return BaseFrameworkSystem but not the extending (=child) class
-               self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[unknown::%s:] Stub! Args: %s",
+               self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[unknown::%s:] Stub! Args: %s',
                        $methodName,
                        $argsString
                ));
@@ -449,7 +509,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      void
         */
        public final function __set ($name, $value) {
-               $this->debugBackTrace(sprintf("Tried to set a missing field. name=%s, value[%s]=%s",
+               $this->debugBackTrace(sprintf('Tried to set a missing field. name=%s, value[%s]=%s',
                        $name,
                        gettype($value),
                        $value
@@ -463,7 +523,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      void
         */
        public final function __get ($name) {
-               $this->debugBackTrace(sprintf("Tried to get a missing field. name=%s",
+               $this->debugBackTrace(sprintf('Tried to get a missing field. name=%s',
                        $name
                ));
        }
@@ -475,7 +535,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      void
         */
        public final function __unset ($name) {
-               $this->debugBackTrace(sprintf("Tried to unset a missing field. name=%s",
+               $this->debugBackTrace(sprintf('Tried to unset a missing field. name=%s',
                        $name
                ));
        }
@@ -1080,40 +1140,40 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Getter for a InputStreamable instance
+        * Getter for a InputStream instance
         *
-        * @param       $inputStreamInstance    The InputStreamable instance
+        * @param       $inputStreamInstance    The InputStream instance
         */
        protected final function getInputStreamInstance () {
                return $this->inputStreamInstance;
        }
 
        /**
-        * Setter for a InputStreamable instance
+        * Setter for a InputStream instance
         *
-        * @param       $inputStreamInstance    The InputStreamable instance
+        * @param       $inputStreamInstance    The InputStream instance
         * @return      void
         */
-       protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) {
+       protected final function setInputStreamInstance (InputStream $inputStreamInstance) {
                $this->inputStreamInstance = $inputStreamInstance;
        }
 
        /**
-        * Getter for a OutputStreamable instance
+        * Getter for a OutputStream instance
         *
-        * @param       $outputStreamInstance   The OutputStreamable instance
+        * @param       $outputStreamInstance   The OutputStream instance
         */
        protected final function getOutputStreamInstance () {
                return $this->outputStreamInstance;
        }
 
        /**
-        * Setter for a OutputStreamable instance
+        * Setter for a OutputStream instance
         *
-        * @param       $outputStreamInstance   The OutputStreamable instance
+        * @param       $outputStreamInstance   The OutputStream instance
         * @return      void
         */
-       protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
+       protected final function setOutputStreamInstance (OutputStream $outputStreamInstance) {
                $this->outputStreamInstance = $outputStreamInstance;
        }
 
@@ -1213,6 +1273,44 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                return $this->iteratorInstance;
        }
 
+       /**
+        * Setter for InputOutputPointer instance
+        *
+        * @param       $pointerInstance        An instance of an InputOutputPointer class
+        * @return      void
+        */
+       protected final function setPointerInstance (InputOutputPointer $pointerInstance) {
+               $this->pointerInstance = $pointerInstance;
+       }
+
+       /**
+        * Getter for InputOutputPointer instance
+        *
+        * @return      $pointerInstance        An instance of an InputOutputPointer class
+        */
+       public final function getPointerInstance () {
+               return $this->pointerInstance;
+       }
+
+       /**
+        * Setter for Indexable instance
+        *
+        * @param       $indexInstance  An instance of an Indexable class
+        * @return      void
+        */
+       protected final function setIndexInstance (Indexable $indexInstance) {
+               $this->indexInstance = $indexInstance;
+       }
+
+       /**
+        * Getter for Indexable instance
+        *
+        * @return      $indexInstance  An instance of an Indexable class
+        */
+       public final function getIndexInstance () {
+               return $this->indexInstance;
+       }
+
        /**
         * Checks whether an object equals this object. You should overwrite this
         * method to implement own equality checks
@@ -1334,20 +1432,20 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // Is a message set?
                if (!empty($message)) {
                        // Construct message
-                       $content = sprintf("<div class=\"debug_message\">Message: %s</div>\n", $message);
+                       $content = sprintf('<div class="debug_message">Message: %s</div>' . PHP_EOL, $message);
                } // END - if
 
                // Generate the output
-               $content .= sprintf("<pre>%s</pre>",
+               $content .= sprintf('<pre>%s</pre>',
                        trim(
                                htmlentities(
-                                       print_r($this, true)
+                                       print_r($this, TRUE)
                                )
                        )
                );
 
                // Output it
-               ApplicationEntryPoint::app_exit(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
+               ApplicationEntryPoint::app_exit(sprintf('<div class="debug_header">%s debug output:</div><div class="debug_content">%s</div>Loaded includes: <div class="debug_include_list">%s</div>',
                        $this->__toString(),
                        $content,
                        ClassLoader::getSelfInstance()->getPrintableIncludeList()
@@ -1407,6 +1505,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                } else {
                        // Trigger an error
                        trigger_error($stubMessage);
+                       exit;
                }
        }
 
@@ -1414,7 +1513,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * 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)
+        * @param       $doExit         Whether exit the program (TRUE is default)
         * @return      void
         */
        public function debugBackTrace ($message = '', $doExit = TRUE) {
@@ -1441,25 +1540,45 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $debugInstance  An instance of a debugger class
         */
        public final static function createDebugInstance ($className) {
-               // Init debug instance
-               $debugInstance = NULL;
+               // Is the instance set?
+               if (!Registry::getRegistry()->instanceExists('debug')) {
+                       // Init debug instance
+                       $debugInstance = NULL;
+
+                       // Try it
+                       try {
+                               // Get a debugger instance
+                               $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class'));
+                       } catch (NullPointerException $e) {
+                               // Didn't work, no instance there
+                               exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
+                       }
 
-               // Try it
-               try {
-                       // Get a debugger instance
-                       $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class'));
-               } catch (NullPointerException $e) {
-                       // Didn't work, no instance there
-                       exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
-               }
+                       // Empty string should be ignored and used for testing the middleware
+                       DebugMiddleware::getSelfInstance()->output('');
 
-               // Empty string should be ignored and used for testing the middleware
-               DebugMiddleware::getSelfInstance()->output('');
+                       // Set it in its own class. This will set it in the registry
+                       $debugInstance->setDebugInstance($debugInstance);
+               } else {
+                       // Get instance from registry
+                       $debugInstance = Registry::getRegistry()->getDebugInstance();
+               }
 
                // Return it
                return $debugInstance;
        }
 
+       /**
+        * Simple output of a message with line-break
+        *
+        * @param       $message        Message to output
+        * @return      void
+        */
+       public function outputLine ($message) {
+               // Simply output it
+               print($message . PHP_EOL);
+       }
+
        /**
         * Outputs a debug message whether to debug instance (should be set!) or
         * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to
@@ -1467,7 +1586,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         *
         * @param       $message        Message we shall send out...
         * @param       $doPrint        Whether print or die here (default: print)
-        * @paran       $stripTags      Whether to strip tags (default: false)
+        * @paran       $stripTags      Whether to strip tags (default: FALSE)
         * @return      void
         */
        public function debugOutput ($message, $doPrint = TRUE, $stripTags = FALSE) {
@@ -1501,7 +1620,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        // Put directly out
                        if ($doPrint === TRUE) {
                                // Print message
-                               print($message . chr(10));
+                               $this->outputLine($message);
                        } else {
                                // Die here
                                exit($message);
@@ -1704,7 +1823,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
 
                // Get current array
                $fieldArray = $resultInstance->current();
-               //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
+               //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, TRUE).'</pre>');
 
                // Convert dashes to underscore
                $fieldName = $this->convertDashesToUnderscores($fieldName);
@@ -1761,6 +1880,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                        } else {
                                // Trigger an error
                                trigger_error($message . "<br />\n");
+                               exit;
                        }
                } else {
                        // @TODO Finish this part!
@@ -1790,7 +1910,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        public function getMilliTime () {
                // Get the time of day as float
-               $milliTime = gettimeofday(true);
+               $milliTime = gettimeofday(TRUE);
 
                // Return it
                return $milliTime;
@@ -1969,7 +2089,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected function isBase64Encoded ($encodedData) {
                // Determine it
-               $isBase64 = (@base64_decode($encodedData, true) !== FALSE);
+               $isBase64 = (@base64_decode($encodedData, TRUE) !== FALSE);
 
                // Return it
                return $isBase64;
@@ -2003,7 +2123,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
                // Generate it
-               $cacheKey = sprintf("%s@%s",
+               $cacheKey = sprintf('%s@%s',
                        $this->__toString(),
                        $criteriaInstance->getCacheKey($onlyKeys)
                );
@@ -2029,7 +2149,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        protected function getPrintableExecutionTime () {
                // Caculate the execution time
-               $executionTime = microtime(true) - $this->getStartupTime();
+               $executionTime = microtime(TRUE) - $this->getStartupTime();
 
                // Pack it in nice braces
                $executionTime = sprintf('[ %01.5f ] ', $executionTime);
@@ -2039,19 +2159,37 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Hashes a given string with a simple but stronger hash function (no salts)
+        * Hashes a given string with a simple but stronger hash function (no salt)
+        * and hex-encode it.
         *
         * @param       $str    The string to be hashed
         * @return      $hash   The hash from string $str
         */
-       public function hashString ($str) {
+       public static final function hash ($str) {
                // Hash given string with (better secure) hasher
-               $hash = mhash(MHASH_SHA256, $str);
+               $hash = bin2hex(mhash(MHASH_SHA256, $str));
 
                // Return it
                return $hash;
        }
 
+       /**
+        * "Getter" for length of hash() output. This will be "cached" to speed up
+        * things.
+        *
+        * @return      $length         Length of hash() output
+        */
+       public static final function getHashLength () {
+               // Is it cashed?
+               if (is_null(self::$hashLength)) {
+                       // No, then hash a string and save its length.
+                       self::$hashLength = strlen(self::hash('abc123'));
+               } // END - if
+
+               // Return it
+               return self::$hashLength;
+       }
+
        /**
         * Checks whether the given number is really a number (only chars 0-9).
         *
@@ -2116,38 +2254,44 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Determines if a key is set in the generic array
+        * Determines if an element is set in the generic array
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to check
+        * @param       $element        Element to check
         * @return      $isset          Whether the given key is set
         */
-       protected final function isGenericArrayKeySet ($keyGroup, $subGroup, $key) {
+       protected final function isGenericArrayElementSet ($keyGroup, $subGroup, $key, $element) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
                // Is it there?
-               $isset = isset($this->genericArray[$keyGroup][$subGroup][$key]);
+               $isset = isset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
 
                // Return it
                return $isset;
        }
-
        /**
-        * Determines if an element is set in the generic array
+        * Determines if a key is set in the generic array
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
         * @param       $key            Key to check
-        * @param       $element        Element to check
         * @return      $isset          Whether the given key is set
         */
-       protected final function isGenericArrayElementSet ($keyGroup, $subGroup, $key, $element) {
+       protected final function isGenericArrayKeySet ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Is it there?
-               $isset = isset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
+               $isset = isset($this->genericArray[$keyGroup][$subGroup][$key]);
 
                // Return it
                return $isset;
        }
 
+
        /**
         * Determines if a group is set in the generic array
         *
@@ -2156,6 +2300,9 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $isset          Whether the given group is set
         */
        protected final function isGenericArrayGroupSet ($keyGroup, $subGroup) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
                // Is it there?
                $isset = isset($this->genericArray[$keyGroup][$subGroup]);
 
@@ -2175,8 +2322,12 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // No, then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+                       exit;
                } // END - if
 
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',value=' . print_r($this->genericArray[$keyGroup][$subGroup], TRUE));
+
                // Return it
                return $this->genericArray[$keyGroup][$subGroup];
        }
@@ -2189,11 +2340,31 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $key            Key to unset
         * @return      void
         */
-       protected final function unsetGenericArrayElement ($keyGroup, $subGroup, $key) {
+       protected final function unsetGenericArrayKey ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Remove it
                unset($this->genericArray[$keyGroup][$subGroup][$key]);
        }
 
+       /**
+        * Unsets a given element in generic array
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to unset
+        * @param       $element        Element to unset
+        * @return      void
+        */
+       protected final function unsetGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
+               // Remove it
+               unset($this->genericArray[$keyGroup][$subGroup][$key][$element]);
+       }
+
        /**
         * Append a string to a given generic array key
         *
@@ -2203,7 +2374,10 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $value          Value to add/append
         * @return      void
         */
-       protected final function appendStringToGenericArrayElement ($keyGroup, $subGroup, $key, $value, $appendGlue = '') {
+       protected final function appendStringToGenericArrayKey ($keyGroup, $subGroup, $key, $value, $appendGlue = '') {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE) . ',appendGlue=' . $appendGlue);
+
                // Is it already there?
                if ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Append it
@@ -2214,6 +2388,103 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                }
        }
 
+       /**
+        * Append a string to a given generic array element
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to unset
+        * @param       $element        Element to check
+        * @param       $value          Value to add/append
+        * @return      void
+        */
+       protected final function appendStringToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value, $appendGlue = '') {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE) . ',appendGlue=' . $appendGlue);
+
+               // Is it already there?
+               if ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+                       // Append it
+                       $this->genericArray[$keyGroup][$subGroup][$key][$element] .= $appendGlue . (string) $value;
+               } else {
+                       // Add it
+                       $this->genericArray[$keyGroup][$subGroup][$key][$element] = (string) $value;
+               }
+       }
+
+       /**
+        * Initializes given generic array group
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to use
+        * @param       $forceInit      Optionally force initialization
+        * @return      void
+        */
+       protected final function initGenericArrayGroup ($keyGroup, $subGroup, $forceInit = FALSE) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',forceInit=' . intval($forceInit));
+
+               // Is it already set?
+               if (($forceInit === FALSE) && ($this->isGenericArrayGroupSet($keyGroup, $subGroup))) {
+                       // Already initialized
+                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' already initialized.');
+                       exit;
+               } // END - if
+
+               // Initialize it
+               $this->genericArray[$keyGroup][$subGroup] = array();
+       }
+
+       /**
+        * Initializes given generic array key
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to use
+        * @param       $forceInit      Optionally force initialization
+        * @return      void
+        */
+       protected final function initGenericArrayKey ($keyGroup, $subGroup, $key, $forceInit = FALSE) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',forceInit=' . intval($forceInit));
+
+               // Is it already set?
+               if (($forceInit === FALSE) && ($this->isGenericArrayKeySet($keyGroup, $subGroup, $key))) {
+                       // Already initialized
+                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' already initialized.');
+                       exit;
+               } // END - if
+
+               // Initialize it
+               $this->genericArray[$keyGroup][$subGroup][$key] = array();
+       }
+
+       /**
+        * Initializes given generic array element
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to use
+        * @param       $element        Element to use
+        * @param       $forceInit      Optionally force initialization
+        * @return      void
+        */
+       protected final function initGenericArrayElement ($keyGroup, $subGroup, $key, $element, $forceInit = FALSE) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',forceInit=' . intval($forceInit));
+
+               // Is it already set?
+               if (($forceInit === FALSE) && ($this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element))) {
+                       // Already initialized
+                       trigger_error(__METHOD__ . ':keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' already initialized.');
+                       exit;
+               } // END - if
+
+               // Initialize it
+               $this->genericArray[$keyGroup][$subGroup][$key][$element] = array();
+       }
+
        /**
         * Pushes an element to a generic key
         *
@@ -2223,33 +2494,52 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @param       $value          Value to add/append
         * @return      $count          Number of array elements
         */
-       protected final function pushValueToGenericArrayElement ($keyGroup, $subGroup, $key, $value) {
+       protected final function pushValueToGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
                // Is it set?
                if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Initialize array
-                       $this->genericArray[$keyGroup][$subGroup][$key] = array();
+                       $this->initGenericArrayKey($keyGroup, $subGroup, $key);
                } // END - if
 
                // Then push it
                $count = array_push($this->genericArray[$keyGroup][$subGroup][$key], $value);
 
                // Return count
+               //* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
+               //* DEBUG: */ print(__METHOD__ . ': count=' . $count . PHP_EOL);
                return $count;
        }
 
        /**
-        * Sets a value in given generic array key/element
+        * Pushes an element to a generic array element
         *
         * @param       $keyGroup       Main group for the key
         * @param       $subGroup       Sub group for the key
-        * @param       $key            Key to set
-        * @param       $element        Element to set
-        * @param       $value          Value to set
-        * @return      void
+        * @param       $key            Key to use
+        * @param       $element        Element to check
+        * @param       $value          Value to add/append
+        * @return      $count          Number of array elements
         */
-       protected final function setGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
-               // Then set it
-               $this->genericArray[$keyGroup][$subGroup][$key][$element] = $value;
+       protected final function pushValueToGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
+               // Is it set?
+               if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
+                       // Initialize array
+                       $this->initGenericArrayElement($keyGroup, $subGroup, $key, $element);
+               } // END - if
+
+               // Then push it
+               $count = array_push($this->genericArray[$keyGroup][$subGroup][$key][$element], $value);
+
+               // Return count
+               //* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
+               //* DEBUG: */ print(__METHOD__ . ': count=' . $count . PHP_EOL);
+               return $count;
        }
 
        /**
@@ -2261,16 +2551,22 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $value          Last "popped" value
         */
        protected final function popGenericArrayElement ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Is it set?
                if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
+                       exit;
                } // END - if
 
                // Then "pop" it
                $value = array_pop($this->genericArray[$keyGroup][$subGroup][$key]);
 
                // Return value
+               //* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
+               //* DEBUG: */ print(__METHOD__ . ': value[' . gettype($value) . ']=' . print_r($value, TRUE) . PHP_EOL);
                return $value;
        }
 
@@ -2283,16 +2579,22 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $value          Last "popped" value
         */
        protected final function shiftGenericArrayElement ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Is it set?
                if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Not found
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' not found.');
+                       exit;
                } // END - if
 
                // Then "shift" it
                $value = array_shift($this->genericArray[$keyGroup][$subGroup][$key]);
 
                // Return value
+               //* DEBUG: */ print(__METHOD__ . ': genericArray=' . print_r($this->genericArray[$keyGroup][$subGroup][$key], TRUE));
+               //* DEBUG: */ print(__METHOD__ . ': value[' . gettype($value) . ']=' . print_r($value, TRUE) . PHP_EOL);
                return $value;
        }
 
@@ -2303,15 +2605,22 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $count          Count of given group
         */
        protected final function countGenericArray ($keyGroup) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
+
                // Is it there?
                if (!isset($this->genericArray[$keyGroup])) {
                        // Abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' not found.');
+                       exit;
                } // END - if
 
                // Then count it
                $count = count($this->genericArray[$keyGroup]);
 
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',count=' . $count);
+
                // Return it
                return $count;
        }
@@ -2324,15 +2633,22 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $count          Count of given group
         */
        protected final function countGenericArrayGroup ($keyGroup, $subGroup) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
                // Is it there?
                if (!$this->isGenericArrayGroupSet($keyGroup, $subGroup)) {
                        // Abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+                       exit;
                } // END - if
 
                // Then count it
                $count = count($this->genericArray[$keyGroup][$subGroup]);
 
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',count=' . $count);
+
                // Return it
                return $count;
        }
@@ -2346,18 +2662,26 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $count          Count of given key
         */
        protected final function countGenericArrayElements ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Is it there?
-               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup)) {
+               if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' not found.');
+                       exit;
                } elseif (!$this->isValidGenericArrayGroup($keyGroup, $subGroup)) {
                        // Not valid
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ' is not an array.');
+                       exit;
                }
 
                // Then count it
                $count = count($this->genericArray[$keyGroup][$subGroup][$key]);
 
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',count=' . $count);
+
                // Return it
                return $count;
        }
@@ -2369,16 +2693,37 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $array          Whole generic array group
         */
        protected final function getGenericArray ($keyGroup) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup);
+
                // Is it there?
                if (!isset($this->genericArray[$keyGroup])) {
                        // Then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ' does not exist.');
+                       exit;
                } // END - if
 
                // Return it
                return $this->genericArray[$keyGroup];
        }
 
+       /**
+        * Setter for generic array key
+        *
+        * @param       $keyGroup       Key group to get
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to unset
+        * @param       $value          Mixed value from generic array element
+        * @return      void
+        */
+       protected final function setGenericArrayKey ($keyGroup, $subGroup, $key, $value) {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
+               // Set value here
+               $this->genericArray[$keyGroup][$subGroup][$key] = $value;
+       }
+
        /**
         * Getter for generic array key
         *
@@ -2388,16 +2733,38 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $value          Mixed value from generic array element
         */
        protected final function getGenericArrayKey ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
                // Is it there?
                if (!$this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) {
                        // Then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ' does not exist.');
+                       exit;
                } // END - if
 
                // Return it
                return $this->genericArray[$keyGroup][$subGroup][$key];
        }
 
+       /**
+        * Sets a value in given generic array key/element
+        *
+        * @param       $keyGroup       Main group for the key
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to set
+        * @param       $element        Element to set
+        * @param       $value          Value to set
+        * @return      void
+        */
+       protected final function setGenericArrayElement ($keyGroup, $subGroup, $key, $element, $value) {
+               // Debug message
+               //* NOISY-DEBUG: */ if (!is_object($value)) $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ',value[' . gettype($value) . ']=' . print_r($value, TRUE));
+
+               // Then set it
+               $this->genericArray[$keyGroup][$subGroup][$key][$element] = $value;
+       }
+
        /**
         * Getter for generic array element
         *
@@ -2408,10 +2775,14 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $value          Mixed value from generic array element
         */
        protected final function getGenericArrayElement ($keyGroup, $subGroup, $key, $element) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element);
+
                // Is it there?
                if (!$this->isGenericArrayElementSet($keyGroup, $subGroup, $key, $element)) {
                        // Then abort here
                        trigger_error(__METHOD__ . ': keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key . ',element=' . $element . ' does not exist.');
+                       exit;
                } // END - if
 
                // Return it
@@ -2426,12 +2797,298 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         * @return      $isValid        Whether given sub group is valid
         */
        protected final function isValidGenericArrayGroup ($keyGroup, $subGroup) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup);
+
                // Determine it
                $isValid = (($this->isGenericArrayGroupSet($keyGroup, $subGroup)) && (is_array($this->getGenericSubArray($keyGroup, $subGroup))));
 
                // Return it
                return $isValid;
        }
+
+       /**
+        * Checks if a given key is valid (array)
+        *
+        * @param       $keyGroup       Key group to get
+        * @param       $subGroup       Sub group for the key
+        * @param       $key            Key to check
+        * @return      $isValid        Whether given sub group is valid
+        */
+       protected final function isValidGenericArrayKey ($keyGroup, $subGroup, $key) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->outputLine('[' . __METHOD__ . ':' . __LINE__ . '] keyGroup=' . $keyGroup . ',subGroup=' . $subGroup . ',key=' . $key);
+
+               // Determine it
+               $isValid = (($this->isGenericArrayKeySet($keyGroup, $subGroup, $key)) && (is_array($this->getGenericArrayKey($keyGroup, $subGroup, $key))));
+
+               // Return it
+               return $isValid;
+       }
+
+       /**
+        * Translates boolean TRUE to 'Y' and FALSE to 'N'
+        *
+        * @param       $boolean                Boolean value
+        * @return      $translated             Translated boolean value
+        */
+       public static final function translateBooleanToYesNo ($boolean) {
+               // Make sure it is really boolean
+               assert(is_bool($boolean));
+
+               // "Translate" it
+               $translated = ($boolean === TRUE) ? 'Y' : 'N';
+
+               // ... and return it
+               return $translated;
+       }
+
+       /**
+        * Initializes counter for valid entries, arrays for damaged entries and
+        * an array for gap seek positions. If you call this method on your own,
+        * please re-analyze the file structure. So you are better to call
+        * analyzeFile() instead of this method.
+        *
+        * @return      void
+        */
+       protected function initCountersGapsArray () {
+               // Init counter and seek position
+               $this->setCounter(0);
+               $this->setSeekPosition(0);
+
+               // Init arrays
+               $this->gaps = array();
+               $this->damagedEntries = array();
+       }
+
+       /**
+        * Getter for total entries
+        *
+        * @return      $totalEntries   Total entries in this file
+        */
+       protected final function getCounter () {
+               // Get it
+               return $this->totalEntries;
+       }
+
+       /**
+        * Setter for total entries
+        *
+        * @param       $totalEntries   Total entries in this file
+        * @return      void
+        */
+       protected final function setCounter ($counter) {
+               // Set it
+               $this->totalEntries = $counter;
+       }
+
+       /**
+        * Increment counter
+        *
+        * @return      void
+        */
+       protected final function incrementCounter () {
+               // Get it
+               $this->totalEntries++;
+       }
+
+       /**
+        * Getter for header size
+        *
+        * @return      $totalEntries   Size of file header
+        */
+       protected final function getHeaderSize () {
+               // Get it
+               return $this->headerSize;
+       }
+
+       /**
+        * Setter for header size
+        *
+        * @param       $headerSize             Size of file header
+        * @return      void
+        */
+       protected final function setHeaderSize ($headerSize) {
+               // Set it
+               $this->headerSize = $headerSize;
+       }
+
+       /**
+        * Getter for seek position
+        *
+        * @return      $seekPosition   Current seek position (stored here in object)
+        */
+       protected final function getSeekPosition () {
+               // Get it
+               return $this->seekPosition;
+       }
+
+       /**
+        * Setter for seek position
+        *
+        * @param       $seekPosition   Current seek position (stored here in object)
+        * @return      void
+        */
+       protected final function setSeekPosition ($seekPosition) {
+               // And set it
+               $this->seekPosition = $seekPosition;
+       }
+
+       /**
+        * Updates seekPosition attribute from file to avoid to much access on file.
+        *
+        * @return      void
+        */
+       protected function updateSeekPosition () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Get key (= seek position)
+               $seekPosition = $this->getIteratorInstance()->key();
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Setting seekPosition=%s', __METHOD__, __LINE__, $seekPosition));
+
+               // And set it here
+               $this->setSeekPosition($seekPosition);
+
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+       }
+
+       /**
+        * Checks whether the file header is initialized
+        *
+        * @return      $isInitialized  Whether the file header is initialized
+        */
+       protected function isFileHeaderInitialized () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+               // Default is not initialized
+               $isInitialized = FALSE;
+
+               // Is the file initialized?
+               if ($this->isFileInitialized()) {
+                       // Some bytes has been written, so rewind to start of it.
+                       $rewindStatus = $this->getIteratorInstance()->rewind();
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] rewindStatus=%s', __METHOD__, __LINE__, $rewindStatus));
+
+                       // Is the rewind() call successfull?
+                       if ($rewindStatus != 1) {
+                               // Something bad happened
+                               self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Could not rewind().', __METHOD__, __LINE__));
+                       } // END - if
+
+                       // Read file header
+                       $this->readFileHeader();
+
+                       // The above method does already check the header
+                       $isInitialized = TRUE;
+               } // END - if
+
+               // Return result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized)));
+               return $isInitialized;
+       }
+
+       /**
+        * Checks whether the assigned file has been initialized
+        *
+        * @return      $isInitialized          Whether the file's size is zero
+        */
+       protected function isFileInitialized () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Get it from iterator which holds the pointer instance. If FALSE is returned
+               $fileSize = $this->getIteratorInstance()->size();
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] fileSize=%s', __METHOD__, __LINE__, $fileSize));
+
+               /*
+                * The returned file size should not be FALSE or NULL as this means
+                * that the pointer class does not work correctly.
+                */
+               assert(is_int($fileSize));
+
+               // Is more than 0 returned?
+               $isInitialized = ($fileSize > 0);
+
+               // Return result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] isInitialized=%d - EXIT!', __METHOD__, __LINE__, intval($isInitialized)));
+               return $isInitialized;
+       }
+
+       /**
+        * Creates the assigned file
+        *
+        * @return      void
+        */
+       protected function createFileHeader () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+               // The file's header should not be initialized here
+               assert(!$this->isFileHeaderInitialized());
+
+               // Simple flush file header which will create it.
+               $this->flushFileHeader();
+
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!!', __METHOD__, __LINE__));
+       }
+
+       /**
+        * Writes data at given position
+        *
+        * @param       $seekPosition   Seek position
+        * @param       $data                   Data to be written
+        * @return      void
+        */
+       protected function writeData ($seekPosition, $data) {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s,data()=%s - CALLED!', __METHOD__, __LINE__, $seekPosition, strlen($data)));
+
+               // Write data at given position
+               $this->getIteratorInstance()->writeAtPosition($seekPosition, $data);
+
+               // Update seek position
+               $this->updateSeekPosition();
+
+               // Flush header
+               $this->flushHeader();
+
+               // Seek to old position
+               $this->seekToOldPosition();
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+       }
+
+       /**
+        * Pre-allocates file (if enabled) with some space for later faster write access.
+        *
+        * @param       $type   Type of the file
+        * @return      void
+        */
+       protected function preAllocateFile ($type) {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Is it enabled?
+               if ($this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_enabled') != 'Y') {
+                       // Not enabled
+                       self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Not pre-allocating file.', __METHOD__, __LINE__));
+
+                       // Don't continue here.
+                       return;
+               } // END - if
+
+               // Message to user
+               self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Pre-allocating file ...', __METHOD__, __LINE__));
+
+               /*
+                * Calculate minimum length for one entry:
+                * minimum length = hash length + separator + name + minimum entry size = ?? + 1 + 10 + 1 = ??
+                */
+               $minLengthEntry = self::getHashLength() + strlen(self::SEPARATOR_HASH_NAME) + self::LENGTH_NAME + 1;
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] minLengthEntry=%s', __METHOD__, __LINE__, $minLengthEntry));
+
+               // Calulcate seek position
+               $seekPosition = $minLengthEntry * $this->getConfigInstance()->getConfigEntry($type . '_pre_allocate_count');
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekPosition=%s', __METHOD__, __LINE__, $seekPosition));
+
+               // Now simply write a NUL there. This will pre-allocate the file.
+               $this->writeData($seekPosition, chr(0));
+
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+       }
 }
 
 // [EOF]