--- /dev/null
+<?php
+/**
+ * A class for directory reading and getting its contents
+ */
+class FrameworkDirectoryPointer extends BaseFrameworkSystem {
+ /**
+ * The current path we are working in
+ */
+ private $pathName = "";
+
+ /**
+ * The directory pointer
+ */
+ private $dirPointer = null;
+
+ /**
+ * Private constructor
+ */
+ private function __construct () {
+ // Call parent constructor
+ parent::constructor(__CLASS__);
+
+ // Set part description
+ $this->setPartDescr("Verzeichnis-Handler");
+
+ // Create unique ID
+ $this->createUniqueID();
+
+ // Clean-up a little
+ $this->removeNumberFormaters();
+ }
+
+ /**
+ * Destructor for cleaning purposes, etc
+ */
+ public function __destruct() {
+ // Is there a resource pointer? Then we have to close the directory here!
+ if (is_resource($this->getPointer())) {
+ // Try to close a directory
+ $this->closeDirectory();
+ }
+
+ // Call the parent destructor
+ parent::__destruct();
+ }
+
+ /**
+ * Create a directory pointer based on the given path. The path will also
+ * be verified here.
+ *
+ * @param $pathName The path name we shall pass
+ * to opendir()
+ * @param $inConstructor If we are in de/con-structor
+ * or from somewhere else
+ * @throws PathIsEmptyException If the provided path name
+ * is empty
+ * @throws InvalidPathStringException If the provided path name is
+ * not a string
+ * @throws PathIsNoDirectoryException If the provided path name is
+ * not valid
+ * @throws PathReadProtectedException If the provided path name is
+ * read-protected
+ * @throws DirPointerNotOpened If opendir() returns not a
+ * directory resource
+ * @return $pointerInstance A prepared instance of
+ * FrameworkDirectoryPointer
+ */
+ public final static function createFrameworkDirectoryPointer ($pathName, $inConstructor = false) {
+ // Some pre-sanity checks...
+ if (is_null($pathName)) {
+ // No pathname given
+ if ($inConstructor) {
+ return null;
+ } else {
+ throw new PathIsEmptyException(null, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
+ }
+ } elseif (!is_string($pathName)) {
+ // Is not a string
+ if ($inConstructor) {
+ return null;
+ } else {
+ throw new InvalidPathStringException(null, self::EXCEPTION_INVALID_STRING);
+ }
+ } elseif (!is_dir($pathName)) {
+ // Not a directory
+ if ($inConstructor) {
+ return null;
+ } else {
+ throw new PathIsNoDirectoryException($pathName, self::EXCEPTION_INVALID_PATH_NAME);
+ }
+ } elseif (!is_readable($pathName)) {
+ // Not readable
+ if ($inConstructor) {
+ return null;
+ } else {
+ throw new PathReadProtectedException($pathName, self::EXCEPTION_READ_PROTECED_PATH);
+ }
+ }
+
+ // Try to open a handler
+ $dirPointer = @opendir($pathName);
+ if (!is_resource($dirPointer)) {
+ // Something bad happend
+ if ($inConstructor) {
+ return null;
+ } else {
+ throw new DirPointerNotOpenedException($pathName, self::EXCEPTION_DIR_POINTER_INVALID);
+ }
+ }
+
+ // Create new instance
+ $pointerInstance = new FrameworkDirectoryPointer();
+
+ // Set directory pointer and path name
+ $pointerInstance->setPointer($dirPointer);
+ $pointerInstance->setPathName($pathName);
+
+ // Return the instance
+ return $pointerInstance;
+ }
+
+ /**
+ * Read raw lines of data from a directory pointer and return the data
+ *
+ * @return string Directory and/or file names read from the current
+ * directory pointer
+ * @throws NullPointerException If the directory pointer instance
+ * is not set by setPointer()
+ * @throws InvalidDirectoryResourceException If there is being set
+ * an invalid directory resource
+ */
+ public function readRawDirectory () {
+ if (is_null($this->getPointer())) {
+ // Pointer not initialized
+ throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
+ } elseif (!is_resource($this->getPointer())) {
+ // Pointer is not a valid resource!
+ throw new InvalidDirectoryResourceException($this, self::EXCEPTION_INVALID_DIRECTORY_POINTER);
+ }
+
+ // Read data from the directory pointer and return it
+ return readdir($this->getPointer());
+ }
+
+ /**
+ * Read lines from the current directory pointer except some parts
+ *
+ * @param $except Some parts of a directory we want to ignore.
+ * Valid: dirs
+ * Other values will be silently ignored
+ * @return string Directory and/or file names read from the current
+ * directory pointer
+ */
+ public function readDirectoryExcept ($except = "") {
+ if ((empty($except)) || (!is_array($except)) || (count($except) == 0)) {
+ // No exception given, so read all data
+ return $this->readRawDirectory();
+ }
+
+ // Read a raw line...
+ $rawLine = $this->readRawDirectory();
+
+ // Shall we exclude directories?
+ if ((!is_null($rawLine)) && ($rawLine !== false) && (in_array($rawLine, $except))) {
+ // Exclude this part
+ return $this->readDirectoryExcept($except);
+ } elseif ((!is_null($rawLine)) && ($rawLine !== false)) {
+ // Return read data
+ return $rawLine;
+ }
+
+ // End pointer reached
+ return null;
+ }
+
+ /**
+ * Close a directory source and set it's instance to null and the path name
+ * to empty
+ *
+ * @return void
+ * @throws NullPointerException If the directory pointer instance
+ * is not set by setPointer()
+ * @throws InvalidDirectoryResourceException If there is being set
+ */
+ public function closeDirectory () {
+ if (is_null($this->getPointer())) {
+ // Pointer not initialized
+ return;
+ } elseif (!is_resource($this->getPointer())) {
+ // Pointer is not a valid resource!
+ throw new InvalidDirectoryResourceException($this, self::EXCEPTION_INVALID_DIRECTORY_POINTER);
+ }
+
+ // Close the directory pointer and reset the instance variable
+ @closedir($this->getPointer());
+ $this->setPointer(null);
+ $this->setPathName("");
+ }
+
+ /**
+ * Setter for the directory pointer
+ *
+ * @param $dirPointer The directory resource
+ * @return void
+ */
+ public final function setPointer ($dirPointer) {
+ // Sanity-check if the pointer is a valid directory resource
+ if (is_resource($dirPointer) || is_null($dirPointer)) {
+ // Is a valid resource
+ $this->dirPointer = $dirPointer;
+ } else {
+ // Throw exception
+ throw new InvalidDirectoryResourceException($this, self::EXCEPTION_INVALID_DIRECTORY_POINTER);
+ }
+ }
+
+ /**
+ * Getter for the directory pointer
+ *
+ * @return $dirPointer The directory pointer which shall be a valid
+ * directory resource
+ */
+ public final function getPointer () {
+ return $this->dirPointer;
+ }
+
+ /**
+ * Setter for path name
+ *
+ * @param $pathName The new path name
+ * @return void
+ */
+ public final function setPathName ($pathName) {
+ $pathName = (string) $pathName;
+ $this->pathName = $pathName;
+ }
+
+ /**
+ * Getter for path name
+ *
+ * @return $pathName The current path name
+ */
+ public final function getPathName () {
+ return $this->pathName;
+ }
+}
+
+// [EOF]
+?>