X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ffile_directories%2Fdirectory%2Fclass_FrameworkDirectoryPointer.php;h=42380fd142469c9834e39a3abf9878f167383e90;hp=a04a8dd486f32ffc41913da5cecf5b176a5c29b6;hb=d7c285e7acc5b68b4fdffe76011d8c4c28aef09d;hpb=3ac79dbc1ecc71a1d704992366a0512d46af7785 diff --git a/inc/classes/main/file_directories/directory/class_FrameworkDirectoryPointer.php b/inc/classes/main/file_directories/directory/class_FrameworkDirectoryPointer.php index a04a8dd4..42380fd1 100644 --- a/inc/classes/main/file_directories/directory/class_FrameworkDirectoryPointer.php +++ b/inc/classes/main/file_directories/directory/class_FrameworkDirectoryPointer.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.shipsimu.org * @@ -21,7 +21,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class FrameworkDirectoryPointer extends BaseFrameworkSystem { +class FrameworkDirectoryPointer extends BaseFrameworkSystem implements FrameworkDirectory { /** * The current path we are working in */ @@ -30,7 +30,7 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { /** * The directory iterator instance */ - private $directoryInstance = NULL; + private $iteratorInstance = NULL; /** * Protected constructor @@ -45,7 +45,7 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { */ public function __destruct() { // Is there a resource pointer? Then we have to close the directory here! - if ($this->getDirectoryInstance() instanceof DirectoryIterator) { + if ($this->getDirectoryIteratorInstance() instanceof DirectoryIterator) { // Try to close a directory $this->closeDirectory(); } // END - if @@ -68,9 +68,6 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { * @todo Get rid of inConstructor, could be old-lost code. */ public static final function createFrameworkDirectoryPointer ($pathName, $inConstructor = FALSE) { - // Secure with realpath() - $pathName = realpath($pathName); - // Some pre-sanity checks... if (is_null($pathName)) { // No pathname given @@ -102,43 +99,44 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { } } - // Get an iterator for the directory - $directoryInstance = new DirectoryIterator($pathName); - // Create new instance $pointerInstance = new FrameworkDirectoryPointer(); + // Get an iterator for the directory + $iteratorInstance = new DirectoryIterator($pathName); + + // ... and rewind back + $iteratorInstance->rewind(); + // Set directory pointer and path name - $pointerInstance->setDirectoryInstance($directoryInstance); + $pointerInstance->setDirectoryIteratorInstance($iteratorInstance); $pointerInstance->setPathName($pathName); // Return the instance + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: Opened pathName=' . $pathName . ' - EXIT!'); return $pointerInstance; } /** * Read raw lines of data from a directory pointer and return the data * - * @return $current Current entry from encapsulated iterator + * @return $currentEntry Current entry from encapsulated iterator */ public function readRawDirectory () { + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . '] - CALLED!'); + // Can the next entry be read? - assert($this->getDirectoryInstance()->valid()); + assert($this->getDirectoryIteratorInstance()->valid()); // Default is FALSE - $current = FALSE; + $currentEntry = FALSE; - // Is it a dot directory? - if (!$this->getDirectoryInstance()->isDot()) { - // Read data from the directory pointer and return it - $current = $this->getDirectoryInstance()->current(); - } // END - if - - // Advance to next entry - $this->getDirectoryInstance()->next(); + // Read data from the directory pointer and return it + $currentEntry = $this->getDirectoryIteratorInstance()->current(); // Return found entry - return $current; + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: currentEntry[]=' . gettype($currentEntry) . ' - EXIT!'); + return $currentEntry; } /** @@ -153,26 +151,41 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { // No exception given, so read all files and directories, but not recursive self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: No exceptions given, please use readRawDirectory() instead!'); return $this->readRawDirectory(); - } // END - if + } elseif (!$this->getDirectoryIteratorInstance()->valid()) { + // No more left to read + return NULL; + } + + // Init raw line + $rawLine = NULL; // Read a raw line... - $rawLine = $this->readRawDirectory(); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine); + $currentEntry = $this->readRawDirectory(); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: currentEntry[]=' . gettype($currentEntry)); // Shall we exclude directories? - if ((!is_null($rawLine)) && ($rawLine !== FALSE) && (!in_array($rawLine, $except))) { - // Return read data + if (is_object($currentEntry)) { + // Get file name + $rawLine = $currentEntry->getFilename(); //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine); - return $rawLine; - } elseif ((!is_null($rawLine)) && ($rawLine !== FALSE)) { - // Exclude this part - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawline[' . gettype($rawLine) . ']=' . $rawLine . ' - Recursive call!'); - return $this->readDirectoryExcept($except); - } - // End pointer reached - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: Returning NULL!'); - return NULL; + // Is it not excluded? + if (in_array($rawLine, $except)) { + // To next entry + $this->getDirectoryIteratorInstance()->next(); + + // Exclude this part + $rawLine = $this->readDirectoryExcept($except); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawline[' . gettype($rawLine) . ']=' . $rawLine . ' - Recursive call!'); + } // END - if + } // END - if + + // To next entry + $this->getDirectoryIteratorInstance()->next(); + + // Return read line + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine); + return $rawLine; } /** @@ -183,28 +196,41 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { */ public function closeDirectory () { // Close the directory by unsetting it - $this->setDirectoryInstance(NULL); + $this->unsetDirectoryIteratorInstance(); $this->setPathName(''); } /** * Setter for the directory pointer * - * @param $directoryInstance An instanceof a DirectoryIterator class or NULL to unset ("close") it. + * @param $iteratorInstance An instanceof a DirectoryIterator class * @return void */ - protected final function setDirectoryInstance (DirectoryIterator $directoryInstance = NULL) { - // Set instance (or NULL) - $this->directoryInstance = $directoryInstance; + protected final function setDirectoryIteratorInstance (DirectoryIterator $iteratorInstance) { + // Set instance + $this->iteratorInstance = $iteratorInstance; } /** * Getter for the directory pointer * - * @return $directoryInstance The directory pointer which shall be a valid directory resource + * @return $iteratorInstance The directory pointer which shall be a valid directory resource + */ + public final function getDirectoryIteratorInstance () { + return $this->iteratorInstance; + } + + /** + * Remove directory iterator instance (effectively closing it) by setting + * it to NULL. This will trigger a call on the destructor which will then + * "close" the iterator. + * + * @param $iteratorInstance An instanceof a DirectoryIterator class + * @return void */ - public final function getDirectoryInstance () { - return $this->directoryInstance; + protected final function unsetDirectoryIteratorInstance (e) { + // "Unset" the instance + $this->iteratorInstance = NULL; } /** @@ -213,7 +239,7 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { * @param $pathName The new path name * @return void */ - public final function setPathName ($pathName) { + protected final function setPathName ($pathName) { $pathName = (string) $pathName; $this->pathName = $pathName; }