+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));
+ }
+
+ /**
+ * Reads the file header
+ *
+ * @return void
+ */
+ private function readFileHeader () {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+ // First rewind to beginning as the header sits at the beginning ...
+ $this->getIteratorInstance()->rewind();
+
+ // Then read it (see constructor for calculation)
+ $data = $this->getIteratorInstance()->read($this->headerSize);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Read %d bytes (%d wanted).', __METHOD__, __LINE__, strlen($data), $this->headerSize));
+
+ // Have all requested bytes been read?
+ assert(strlen($data) == $this->headerSize);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+
+ // Last character must be the separator
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] data(-1)=%s', __METHOD__, __LINE__, dechex(ord(substr($data, -1, 1)))));
+ assert(substr($data, -1, 1) == chr(self::SEPARATOR_HEADER_ENTRIES));
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+
+ // Okay, then remove it
+ $data = substr($data, 0, -1);
+
+ // And update seek position
+ $this->updateSeekPosition();
+
+ /*
+ * Now split it:
+ *
+ * 0 => Magic
+ * 1 => Total entries
+ * 2 => Current seek position
+ */
+ $this->header = explode(chr(self::SEPARATOR_HEADER_DATA), $data);
+
+ // Check if the array has only 3 elements
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] header(%d)=%s', __METHOD__, __LINE__, count($this->header), print_r($this->header, TRUE)));
+ assert(count($this->header) == 3);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+
+ // Check magic
+ assert($this->header[0] == self::STACK_MAGIC);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+
+ // Check length of count and seek position
+ assert(strlen($this->header[1]) == self::LENGTH_COUNT);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+ assert(strlen($this->header[2]) == self::LENGTH_POSITION);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] Passed assert().', __METHOD__, __LINE__));
+
+ // Decode count and seek position
+ $this->header[1] = hex2bin($this->header[1]);
+ $this->header[2] = hex2bin($this->header[2]);
+
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] EXIT!', __METHOD__, __LINE__));