+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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'
+ *
+ * @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;
+ }
+
+ /**
+ * 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;
+ }