* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.shipsimu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class FileIoHandler extends BaseMiddleware implements IoHandler { // Load traits use FileInputStreamerTrait; use FileOutputStreamerTrait; /** * An instance of this class */ private static $selfInstance = NULL; /** * Protected constructor * * @return void */ private function __construct () { // Call parent constructor /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: CONSTRUCTED!'); parent::__construct(__CLASS__); // Set own instance self::$selfInstance = $this; // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } /** * Creates an instance of this class and prepares the IO system. This is * being done by setting the default file IO class * * @return $ioHandlerInstance A prepared instance of FilIoHandler */ public static final function createFileIoHandler () { // Get instance /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: CALLED!'); $ioHandlerInstance = new FileIoHandler(); // Set the *real* file IO instances (both the same) $ioHandlerInstance->setInputStreamerInstance(ObjectFactory::createObjectByConfiguredName('file_input_class')); $ioHandlerInstance->setOutputStreamerInstance(ObjectFactory::createObjectByConfiguredName('file_output_class')); // Return instance /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: ioHandlerInstance=%s - EXIT!', $ioHandlerInstance->__toString())); return $ioHandlerInstance; } /** * Getter for an instance of this class * * @return $selfInstance An instance of this class */ public static final function getSelfInstance () { // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: Returning self::selfInstance[]=%s - EXIT!', gettype(self::$selfInstance))); return self::$selfInstance; } /** * Saves streamed (that are mostly serialized objects) data to files or * external servers. * * @param $infoInstance An instance of a SplFileInfo class * @param $dataArray Array containing the compressor's extension and streamed data * @return void * @throws UnsupportedOperationException If this method is called */ public function saveFile (SplFileInfo $infoInstance, array $dataArray) { // Trace message for logging parameters /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: infoInstance.pathname=%s,dataArray()=%d - CALLED!', $infoInstance->getPathname(), count($dataArray))); throw new UnsupportedOperationException([$this, __FUNCTION__], FrameworkInterface::EXCEPTION_UNSPPORTED_OPERATION); } /** * Saves a file with data by using the current output stream * * @param $infoInstance An instance of a SplFileInfo class * @param $dataStream File data stream * @param $objectInstance An instance of a FrameworkInterface class (default: NULL) * @return void * @throws InvalidArgumentException If a parameter has an invalid value */ public function saveStreamToFile (SplFileInfo $infoInstance, string $dataStream, FrameworkInterface $objectInstance = NULL) { // Check parameters /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: infoInstance=%s,dataStream()=%d,objectInstance[]=%s - CALLED!', $infoInstance->__toString(), strlen($dataStream), gettype($objectInstance))); if (empty($dataStream)) { // Throw IAE throw new InvalidArgumentException('Parameter "dataStream" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // Default is this array $className = $this->__toString(); // Is the object instance set? /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('FILE-IO-HANDLER: className=%s - BEFORE!', $className)); if ($objectInstance instanceof FrameworkInterface) { // Then use this $className = $objectInstance->__toString(); } // Send the infoInstance and data array to the output handler /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('FILE-IO-HANDLER: className=%s - AFTER!', $className)); $this->getOutputStreamerInstance()->saveFile($infoInstance, [ 0 => $className, 1 => $dataStream ]); // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } /** Loads data from a file over the input handler * * @param $infoInstance An instance of a SplFileInfo class * @return $array Array with the file contents */ public function loadFileContents (SplFileInfo $infoInstance) { // Read from the input handler /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: infoInstance=%s - CALLED!', $infoInstance->__toString())); return $this->getInputStreamerInstance()->loadFileContents($infoInstance); } /** * Determines seek position * * @return $seekPosition Current seek position * @todo 0% done */ public function determineSeekPosition () { // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: CALLED!'); DebugMiddleware::getSelfInstance()->partialStub(); // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } /** * 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 void * @throws InvalidArgumentException If a parameter has an invalid value */ public function seek (int $offset, int $whence = SEEK_SET) { // Check parameter /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('FILE-IO-HANDLER: offset=%d,whence=%d - CALLED!', $offset, $whence)); if ($offset < 0) { // Throw IAE throw new InvalidArgumentException('Parameter "offset" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT); } // @TODO Unfinished work DebugMiddleware::getSelfInstance()->partialStub('offset=' . $offset . ',whence=' . $whence); // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } /** * Size of file stack * * @return $size Size (in bytes) of file * @todo 0% done */ public function size () { // @TODO: Unfinished method: /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: CALLED!'); DebugMiddleware::getSelfInstance()->partialStub(); // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } /** * "Getter" for seek position * * @return $seekPosition Current seek position * @todo 0% done */ public function getPosition () { // @TODO: Unfinished method: /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: CALLED!'); DebugMiddleware::getSelfInstance()->partialStub(); // Trace message /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('FILE-IO-HANDLER: EXIT!'); } }