InputOutputPointer is the right interface.
[core.git] / inc / classes / main / file_directories / class_BaseFileIo.php
index a18a8529df11a831ffd6b332cb0fe3e2e7cff126..cd07f7fbc42123c816b63a7055d2d79b42a95950 100644 (file)
@@ -89,7 +89,7 @@ class BaseFileIo extends BaseFrameworkSystem {
         * @param       $filePointer    File resource
         * @return      void
         */
-       public final function setPointer ($filePointer) {
+       protected final function setPointer ($filePointer) {
                $this->filePointer = $filePointer;
        }
 
@@ -109,7 +109,7 @@ class BaseFileIo extends BaseFrameworkSystem {
         * @param       $fileName       The new file name
         * @return      void
         */
-       public final function setFileName ($fileName) {
+       protected final function setFileName ($fileName) {
                $fileName = (string) $fileName;
                $this->fileName = $fileName;
        }
@@ -122,6 +122,58 @@ class BaseFileIo extends BaseFrameworkSystem {
        public final function getFileName () {
                return $this->fileName;
        }
+
+       /**
+        * Determines seek position
+        *
+        * @return      $seekPosition   Current seek position
+        */
+       public final function determineSeekPosition () {
+               return ftell($this->getPointer());
+       }
+
+       /**
+        * Seek to given offset (default) or other possibilities as fseek() gives.
+        *
+        * @param       $offset         Offset to seek to (or used as "base" for other seeks)
+        * @param       $whence         Added to offset (default: only use offset to seek to)
+        * @return      $status         Status of file seek: 0 = success, -1 = failed
+        */
+       public function seek ($offset, $whence = SEEK_SET) {
+               // Seek to position
+               $status = fseek($this->getPointer(), $offset, $whence);
+
+               // Return status
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] status=%d', __METHOD__, __LINE__, $status));
+               return $status;
+       }
+
+       /**
+        * Size of this file
+        *
+        * @return      $size   Size (in bytes) of file
+        * @todo        Handle seekStatus
+        */
+       public function size () {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] CALLED!', __METHOD__, __LINE__));
+
+               // Get current seek position
+               $seekPosition = $this->determineSeekPosition();
+
+               // Seek to end
+               $seekStatus = $this->seek(0, SEEK_END);
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] seekStatus=%d', __METHOD__, __LINE__, $seekStatus));
+
+               // Get position again  (which is the end of the file)
+               $size = $this->determineSeekPosition();
+
+               // Reset seek position to old
+               $this->seek($seekPosition);
+
+               // Return size
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput(sprintf('[%s:%d:] size=%s - EXIT!', __METHOD__, __LINE__, $size));
+               return $size;
+       }
 }
 
 // [EOF]