| 1 | <?php
 | 
  
    | 2 | /**
 | 
  
    | 3 |  * PhpThumb Base Class Definition File
 | 
  
    | 4 |  * 
 | 
  
    | 5 |  * This file contains the definition for the ThumbBase object
 | 
  
    | 6 |  * 
 | 
  
    | 7 |  * PHP Version 5 with GD 2.0+
 | 
  
    | 8 |  * PhpThumb : PHP Thumb Library <http://phpthumb.gxdlabs.com>
 | 
  
    | 9 |  * Copyright (c) 2009, Ian Selby/Gen X Design
 | 
  
    | 10 |  * 
 | 
  
    | 11 |  * Author(s): Ian Selby <ian@gen-x-design.com>
 | 
  
    | 12 |  * 
 | 
  
    | 13 |  * Licensed under the MIT License
 | 
  
    | 14 |  * Redistributions of files must retain the above copyright notice.
 | 
  
    | 15 |  * 
 | 
  
    | 16 |  * @author Ian Selby <ian@gen-x-design.com>
 | 
  
    | 17 |  * @copyright Copyright (c) 2009 Gen X Design
 | 
  
    | 18 |  * @link http://phpthumb.gxdlabs.com
 | 
  
    | 19 |  * @license http://www.opensource.org/licenses/mit-license.php The MIT License
 | 
  
    | 20 |  * @version 3.0
 | 
  
    | 21 |  * @package PhpThumb
 | 
  
    | 22 |  * @filesource
 | 
  
    | 23 |  */
 | 
  
    | 24 | 
 | 
  
    | 25 | /**
 | 
  
    | 26 |  * ThumbBase Class Definition
 | 
  
    | 27 |  * 
 | 
  
    | 28 |  * This is the base class that all implementations must extend.  It contains the 
 | 
  
    | 29 |  * core variables and functionality common to all implementations, as well as the functions that 
 | 
  
    | 30 |  * allow plugins to augment those classes.
 | 
  
    | 31 |  * 
 | 
  
    | 32 |  * @package PhpThumb
 | 
  
    | 33 |  * @subpackage Core
 | 
  
    | 34 |  */
 | 
  
    | 35 | abstract class ThumbBase 
 | 
  
    | 36 | {
 | 
  
    | 37 |     /**
 | 
  
    | 38 |      * All imported objects
 | 
  
    | 39 |      * 
 | 
  
    | 40 |      * An array of imported plugin objects
 | 
  
    | 41 |      * 
 | 
  
    | 42 |      * @var array
 | 
  
    | 43 |      */
 | 
  
    | 44 |     protected $imported;
 | 
  
    | 45 |     /**
 | 
  
    | 46 |      * All imported object functions
 | 
  
    | 47 |      * 
 | 
  
    | 48 |      * An array of all methods added to this class by imported plugin objects
 | 
  
    | 49 |      * 
 | 
  
    | 50 |      * @var array
 | 
  
    | 51 |      */
 | 
  
    | 52 |     protected $importedFunctions;
 | 
  
    | 53 |     /**
 | 
  
    | 54 |      * The last error message raised
 | 
  
    | 55 |      * 
 | 
  
    | 56 |      * @var string
 | 
  
    | 57 |      */
 | 
  
    | 58 |     protected $errorMessage;
 | 
  
    | 59 |     /**
 | 
  
    | 60 |      * Whether or not the current instance has any errors
 | 
  
    | 61 |      * 
 | 
  
    | 62 |      * @var bool
 | 
  
    | 63 |      */
 | 
  
    | 64 |     protected $hasError;
 | 
  
    | 65 |     /**
 | 
  
    | 66 |      * The name of the file we're manipulating
 | 
  
    | 67 |      * 
 | 
  
    | 68 |      * This must include the path to the file (absolute paths recommended)
 | 
  
    | 69 |      * 
 | 
  
    | 70 |      * @var string
 | 
  
    | 71 |      */
 | 
  
    | 72 |     protected $fileName;
 | 
  
    | 73 |     /**
 | 
  
    | 74 |      * What the file format is (mime-type)
 | 
  
    | 75 |      * 
 | 
  
    | 76 |      * @var string
 | 
  
    | 77 |      */
 | 
  
    | 78 |     protected $format;
 | 
  
    | 79 |     /**
 | 
  
    | 80 |      * Whether or not the image is hosted remotely
 | 
  
    | 81 |      * 
 | 
  
    | 82 |      * @var bool
 | 
  
    | 83 |      */
 | 
  
    | 84 |     protected $remoteImage;
 | 
  
    | 85 |     /**
 | 
  
    | 86 |      * Whether or not the current image is an actual file, or the raw file data
 | 
  
    | 87 |      *
 | 
  
    | 88 |      * By "raw file data" it's meant that we're actually passing the result of something
 | 
  
    | 89 |      * like file_get_contents() or perhaps from a database blob
 | 
  
    | 90 |      * 
 | 
  
    | 91 |      * @var bool
 | 
  
    | 92 |      */
 | 
  
    | 93 |     protected $isDataStream;
 | 
  
    | 94 |     
 | 
  
    | 95 |     /**
 | 
  
    | 96 |      * Class constructor
 | 
  
    | 97 |      * 
 | 
  
    | 98 |      * @return ThumbBase
 | 
  
    | 99 |      */
 | 
  
    | 100 |     public function __construct ($fileName, $isDataStream = false)
 | 
  
    | 101 |     {
 | 
  
    | 102 |         $this->imported                = array();
 | 
  
    | 103 |         $this->importedFunctions    = array();
 | 
  
    | 104 |         $this->errorMessage            = null;
 | 
  
    | 105 |         $this->hasError                = false;
 | 
  
    | 106 |         $this->fileName                = $fileName;
 | 
  
    | 107 |         $this->remoteImage            = false;
 | 
  
    | 108 |         $this->isDataStream            = $isDataStream;
 | 
  
    | 109 |         
 | 
  
    | 110 |         $this->fileExistsAndReadable();
 | 
  
    | 111 |     }
 | 
  
    | 112 |     
 | 
  
    | 113 |     /**
 | 
  
    | 114 |      * Imports plugins in $registry to the class
 | 
  
    | 115 |      * 
 | 
  
    | 116 |      * @param array $registry
 | 
  
    | 117 |      */
 | 
  
    | 118 |     public function importPlugins ($registry)
 | 
  
    | 119 |     {
 | 
  
    | 120 |         foreach ($registry as $plugin => $meta)
 | 
  
    | 121 |         {
 | 
  
    | 122 |             $this->imports($plugin);
 | 
  
    | 123 |         }
 | 
  
    | 124 |     }
 | 
  
    | 125 |     
 | 
  
    | 126 |     /**
 | 
  
    | 127 |      * Imports a plugin
 | 
  
    | 128 |      * 
 | 
  
    | 129 |      * This is where all the plugins magic happens!  This function "loads" the plugin functions, making them available as 
 | 
  
    | 130 |      * methods on the class.
 | 
  
    | 131 |      * 
 | 
  
    | 132 |      * @param string $object The name of the object to import / "load"
 | 
  
    | 133 |      */
 | 
  
    | 134 |     protected function imports ($object)
 | 
  
    | 135 |     {
 | 
  
    | 136 |         // the new object to import
 | 
  
    | 137 |         $newImport             = new $object();
 | 
  
    | 138 |         // the name of the new object (class name)
 | 
  
    | 139 |         $importName            = get_class($newImport);
 | 
  
    | 140 |         // the new functions to import
 | 
  
    | 141 |         $importFunctions     = get_class_methods($newImport);
 | 
  
    | 142 |         
 | 
  
    | 143 |         // add the object to the registry
 | 
  
    | 144 |         array_push($this->imported, array($importName, $newImport));
 | 
  
    | 145 |         
 | 
  
    | 146 |         // add the methods to the registry
 | 
  
    | 147 |         foreach ($importFunctions as $key => $functionName)
 | 
  
    | 148 |         {
 | 
  
    | 149 |             $this->importedFunctions[$functionName] = &$newImport;
 | 
  
    | 150 |         }
 | 
  
    | 151 |     }
 | 
  
    | 152 |     
 | 
  
    | 153 |     /**
 | 
  
    | 154 |      * Checks to see if $this->fileName exists and is readable
 | 
  
    | 155 |      * 
 | 
  
    | 156 |      */
 | 
  
    | 157 |     protected function fileExistsAndReadable ()
 | 
  
    | 158 |     {
 | 
  
    | 159 |         if ($this->isDataStream === true)
 | 
  
    | 160 |         {
 | 
  
    | 161 |             return;
 | 
  
    | 162 |         }
 | 
  
    | 163 |         
 | 
  
    | 164 |         if (stristr($this->fileName, 'http://') !== false)
 | 
  
    | 165 |         {
 | 
  
    | 166 |             $this->remoteImage = true;
 | 
  
    | 167 |             return;
 | 
  
    | 168 |         }
 | 
  
    | 169 |         
 | 
  
    | 170 |         if (!file_exists($this->fileName))
 | 
  
    | 171 |         {
 | 
  
    | 172 |             $this->triggerError('Image file not found: ' . $this->fileName);
 | 
  
    | 173 |         }
 | 
  
    | 174 |         elseif (!is_readable($this->fileName))
 | 
  
    | 175 |         {
 | 
  
    | 176 |             $this->triggerError('Image file not readable: ' . $this->fileName);
 | 
  
    | 177 |         }
 | 
  
    | 178 |     }
 | 
  
    | 179 |     
 | 
  
    | 180 |     /**
 | 
  
    | 181 |      * Sets $this->errorMessage to $errorMessage and throws an exception
 | 
  
    | 182 |      * 
 | 
  
    | 183 |      * Also sets $this->hasError to true, so even if the exceptions are caught, we don't
 | 
  
    | 184 |      * attempt to proceed with any other functions
 | 
  
    | 185 |      * 
 | 
  
    | 186 |      * @param string $errorMessage
 | 
  
    | 187 |      */
 | 
  
    | 188 |     protected function triggerError ($errorMessage)
 | 
  
    | 189 |     {
 | 
  
    | 190 |         $this->hasError     = true;
 | 
  
    | 191 |         $this->errorMessage    = $errorMessage;
 | 
  
    | 192 |         
 | 
  
    | 193 |         throw new Exception ($errorMessage);
 | 
  
    | 194 |     }
 | 
  
    | 195 |     
 | 
  
    | 196 |     /**
 | 
  
    | 197 |      * Calls plugin / imported functions
 | 
  
    | 198 |      * 
 | 
  
    | 199 |      * This is also where a fair amount of plugins magaic happens.  This magic method is called whenever an "undefined" class 
 | 
  
    | 200 |      * method is called in code, and we use that to call an imported function. 
 | 
  
    | 201 |      * 
 | 
  
    | 202 |      * You should NEVER EVER EVER invoke this function manually.  The universe will implode if you do... seriously ;)
 | 
  
    | 203 |      * 
 | 
  
    | 204 |      * @param string $method
 | 
  
    | 205 |      * @param array $args
 | 
  
    | 206 |      */
 | 
  
    | 207 |     public function __call ($method, $args)
 | 
  
    | 208 |     {
 | 
  
    | 209 |         if( array_key_exists($method, $this->importedFunctions))
 | 
  
    | 210 |         {
 | 
  
    | 211 |             $args[] = $this;
 | 
  
    | 212 |             return call_user_func_array(array($this->importedFunctions[$method], $method), $args);
 | 
  
    | 213 |         }
 | 
  
    | 214 |         
 | 
  
    | 215 |         throw new BadMethodCallException ('Call to undefined method/class function: ' . $method);
 | 
  
    | 216 |     }
 | 
  
    | 217 | 
 | 
  
    | 218 |     /**
 | 
  
    | 219 |      * Returns $imported.
 | 
  
    | 220 |      * @see ThumbBase::$imported
 | 
  
    | 221 |      * @return array
 | 
  
    | 222 |      */
 | 
  
    | 223 |     public function getImported ()
 | 
  
    | 224 |     {
 | 
  
    | 225 |         return $this->imported;
 | 
  
    | 226 |     }
 | 
  
    | 227 |     
 | 
  
    | 228 |     /**
 | 
  
    | 229 |      * Returns $importedFunctions.
 | 
  
    | 230 |      * @see ThumbBase::$importedFunctions
 | 
  
    | 231 |      * @return array
 | 
  
    | 232 |      */
 | 
  
    | 233 |     public function getImportedFunctions ()
 | 
  
    | 234 |     {
 | 
  
    | 235 |         return $this->importedFunctions;
 | 
  
    | 236 |     }
 | 
  
    | 237 |     
 | 
  
    | 238 |     /**
 | 
  
    | 239 |      * Returns $errorMessage.
 | 
  
    | 240 |      *
 | 
  
    | 241 |      * @see ThumbBase::$errorMessage
 | 
  
    | 242 |      */
 | 
  
    | 243 |     public function getErrorMessage ()
 | 
  
    | 244 |     {
 | 
  
    | 245 |         return $this->errorMessage;
 | 
  
    | 246 |     }
 | 
  
    | 247 |     
 | 
  
    | 248 |     /**
 | 
  
    | 249 |      * Sets $errorMessage.
 | 
  
    | 250 |      *
 | 
  
    | 251 |      * @param object $errorMessage
 | 
  
    | 252 |      * @see ThumbBase::$errorMessage
 | 
  
    | 253 |      */
 | 
  
    | 254 |     public function setErrorMessage ($errorMessage)
 | 
  
    | 255 |     {
 | 
  
    | 256 |         $this->errorMessage = $errorMessage;
 | 
  
    | 257 |     }
 | 
  
    | 258 |     
 | 
  
    | 259 |     /**
 | 
  
    | 260 |      * Returns $fileName.
 | 
  
    | 261 |      *
 | 
  
    | 262 |      * @see ThumbBase::$fileName
 | 
  
    | 263 |      */
 | 
  
    | 264 |     public function getFileName ()
 | 
  
    | 265 |     {
 | 
  
    | 266 |         return $this->fileName;
 | 
  
    | 267 |     }
 | 
  
    | 268 |     
 | 
  
    | 269 |     /**
 | 
  
    | 270 |      * Sets $fileName.
 | 
  
    | 271 |      *
 | 
  
    | 272 |      * @param object $fileName
 | 
  
    | 273 |      * @see ThumbBase::$fileName
 | 
  
    | 274 |      */
 | 
  
    | 275 |     public function setFileName ($fileName)
 | 
  
    | 276 |     {
 | 
  
    | 277 |         $this->fileName = $fileName;
 | 
  
    | 278 |     }
 | 
  
    | 279 |     
 | 
  
    | 280 |     /**
 | 
  
    | 281 |      * Returns $format.
 | 
  
    | 282 |      *
 | 
  
    | 283 |      * @see ThumbBase::$format
 | 
  
    | 284 |      */
 | 
  
    | 285 |     public function getFormat ()
 | 
  
    | 286 |     {
 | 
  
    | 287 |         return $this->format;
 | 
  
    | 288 |     }
 | 
  
    | 289 |     
 | 
  
    | 290 |     /**
 | 
  
    | 291 |      * Sets $format.
 | 
  
    | 292 |      *
 | 
  
    | 293 |      * @param object $format
 | 
  
    | 294 |      * @see ThumbBase::$format
 | 
  
    | 295 |      */
 | 
  
    | 296 |     public function setFormat ($format)
 | 
  
    | 297 |     {
 | 
  
    | 298 |         $this->format = $format;
 | 
  
    | 299 |     }
 | 
  
    | 300 |     
 | 
  
    | 301 |     /**
 | 
  
    | 302 |      * Returns $hasError.
 | 
  
    | 303 |      *
 | 
  
    | 304 |      * @see ThumbBase::$hasError
 | 
  
    | 305 |      */
 | 
  
    | 306 |     public function getHasError ()
 | 
  
    | 307 |     {
 | 
  
    | 308 |         return $this->hasError;
 | 
  
    | 309 |     }
 | 
  
    | 310 |     
 | 
  
    | 311 |     /**
 | 
  
    | 312 |      * Sets $hasError.
 | 
  
    | 313 |      *
 | 
  
    | 314 |      * @param object $hasError
 | 
  
    | 315 |      * @see ThumbBase::$hasError
 | 
  
    | 316 |      */
 | 
  
    | 317 |     public function setHasError ($hasError)
 | 
  
    | 318 |     {
 | 
  
    | 319 |         $this->hasError = $hasError;
 | 
  
    | 320 |     } 
 | 
  
    | 321 |     
 | 
  
    | 322 | 
 | 
  
    | 323 | }
 |