You are here

abstract class VideoRemoteStreamWrapper in Video 8.2

Same name and namespace in other branches
  1. 8 src/StreamWrapper/VideoRemoteStreamWrapper.php \Drupal\video\StreamWrapper\VideoRemoteStreamWrapper

Defines a video read only stream wrapper class.

Provides support for reading remotely accessible files with the Drupal file interface.

Hierarchy

Expanded class hierarchy of VideoRemoteStreamWrapper

File

src/StreamWrapper/VideoRemoteStreamWrapper.php, line 14

Namespace

Drupal\video\StreamWrapper
View source
abstract class VideoRemoteStreamWrapper extends ReadOnlyStream {
  protected static $base_url = NULL;
  protected $parameters = [];

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

  /**
   * Finds and returns the base URL for read only stream.
   * @return string
   *   The external base URL
   */
  public static function baseUrl() {
    return self::$base_url;
  }

  /**
   * {@inheritdoc}
   */
  public function getDirectoryPath() {
    return static::basePath();
  }

  /**
   * {@inheritdoc}
   */
  public function getExternalUrl() {
    $path = str_replace('\\', '/', $this
      ->getTarget());
    return static::baseUrl() . '/' . $path;
  }

  /**
   * Returns the base path for stream wrapper.
   */
  public static function basePath(\SplString $site_path = NULL) {
    return static::baseUrl();
  }

  /**
   * {@inheritdoc}
   */
  function setUri($uri) {
    $this->uri = $uri;
  }

  /**
   * Returns the local writable target of the resource within the stream.
   *
   * This function should be used in place of calls to realpath() or similar
   * functions when attempting to determine the location of a file. While
   * functions like realpath() may return the location of a read-only file, this
   * method may return a URI or path suitable for writing that is completely
   * separate from the URI used for reading.
   *
   * @param string $uri
   *   Optional URI.
   *
   * @return string|bool
   *   Returns a string representing a location suitable for writing of a file,
   *   or FALSE if unable to write to the file such as with read-only streams.
   */
  protected function getTarget($uri = NULL) {
    if (!isset($uri)) {
      $uri = $this->uri;
    }
    list(, $target) = explode('://', $uri, 2);

    // Remove erroneous leading or trailing, forward-slashes and backslashes.
    return trim($target, '\\/');
  }

  /**
   * Returns the canonical absolute path of the URI, if possible.
   *
   * @param string $uri
   *   (optional) The stream wrapper URI to be converted to a canonical
   *   absolute path. This may point to a directory or another type of file.
   *
   * @return string|bool
   *   If $uri is not set, returns the canonical absolute path of the URI
   *   previously set by the
   *   Drupal\Core\StreamWrapper\StreamWrapperInterface::setUri() function.
   *   If $uri is set and valid for this class, returns its canonical absolute
   *   path, as determined by the realpath() function. If $uri is set but not
   *   valid, returns FALSE.
   */
  protected function getLocalPath($uri = NULL) {
    if (!isset($uri)) {
      $uri = $this->uri;
    }
    $path = $this
      ->getDirectoryPath() . '/' . $this
      ->getTarget($uri);

    // In PHPUnit tests, the base path for local streams may be a virtual
    // filesystem stream wrapper URI, in which case this local stream acts like
    // a proxy. realpath() is not supported by vfsStream, because a virtual
    // file system does not have a real filepath.
    if (strpos($path, 'vfs://') === 0) {
      return $path;
    }
    $realpath = realpath($path);
    if (!$realpath) {

      // This file does not yet exist.
      $file_system = \Drupal::service('file_system');
      $realpath = realpath(dirname($path)) . '/' . $file_system
        ->basename($path);
    }
    $directory = realpath($this
      ->getDirectoryPath());
    if (!$realpath || !$directory || strpos($realpath, $directory) !== 0) {
      return FALSE;
    }
    return $realpath;
  }

  /**
   * {@inheritdoc}
   */
  function realpath() {
    return $this
      ->getLocalPath();
  }

  /**
   * Gets the name of the directory from a given path.
   *
   * This method is usually accessed through drupal_dirname(), which wraps
   * around the PHP dirname() function because it does not support stream
   * wrappers.
   *
   * @param string $uri
   *   A URI or path.
   *
   * @return string
   *   A string containing the directory name.
   *
   * @see drupal_dirname()
   */
  public function dirname($uri = NULL) {
    list($scheme) = explode('://', $uri, 2);
    $target = $this
      ->getTarget($uri);
    $dirname = dirname($target);
    if ($dirname == '.') {
      $dirname = '';
    }
    return $scheme . '://' . $dirname;
  }

  /**
   * Support for closedir().
   *
   * @return bool
   *   TRUE on success.
   *
   * @see http://php.net/manual/streamwrapper.dir-closedir.php
   */
  public function dir_closedir() {
    closedir($this->handle);

    // We do not really have a way to signal a failure as closedir() does not
    // have a return value.
    return TRUE;
  }

  /**
   * Support for opendir().
   *
   * @param string $uri
   *   A string containing the URI to the directory to open.
   * @param int $options
   *   Unknown (parameter is not documented in PHP Manual).
   *
   * @return bool
   *   TRUE on success.
   *
   * @see http://php.net/manual/streamwrapper.dir-opendir.php
   */
  public function dir_opendir($uri, $options) {
    $this->uri = $uri;
    $this->handle = opendir($this
      ->getLocalPath());
    return (bool) $this->handle;
  }

  /**
   * Support for readdir().
   *
   * @return string
   *   The next filename, or FALSE if there are no more files in the directory.
   *
   * @see http://php.net/manual/streamwrapper.dir-readdir.php
   */
  public function dir_readdir() {
    return readdir($this->handle);
  }

  /**
   * Support for rewinddir().
   *
   * @return bool
   *   TRUE on success.
   *
   * @see http://php.net/manual/streamwrapper.dir-rewinddir.php
   */
  public function dir_rewinddir() {
    rewinddir($this->handle);

    // We do not really have a way to signal a failure as rewinddir() does not
    // have a return value and there is no way to read a directory handler
    // without advancing to the next file.
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  public function stream_cast($cast_as) {
    return $this->handle ? $this->handle : FALSE;
  }

  /**
   * Support for fclose().
   *
   * @return bool
   *   TRUE if stream was successfully closed.
   *
   * @see http://php.net/manual/streamwrapper.stream-close.php
   */
  public function stream_close() {
    return fclose($this->handle);
  }

  /**
   * Support for feof().
   *
   * @return bool
   *   TRUE if end-of-file has been reached.
   *
   * @see http://php.net/manual/streamwrapper.stream-eof.php
   */
  public function stream_eof() {
    return feof($this->handle);
  }

  /**
   * Support for fread(), file_get_contents() etc.
   *
   * @param int $count
   *   Maximum number of bytes to be read.
   *
   * @return string|bool
   *   The string that was read, or FALSE in case of an error.
   *
   * @see http://php.net/manual/streamwrapper.stream-read.php
   */
  public function stream_read($count) {
    return fread($this->handle, $count);
  }

  /**
   * {@inheritdoc}
   */
  public function stream_seek($offset, $whence = SEEK_SET) {

    // fseek returns 0 on success and -1 on a failure.
    // stream_seek   1 on success and  0 on a failure.
    return !fseek($this->handle, $offset, $whence);
  }

  /**
   * {@inheritdoc}
   *
   * 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 advanced use cases.
   */
  public function stream_set_option($option, $arg1, $arg2) {
    trigger_error('stream_set_option() not supported for local file based stream wrappers', E_USER_WARNING);
    return FALSE;
  }

  /**
   * Support for fstat().
   *
   * @return bool
   *   An array with file status, or FALSE in case of an error - see fstat()
   *   for a description of this array.
   *
   * @see http://php.net/manual/streamwrapper.stream-stat.php
   */
  public function stream_stat() {
    return fstat($this->handle);
  }

  /**
   * Support for ftell().
   *
   * @return bool
   *   The current offset in bytes from the beginning of file.
   *
   * @see http://php.net/manual/streamwrapper.stream-tell.php
   */
  public function stream_tell() {
    return ftell($this->handle);
  }

  /**
   * Support for stat().
   *
   * @param string $uri
   *   A string containing the URI to get information about.
   * @param int $flags
   *   A bit mask of STREAM_URL_STAT_LINK and STREAM_URL_STAT_QUIET.
   *
   * @return array
   *   An array with file status, or FALSE in case of an error - see fstat()
   *   for a description of this array.
   *
   * @see http://php.net/manual/streamwrapper.url-stat.php
   */
  public function url_stat($uri, $flags) {
    $this->uri = $uri;
    $path = $this
      ->getLocalPath();

    // Suppress warnings if requested or if the file or directory does not
    // exist. This is consistent with PHP's plain filesystem stream wrapper.
    if ($flags & STREAM_URL_STAT_QUIET || !file_exists($path)) {
      return @stat($path);
    }
    else {
      return stat($path);
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ReadOnlyStream::$context public property Stream context resource.
ReadOnlyStream::$handle public property A generic resource handle.
ReadOnlyStream::$uri protected property Instance URI (stream).
ReadOnlyStream::getUri public function Returns the stream resource URI. Overrides StreamWrapperInterface::getUri
ReadOnlyStream::mkdir public function Support for mkdir(). Overrides PhpStreamWrapperInterface::mkdir
ReadOnlyStream::rename public function Support for rename(). Overrides PhpStreamWrapperInterface::rename
ReadOnlyStream::rmdir public function Support for rmdir(). Overrides PhpStreamWrapperInterface::rmdir
ReadOnlyStream::stream_flush public function Support for fflush(). Overrides PhpStreamWrapperInterface::stream_flush
ReadOnlyStream::stream_lock public function Support for flock(). Overrides PhpStreamWrapperInterface::stream_lock
ReadOnlyStream::stream_metadata public function Does not change meta data as this is a read-only stream wrapper. Overrides PhpStreamWrapperInterface::stream_metadata
ReadOnlyStream::stream_open public function Support for fopen(), file_get_contents(), etc. Overrides PhpStreamWrapperInterface::stream_open
ReadOnlyStream::stream_truncate public function Truncate stream. Overrides PhpStreamWrapperInterface::stream_truncate
ReadOnlyStream::stream_write public function Support for fwrite(), file_put_contents() etc. Overrides PhpStreamWrapperInterface::stream_write
ReadOnlyStream::unlink public function Support for unlink(). Overrides PhpStreamWrapperInterface::unlink
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::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.
VideoRemoteStreamWrapper::$base_url protected static property 6
VideoRemoteStreamWrapper::$parameters protected property
VideoRemoteStreamWrapper::basePath public static function Returns the base path for stream wrapper.
VideoRemoteStreamWrapper::baseUrl public static function Finds and returns the base URL for read only stream. 6
VideoRemoteStreamWrapper::dirname public function Gets the name of the directory from a given path. Overrides StreamWrapperInterface::dirname
VideoRemoteStreamWrapper::dir_closedir public function Support for closedir(). Overrides PhpStreamWrapperInterface::dir_closedir
VideoRemoteStreamWrapper::dir_opendir public function Support for opendir(). Overrides PhpStreamWrapperInterface::dir_opendir
VideoRemoteStreamWrapper::dir_readdir public function Support for readdir(). Overrides PhpStreamWrapperInterface::dir_readdir
VideoRemoteStreamWrapper::dir_rewinddir public function Support for rewinddir(). Overrides PhpStreamWrapperInterface::dir_rewinddir
VideoRemoteStreamWrapper::getDirectoryPath public function
VideoRemoteStreamWrapper::getExternalUrl public function Returns a web accessible URL for the resource. Overrides StreamWrapperInterface::getExternalUrl
VideoRemoteStreamWrapper::getLocalPath protected function Returns the canonical absolute path of the URI, if possible.
VideoRemoteStreamWrapper::getTarget protected function Returns the local writable target of the resource within the stream.
VideoRemoteStreamWrapper::getType public static function Returns the type of stream wrapper. Overrides StreamWrapperInterface::getType
VideoRemoteStreamWrapper::realpath function Returns canonical, absolute path of the resource. Overrides StreamWrapperInterface::realpath
VideoRemoteStreamWrapper::setUri function Sets the absolute stream resource URI. Overrides ReadOnlyStream::setUri
VideoRemoteStreamWrapper::stream_cast public function Retrieve the underlying stream resource. Overrides PhpStreamWrapperInterface::stream_cast
VideoRemoteStreamWrapper::stream_close public function Support for fclose(). Overrides PhpStreamWrapperInterface::stream_close
VideoRemoteStreamWrapper::stream_eof public function Support for feof(). Overrides PhpStreamWrapperInterface::stream_eof
VideoRemoteStreamWrapper::stream_read public function Support for fread(), file_get_contents() etc. Overrides PhpStreamWrapperInterface::stream_read
VideoRemoteStreamWrapper::stream_seek public function Seeks to specific location in a stream. Overrides PhpStreamWrapperInterface::stream_seek
VideoRemoteStreamWrapper::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
VideoRemoteStreamWrapper::stream_stat public function Support for fstat(). Overrides PhpStreamWrapperInterface::stream_stat
VideoRemoteStreamWrapper::stream_tell public function Support for ftell(). Overrides PhpStreamWrapperInterface::stream_tell
VideoRemoteStreamWrapper::url_stat public function Support for stat(). Overrides PhpStreamWrapperInterface::url_stat