<?php
-# Class to represent an image
-# Provides methods to retrieve paths (physical, logical, URL),
-# to generate thumbnails or for uploading.
-
+/**
+ * @package MediaWiki
+ * $Id$
+ */
+
+/**
+ * Class to represent an image
+ *
+ * Provides methods to retrieve paths (physical, logical, URL),
+ * to generate thumbnails or for uploading.
+ * @package MediaWiki
+ */
class Image
{
/* private */
function Image( $name )
{
- global $wgUploadDirectory;
+ global $wgUploadDirectory,$wgHashedUploadDirectory;
$this->name = $name;
- $this->title = Title::makeTitle( Namespace::getImage(), $this->name );
+ $this->title = Title::makeTitleSafe( NS_IMAGE, $this->name );
//$this->imagePath = wfImagePath( $name );
- $hash = md5( $this->title->getDBkey() );
- $this->imagePath = $wgUploadDirectory . '/' . $hash{0} . '/' .substr( $hash, 0, 2 ) . "/{$name}";
+ if ($wgHashedUploadDirectory) {
+ $hash = md5( $this->title->getDBkey() );
+ $this->imagePath = $wgUploadDirectory . '/' . $hash{0} . '/' .
+ substr( $hash, 0, 2 ) . "/{$name}";
+ } else {
+ $this->imagePath = $wgUploadDirectory . '/' . $name;
+ }
$this->url = $this->wfImageUrl( $name );
return $this->name;
}
+ function getTitle()
+ {
+ return $this->title;
+ }
+
function getURL()
{
return $this->url;
return $this->height;
}
+ function getSize()
+ {
+ $st = stat( $this->getImagePath() );
+ return $st['size'];
+ }
+
function getType()
{
return $this->type;
function wfImageUrl( $name )
{
- global $wgUploadPath;
- $hash = md5( $name );
-
- $url = "{$wgUploadPath}/" . $hash{0} . "/" .
- substr( $hash, 0, 2 ) . "/{$name}";
+ global $wgUploadPath,$wgUploadBaseUrl,$wgHashedUploadDirectory;
+ if ($wgHashedUploadDirectory) {
+ $hash = md5( $name );
+ $url = "{$wgUploadBaseUrl}{$wgUploadPath}/" . $hash{0} . "/" .
+ substr( $hash, 0, 2 ) . "/{$name}";
+ } else {
+ $url = "{$wgUploadBaseUrl}{$wgUploadPath}/{$name}";
+ }
return wfUrlencode( $url );
}
-
function exists()
{
return $this->fileExists;
}
function thumbUrl( $width, $subdir='thumb' ) {
- global $wgUploadPath;
-
+ global $wgUploadPath,$wgHashedUploadDirectory;
$name = $this->thumbName( $width );
- $hash = md5( $name );
- $url = "{$wgUploadPath}/{$subdir}/" . $hash{0} . "/" . substr( $hash, 0, 2 ) . "/{$name}";
+ if ($wgHashedUploadDirectory) {
+ $hash = md5( $name );
+ $url = "{$wgUploadPath}/{$subdir}/" . $hash{0} . "/" .
+ substr( $hash, 0, 2 ) . "/{$name}";
+ } else {
+ $url = "{$wgUploadPath}/{$subdir}/{$name}";
+ }
return wfUrlencode($url);
}
return $width."px-".$this->name;
}
- //**********************************************************************
- // Create a thumbnail of the image having the specified width.
- // The thumbnail will not be created if the width is larger than the
- // image's width. Let the browser do the scaling in this case.
- // The thumbnail is stored on disk and is only computed if the thumbnail
- // file does not exist OR if it is older than the image.
- // Returns the URL.
- function createThumb( $width ) {
+ function createThumb( $width, $height=-1 ) {
+ if ( $height == -1 ) {
+ return $this->renderThumb( $width );
+ }
+ if ( $width < $this->width ) {
+ $thumbheight = $this->height * $width / $this->width;
+ $thumbwidth = $width;
+ } else {
+ $thumbheight = $this->height;
+ $thumbwidth = $this->width;
+ }
+ if ( $thumbheight > $height ) {
+ $thumbwidth = $thumbwidth * $height / $thumbheight;
+ $thumbheight = $height;
+ }
+ return $this->renderThumb( $thumbwidth );
+ }
+
+ /**
+ * Create a thumbnail of the image having the specified width.
+ * The thumbnail will not be created if the width is larger than the
+ * image's width. Let the browser do the scaling in this case.
+ * The thumbnail is stored on disk and is only computed if the thumbnail
+ * file does not exist OR if it is older than the image.
+ * Returns the URL.
+ */
+ function /* private */ renderThumb( $width ) {
global $wgUploadDirectory;
global $wgImageMagickConvertCommand;
global $wgUseImageMagick;
return $thumbUrl;
} // END OF function createThumb
- //**********************************************************************
- // Return the image history of this image, line by line.
- // starts with current version, then old versions.
- // uses $this->historyLine to check which line to return:
- // 0 return line for current version
- // 1 query for old versions, return first one
- // 2, ... return next old version from above query
+ /**
+ * Return the image history of this image, line by line.
+ * starts with current version, then old versions.
+ * uses $this->historyLine to check which line to return:
+ * 0 return line for current version
+ * 1 query for old versions, return first one
+ * 2, ... return next old version from above query
+ */
function nextHistoryLine()
{
$fname = 'Image::nextHistoryLine()';
function wfImageDir( $fname )
{
- global $wgUploadDirectory;
+ global $wgUploadDirectory, $wgHashedUploadDirectory;
+
+ if (!$wgHashedUploadDirectory) { return $wgUploadDirectory; }
$hash = md5( $fname );
$oldumask = umask(0);
function wfImageArchiveDir( $fname , $subdir='archive')
{
- global $wgUploadDirectory;
+ global $wgUploadDirectory, $wgHashedUploadDirectory;
+
+ if (!$wgHashedUploadDirectory) { return $wgUploadDirectory.'/'.$subdir; }
$hash = md5( $fname );
$oldumask = umask(0);
# Test to see if the row exists using INSERT IGNORE
# This avoids race conditions by locking the row until the commit, and also
# doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
- $dbw->insert( 'image',
+ $dbw->insertArray( 'image',
array(
'img_name' => $name,
'img_size'=> $size,
- 'img_timestamp' => $now,
+ 'img_timestamp' => $dbw->timestamp($now),
'img_description' => $desc,
'img_user' => $wgUser->getID(),
'img_user_text' => $wgUser->getName(),
), $fname, 'IGNORE'
);
- $descTitle = Title::makeTitle( NS_IMAGE, $name );
+ $descTitle = Title::makeTitleSafe( NS_IMAGE, $name );
if ( $dbw->affectedRows() ) {
# Successfully inserted, this is a new image
'cur_comment' => $desc,
'cur_user' => $wgUser->getID(),
'cur_user_text' => $wgUser->getName(),
- 'cur_timestamp' => $now,
+ 'cur_timestamp' => $dbw->timestamp($now),
'cur_is_new' => 1,
'cur_text' => $textdesc,
'inverse_timestamp' => $won,
- 'cur_touched' => $now
+ 'cur_touched' => $dbw->timestamp($now)
), $fname
);
$id = $dbw->insertId() or 0; # We should throw an error instead
'oi_name' => $s->img_name,
'oi_archive_name' => $oldver,
'oi_size' => $s->img_size,
- 'oi_timestamp' => $s->img_timestamp,
+ 'oi_timestamp' => $dbw->timestamp($s->img_timestamp),
'oi_description' => $s->img_description,
'oi_user' => $s->img_user,
'oi_user_text' => $s->img_user_text
$dbw->updateArray( 'image',
array( /* SET */
'img_size' => $size,
- 'img_timestamp' => wfTimestampNow(),
+ 'img_timestamp' => $dbw->timestamp(),
'img_user' => $wgUser->getID(),
'img_user_text' => $wgUser->getName(),
'img_description' => $desc,
$descTitle->invalidateCache();
}
- $log = new LogPage( wfMsg( 'uploadlogpage' ), wfMsg( 'uploadlogpagetext' ) );
- $da = wfMsg( 'uploadedimage', '[[:' . $wgLang->getNsText(
- Namespace::getImage() ) . ":{$name}|{$name}]]" );
- $ta = wfMsg( 'uploadedimage', $name );
- $log->addEntry( $da, $desc, $ta );
+ $log = new LogPage( 'upload' );
+ $log->addEntry( 'upload', $descTitle, $desc );
}
-function wfImageArchiveUrl( $name )
+function wfImageArchiveUrl( $name, $subdir='archive' )
{
- global $wgUploadPath;
+ global $wgUploadPath, $wgHashedUploadDirectory;
- $hash = md5( substr( $name, 15) );
- $url = $wgUploadPath.'/archive/' . $hash{0} . '/' .
- substr( $hash, 0, 2 ) . '/'.$name;
+ if ($wgHashedUploadDirectory) {
+ $hash = md5( substr( $name, 15) );
+ $url = $wgUploadPath.'/'.$subdir.'/' . $hash{0} . '/' .
+ substr( $hash, 0, 2 ) . '/'.$name;
+ } else {
+ $url = $wgUploadPath.'/'.$subdir.'/'.$name;
+ }
return wfUrlencode($url);
}