134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * @file
 | 
						|
 * Drupal module stream wrapper class (module://{module}/{resource}).
 | 
						|
 *
 | 
						|
 * Provides support for accessing files in module directories.
 | 
						|
 */
 | 
						|
class ImageCacheActionsModuleStreamWrapper extends DrupalLocalStreamWrapper {
 | 
						|
  /**
 | 
						|
   * Parses an uri into its separate components.
 | 
						|
   *
 | 
						|
   * Example:
 | 
						|
   * module://my_module/images/mask.png will return
 | 
						|
   * array('module', 'my_module', 'images/mask.png').
 | 
						|
   *
 | 
						|
   * @return array
 | 
						|
   *   An array of strings containing the separate parts of the uri:
 | 
						|
   *   - scheme (module)
 | 
						|
   *   - module name
 | 
						|
   *   - resource name
 | 
						|
   */
 | 
						|
  protected function parseUri() {
 | 
						|
    $scheme = '';
 | 
						|
    $module = '';
 | 
						|
    $component = '';
 | 
						|
    if (!empty($this->uri)) {
 | 
						|
      list($scheme, $target) = explode('://', $this->uri, 2);
 | 
						|
      if (!empty($target)) {
 | 
						|
        $target = trim($target, '\/');
 | 
						|
        list($module, $resource) = explode('/', $target, 2);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return array($scheme, $module, $resource);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Implements abstract public function getDirectoryPath()
 | 
						|
   */
 | 
						|
  public function getDirectoryPath() {
 | 
						|
    list($scheme, $module, $component) = $this->parseUri();
 | 
						|
    return drupal_get_path('module', $module);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the local writable target of the resource within the stream.
 | 
						|
   *
 | 
						|
   * @see DrupalLocalStreamWrapper::getTarget()
 | 
						|
   */
 | 
						|
  protected function getTarget($uri = NULL) {
 | 
						|
    if (!empty($uri)) {
 | 
						|
      $this->setUri($uri);
 | 
						|
    }
 | 
						|
    list($scheme, $module, $component) = $this->parseUri();
 | 
						|
    return $component;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the canonical absolute path of the URI, if possible.
 | 
						|
   *
 | 
						|
   * @see DrupalLocalStreamWrapper::getLocalPath()
 | 
						|
   */
 | 
						|
  protected function getLocalPath($uri = NULL) {
 | 
						|
    if (!empty($uri)) {
 | 
						|
      $this->setUri($uri);
 | 
						|
    }
 | 
						|
    return parent::getLocalPath();
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the local writable target of the resource within the stream.
 | 
						|
   *
 | 
						|
   * Overrides getExternalUrl().
 | 
						|
   *
 | 
						|
   * Return the HTML URI of a public file.
 | 
						|
   */
 | 
						|
  function getExternalUrl() {
 | 
						|
    $path = str_replace('\\', '/', $this->getTarget());
 | 
						|
    return $GLOBALS['base_url'] . '/' . $this->getDirectoryPath() . '/' . drupal_encode_path($path);
 | 
						|
  }
 | 
						|
 | 
						|
  /*
 | 
						|
   * Unsupported methods, modes and operations because we are read-only.
 | 
						|
   */
 | 
						|
  function chmod($mode) {
 | 
						|
    return $this->unsupportedError('chmod', STREAM_REPORT_ERRORS);
 | 
						|
  }
 | 
						|
 | 
						|
  public function stream_open($uri, $mode, $options, &$opened_path) {
 | 
						|
    if (!in_array($mode, array('r'))) {
 | 
						|
      return $this->unsupportedError("stream_open(mode = '$mode')", $options);
 | 
						|
    }
 | 
						|
    return parent::stream_open($uri, $mode, $options, $opened_path);
 | 
						|
  }
 | 
						|
 | 
						|
  public function stream_lock($operation) {
 | 
						|
    if (in_array($operation, array(LOCK_EX))) {
 | 
						|
      return $this->unsupportedError('stream_lock(LOCK_EX)', $options);
 | 
						|
    }
 | 
						|
    return parent::stream_lock($operation);
 | 
						|
  }
 | 
						|
 | 
						|
  public function stream_write($data) {
 | 
						|
    return $this->unsupportedError('stream_write', STREAM_REPORT_ERRORS);
 | 
						|
  }
 | 
						|
 | 
						|
  public function stream_flush() {
 | 
						|
    return $this->unsupportedError('stream_flush', STREAM_REPORT_ERRORS);
 | 
						|
  }
 | 
						|
 | 
						|
  public function unlink($uri) {
 | 
						|
    return $this->unsupportedError('unlink', STREAM_REPORT_ERRORS);
 | 
						|
  }
 | 
						|
 | 
						|
  public function rename($from_uri, $to_uri) {
 | 
						|
    return $this->unsupportedError('rename', STREAM_REPORT_ERRORS);
 | 
						|
  }
 | 
						|
 | 
						|
  public function mkdir($uri, $mode, $options) {
 | 
						|
    return $this->unsupportedError('mkdir', $options);
 | 
						|
  }
 | 
						|
 | 
						|
  public function rmdir($uri, $options) {
 | 
						|
    return $this->unsupportedError('rmdir', $options);
 | 
						|
  }
 | 
						|
 | 
						|
  public function unsupportedError($method, $options) {
 | 
						|
    if ($options & STREAM_REPORT_ERRORS) {
 | 
						|
      drupal_set_message("ImageCacheActionsModuleStreamWrapper is read-only and does not support $method", 'error');
 | 
						|
      watchdog(WATCHDOG_ERROR, "ImageCacheActionsModuleStreamWrapper is read-only and does not support $method");
 | 
						|
    }
 | 
						|
    return FALSE;
 | 
						|
  }
 | 
						|
}
 |