summaryrefslogtreecommitdiff
path: root/includes/filerepo/File.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/filerepo/File.php')
-rw-r--r--includes/filerepo/File.php128
1 files changed, 77 insertions, 51 deletions
diff --git a/includes/filerepo/File.php b/includes/filerepo/File.php
index d79a1661..192e8c8a 100644
--- a/includes/filerepo/File.php
+++ b/includes/filerepo/File.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * Base code for files.
+ *
+ * @file
+ * @ingroup FileRepo
+ */
/**
* Implements some public methods and some protected utility functions which
@@ -177,7 +183,8 @@ abstract class File {
* Return a fully-qualified URL to the file.
* Upload URL paths _may or may not_ be fully qualified, so
* we check. Local paths are assumed to belong on $wgServer.
- * @return string
+ *
+ * @return String
*/
public function getFullUrl() {
return wfExpandUrl( $this->getUrl() );
@@ -260,6 +267,19 @@ abstract class File {
}
/**
+ * Return true if the file is vectorized
+ */
+ public function isVectorized() {
+ $handler = $this->getHandler();
+ if ( $handler ) {
+ return $handler->isVectorized( $this );
+ } else {
+ return false;
+ }
+ }
+
+
+ /**
* Get handler-specific metadata
* Overridden by LocalFile, UnregisteredLocalFile
* STUB
@@ -437,26 +457,21 @@ abstract class File {
/**
* Get a ThumbnailImage which is the same size as the source
*/
- function getUnscaledThumb( $page = false ) {
+ function getUnscaledThumb( $handlerParams = array() ) {
+ $hp =& $handlerParams;
+ $page = isset( $hp['page'] ) ? $hp['page'] : false;
$width = $this->getWidth( $page );
if ( !$width ) {
return $this->iconThumb();
}
- if ( $page ) {
- $params = array(
- 'page' => $page,
- 'width' => $this->getWidth( $page )
- );
- } else {
- $params = array( 'width' => $this->getWidth() );
- }
- return $this->transform( $params );
+ $hp['width'] = $width;
+ return $this->transform( $hp );
}
/**
* Return the file name of a thumbnail with the specified parameters
*
- * @param array $params Handler-specific parameters
+ * @param $params Array: handler-specific parameters
* @private -ish
*/
function thumbName( $params ) {
@@ -464,7 +479,7 @@ abstract class File {
return null;
}
$extension = $this->getExtension();
- list( $thumbExt, $thumbMime ) = $this->handler->getThumbType( $extension, $this->getMimeType() );
+ list( $thumbExt, $thumbMime ) = $this->handler->getThumbType( $extension, $this->getMimeType(), $params );
$thumbName = $this->handler->makeParamString( $params ) . '-' . $this->getName();
if ( $thumbExt != $extension ) {
$thumbName .= ".$thumbExt";
@@ -484,8 +499,8 @@ abstract class File {
* specified, the generated image will be no bigger than width x height,
* and will also have correct aspect ratio.
*
- * @param integer $width maximum width of the generated thumbnail
- * @param integer $height maximum height of the image (optional)
+ * @param $width Integer: maximum width of the generated thumbnail
+ * @param $height Integer: maximum height of the image (optional)
*/
public function createThumb( $width, $height = -1 ) {
$params = array( 'width' => $width );
@@ -500,19 +515,20 @@ abstract class File {
/**
* As createThumb, but returns a ThumbnailImage object. This can
* provide access to the actual file, the real size of the thumb,
- * and can produce a convenient <img> tag for you.
+ * and can produce a convenient \<img\> tag for you.
*
* For non-image formats, this may return a filetype-specific icon.
*
- * @param integer $width maximum width of the generated thumbnail
- * @param integer $height maximum height of the image (optional)
- * @param boolean $render Deprecated
+ * @param $width Integer: maximum width of the generated thumbnail
+ * @param $height Integer: maximum height of the image (optional)
+ * @param $render Integer: Deprecated
*
* @return ThumbnailImage or null on failure
*
* @deprecated use transform()
*/
public function getThumbnail( $width, $height=-1, $render = true ) {
+ wfDeprecated( __METHOD__ );
$params = array( 'width' => $width );
if ( $height != -1 ) {
$params['height'] = $height;
@@ -523,10 +539,10 @@ abstract class File {
/**
* Transform a media file
*
- * @param array $params An associative array of handler-specific parameters. Typical
- * keys are width, height and page.
- * @param integer $flags A bitfield, may contain self::RENDER_NOW to force rendering
- * @return MediaTransformOutput
+ * @param $params Array: an associative array of handler-specific parameters.
+ * Typical keys are width, height and page.
+ * @param $flags Integer: a bitfield, may contain self::RENDER_NOW to force rendering
+ * @return MediaTransformOutput | false
*/
function transform( $params, $flags = 0 ) {
global $wgUseSquid, $wgIgnoreImageErrors, $wgThumbnailEpoch, $wgServer;
@@ -560,7 +576,7 @@ abstract class File {
$thumbPath = $this->getThumbPath( $thumbName );
$thumbUrl = $this->getThumbUrl( $thumbName );
- if ( $this->repo->canTransformVia404() && !($flags & self::RENDER_NOW ) ) {
+ if ( $this->repo && $this->repo->canTransformVia404() && !($flags & self::RENDER_NOW ) ) {
$thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
break;
}
@@ -842,19 +858,18 @@ abstract class File {
/**
* Move or copy a file to its public location. If a file exists at the
- * destination, move it to an archive. Returns the archive name on success
- * or an empty string if it was a new file, and a wikitext-formatted
- * WikiError object on failure.
+ * destination, move it to an archive. Returns a FileRepoStatus object with
+ * the archive name in the "value" member on success.
*
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param string $sourcePath Local filesystem path to the source image
- * @param integer $flags A bitwise combination of:
+ * @param $srcPath String: local filesystem path to the source image
+ * @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move
* rather than copy
- * @return The archive name on success or an empty string if it was a new
- * file, and a wikitext-formatted WikiError object on failure.
+ * @return FileRepoStatus object. On success, the value member contains the
+ * archive name, or an empty string if it was a new file.
*
* STUB
* Overridden by LocalFile
@@ -872,6 +887,7 @@ abstract class File {
* @deprecated Use HTMLCacheUpdate, this function uses too much memory
*/
function getLinksTo( $options = array() ) {
+ wfDeprecated( __METHOD__ );
wfProfileIn( __METHOD__ );
// Note: use local DB not repo DB, we want to know local links
@@ -884,21 +900,21 @@ abstract class File {
$encName = $db->addQuotes( $this->getName() );
$res = $db->select( array( 'page', 'imagelinks'),
- array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect' ),
- array( 'page_id' => 'il_from', 'il_to' => $encName ),
+ array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ array( 'page_id=il_from', 'il_to' => $encName ),
__METHOD__,
$options );
$retVal = array();
if ( $db->numRows( $res ) ) {
- while ( $row = $db->fetchObject( $res ) ) {
- if ( $titleObj = Title::newFromRow( $row ) ) {
- $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect );
+ foreach ( $res as $row ) {
+ $titleObj = Title::newFromRow( $row );
+ if ( $titleObj ) {
+ $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect, $row->page_latest );
$retVal[] = $titleObj;
}
}
}
- $db->freeResult( $res );
wfProfileOut( __METHOD__ );
return $retVal;
}
@@ -916,7 +932,8 @@ abstract class File {
* @return bool
*/
function isLocal() {
- return $this->getRepoName() == 'local';
+ $repo = $this->getRepo();
+ return $repo && $repo->isLocal();
}
/**
@@ -992,8 +1009,8 @@ abstract class File {
*
* Cache purging is done; logging is caller's responsibility.
*
- * @param $reason
- * @param $suppress, hide content from sysops?
+ * @param $reason String
+ * @param $suppress Boolean: hide content from sysops?
* @return true on success, false on some kind of failure
* STUB
* Overridden by LocalFile
@@ -1010,7 +1027,7 @@ abstract class File {
*
* @param $versions set of record ids of deleted items to restore,
* or empty to restore all revisions.
- * @param $unsuppress, remove restrictions on content upon restoration?
+ * @param $unsuppress remove restrictions on content upon restoration?
* @return the number of file revisions restored if successful,
* or false on failure
* STUB
@@ -1032,7 +1049,7 @@ abstract class File {
}
/**
- * Returns the number of pages of a multipage document, or NULL for
+ * Returns the number of pages of a multipage document, or false for
* documents which aren't multipage documents
*/
function pageCount() {
@@ -1059,11 +1076,11 @@ abstract class File {
}
/**
- * Get an image size array like that returned by getimagesize(), or false if it
+ * Get an image size array like that returned by getImageSize(), or false if it
* can't be determined.
*
- * @param string $fileName The filename
- * @return array
+ * @param $fileName String: The filename
+ * @return Array
*/
function getImageSize( $fileName ) {
if ( !$this->getHandler() ) {
@@ -1156,8 +1173,8 @@ abstract class File {
* Determine if the current user is allowed to view a particular
* field of this file, if it's marked as deleted.
* STUB
- * @param int $field
- * @return bool
+ * @param $field Integer
+ * @return Boolean
*/
function userCan( $field ) {
return true;
@@ -1166,9 +1183,9 @@ abstract class File {
/**
* Get an associative array containing information about a file in the local filesystem.
*
- * @param string $path Absolute local filesystem path
- * @param mixed $ext The file extension, or true to extract it from the filename.
- * Set it to false to ignore the extension.
+ * @param $path String: absolute local filesystem path
+ * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * Set it to false to ignore the extension.
*/
static function getPropsFromPath( $path, $ext = true ) {
wfProfileIn( __METHOD__ );
@@ -1180,7 +1197,16 @@ abstract class File {
if ( $info['fileExists'] ) {
$magic = MimeMagic::singleton();
- $info['mime'] = $magic->guessMimeType( $path, $ext );
+ if ( $ext === true ) {
+ $i = strrpos( $path, '.' );
+ $ext = strtolower( $i ? substr( $path, $i + 1 ) : '' );
+ }
+
+ # mime type according to file contents
+ $info['file-mime'] = $magic->guessMimeType( $path, false );
+ # logical mime type
+ $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
+
list( $info['major_mime'], $info['minor_mime'] ) = self::splitMime( $info['mime'] );
$info['media_type'] = $magic->getMediaType( $path, $info['mime'] );