+ return $tn;
+ }
+
+ static function path($filename)
+ {
+ // TODO: Store thumbnails in their own directory and don't use File::path here
+ return File::path($filename);
+ }
+
+ static function url($filename)
+ {
+ // TODO: Store thumbnails in their own directory and don't use File::url here
+ return File::url($filename);
+ }
+
+ public function getPath()
+ {
+ $filepath = self::path($this->filename);
+ if (!file_exists($filepath)) {
+ throw new FileNotFoundException($filepath);
+ }
+ return $filepath;
+ }
+
+ public function getUrl()
+ {
+ if (!empty($this->filename) || $this->getFile()->isLocal()) {
+ // A locally stored File, so we can dynamically generate a URL.
+ $url = common_local_url('attachment_thumbnail', array('attachment'=>$this->file_id));
+ if (strpos($url, '?') === false) {
+ $url .= '?';
+ }
+ return $url . http_build_query(array('w'=>$this->width, 'h'=>$this->height));
+ }
+
+ // No local filename available, return the remote URL we have stored
+ return $this->url;
+ }
+
+ public function getHeight()
+ {
+ return $this->height;
+ }
+
+ public function getWidth()
+ {
+ return $this->width;
+ }
+
+ /**
+ * @throws UseFileAsThumbnailException from File_thumbnail->getUrl() for stuff like animated GIFs
+ */
+ public function getHtmlAttrs(array $orig=array(), $overwrite=true)
+ {
+ $attrs = [
+ 'height' => $this->getHeight(),
+ 'width' => $this->getWidth(),
+ 'src' => $this->getUrl(),
+ ];
+ return $overwrite ? array_merge($orig, $attrs) : array_merge($attrs, $orig);
+ }
+
+ public function delete($useWhere=false)
+ {
+ if (!empty($this->filename) && file_exists(File_thumbnail::path($this->filename))) {
+ $deleted = @unlink(self::path($this->filename));
+ if (!$deleted) {
+ common_log(LOG_ERR, sprintf('Could not unlink existing file: "%s"', self::path($this->filename)));
+ }
+ }
+
+ return parent::delete($useWhere);
+ }
+
+ public function getFile()
+ {
+ return File::getByID($this->file_id);
+ }
+
+
+ static public function hashurl($url)
+ {
+ if (!mb_strlen($url)) {
+ throw new Exception('No URL provided to hash algorithm.');
+ }
+ return hash(self::URLHASH_ALG, $url);
+ }
+
+ public function onInsert()
+ {
+ $this->setUrlhash();
+ }
+
+ public function onUpdate($dataObject=false)
+ {
+ // if we have nothing to compare with OR it has changed from previous entry
+ if (!$dataObject instanceof Managed_DataObject || $this->url !== $dataObject->url) {
+ $this->setUrlhash();
+ }
+ }
+
+ public function setUrlhash()
+ {
+ $this->urlhash = mb_strlen($this->url)>0 ? self::hashurl($this->url) : null;