Merge commit 'origin/master' into nefformat
authorAndreas Unterkircher <unki@netshadow.at>
Sat, 12 Apr 2008 17:33:51 +0000 (19:33 +0200)
committerAndreas Unterkircher <unki@netshadow.at>
Sat, 12 Apr 2008 17:33:51 +0000 (19:33 +0200)
1  2 
phpfspot.class.php

diff --combined phpfspot.class.php
index b5034e72026704cbb3014891c2b4d7eaac98ffe3,b5dd177307e07012704e93486f6a7ab6d4143605..eb2312bf709a9b5ff0302d4538fa18480e6c2a1b
@@@ -2,8 -2,9 +2,9 @@@
  
  /***************************************************************************
   *
-  * Copyright (c) by Andreas Unterkircher, unki@netshadow.at
-  * All rights reserved
+  * phpfspot, presents your F-Spot photo collection in Web browsers.
+  *
+  * Copyright (c) by Andreas Unterkircher
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
  require_once "phpfspot_cfg.php";
  require_once "phpfspot_db.php";
  
+ /**
+  * PHPFSPOT main class
+  *
+  * this class contains the most functions which will to the major
+  * work for phpfspot.
+  *
+  * @package phpfspot
+  */
  class PHPFSPOT {
  
+    /**
+      * phpfspot configuration
+      * @access public
+      * @see PHPFSPOT_CFG()
+      * @var PHPFSPOT_CFG
+      */
     var $cfg;
+    /**
+      * SQLite database handle to f-spot database
+      * @see PHPFSPOT_DB()
+      * @access public
+      * @var PHPFSPOT_DB
+      */
     var $db;
+    /**
+      * SQLite database handle to phpfspot database
+      * @see PHPFSPOT_DB()
+      * @access public
+      * @var PHPFSPOT_DB
+      */
     var $cfg_db;
+    /**
+     * Smarty template engine
+     * @link http://smarty.php.net smarty.php.net
+     * @see PHPFSPOT_TMPL()
+     * @access public
+     * @var PHPFSPOT_TMPL
+     */
     var $tmpl;
+    /**
+     * full tag - list
+     * @access public
+     * @var array
+     */
     var $tags;
+    /**
+     * list of available, not-selected, tags
+     * @access public
+     * @var array
+     */
     var $avail_tags;
  
+    /**
+     * true if runtime error occued
+     * @access private
+     * @var boolean
+     */
     private $runtime_error = false;
+    /**
+     * F-Spot database version
+     * @access private
+     * @var integer
+     */
     private $dbver;
  
     /**
-     * class constructor
+     * class constructor ($cfg, $db, $cfg_db, $tmpl, $db_ver)
      *
      * this function will be called on class construct
      * and will check requirements, loads configuration,
      */
     public function __construct()
     {
+       /**
+        * register PHPFSPOT class global
+        *
+        * @global PHPFSPOT $GLOBALS['phpfspot']
+        * @name $phpfspot
+        */
+       $GLOBALS['phpfspot'] =& $this;
        $this->cfg = new PHPFSPOT_CFG;
  
        /* verify config settings */
  
        /* overload Smarty class with our own template handler */
        require_once "phpfspot_tmpl.php";
-       $this->tmpl = new PHPFSPOT_TMPL($this);
+       $this->tmpl = new PHPFSPOT_TMPL();
  
        /* check if all necessary indices exist */
        $this->checkDbIndices();
      * 
      * retrieve all available details from f-spot's
      * database and return them as object
+     * @param integer $idx
+     * @return object|null
      */
     public function get_photo_details($idx)
     {
      * this function returns aligned (length) names for
      * an specific photo. If the length of the name exceeds
      * $limit the name will be shrinked (...)
+     * @param integer $idx
+     * @param integer $limit
+     * @return string|null
      */
     public function getPhotoName($idx, $limit = 0)
     {
      * If the length of the name exceeds $limit the
      * text will be shortend and some content in between
      * will be replaced with "..." 
+     * @param string $ext
+     * @param integer $limit
+     * @return string
      */
     private function shrink_text($text, $limit)
     {
      * as the full-qualified path recorded in the f-spot database
      * is usally not the same as on the webserver, this function
      * will replace the path with that one specified in the cfg
+     * @param string $path
+     * @return string
      */
-    public function translate_path($path, $width = 0)
+    public function translate_path($path)
     {  
        return str_replace($this->cfg->path_replace_from, $this->cfg->path_replace_to, $path);
  
      *
      * this function provides all the necessary information
      * for the single photo template.
+     * @param integer photo
      */
     public function showPhoto($photo)
     {
           $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
        }
  
+       /* get mime-type, height and width from the original photo */
+       $info = getimagesize($orig_path);
        /* get EXIF information if JPEG */
-       if($details['mime'] == "image/jpeg") {
+       if($info['mime'] == "image/jpeg") {
           $meta = $this->get_meta_informations($orig_path);
        }
  
        if(isset($meta['ExifImageWidth'])) {
           $meta_res = $meta['ExifImageWidth'] ."x". $meta['ExifImageLength'];
        } else {
-          $info = getimagesize($orig_path);
           $meta_res = $info[0] ."x". $info[1]; 
        }
  
           return;
        }
  
-       $info = getimagesize($thumb_path);
+       $info_thumb = getimagesize($thumb_path);
  
        $this->tmpl->assign('description', $details['description']);
        $this->tmpl->assign('image_name', $this->parse_uri($details['uri'], 'filename'));
  
-       $this->tmpl->assign('width', $info[0]);
-       $this->tmpl->assign('height', $info[1]);
+       $this->tmpl->assign('width', $info_thumb[0]);
+       $this->tmpl->assign('height', $info_thumb[1]);
        $this->tmpl->assign('ExifMadeOn', $meta_date);
        $this->tmpl->assign('ExifMadeWith', $meta_make);
        $this->tmpl->assign('ExifOrigResolution', $meta_res);
      * this function output all tags which have been selected
      * by the user. the selected tags are stored in the 
      * session-variable $_SESSION['selected_tags']
+     * @return string
      */
     public function getSelectedTags()
     {
      * this function will add the specified to users current
      * tag selection. if a date search has been made before
      * it will be now cleared
+     * @return string
      */
     public function addTag($tag)
     {
      *
      * this function removes the specified tag from
      * users current tag selection
+     * @param string $tag
+     * @return string
      */
     public function delTag($tag)
     {
  
     /**
      * returns the value for the autocomplet tag-search
+     * @return string
      */
     public function get_xml_tag_list()
     {
      * the tag-selection, tag- or date-search.
      * the tag-search also has to take care of AND
      * and OR conjunctions
+     * @return array
      */
     public function getPhotoSelection()
     {  
      * stored as $thumb_image. It will check if the image is
      * in a supported format, if necessary rotate the image
      * (based on EXIF orientation meta headers) and re-sizing.
+     * @param string $orig_image
+     * @param string $thumb_image
+     * @param integer $width
+     * @return boolean
      */
     public function create_thumbnail($orig_image, $thumb_image, $width)
     {  
              }
  
              $src_img = @imagecreatefromjpeg($orig_image);
 +            $handler = "gd";
              break;
  
           case 'image/png':
  
              $src_img = @imagecreatefrompng($orig_image);
 +            $handler = "gd";
              break;
  
 -      }
 +         case 'image/tiff':
 +
 +            $src_img = new Imagick($orig_image);
 +            print_r($src_img->queryFormats());
 +            
 +            $handler = "imagick";
 +            exit(1);
 +            break;
  
 -      if(!$src_img) {
 -         print "Can't load image from ". $orig_image ."\n";
 -         return false;
        }
  
 -      /* grabs the height and width */
 -      $cur_width = imagesx($src_img);
 -      $cur_height = imagesy($src_img);
  
 -      // If requested width is more then the actual image width,
 -      // do not generate a thumbnail, instead safe the original
 -      // as thumbnail but with lower quality. But if the image
 -      // is to heigh too, then we still have to resize it.
 -      if($width >= $cur_width && $cur_height < $this->cfg->thumb_height) {
 -         $result = imagejpeg($src_img, $thumb_image, 75);
 -         imagedestroy($src_img);
 -         return true;
 -      }
 +      switch($handler) {
  
 -      // If the image will be rotate because EXIF orientation said so
 -      // 'virtually rotate' the image for further calculations
 -      if($rotate == 90 || $rotate == 270) {
 -         $tmp = $cur_width;
 -         $cur_width = $cur_height;
 -         $cur_height = $tmp;
 -      }
 +         case 'gd':
  
 -      /* calculates aspect ratio */
 -      $aspect_ratio = $cur_height / $cur_width;
 +            if(!isset($src_img) || empty($src_img)) {
 +               print "Can't load image from ". $orig_image ."\n";
 +               return false;
 +            }
  
 -      /* sets new size */
 -      if($aspect_ratio < 1) {
 -         $new_w = $width;
 -         $new_h = abs($new_w * $aspect_ratio);
 -      } else {
 -         /* 'virtually' rotate the image and calculate it's ratio */
 -         $tmp_w = $cur_height;
 -         $tmp_h = $cur_width;
 -         /* now get the ratio from the 'rotated' image */
 -         $tmp_ratio = $tmp_h/$tmp_w;
 -         /* now calculate the new dimensions */
 -         $tmp_w = $width;
 -         $tmp_h = abs($tmp_w * $tmp_ratio);
 -
 -         // now that we know, how high they photo should be, if it
 -         // gets rotated, use this high to scale the image
 -         $new_h = $tmp_h;
 -         $new_w = abs($new_h / $aspect_ratio);
 -
 -         // If the image will be rotate because EXIF orientation said so
 -         // now 'virtually rotate' back the image for the image manipulation
 -         if($rotate == 90 || $rotate == 270) {
 -            $tmp = $new_w;
 -            $new_w = $new_h;
 -            $new_h = $tmp;
 -         }
 -      }
 +            /* grabs the height and width */
 +            $cur_width = imagesx($src_img);
 +            $cur_height = imagesy($src_img);
 +
 +            // If requested width is more then the actual image width,
 +            // do not generate a thumbnail, instead safe the original
 +            // as thumbnail but with lower quality. But if the image
 +            // is to heigh too, then we still have to resize it.
 +            if($width >= $cur_width && $cur_height < $this->cfg->thumb_height) {
 +               $result = imagejpeg($src_img, $thumb_image, 75);
 +               imagedestroy($src_img);
 +               return true;
 +            }
  
 -      /* creates new image of that size */
 -      $dst_img = imagecreatetruecolor($new_w, $new_h);
 +            // If the image will be rotate because EXIF orientation said so
 +            // 'virtually rotate' the image for further calculations
 +            if($rotate == 90 || $rotate == 270) {
 +               $tmp = $cur_width;
 +               $cur_width = $cur_height;
 +               $cur_height = $tmp;
 +            }
  
 -      imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255));
 +            /* calculates aspect ratio */
 +            $aspect_ratio = $cur_height / $cur_width;
  
 -      /* copies resized portion of original image into new image */
 -      imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, imagesx($src_img), imagesy($src_img));
 +            /* sets new size */
 +            if($aspect_ratio < 1) {
 +               $new_w = $width;
 +               $new_h = abs($new_w * $aspect_ratio);
 +            } else {
 +               /* 'virtually' rotate the image and calculate it's ratio */
 +               $tmp_w = $cur_height;
 +               $tmp_h = $cur_width;
 +               /* now get the ratio from the 'rotated' image */
 +               $tmp_ratio = $tmp_h/$tmp_w;
 +               /* now calculate the new dimensions */
 +               $tmp_w = $width;
 +               $tmp_h = abs($tmp_w * $tmp_ratio);
 +
 +               // now that we know, how high they photo should be, if it
 +               // gets rotated, use this high to scale the image
 +               $new_h = $tmp_h;
 +               $new_w = abs($new_h / $aspect_ratio);
 +
 +               // If the image will be rotate because EXIF orientation said so
 +               // now 'virtually rotate' back the image for the image manipulation
 +               if($rotate == 90 || $rotate == 270) {
 +                  $tmp = $new_w;
 +                  $new_w = $new_h;
 +                  $new_h = $tmp;
 +               }
 +            }
  
 -      /* needs the image to be flipped horizontal? */
 -      if($flip_hori) {
 -         $this->_debug("(FLIP)");
 -         $dst_img = $this->flipImage($dst_img, 'hori');
 -      }
 -      /* needs the image to be flipped vertical? */
 -      if($flip_vert) {
 -         $this->_debug("(FLIP)");
 -         $dst_img = $this->flipImage($dst_img, 'vert');
 -      }
 +            /* creates new image of that size */
 +            $dst_img = imagecreatetruecolor($new_w, $new_h);
  
 -      if($rotate) {
 -         $this->_debug("(ROTATE)");
 -         $dst_img = $this->rotateImage($dst_img, $rotate);
 -      }
 +            imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255));
  
 -      /* write down new generated file */
 -      $result = imagejpeg($dst_img, $thumb_image, 75);
 +            /* copies resized portion of original image into new image */
 +            imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, imagesx($src_img), imagesy($src_img));
  
 -      /* free your mind */
 -      imagedestroy($dst_img);
 -      imagedestroy($src_img);
 +            /* needs the image to be flipped horizontal? */
 +            if($flip_hori) {
 +               $this->_debug("(FLIP)");
 +               $dst_img = $this->flipImage($dst_img, 'hori');
 +            }
 +            /* needs the image to be flipped vertical? */
 +            if($flip_vert) {
 +               $this->_debug("(FLIP)");
 +               $dst_img = $this->flipImage($dst_img, 'vert');
 +            }
  
 -      if($result === false) {
 -         print "Can't write thumbnail ". $thumb_image ."\n";
 -         return false;
 -      }
 +            if($rotate) {
 +               $this->_debug("(ROTATE)");
 +               $dst_img = $this->rotateImage($dst_img, $rotate);
 +            }
  
 -      return true;
 +            /* write down new generated file */
 +            $result = imagejpeg($dst_img, $thumb_image, 75);
 +
 +            /* free your mind */
 +            imagedestroy($dst_img);
 +            imagedestroy($src_img);
 +
 +            if($result === false) {
 +               print "Can't write thumbnail ". $thumb_image ."\n";
 +               return false;
 +            }
 +
 +            return true;
 +
 +            break;
 +
 +         case 'imagick':
 +
 +            break;
 +
 +      }
  
     } // create_thumbnail()
  
     /**
      * return all exif meta data from the file
+     * @param string $file
+     * @return array
      */
     public function get_meta_informations($file)
     {
      *    readable
      * 2. Check if the md5sum of the original file has changed
      * 3. Generate the thumbnails if needed
+     * @param integer $idx
+     * @param integer $force
+     * @param boolean $overwrite
      */
     public function gen_thumb($idx = 0, $force = 0, $overwrite = false)
     {
      *
      * this function queries the phpfspot database for a
      * stored MD5 checksum of the specified photo
+     * @param integer $idx
+     * @return string|null
      */
     public function getMD5($idx)
     {
  
     /**
      * set MD5 sum for the specific photo
+     * @param integer $idx
+     * @param string $md5
      */
     private function setMD5($idx, $md5)
     {
      *
      * this function stores the current tag condition
      * (AND or OR) in the users session variables
+     * @param string $mode
+     * @return string
      */
     public function setTagCondition($mode)
     {
      * it also handles the date search.
      * getPhotoSelection() will then only return the matching
      * photos.
+     * @return string
      */
     public function startSearch()
     {
      *
      * this function is invoked by RPC and will sort the requested
      * sort order in the session variable.
+     * @param string $sort_order
+     * @return string
      */
     public function updateSortOrder($order)
     {
      *
      * this function rotates the image according the
      * specified angel.
+     * @param string $img
+     * @param integer $degress
+     * @return image
      */
     private function rotateImage($img, $degrees)
     {
      *
      * this function will return an either horizontal or
      * vertical flipped truecolor image.
+     * @param string $image
+     * @param string $mode 
+     * @return image
      */
     private function flipImage($image, $mode)
     {
  
     /**
      * return all assigned tags for the specified photo
+     * @param integer $idx
+     * @return array
      */
     private function get_photo_tags($idx)
     {
  
     /**
      * create on-the-fly images with text within
+     * @param string $txt
+     * @param string $color
+     * @param integer $space
+     * @param integer $font
+     * @param integer $w
      */
     public function showTextImage($txt, $color=000000, $space=4, $font=4, $w=300)
     {
  
     /**
      * check if all requirements are met
+     * @return boolean
      */
     private function check_requirements()
     {
  
     /**
      * check if specified MIME type is supported
+     * @param string $mime
+     * @return boolean
      */
     public function checkifImageSupported($mime)
     {
 -      if(in_array($mime, Array("image/jpeg", "image/png")))
 +      if(in_array($mime, Array("image/jpeg", "image/png", "image/tiff")))
           return true;
  
        return false;
  
     } // checkifImageSupported()
  
+    /**
+     * output error text
+     * @param string $text
+     */
     public function _error($text)
     {
        switch($this->cfg->logging) {
  
     /**
      * output calendard input fields
+     * @param string $mode
+     * @return string
      */
     private function get_calendar($mode)
     {
  
     /**
      * output calendar matrix
+     * @param integer $year
+     * @param integer $month
+     * @param integer $day
      */
     public function get_calendar_matrix($year = 0, $month = 0, $day = 0)
     {
  
     /**
      * output export page
+     * @param string $mode
      */
     public function getExport($mode)
     {
   
     /**
      * return all selected tags as one string
+     * @return array
      */
     private function getCurrentTags()
     {
      * to do next. This is necessary for directly jumping
      * into photo index or single photo view when the are
      * requested with specific URLs
+     * @return string
      */
     public function whatToDo()
     {
  
     /**
      * return the current process-user
+     * @return string
      */
     private function getuid()
     {
  
     /**
      * returns a select-dropdown box to select photo index sort parameters
+     * @param array $params
+     * @param smarty $smarty
+     * @return string
      */
     public function smarty_sort_select_list($params, &$smarty)
     {
  
     /**
      * returns the currently selected sort order
+     * @return string
      */ 
     private function get_sort_order()
     {
  
     } // get_sort_order()
  
-    /***
-      * return the next to be shown slide show image
-      *
-      * this function returns the URL of the next image
-      * in the slideshow sequence.
-      */
+    /**
+     * return the next to be shown slide show image
+     *
+     * this function returns the URL of the next image
+     * in the slideshow sequence.
+     * @return string
+     */
     public function getNextSlideShowImage()
     {
        $all_photos = $this->getPhotoSelection();
  
     } // getNextSlideShowImage()
  
-    /***
-      * return the previous to be shown slide show image
-      *
-      * this function returns the URL of the previous image
-      * in the slideshow sequence.
-      */
+    /**
+     * return the previous to be shown slide show image
+     *
+     * this function returns the URL of the previous image
+     * in the slideshow sequence.
+     * @return string
+     */
     public function getPrevSlideShowImage()
     {
        $all_photos = $this->getPhotoSelection();
  
     } // resetSlideShow()
     
-    /***
-      * get random photo
-      *
-      * this function will get all photos from the fspot
-      * database and randomly return ONE entry
-      *
-      * saddly there is yet no sqlite3 function which returns
-      * the bulk result in array, so we have to fill up our
-      * own here.
-      */ 
+    /**
+     * get random photo
+     *
+     * this function will get all photos from the fspot
+     * database and randomly return ONE entry
+     *
+     * saddly there is yet no sqlite3 function which returns
+     * the bulk result in array, so we have to fill up our
+     * own here.
+     * @return array
+     */
     public function get_random_photo()
     {
        $all = Array();
      * this function validates if the provided date
      * contains a valid date and will return true 
      * if it is.
+     * @param string $date_str
+     * @return boolean
      */
     public function isValidDate($date_str)
     {
  
     /**
      * timestamp to string conversion
+     * @param integer $timestamp
+     * @return string
      */
     private function ts2str($timestamp)
     {
        return strftime("%Y-%m-%d", $timestamp);
     } // ts2str()
  
+    /**
+     * extract tag-names from $_GET['tags']
+     * @param string $tags_str
+     * @return string
+     */
     private function extractTags($tags_str)
     {
-       $not_validated = split(',', $_GET['tags']);
+       $not_validated = split(',', $tags_str);
        $validated = array();
  
        foreach($not_validated as $tag) {
  
     /**
      * returns the full path to a thumbnail
+     * @param integer $width
+     * @param integer $photo
+     * @return string
      */
     public function get_thumb_path($width, $photo)
     {
  
     /**
      * returns server's virtual host name
+     * @return string
      */
     private function get_server_name()
     {
     } // get_server_name()
  
     /**
-     * returns type of webprotocol which is
-     * currently used
+     * returns type of webprotocol which is currently used
+     * @return string
      */
     private function get_web_protocol()
     {
  
     /**
      * return url to this phpfspot installation
+     * @return string
      */
     private function get_phpfspot_url()
     {
  
     /**
      * returns the number of photos which are tagged with $tag_id
+     * @param integer $tag_id
+     * @return integer
      */
     public function get_num_photos($tag_id)
     {
      * returns true, if everything is ok, otherwise false
      * if $silent is not set, this function will output and
      * error message
+     * @param string $file
+     * @param boolean $silent
+     * @return boolean
      */
     private function check_readable($file, $silent = null)
     {
      *
      * this function will return the F-Spot database version number
      * It is stored within the sqlite3 database in the table meta
+     * @return string|null
      */
     public function getFspotDBVersion()
     {
     } // getFspotDBVersion()
  
     /**
-     * parse the provided URI and will returned the
-     * requested chunk
+     * parse the provided URI and will returned the requested chunk
+     * @param string $uri
+     * @param string $mode
+     * @return string
      */
     public function parse_uri($uri, $mode)
     {
      *
      * this function checks if all necessary configuration options are
      * specified and set.
+     * @return boolean
      */
     private function check_config_options()
     {
      * current page, in which the $current photo lies. this is
      * used to display the correct photo, when calling showPhotoIndex()
      * from showImage()
+     * @param integer $current
+     * @param integer $max
+     * @return integer
      */
     private function getCurrentPage($current, $max)
     {