eZ Publish  [trunk]
ezimageshellhandler.php
Go to the documentation of this file.
00001 <?php
00002 /**
00003  * File containing the eZImageShellHandler class.
00004  *
00005  * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved.
00006  * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
00007  * @version //autogentag//
00008  * @package lib
00009  */
00010 
00011 /*!
00012   \class eZImageShellHandler ezimageshellhandler.php
00013   \ingroup eZImage
00014   \brief The class eZImageShellHandler does
00015 
00016 */
00017 
00018 class eZImageShellHandler extends eZImageHandler
00019 {
00020     /*!
00021      Constructor
00022     */
00023     function eZImageShellHandler( $handlerName, $isEnabled = true, $outputRewriteType = self::REPLACE_SUFFIX,
00024                                   $supportedInputMIMETypes = false, $supportedOutputMIMETypes = false,
00025                                   $conversionRules = false, $filters = false, $mimeTagMap = false)
00026     {
00027         $this->eZImageHandler( $handlerName, $isEnabled, $outputRewriteType,
00028                                $supportedInputMIMETypes, $supportedOutputMIMETypes,
00029                                $conversionRules, $filters, $mimeTagMap );
00030         $this->Path = false;
00031         $this->Executable = false;
00032         $this->PreParameters = false;
00033         $this->PostParameters = false;
00034         $this->UseTypeTag = false;
00035         $this->QualityParameters = false;
00036         $this->FrameRangeParameters = false;
00037     }
00038 
00039     /*!
00040      Creates the shell string and runs the executable.
00041     */
00042     function convert( $manager, $sourceMimeData, &$destinationMimeData, $filters = false )
00043     {
00044         $argumentList = array();
00045         $executable = $this->Executable;
00046         if ( eZSys::osType() == 'win32' and $this->ExecutableWin32 )
00047             $executable = $this->ExecutableWin32;
00048         else if ( eZSys::osType() == 'mac' and $this->ExecutableMac )
00049             $executable = $this->ExecutableMac;
00050         else if ( eZSys::osType() == 'unix' and $this->ExecutableUnix )
00051             $executable = $this->ExecutableUnix;
00052         if ( $this->Path )
00053             $executable = $this->Path . eZSys::fileSeparator() . $executable;
00054         if ( eZSys::osType() == 'win32' )
00055             $executable = "\"$executable\"";
00056 
00057         $argumentList[] = $executable;
00058 
00059         if ( $this->PreParameters )
00060             $argumentList[] = $this->PreParameters;
00061 
00062         $frameRangeParameters = $this->FrameRangeParameters;
00063         if ( $frameRangeParameters && isset( $frameRangeParameters[$sourceMimeData['name']] ) )
00064         {
00065             $sourceMimeData['url'] .= $frameRangeParameters[$sourceMimeData['name']];
00066         }
00067 
00068         $argumentList[] = eZSys::escapeShellArgument( $sourceMimeData['url'] );
00069 
00070         $qualityParameters = $this->QualityParameters;
00071         if ( $qualityParameters and
00072              isset( $qualityParameters[$destinationMimeData['name']] ) )
00073         {
00074             $qualityParameter = $qualityParameters[$destinationMimeData['name']];
00075             $outputQuality = $manager->qualityValue( $destinationMimeData['name'] );
00076             if ( $outputQuality )
00077             {
00078                 $qualityArgument = eZSys::createShellArgument( $qualityParameter, array( '%1' => $outputQuality ) );
00079                 $argumentList[] = $qualityArgument;
00080             }
00081         }
00082 
00083         if ( $filters !== false )
00084         {
00085             foreach ( $filters as $filterData )
00086             {
00087                 $argumentList[] = $this->textForFilter( $filterData );
00088             }
00089         }
00090 
00091         $destinationURL = $destinationMimeData['url'];
00092         if ( $this->UseTypeTag )
00093             $destinationURL = $this->tagForMIMEType( $destinationMimeData ) . $this->UseTypeTag . $destinationURL;
00094         $argumentList[] = eZSys::escapeShellArgument( $destinationURL );
00095 
00096         if ( $this->PostParameters )
00097             $argumentList[] = $this->PostParameters;
00098 
00099         $systemString = implode( ' ', $argumentList );
00100 
00101         system( $systemString, $returnCode );
00102 
00103         if ( $returnCode == 0 )
00104         {
00105             if ( !file_exists( $destinationMimeData['url'] ) )
00106             {
00107                 eZDebug::writeError( 'Unknown destination file: ' . $destinationMimeData['url'] . " when executing '$systemString'", 'eZImageShellHandler(' . $this->HandlerName . ')' );
00108                 return false;
00109             }
00110             $this->changeFilePermissions( $destinationMimeData['url'] );
00111             return true;
00112         }
00113         else
00114         {
00115             eZDebug::writeWarning( "Failed executing: $systemString, Error code: $returnCode", __METHOD__ );
00116             return false;
00117         }
00118 
00119     }
00120 
00121     /*!
00122      Creates a new image handler for shell executable from INI settings.
00123      The INI settings are read from ini file \a $iniFilename and group \a $iniGroup.
00124      If \a $iniFilename is not supplied \c image.ini is used.
00125     */
00126     static function createFromINI( $iniGroup, $iniFilename = false )
00127     {
00128         if ( !$iniFilename )
00129             $iniFilename = 'image.ini';
00130 
00131         $handler = false;
00132         $ini = eZINI::instance( $iniFilename );
00133         if ( !$ini )
00134         {
00135             eZDebug::writeError( "Failed loading ini file $iniFilename", __METHOD__ );
00136             return $handler;
00137         }
00138 
00139         if ( $ini->hasGroup( $iniGroup ) )
00140         {
00141             $name = $iniGroup;
00142             if ( $ini->hasVariable( $iniGroup, 'Name' ) )
00143                 $name = $ini->variable( $iniGroup, 'Name' );
00144             $inputMimeList = false;
00145             $outputMimeList = false;
00146             if ( $ini->hasVariable( $iniGroup, 'InputMIMEList' ) )
00147                 $inputMimeList = $ini->variable( $iniGroup, 'InputMIMEList' );
00148             if ( $ini->hasVariable( $iniGroup, 'OutputMIMEList' ) )
00149                 $outputMimeList = $ini->variable( $iniGroup, 'OutputMIMEList' );
00150             $qualityParameters = false;
00151             if ( $ini->hasVariable( $iniGroup, 'QualityParameters' ) )
00152             {
00153                 $qualityParametersRaw = $ini->variable( $iniGroup, 'QualityParameters' );
00154                 foreach ( $qualityParametersRaw as $qualityParameterRaw )
00155                 {
00156                     $elements = explode( ';', $qualityParameterRaw );
00157                     $qualityParameters[$elements[0]] = $elements[1];
00158                 }
00159             }
00160 
00161             $frameRangeParameters = false;
00162             if ( $ini->hasVariable( $iniGroup, 'FrameRangeParameters' ) )
00163             {
00164                 foreach ( $ini->variable( $iniGroup, 'FrameRangeParameters' ) as $frameRangeParameter )
00165                 {
00166                     $elements = explode( ';', $frameRangeParameter );
00167                     $frameRangeParameters[$elements[0]] = $elements[1];
00168                 }
00169             }
00170 
00171             $conversionRules = false;
00172             if ( $ini->hasVariable( $iniGroup, 'ConversionRules' ) )
00173             {
00174                 $conversionRules = array();
00175                 $rules = $ini->variable( $iniGroup, 'ConversionRules' );
00176                 foreach ( $rules as $ruleString )
00177                 {
00178                     $ruleItems = explode( ';', $ruleString );
00179                     if ( count( $ruleItems ) >= 2 )
00180                     {
00181                         $conversionRules[] = array( 'from' => $ruleItems[0],
00182                                                     'to' => $ruleItems[1] );
00183                     }
00184                 }
00185             }
00186             $isEnabled = $ini->variable( $iniGroup, 'IsEnabled' ) == 'true';
00187             $path = false;
00188             $executable = false;
00189             $preParameters = false;
00190             $postParameters = false;
00191             if ( $ini->hasVariable( $iniGroup, 'ExecutablePath' ) )
00192                 $path = $ini->variable( $iniGroup, 'ExecutablePath' );
00193             if ( !$ini->hasVariable( $iniGroup, 'Executable' ) )
00194             {
00195                 eZDebug::writeError( "No Executable setting for group $iniGroup in ini file $iniFilename", __METHOD__ );
00196                 return $handler;
00197             }
00198             $executable = $ini->variable( $iniGroup, 'Executable' );
00199             $executableWin32 = false;
00200             $executableMac = false;
00201             $executableUnix = false;
00202             $ini->assign( $iniGroup, 'ExecutableWin32', $executableWin32 );
00203             $ini->assign( $iniGroup, 'ExecutableMac', $executableMac );
00204             $ini->assign( $iniGroup, 'ExecutableUnix', $executableUnix );
00205 
00206             if ( $ini->hasVariable( $iniGroup, 'ExecutablePath' ) )
00207                 $path = $ini->variable( $iniGroup, 'ExecutablePath' );
00208             if ( $ini->hasVariable( $iniGroup, 'PreParameters' ) )
00209                 $preParameters = $ini->variable( $iniGroup, 'PreParameters' );
00210             if ( $ini->hasVariable( $iniGroup, 'PostParameters' ) )
00211                 $postParameters = $ini->variable( $iniGroup, 'PostParameters' );
00212             $useTypeTag = false;
00213             if ( $ini->hasVariable( $iniGroup, 'UseTypeTag' ) )
00214             {
00215                 $useTypeTag = $ini->variable( $iniGroup, 'UseTypeTag' );
00216             }
00217             $outputRewriteType = self::REPLACE_SUFFIX;
00218             $filters = false;
00219             if ( $ini->hasVariable( $iniGroup, 'Filters' ) )
00220             {
00221                 $filterRawList = $ini->variable( $iniGroup, 'Filters' );
00222                 $filters = array();
00223                 foreach ( $filterRawList as $filterRawItem )
00224                 {
00225                     $filter = eZImageHandler::createFilterDefinitionFromINI( $filterRawItem );
00226                     $filters[] = $filter;
00227                 }
00228             }
00229             $mimeTagMap = false;
00230             if ( $ini->hasVariable( $iniGroup, 'MIMETagMap' ) )
00231             {
00232                 $mimeTagMapList = $ini->variable( $iniGroup, 'MIMETagMap' );
00233                 $mimeTagMap = array();
00234                 foreach ( $mimeTagMapList as $mimeTagMapItem )
00235                 {
00236                     $mimeTagMapArray = explode( ';', $mimeTagMapItem );
00237                     if ( count( $mimeTagMapArray ) >= 2 )
00238                         $mimeTagMap[$mimeTagMapArray[0]] = $mimeTagMapArray[1];
00239                 }
00240             }
00241             $handler = new eZImageShellHandler( $name, $isEnabled,
00242                                                 $outputRewriteType,
00243                                                 $inputMimeList, $outputMimeList,
00244                                                 $conversionRules, $filters, $mimeTagMap );
00245             $handler->Path = $path;
00246             $handler->Executable = $executable;
00247             $handler->ExecutableWin32 = $executableWin32;
00248             $handler->ExecutableMac = $executableMac;
00249             $handler->ExecutableUnix = $executableUnix;
00250             $handler->PreParameters = $preParameters;
00251             $handler->PostParameters = $postParameters;
00252             $handler->UseTypeTag = $useTypeTag;
00253             $handler->QualityParameters = $qualityParameters;
00254             $handler->FrameRangeParameters = $frameRangeParameters;
00255             return $handler;
00256         }
00257         return $handler;
00258     }
00259 
00260     /// \privatesection
00261     public $Path;
00262     public $Executable;
00263     public $PreParameters;
00264     public $PostParameters;
00265 }
00266 
00267 ?>