+
+ /**
+ * Checks whether start/end marker are set
+ *
+ * @param $data Data to be checked
+ * @return $isset Whether start/end marker are set
+ */
+ public final function ifStartEndMarkersSet ($data) {
+ // Determine it
+ $isset = ((substr($data, 0, strlen(BaseRawDataHandler::STREAM_START_MARKER)) == BaseRawDataHandler::STREAM_START_MARKER) && (substr($data, -1 * strlen(BaseRawDataHandler::STREAM_END_MARKER), strlen(BaseRawDataHandler::STREAM_END_MARKER)) == BaseRawDataHandler::STREAM_END_MARKER));
+
+ // ... and return it
+ return $isset;
+ }
+
+ /**
+ * 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 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][$element]);
+
+ // Return it
+ return $isset;
+ }
+ /**
+ * 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
+ * @return $isset Whether the given key is set
+ */
+ 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]);
+
+ // Return it
+ return $isset;
+ }
+
+
+ /**
+ * Determines if a group is set in the generic array
+ *
+ * @param $keyGroup Main group
+ * @param $subGroup Sub group
+ * @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]);
+
+ // Return it
+ return $isset;
+ }
+
+ /**
+ * Getter for sub key group
+ *
+ * @param $keyGroup Main key group
+ * @param $subGroup Sub key group
+ * @return $array An array with all array elements
+ */
+ protected final function getGenericSubArray ($keyGroup, $subGroup) {
+ // Is it there?
+ 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];
+ }
+
+ /**
+ * Unsets a given key in generic array
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @return void
+ */
+ 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
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @param $value Value to add/append
+ * @return void
+ */
+ 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
+ $this->genericArray[$keyGroup][$subGroup][$key] .= $appendGlue . (string) $value;
+ } else {
+ // Add it
+ $this->genericArray[$keyGroup][$subGroup][$key] = (string) $value;
+ }
+ }
+
+ /**
+ * 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
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to use
+ * @param $value Value to add/append
+ * @return $count Number of array elements
+ */
+ 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->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;
+ }
+
+ /**
+ * 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 use
+ * @param $element Element to check
+ * @param $value Value to add/append
+ * @return $count Number of array elements
+ */
+ 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;
+ }
+
+ /**
+ * Pops an element from a generic group
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @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;
+ }
+
+ /**
+ * Shifts an element from a generic group
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @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;
+ }
+
+ /**
+ * Count generic array group
+ *
+ * @param $keyGroup Main group for the key
+ * @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;
+ }
+
+ /**
+ * Count generic array sub group
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @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;
+ }
+
+ /**
+ * Count generic array elements
+ *
+ * @param $keyGroup Main group for the key
+ * @param $subGroup Sub group for the key
+ * @para $key Key to count
+ * @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, $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;
+ }
+
+ /**
+ * Getter for whole generic group array
+ *
+ * @param $keyGroup Key group to get
+ * @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
+ *
+ * @param $keyGroup Key group to get
+ * @param $subGroup Sub group for the key
+ * @param $key Key to unset
+ * @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
+ *
+ * @param $keyGroup Key group to get
+ * @param $subGroup Sub group for the key
+ * @param $key Key to look for
+ * @param $element Element to look for
+ * @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
+ return $this->genericArray[$keyGroup][$subGroup][$key][$element];
+ }
+
+ /**
+ * Checks if a given sub group is valid (array)
+ *
+ * @param $keyGroup Key group to get
+ * @param $subGroup Sub group for the key
+ * @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 header array
+ *
+ * @return $totalEntries Size of file header
+ */
+ protected final function getHeade () {
+ // Get it
+ return $this->header;
+ }
+
+ /**
+ * Setter for header
+ *
+ * @param $header Array for a file header
+ * @return void
+ */
+ protected final function setHeader (array $header) {
+ // Set it
+ $this->header = $header;
+ }
+
+ /**
+ * 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 () {
+ // Is the method there?
+ assert(is_callable(array($this, 'readFileHeader')));
+
+ //* 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__));
+ }