You are here

abstract class LocalReadOnlyStream in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/StreamWrapper/LocalReadOnlyStream.php \Drupal\Core\StreamWrapper\LocalReadOnlyStream

Defines a read-only Drupal stream wrapper base class for local files.

This class extends the complete stream wrapper implementation in LocalStream. URIs such as "public://example.txt" are expanded to a normal filesystem path such as "sites/default/files/example.txt" and then PHP filesystem functions are invoked.

Drupal\Core\StreamWrapper\LocalReadOnlyStream implementations need to implement at least the getDirectoryPath() and getExternalUrl() methods.

Hierarchy

Expanded class hierarchy of LocalReadOnlyStream

1 file declares its use of LocalReadOnlyStream
DummyReadOnlyStreamWrapper.php in core/modules/file/tests/file_test/src/StreamWrapper/DummyReadOnlyStreamWrapper.php

File

core/lib/Drupal/Core/StreamWrapper/LocalReadOnlyStream.php, line 16

Namespace

Drupal\Core\StreamWrapper
View source
abstract class LocalReadOnlyStream extends LocalStream {

  /**
   * {@inheritdoc}
   */
  public static function getType() {
    return StreamWrapperInterface::READ_VISIBLE | StreamWrapperInterface::LOCAL;
  }

  /**
   * {@inheritdoc}
   */
  public function stream_open($uri, $mode, $options, &$opened_path) {
    if (!in_array($mode, [
      'r',
      'rb',
      'rt',
    ])) {
      if ($options & STREAM_REPORT_ERRORS) {
        trigger_error('stream_open() write modes not supported for read-only stream wrappers', E_USER_WARNING);
      }
      return FALSE;
    }
    return parent::stream_open($uri, $mode, $options, $opened_path);
  }

  /**
   * Support for flock().
   *
   * An exclusive lock attempt will be rejected, as this is a read-only stream
   * wrapper.
   *
   * @param int $operation
   *   One of the following:
   *   - LOCK_SH to acquire a shared lock (reader).
   *   - LOCK_EX to acquire an exclusive lock (writer).
   *   - LOCK_UN to release a lock (shared or exclusive).
   *   - LOCK_NB added as a bitmask if you don't want flock() to block while
   *     locking (not supported on Windows).
   *
   * @return bool
   *   Return FALSE for an exclusive lock (writer), as this is a read-only
   *   stream wrapper.  Return the result of flock() for other valid operations.
   *   Defaults to TRUE if an invalid operation is passed.
   *
   * @see http://php.net/manual/streamwrapper.stream-lock.php
   */
  public function stream_lock($operation) {

    // Disallow exclusive lock or non-blocking lock requests
    if (in_array($operation, [
      LOCK_EX,
      LOCK_EX | LOCK_NB,
    ])) {
      trigger_error('stream_lock() exclusive lock operations not supported for read-only stream wrappers', E_USER_WARNING);
      return FALSE;
    }
    if (in_array($operation, [
      LOCK_SH,
      LOCK_UN,
      LOCK_SH | LOCK_NB,
    ])) {
      return flock($this->handle, $operation);
    }
    return TRUE;
  }

  /**
   * Support for fwrite(), file_put_contents() etc.
   *
   * Data will not be written as this is a read-only stream wrapper.
   *
   * @param string $data
   *   The string to be written.
   *
   * @return bool
   *   FALSE as data will not be written.
   *
   * @see http://php.net/manual/streamwrapper.stream-write.php
   */
  public function stream_write($data) {
    trigger_error('stream_write() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * Support for fflush().
   *
   * Nothing will be output to the file, as this is a read-only stream wrapper.
   * However as stream_flush is called during stream_close we should not trigger
   * an error.
   *
   * @return bool
   *   FALSE, as no data will be stored.
   *
   * @see http://php.net/manual/streamwrapper.stream-flush.php
   */
  public function stream_flush() {
    return FALSE;
  }

  /**
   * {@inheritdoc}
   *
   * Does not change meta data as this is a read-only stream wrapper.
   */
  public function stream_metadata($uri, $option, $value) {
    trigger_error('stream_metadata() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function stream_truncate($new_size) {
    trigger_error('stream_truncate() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * Support for unlink().
   *
   * The file will not be deleted from the stream as this is a read-only stream
   * wrapper.
   *
   * @param string $uri
   *   A string containing the uri to the resource to delete.
   *
   * @return bool
   *   TRUE so that file_delete() will remove db reference to file. File is not
   *   actually deleted.
   *
   * @see http://php.net/manual/streamwrapper.unlink.php
   */
  public function unlink($uri) {
    trigger_error('unlink() not supported for read-only stream wrappers', E_USER_WARNING);
    return TRUE;
  }

  /**
   * Support for rename().
   *
   * The file will not be renamed as this is a read-only stream wrapper.
   *
   * @param string $from_uri
   *   The uri to the file to rename.
   * @param string $to_uri
   *   The new uri for file.
   *
   * @return bool
   *   FALSE as file will never be renamed.
   *
   * @see http://php.net/manual/streamwrapper.rename.php
   */
  public function rename($from_uri, $to_uri) {
    trigger_error('rename() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * Support for mkdir().
   *
   * Directory will never be created as this is a read-only stream wrapper.
   *
   * @param string $uri
   *   A string containing the URI to the directory to create.
   * @param int $mode
   *   Permission flags - see mkdir().
   * @param int $options
   *   A bit mask of STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE.
   *
   * @return bool
   *   FALSE as directory will never be created.
   *
   * @see http://php.net/manual/streamwrapper.mkdir.php
   */
  public function mkdir($uri, $mode, $options) {
    trigger_error('mkdir() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * Support for rmdir().
   *
   * Directory will never be deleted as this is a read-only stream wrapper.
   *
   * @param string $uri
   *   A string containing the URI to the directory to delete.
   * @param int $options
   *   A bit mask of STREAM_REPORT_ERRORS.
   *
   * @return bool
   *   FALSE as directory will never be deleted.
   *
   * @see http://php.net/manual/streamwrapper.rmdir.php
   */
  public function rmdir($uri, $options) {
    trigger_error('rmdir() not supported for read-only stream wrappers', E_USER_WARNING);
    return FALSE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
LocalReadOnlyStream::getType public static function Returns the type of stream wrapper. Overrides LocalStream::getType
LocalReadOnlyStream::mkdir public function Support for mkdir(). Overrides LocalStream::mkdir
LocalReadOnlyStream::rename public function Support for rename(). Overrides LocalStream::rename
LocalReadOnlyStream::rmdir public function Support for rmdir(). Overrides LocalStream::rmdir
LocalReadOnlyStream::stream_flush public function Support for fflush(). Overrides LocalStream::stream_flush
LocalReadOnlyStream::stream_lock public function Support for flock(). Overrides LocalStream::stream_lock
LocalReadOnlyStream::stream_metadata public function Does not change meta data as this is a read-only stream wrapper. Overrides LocalStream::stream_metadata
LocalReadOnlyStream::stream_open public function Opens file or URL. Overrides LocalStream::stream_open
LocalReadOnlyStream::stream_truncate public function Truncate stream. Overrides LocalStream::stream_truncate
LocalReadOnlyStream::stream_write public function Support for fwrite(), file_put_contents() etc. Overrides LocalStream::stream_write
LocalReadOnlyStream::unlink public function Support for unlink(). Overrides LocalStream::unlink
LocalStream::$context public property Stream context resource.
LocalStream::$handle public property A generic resource handle.
LocalStream::$uri protected property Instance URI (stream).
LocalStream::dirname public function Gets the name of the directory from a given path. Overrides StreamWrapperInterface::dirname
LocalStream::dir_closedir public function Close directory handle. Overrides PhpStreamWrapperInterface::dir_closedir
LocalStream::dir_opendir public function Open directory handle. Overrides PhpStreamWrapperInterface::dir_opendir
LocalStream::dir_readdir public function Read entry from directory handle. Overrides PhpStreamWrapperInterface::dir_readdir
LocalStream::dir_rewinddir public function Rewind directory handle. Overrides PhpStreamWrapperInterface::dir_rewinddir
LocalStream::getDirectoryPath abstract public function Gets the path that the wrapper is responsible for. 6
LocalStream::getFileSystem private function Returns file system service.
LocalStream::getLocalPath protected function Returns the canonical absolute path of the URI, if possible.
LocalStream::getTarget protected function Returns the local writable target of the resource within the stream.
LocalStream::getUri public function Returns the stream resource URI. Overrides StreamWrapperInterface::getUri
LocalStream::realpath public function Returns canonical, absolute path of the resource. Overrides StreamWrapperInterface::realpath 1
LocalStream::setUri public function Sets the absolute stream resource URI. Overrides StreamWrapperInterface::setUri
LocalStream::stream_cast public function Retrieve the underlying stream resource. Overrides PhpStreamWrapperInterface::stream_cast
LocalStream::stream_close public function Closes stream. Overrides PhpStreamWrapperInterface::stream_close
LocalStream::stream_eof public function Tests for end-of-file on a file pointer. Overrides PhpStreamWrapperInterface::stream_eof
LocalStream::stream_read public function Read from stream. Overrides PhpStreamWrapperInterface::stream_read
LocalStream::stream_seek public function Seeks to specific location in a stream. Overrides PhpStreamWrapperInterface::stream_seek
LocalStream::stream_set_option public function Since Windows systems do not allow it and it is not needed for most use cases anyway, this method is not supported on local files and will trigger an error and return false. If needed, custom subclasses can provide OS-specific implementations for… Overrides PhpStreamWrapperInterface::stream_set_option
LocalStream::stream_stat public function Retrieve information about a file resource. Overrides PhpStreamWrapperInterface::stream_stat
LocalStream::stream_tell public function Retrieve the current position of a stream. Overrides PhpStreamWrapperInterface::stream_tell
LocalStream::url_stat public function Retrieve information about a file. Overrides PhpStreamWrapperInterface::url_stat
StreamWrapperInterface::ALL constant A filter that matches all wrappers.
StreamWrapperInterface::getDescription public function Returns the description of the stream wrapper for use in the UI. 6
StreamWrapperInterface::getExternalUrl public function Returns a web accessible URL for the resource. 6
StreamWrapperInterface::getName public function Returns the name of the stream wrapper for use in the UI. 6
StreamWrapperInterface::HIDDEN constant Defines the stream wrapper bit flag for a hidden file.
StreamWrapperInterface::LOCAL constant Refers to a local file system location.
StreamWrapperInterface::LOCAL_HIDDEN constant Hidden, readable and writable using local files.
StreamWrapperInterface::LOCAL_NORMAL constant Visible, readable and writable using local files.
StreamWrapperInterface::NORMAL constant This is the default 'type' flag. This does not include StreamWrapperInterface::LOCAL, because PHP grants a greater trust level to local files (for example, they can be used in an "include" statement, regardless of the…
StreamWrapperInterface::READ constant Wrapper is readable (almost always true).
StreamWrapperInterface::READ_VISIBLE constant Visible and read-only.
StreamWrapperInterface::VISIBLE constant Exposed in the UI and potentially web accessible.
StreamWrapperInterface::WRITE constant Wrapper is writable.
StreamWrapperInterface::WRITE_VISIBLE constant Visible, readable and writable.