Index: includes/file.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/file.inc,v retrieving revision 1.237 diff -u -p -r1.237 file.inc --- includes/file.inc 15 Oct 2010 03:36:21 -0000 1.237 +++ includes/file.inc 15 Oct 2010 20:37:21 -0000 @@ -90,12 +90,31 @@ define('FILE_STATUS_PERMANENT', 1); * * A stream is referenced as "scheme://target". * + * Examples: + * @code + * // Retrieve information about all stream wrappers defined by + * // hook_stream_wrappers() implementations. + * $all_stream_wrappers = file_get_stream_wrappers(); + * + * // Retrieve information about all stream wrappers that have both + * // STREAM_WRAPPERS_READ and STREAM_WRAPPERS_VISIBLE bits set. + * $readable_and_visible_stream_wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_READ | STREAM_WRAPPERS_VISIBLE); + * + * // Retrieve information about all stream wrappers that are visible, but do + * // not use local file storage. + * $remote_stream_wrappers = array_diff_key(file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE), file_get_stream_wrappers(STEAM_WRAPPERS_LOCAL)); + * @endcode + * * @param $filter - * Optionally filter out all types except these. Defaults to - * STREAM_WRAPPERS_ALL, which returns all registered stream wrappers. + * (Optional) Filters out all types except these. Defaults to + * STREAM_WRAPPERS_ALL, which returns all registered stream wrappers. * * @return - * Returns the entire Drupal stream wrapper registry. + * An array keyed by scheme, with values containing an array of information + * about the stream wrapper, as returned by hook_stream_wrappers(). If $filter + * is omitted or set to STREAM_WRAPPERS_ALL, the entire Drupal stream wrapper + * registry is returned. Otherwise only the stream wrappers whose 'type' + * bitmask has an on bit for each bit specified in $filter are returned. * * @see hook_stream_wrappers() * @see hook_stream_wrappers_alter() @@ -122,11 +141,11 @@ function file_get_stream_wrappers($filte else { $wrappers[$scheme]['override'] = FALSE; } - if (($info['type'] & STREAM_WRAPPERS_REMOTE) == STREAM_WRAPPERS_REMOTE) { - stream_wrapper_register($scheme, $info['class'], STREAM_IS_URL); + if (($info['type'] & STREAM_WRAPPERS_LOCAL) == STREAM_WRAPPERS_LOCAL) { + stream_wrapper_register($scheme, $info['class']); } else { - stream_wrapper_register($scheme, $info['class']); + stream_wrapper_register($scheme, $info['class'], STREAM_IS_URL); } } // Pre-populate the static cache with the filters most typically used. @@ -141,7 +160,7 @@ function file_get_stream_wrappers($filte $wrappers_storage[$filter] = array(); foreach ($wrappers_storage[STREAM_WRAPPERS_ALL] as $scheme => $info) { // Bit-wise filter. - if ($info['type'] & $filter == $filter) { + if (($info['type'] & $filter) == $filter) { $wrappers_storage[$filter][$scheme] = $info; } } Index: includes/stream_wrappers.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/stream_wrappers.inc,v retrieving revision 1.20 diff -u -p -r1.20 stream_wrappers.inc --- includes/stream_wrappers.inc 17 Aug 2010 22:05:22 -0000 1.20 +++ includes/stream_wrappers.inc 15 Oct 2010 20:37:21 -0000 @@ -22,6 +22,9 @@ /** * Stream wrapper bit flags that are the basis for composite types. + * + * Note that 0x0002 is skipped, because it was the value of a constant that has + * since been removed. */ /** @@ -35,11 +38,6 @@ define('STREAM_WRAPPERS_ALL', 0x0000); define('STREAM_WRAPPERS_LOCAL', 0x0001); /** - * Stream wrapper bit flag -- refers to a remote filesystem location. - */ -define('STREAM_WRAPPERS_REMOTE', 0x0002); - -/** * Stream wrapper bit flag -- wrapper is readable (almost always true). */ define('STREAM_WRAPPERS_READ', 0x0004); @@ -65,9 +63,9 @@ define('STREAM_WRAPPERS_VISIBLE', 0x0010 define('STREAM_WRAPPERS_HIDDEN', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE); /** - * Stream wrapper type flag -- visible, readable and writeable. + * Stream wrapper type flag -- hidden, readable and writeable using local files. */ -define('STREAM_WRAPPERS_WRITE_VISIBLE', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE | STREAM_WRAPPERS_VISIBLE); +define('STREAM_WRAPPERS_LOCAL_HIDDEN', STREAM_WRAPPERS_LOCAL | STREAM_WRAPPERS_HIDDEN); /** * Stream wrapper type flag -- visible and read-only. @@ -75,9 +73,23 @@ define('STREAM_WRAPPERS_WRITE_VISIBLE', define('STREAM_WRAPPERS_READ_VISIBLE', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_VISIBLE); /** + * Stream wrapper type flag -- visible, readable and writeable. + */ +define('STREAM_WRAPPERS_WRITE_VISIBLE', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE | STREAM_WRAPPERS_VISIBLE); + +/** + * Stream wrapper type flag -- the default when 'type' is omitted from + * hook_stream_wrappers(). This does not include STREAM_WRAPPERS_LOCAL, + * because PHP grants a greater trust level to local files (for example, they + * can be used in an "include" statement, regardless of the "allow_url_include" + * setting), so stream wrappers need to explicitly opt-in to this. + */ +define('STREAM_WRAPPERS_NORMAL', STREAM_WRAPPERS_WRITE_VISIBLE); + +/** * Stream wrapper type flag -- visible, readable and writeable using local files. */ -define('STREAM_WRAPPERS_NORMAL', STREAM_WRAPPERS_LOCAL | STREAM_WRAPPERS_WRITE_VISIBLE); +define('STREAM_WRAPPERS_LOCAL_NORMAL', STREAM_WRAPPERS_LOCAL | STREAM_WRAPPERS_NORMAL); /** * Generic PHP stream wrapper interface. Index: modules/system/system.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v retrieving revision 1.199 diff -u -p -r1.199 system.api.php --- modules/system/system.api.php 15 Oct 2010 03:36:21 -0000 1.199 +++ modules/system/system.api.php 15 Oct 2010 20:37:29 -0000 @@ -2296,9 +2296,13 @@ function hook_modules_uninstalled($modul * - 'class' A string specifying the PHP class that implements the * DrupalStreamWrapperInterface interface. * - 'description' A string with a short description of what the wrapper does. - * - 'type' A bitmask of flags indicating what type of streams this wrapper - * will access - local or remote, readable and/or writeable, etc. Many - * shortcut constants are defined in stream_wrappers.inc. + * - 'type' (Optional) A bitmask of flags indicating what type of streams this + * wrapper will access - local or remote, readable and/or writeable, etc. + * Many shortcut constants are defined in stream_wrappers.inc. Defaults to + * STREAM_WRAPPERS_NORMAL which includes all of these bit flags: + * - STREAM_WRAPPERS_READ + * - STREAM_WRAPPERS_WRITE + * - STREAM_WRAPPERS_VISIBLE * * @see file_get_stream_wrappers() * @see hook_stream_wrappers_alter() @@ -2310,18 +2314,35 @@ function hook_stream_wrappers() { 'name' => t('Public files'), 'class' => 'DrupalPublicStreamWrapper', 'description' => t('Public local files served by the webserver.'), + 'type' => STREAM_WRAPPERS_LOCAL_NORMAL, ), 'private' => array( 'name' => t('Private files'), 'class' => 'DrupalPrivateStreamWrapper', 'description' => t('Private local files served by Drupal.'), + 'type' => STREAM_WRAPPERS_LOCAL_NORMAL, ), 'temp' => array( 'name' => t('Temporary files'), 'class' => 'DrupalTempStreamWrapper', 'description' => t('Temporary local files for upload and previews.'), - 'type' => STREAM_WRAPPERS_HIDDEN, - ) + 'type' => STREAM_WRAPPERS_LOCAL_HIDDEN, + ), + 'cdn' => array( + 'name' => t('Content delivery network files'), + 'class' => 'MyModuleCDNStreamWrapper', + 'description' => t('Files served by a content delivery network.'), + // 'type' can be omitted to use the default of STREAM_WRAPPERS_NORMAL + ), + 'youtube' => array( + 'name' => t('YouTube video'), + 'class' => 'MyModuleYouTubeStreamWrapper', + 'description' => t('Video streamed from YouTube.'), + // A module implementing YouTube integration may decide to support using + // the YouTube API for uploading video, but here, we assume that this + // particular module only supports playing YouTube video. + 'type' => STREAM_WRAPPERS_READ_VISIBLE, + ), ); } Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.981 diff -u -p -r1.981 system.module --- modules/system/system.module 15 Oct 2010 04:40:41 -0000 1.981 +++ modules/system/system.module 15 Oct 2010 20:37:29 -0000 @@ -1541,12 +1541,13 @@ function system_stream_wrappers() { 'name' => t('Public files'), 'class' => 'DrupalPublicStreamWrapper', 'description' => t('Public local files served by the webserver.'), + 'type' => STREAM_WRAPPERS_LOCAL_NORMAL, ), 'temporary' => array( 'name' => t('Temporary files'), 'class' => 'DrupalTemporaryStreamWrapper', 'description' => t('Temporary local files for upload and previews.'), - 'type' => STREAM_WRAPPERS_HIDDEN, + 'type' => STREAM_WRAPPERS_LOCAL_HIDDEN, ), ); @@ -1556,6 +1557,7 @@ function system_stream_wrappers() { 'name' => t('Private files'), 'class' => 'DrupalPrivateStreamWrapper', 'description' => t('Private local files served by Drupal.'), + 'type' => STREAM_WRAPPERS_LOCAL_NORMAL, ); }