http://www.mediawiki.org/wiki/Special:Code/MediaWiki/74022
Revision: 74022
Author: neilk
Date: 2010-09-30 13:56:51 +0000 (Thu, 30 Sep 2010)
Log Message:
-----------
this has been moved to /includes/upload
Removed Paths:
-------------
branches/uploadwizard/extensions/UploadWizard/SessionStash.php
Deleted: branches/uploadwizard/extensions/UploadWizard/SessionStash.php
===================================================================
--- branches/uploadwizard/extensions/UploadWizard/SessionStash.php
2010-09-30 13:52:16 UTC (rev 74021)
+++ branches/uploadwizard/extensions/UploadWizard/SessionStash.php
2010-09-30 13:56:51 UTC (rev 74022)
@@ -1,327 +0,0 @@
-<?php
-/**
- * SessionStash is intended to accomplish a few things:
- * - enable applications to temporarily stash files without publishing them
to the wiki.
- * - Several parts of MediaWiki do this in similar ways: UploadBase,
UploadWizard, and FirefoggChunkedExtension
- * the idea is to unify them all here
- * - enable applications to find said files later, as long as the session or
temp files haven't been purged.
- * - enable the uploading user (and *ONLY* the uploading user) to access
said files, and thumbnails of said files, via a URL.
- * We accomplish this by making the session serve as a URL->file mapping,
on the assumption that nobody else can access
- * the session, even the uploading user.
- */
-
-class SessionStash {
- // repository that this uses to store temp files
- protected $repo;
-
- // array of initialized objects obtained from session (lazily
initialized upon getFile())
- private $files = array();
-
- // the base URL for files in the stash
- private $baseUrl;
-
- // TODO: Once UploadBase starts using this, switch to use these
constants rather than UploadBase::SESSION*
- // const SESSION_VERSION = 2;
- // const SESSION_KEYNAME = 'wsUploadData';
-
- /**
- * Represents the session which contain temporarily stored files.
- * Designed to be compatible with the session stashing code in
UploadBase (should replace eventually)
- * @param {FileRepo} optional -- repo in which to store files. Will
choose LocalRepo if not supplied.
- */
- public function __construct( $repo=null ) {
-
- if ( is_null( $repo ) ) {
- $repo = RepoGroup::singleton()->getLocalRepo();
- }
- $this->repo = $repo;
-
- if ( ! isset( $_SESSION ) ) {
- throw new MWException( 'session not available' );
- }
-
- if ( ! array_key_exists( UploadBase::SESSION_KEYNAME, $_SESSION
) ) {
- $_SESSION[UploadBase::SESSION_KEYNAME] = array();
- }
-
- $this->baseUrl = SpecialPage::getTitleFor( 'SessionStash'
)->getLocalURL();
- }
-
- public function getBaseUrl() {
- return $this->baseUrl;
- }
-
- /**
- * Get a file from the stash.
- * May throw exception if session data cannot be parsed due to schema
change.
- * @param {Integer} key
- * @return {null|SessionStashItem} null if no such item, or the item
- */
- public function getFile( $key ) {
- if ( !array_key_exists( $key, $this->files ) ) {
- $stashData =
$_SESSION[UploadBase::SESSION_KEYNAME][$key];
-
- if ($stashData['version'] !==
UploadBase::SESSION_VERSION ) {
- throw new MWException( 'session item schema
does not match current software' );
- }
-
- // The path is flattened in with the other random props
so we have to dig it out.
- $data = array();
- foreach( $stashData as $stashKey => $stashVal ) {
- if ( $stashKey === 'mTempPath' ) {
- $path = $stashVal;
- } else {
- $data[ $stashKey ] = $stashVal;
- }
- }
- $this->files[$key] = new SessionStashFile( $this,
$this->repo, $path, $key, $data );
- }
- return $this->files[$key];
- }
-
- /**
- * Stash a file in a temp directory and record that we did this in the
session, along with other parameters.
- * @param {String} name - this is used for directory hashing when
storing. Otherwise not important
- * @param {String} path - path to file you want stashed
- * @param {Array} data - other data you want added to the session. Do
not use 'mTempPath', 'mFileProps', 'mFileSize', or version as keys here
- * @return {SessionStashFile} file
- */
- public function stashFile( $key, $path, $data=array() ) {
- if ( !$key ) {
- $key = mt_rand( 0, 0x7fffffff );
- }
-
- // if not already in a temporary area, put it there
- $status = $this->repo->storeTemp( basename($path), $path );
- if( !$status->isOK() ) {
- return false;
- }
- $stashPath = $status->value;
-
-
- // get props
- $fileProps = File::getPropsFromPath( $path );
- $fileSize = $fileProps['size'];
-
- // standard info we always store.
- // 'mTempPath', 'mFileSize', and 'mFileProps' are arbitrary
names
- // chosen for compatibility with UploadBase's way of doing this.
- $stashData = array(
- 'mTempPath' => $stashPath,
- 'mFileSize' => $fileSize,
- 'mFileProps' => $fileProps,
- 'version' => UploadBase::SESSION_VERSION
- );
-
- // put extended info into the session (this changes from
application to application).
- // UploadWizard wants different things than say
FirefoggChunkedUpload.
- foreach ($data as $stashKey => $stashValue) {
- if ( !array_key_exists( $stashKey, $data ) ) {
- $stashData[$stashKey] = $stashValue;
- }
- }
-
- $_SESSION[UploadBase::SESSION_KEYNAME][$key] = $stashData;
-
- //wfDebug( "SESSION\n=====\n " . print_r( $_SESSION, 1 ) . "\n"
);
-
- return $this->getFile( $key );
- }
-}
-
-class SessionStashFile extends UnregisteredLocalFile {
- public $sessionStash;
- public $sessionKey;
- public $sessionData;
- private $urlName;
-
- /**
- * A LocalFile wrapper around a file that has been temporarily stashed,
so we can do things like create thumbnails for it
- * Arguably UnregisteredLocalFile should be handling its own file repo
but that class is a bit retarded currently
- * @param {FileRepo} repository where we should find the path
- * @param {String} path to file
- */
- public function __construct( $stash, $repo, $path, $key, $data ) {
- $this->sessionStash = $stash;
- $this->sessionKey = $key;
- $this->sessionData = $data;
- if ( $repo->isVirtualUrl( $path ) ) {
- $path = $repo->resolveVirtualUrl( $path );
- }
- parent::__construct( false, $repo, $path, false );
-
- // we will be initializing from some tmpnam files that don't
have extensions.
- // most of MediaWiki assumes all uploaded files have good
extensions. So, we fix this.
- $this->name = basename( $this->path );
- $this->setExtension();
-
- }
-
- /**
- * A method needed by the file transforming and scaling routines in
File.php
- * We do not necessarily care about doing the description at this point
- * @return {String} the empty string
- */
- public function getDescriptionUrl() {
- return '';
- }
-
- /**
- * Find or guess extension -- ensuring that our extension matches our
mime type.
- * Since these files are constructed from php tempnames they may not
start off
- * with an extension
- * This does not override getExtension because things like getMimeType
already call getExtension,
- * and that results in infinite recursion. So, we preemptively *set*
the extension so getExtension can find it.
- * For obvious reasons this should be called as early as possible, as
part of initialization
- */
- public function setExtension() {
- // Does this have an extension?
- $n = strrpos( $this->path, '.' );
- if ( $n !== false ) {
- $extension = $n ? substr( $this->path, $n + 1 ) : '';
- } else {
- // If not, assume that it should be related to the mime
type of the original file.
- //
- // This entire thing is backwards -- we *should* just
create an extension based on
- // the mime type of the transformed file, *after*
transformation. But File.php demands
- // to know the name of the transformed file before
creating it.
- $mimeType = $this->getMimeType();
- $extensions = explode( ' ',
MimeMagic::singleton()->getExtensionsForType( $mimeType ) );
- if ( count( $extensions ) ) {
- $extension = $extensions[0];
- }
- }
-
- if ( is_null( $extension ) ) {
- throw 'cannot determine extension';
- }
-
- $this->extension = parent::normalizeExtension( $extension );
- }
-
- /**
- * Get the path for the thumbnail (actually any transformation of this
file)
- * The actual argument is the result of thumbName although we seem to
have
- * buggy code elsewhere that expects a boolean 'suffix'
- *
- * @param {String|false} name of thumbnail (e.g. "120px-123456.jpg" ),
or false to just get the path
- * @return {String} path thumbnail should take on filesystem, or
containing directory if thumbname is false
- */
- public function getThumbPath( $thumbName=false ) {
- $path = dirname( $this->path );
- if ( $thumbName !== false ) {
- $path .= "/$thumbName";
- }
- return $path;
- }
-
- /**
- * Return the file/url base name of a thumbnail with the specified
parameters
- *
- * @param {Array} $params: handler-specific parameters
- * @return {String} base name for URL, like '120px-12345.jpg'
- */
- function thumbName( $params ) {
- if ( !$this->getHandler() ) {
- return null;
- }
- $extension = $this->getExtension();
- list( $thumbExt, $thumbMime ) = $this->handler->getThumbType(
$extension, $this->getMimeType(), $params );
- $thumbName = $this->handler->makeParamString( $params ) . '-' .
$this->getUrlName();
- if ( $thumbExt != $extension ) {
- $thumbName .= ".$thumbExt";
- }
- return $thumbName;
- }
-
- /**
- * Get a URL to access the thumbnail
- * This is required because the model of how files work requires that
- * the thumbnail urls be predictable. However, in our model the URL is
not based on the filename
- * (that's hidden in the session)
- *
- * @param {String} basename of thumbnail file -- however, we don't want
to use the file exactly
- * @return {String} URL to access thumbnail, or URL with partial path
- */
- public function getThumbUrl( $thumbName=false ) {
- $path = $this->sessionStash->getBaseUrl();
- $extension = $this->getExtension();
- if ( $thumbName !== false ) {
- $path .= '/' . rawurlencode( $thumbName );
- }
- return $path;
- }
-
- /**
- * The basename for the URL, which we want to not be related to the
filename.
- * Will also be used as the lookup key for a thumbnail file.
- * @param {Array} optional transformation parameters
- * @return {String} base url name, like '120px-123456.jpg'
- */
- public function getUrlName() {
- if ( ! $this->urlName ) {
- $this->urlName = $this->sessionKey . '.' .
$this->getExtension();
- }
- return $this->urlName;
- }
-
- /**
- * Return the URL of the file, if for some reason we wanted to download
it
- * We tend not to do this for the original file, but we do want thumb
icons
- * @return {String} url
- */
- public function getUrl() {
- if ( !isset( $this->url ) ) {
- $this->url = $this->sessionStash->getBaseUrl() . '/' .
$this->getUrlName();
- }
- return $this->url;
- }
-
- /**
- * Parent classes use this method, for no obvious reason, to return the
path (relative to wiki root, I assume).
- * But with this class, the URL is unrelated to the path.
- *
- * @return {String} url
- */
- public function getFullUrl() {
- return $this->getUrl();
- }
-
-
- /**
- * Typically, transform() returns a ThumbnailImage, which you can think
of as being the exact
- * equivalent of an HTML thumbnail on Wikipedia. So its URL is the
full-size file, not the thumbnail's URL.
- *
- * Here we override transform() to stash the thumbnail file, and then
- * provide a way to get at the stashed thumbnail file to extract
properties such as its URL
- *
- * @param {Array} parameters suitable for File::transform()
- * @param {Bitmask} flags suitable for File::transform()
- * @return {ThumbnailImage} with additional File thumbnailFile property
- */
- public function transform( $params, $flags=0 ) {
-
- // force it to get a thumbnail right away
- $flags |= self::RENDER_NOW;
-
- // returns a ThumbnailImage object containing the url and path.
Note. NOT A FILE OBJECT.
- $thumb = parent::transform( $params, $flags );
-
- $key = $this->thumbName($params);
-
- // remove extension, so it's stored in the session under
'120px-123456'
- // this makes it uniform with the other session key for the
original, '123456'
- $n = strrpos( $key, '.' );
- if ( $n !== false ) {
- $key = substr( $key, 0, $n );
- }
-
- // stash the thumbnail File, and provide our caller with a way
to get at its properties
- $stashedThumbFile = $this->sessionStash->stashFile( $key,
$thumb->path );
- $thumb->thumbnailFile = $stashedThumbFile;
-
- return $thumb;
-
- }
-
-}
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs