Merge "Protected function UploadBase->validateName changed to public"
[lhc/web/wiklou.git] / includes / media / SVG.php
index 53716df..cddab51 100644 (file)
@@ -120,6 +120,12 @@ class SvgHandler extends ImageHandler {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
 
+               $metadata = $this->unpackMetadata( $image->getMetadata() );
+               if ( isset( $metadata['error'] ) ) { // sanity check
+                       $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+                       return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
+               }
+
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
                                wfMessage( 'thumbnail_dest_directory' )->text() );
@@ -127,7 +133,7 @@ class SvgHandler extends ImageHandler {
 
                $srcPath = $image->getLocalRefPath();
                $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
-               if( $status === true ) {
+               if ( $status === true ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                } else {
                        return $status; // MediaTransformError
@@ -164,14 +170,14 @@ class SvgHandler extends ImageHandler {
                                $cmd = str_replace(
                                        array( '$path/', '$width', '$height', '$input', '$output' ),
                                        array( $wgSVGConverterPath ? wfEscapeShellArg( "$wgSVGConverterPath/" ) : "",
-                                                  intval( $width ),
-                                                  intval( $height ),
-                                                  wfEscapeShellArg( $srcPath ),
-                                                  wfEscapeShellArg( $dstPath ) ),
+                                               intval( $width ),
+                                               intval( $height ),
+                                               wfEscapeShellArg( $srcPath ),
+                                               wfEscapeShellArg( $dstPath ) ),
                                        $wgSVGConverters[$wgSVGConverter]
                                ) . " 2>&1";
                                wfProfileIn( 'rsvg' );
-                               wfDebug( __METHOD__.": $cmd\n" );
+                               wfDebug( __METHOD__ . ": $cmd\n" );
                                $err = wfShellExec( $cmd, $retval );
                                wfProfileOut( 'rsvg' );
                        }
@@ -179,7 +185,7 @@ class SvgHandler extends ImageHandler {
                $removed = $this->removeBadFile( $dstPath, $retval );
                if ( $retval != 0 || $removed ) {
                        wfDebugLog( 'thumbnail', sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
-                                       wfHostname(), $retval, trim($err), $cmd ) );
+                                       wfHostname(), $retval, trim( $err ), $cmd ) );
                        return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
                }
                return true;
@@ -214,6 +220,8 @@ class SvgHandler extends ImageHandler {
                if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
                        return array( $metadata['width'], $metadata['height'], 'SVG',
                                        "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" );
+               } else { // error
+                       return array( 0, 0, 'SVG', "width=\"0\" height=\"0\"" );
                }
        }
 
@@ -232,6 +240,12 @@ class SvgHandler extends ImageHandler {
         */
        function getLongDesc( $file ) {
                global $wgLang;
+
+               $metadata = $this->unpackMetadata( $file->getMetadata() );
+               if ( isset( $metadata['error'] ) ) {
+                       return wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+               }
+
                $size = $wgLang->formatSize( $file->getSize() );
 
                if ( $this->isAnimatedImage( $file ) ) {
@@ -240,23 +254,23 @@ class SvgHandler extends ImageHandler {
                        $msg = wfMessage( 'svg-long-desc' );
                }
 
-               $msg->numParams(
-                       $file->getWidth(),
-                       $file->getHeight()
-               );
-               $msg->Params( $size );
+               $msg->numParams( $file->getWidth(), $file->getHeight() )->params( $size );
+
                return $msg->parse();
        }
 
        function getMetadata( $file, $filename ) {
+               $metadata = array( 'version' => self::SVG_METADATA_VERSION );
                try {
-                       $metadata = SVGMetadataExtractor::getMetadata( $filename );
-               } catch( Exception $e ) {
-                       // Broken file?
+                       $metadata += SVGMetadataExtractor::getMetadata( $filename );
+               } catch( MWException $e ) { // @TODO: SVG specific exceptions
+                       // File not found, broken, etc.
+                       $metadata['error'] = array(
+                               'message' => $e->getMessage(),
+                               'code'    => $e->getCode()
+                       );
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
-                       return '0';
                }
-               $metadata['version'] = self::SVG_METADATA_VERSION;
                return serialize( $metadata );
        }
 
@@ -306,7 +320,7 @@ class SvgHandler extends ImageHandler {
                        return false;
                }
                $metadata = $this->unpackMetadata( $metadata );
-               if ( !$metadata ) {
+               if ( !$metadata || isset( $metadata['error'] ) ) {
                        return false;
                }