X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ffile_directories%2Fio%2Fclass_FrameworkFileInputOutputPointer.php;h=ae372f3532b56aeb6321b892855dca0c96edfd6b;hp=36c81898d8ebfd008245ae17461710a24d052e2e;hb=6f830b22ba3fd5a89c56177165a53e8fa94ff9c0;hpb=3c5ce56adcf758f877b74bbf1285d6cca1549a5e diff --git a/inc/classes/main/file_directories/io/class_FrameworkFileInputOutputPointer.php b/inc/classes/main/file_directories/io/class_FrameworkFileInputOutputPointer.php index 36c81898..ae372f35 100644 --- a/inc/classes/main/file_directories/io/class_FrameworkFileInputOutputPointer.php +++ b/inc/classes/main/file_directories/io/class_FrameworkFileInputOutputPointer.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 * @@ -41,6 +41,7 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP * @throws FileIsEmptyException If the given file name is NULL or empty * @throws FileReadProtectedException If PHP cannot read an existing file * @throws FileWriteProtectedException If PHP cannot write an existing file + * @throws PathWriteProtectedException If PHP cannot write to an existing path * @throws FileIoException If fopen() returns not a file resource */ public static final function createFrameworkFileInputOutputPointer ($fileName) { @@ -48,16 +49,22 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP if ((is_null($fileName)) || (empty($fileName))) { // No filename given throw new FileIsEmptyException(NULL, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); - } elseif ((file_exists($fileName)) && (!is_readable($fileName))) { + } elseif (!BaseFrameworkSystem::isReachableFilePath($fileName)) { + // File exists but cannot be read + throw new FileIoException($fileName, self::EXCEPTION_FILE_NOT_REACHABLE); + } elseif ((!BaseFrameworkSystem::isReadableFile($fileName)) && (file_exists($fileName))) { // File exists but cannot be read throw new FileReadProtectedException($fileName, self::EXCEPTION_FILE_CANNOT_BE_READ); } elseif ((file_exists($fileName)) && (!is_writable($fileName))) { // File exists but cannot be written - throw new FileWriteProtectedException($fileName, self::EXCEPTION_FILE_CANNOT_BE_READ); + throw new FileWriteProtectedException($fileName, self::EXCEPTION_FILE_CANNOT_BE_WRITTEN); + } elseif (!is_writable(dirname($fileName))) { + // Path is not writable + throw new PathWriteProtectedException($fileName, self::EXCEPTION_PATH_CANNOT_BE_WRITTEN); } // Try to open a handler - $filePointer = fopen($fileName, 'a+b'); + $filePointer = fopen($fileName, 'c+b'); if ((is_null($filePointer)) || ($filePointer === FALSE)) { // Something bad happend throw new FileIoException($fileName, self::EXCEPTION_FILE_POINTER_INVALID); @@ -75,14 +82,17 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP } /** - * Read data a file pointer + * Validates file pointer and throws exceptions. This method does not return + * anything (not reliable) as this method checks the file pointer and on + * case of an error it throws an exception. If this method does not throw + * any exceptions, the file pointer seems to be fine. * - * @return mixed The result of fread() + * @return void * @throws NullPointerException If the file pointer instance * is not set by setPointer() * @throws InvalidResourceException If there is being set */ - public function readFromFile () { + private function validateFilePointer () { if (is_null($this->getPointer())) { // Pointer not initialized throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); @@ -91,8 +101,20 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); } + // All fine here + } + + /** + * Read 1024 bytes data from a file pointer + * + * @return mixed The result of fread() + */ + public function readFromFile () { + // Validate the pointer + $this->validateFilePointer(); + // Read data from the file pointer and return it - return fread($this->getPointer(), 1024); + return $this->read(1024); } /** @@ -100,32 +122,41 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP * * @param $dataStream The data stream we shall write to the file * @return mixed Number of writes bytes or FALSE on error - * @throws NullPointerException If the file pointer instance - * is not set by setPointer() - * @throws InvalidResourceException If there is being set - * an invalid file resource */ public function writeToFile ($dataStream) { - 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 InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); - } + // Validate the pointer + $this->validateFilePointer(); // Write data to the file pointer and return written bytes return fwrite($this->getPointer(), $dataStream, strlen($dataStream)); } + /** + * Writes at given position by seeking to it. + * + * @param $seekPosition Seek position in file + * @param $data Data to be written + * @return mixed Number of writes bytes or FALSE on error + */ + public function writeAtPosition ($seekPosition, $data) { + // First seek to it + $this->seek($seekPosition); + + // Then write the data at that position + return $this->writeToFile($data); + } + /** * Rewinds to the beginning of the file * - * @return void + * @return $status Status of this operation */ public function rewind () { + // Validate the pointer + $this->validateFilePointer(); + // Rewind the pointer - assert(rewind($this->getPointer()) === 1); + return rewind($this->getPointer()); } /** @@ -133,11 +164,109 @@ class FrameworkFileInputOutputPointer extends BaseFileIo implements InputOutputP * * @param $seekPosition Seek position in file * @param $whence "Seek mode" (see http://de.php.net/fseek) - * @return void + * @return $status Status of this operation */ public function seek ($seekPosition, $whence = SEEK_SET) { + // Validate the pointer + $this->validateFilePointer(); + // Move the file pointer - assert(fseek($this->getPointerInstance(), $seekPosition, $whence) === 0); + return fseek($this->getPointer(), $seekPosition, $whence); + } + + /** + * Reads a line, maximum 4096 Bytes from current file pointer + * + * @return $data Read data from file + */ + public function readLine () { + // Read whole line + return $this->read(); + } + + /** + * Reads given amount of bytes from file. + * + * @param $bytes Amount of bytes to read + * @return $data Data read from file + */ + public function read ($bytes = NULL) { + // Validate the pointer + $this->validateFilePointer(); + + // Is $bytes set? + if (is_int($bytes)) { + // Try to read given characters + $data = fread($this->getPointer(), $bytes); + } else { + // Try to read whole line + $data = fread($this->getPointer()); + } + + // Then return it + return $data; + } + + /** + * Analyzes entries in index file. This will count all found (and valid) + * entries, mark invalid as damaged and count gaps ("fragmentation"). If + * only gaps are found, the file is considered as "virgin" (no entries). + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function analyzeFile () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Advances to next "block" of bytes + * + * @return void + * @throws UnsupportedOperationException If this method is called + */ + public function next () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Checks wether the current entry is valid (not at the end of the file). + * This method will return TRUE if an emptied (nulled) entry has been found. + * + * @return $isValid Whether the next entry is valid + * @throws UnsupportedOperationException If this method is called + */ + public function valid () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Gets current seek position ("key"). + * + * @return $key Current key in iteration + * @throws UnsupportedOperationException If this method is called + */ + public function key () { + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * "Getter" for file size + * + * @return $fileSize Size of currently loaded file + */ + public function getFileSize () { + // Check if the pointer is still valid + $this->validateFilePointer(); + + // Get file's data + $fileData = fstat($this->getPointer()); + + // Make sure the required array key is there + assert(isset($fileData['size'])); + + // Return size + return $fileData['size']; } }