. * */ namespace OCA\Contacts\Utils; /** * This class is used for getting a temporary contact photo for cropping. */ class TemporaryPhoto { const MAX_SIZE = 400; const PHOTO_CURRENT = 0; const PHOTO_FILESYSTEM = 1; const PHOTO_UPLOADED = 2; /** * @var \OCP\IServerContainer */ protected $server; /** * @var \OCP\Image */ protected $image; /** * Cache key for temporary storage. * * @var string */ protected $key; /** * Whether normalizePhoto() has already been called. * * @var bool */ protected $normalized; /** * Whether the photo is cached. * * @var bool */ protected $cached; /** * Photo loader classes. * * @var array */ static public $classMap = array( 'OCA\\Contacts\\Utils\\TemporaryPhoto\\Contact', 'OCA\\Contacts\\Utils\\TemporaryPhoto\\FileSystem', 'OCA\\Contacts\\Utils\\TemporaryPhoto\\Uploaded', ); /** * Always call parents ctor: * parent::__construct($server); */ public function __construct(\OCP\IServerContainer $server, $key = null) { $this->server = $server; $this->key = $key; if (!is_null($key)) { $this->processImage(); } } /** * Returns an instance of a subclass of this class * * @param \OCP\IServerContainer $server * @param int|null $type One of the pre-defined types. * @param mixed|null $data Whatever data is needed to load the photo. */ public static function create(\OCP\IServerContainer $server, $type = null, $data = null) { if (isset(self::$classMap[$type])) { return new self::$classMap[$type]($server, $data); } else { return new self($data, $data); } } /** * Remove a cached image by key. * * @param string $key */ public function remove($key) { return $this->server->getCache()->remove($key); } /** * Do what's needed to get the image from storage * depending on the type. * After this method is called $this->image must hold an * instance of \OCP\Image. */ protected function processImage() { $this->image = new \OCP\Image(); $this->image->loadFromData($this->server->getCache()->get($this->key)); } /** * Whether this image is valied * * @return bool */ public function isValid() { return (($this->image instanceof \OCP\Image) && $this->image->valid()); } /** * Get the key to the cache image. * * @return string */ public function getKey() { $this->cachePhoto(); return $this->key; } /** * Get normalized image. * * @return \OCP\Image */ public function getPhoto() { $this->normalizePhoto(); return $this->image; } /** * Save image data to cache and return the key * * @return string */ private function cachePhoto() { if ($this->cached) { return; } if (!$this->image instanceof \OCP\Image) { $this->processImage(); } $this->normalizePhoto(); $data = $this->image->data(); $this->key = uniqid('photo-'); $this->server->getCache()->set($this->key, $data, 600); } /** * Resize and rotate the image if needed. */ private function normalizePhoto() { if($this->normalized) { return; } $this->image->fixOrientation(); if ($this->image->height() > self::MAX_SIZE || $this->image->width() > self::MAX_SIZE ) { $this->image->resize(self::MAX_SIZE); } $this->normalized = true; } }