summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kremmel <xing@synapse.plus.com>2007-07-10 00:08:14 +0000
committerMax Kremmel <xing@synapse.plus.com>2007-07-10 00:08:14 +0000
commit9731b4ca7e237536a9fb360e533fcafdf75e194c (patch)
tree5b601142947b99c7aa2f16520f3478aed098685b
parent0c20fcdff9bd27ba5b630fe37934a7b179a3dcc6 (diff)
downloadfisheye-9731b4ca7e237536a9fb360e533fcafdf75e194c.tar.gz
fisheye-9731b4ca7e237536a9fb360e533fcafdf75e194c.tar.bz2
fisheye-9731b4ca7e237536a9fb360e533fcafdf75e194c.zip
convert file back to unix fileformat - please use a text editor that doesn't change the fileformat
-rw-r--r--FisheyeImage.php1438
1 files changed, 719 insertions, 719 deletions
diff --git a/FisheyeImage.php b/FisheyeImage.php
index 6b2b22d..7aa98a2 100644
--- a/FisheyeImage.php
+++ b/FisheyeImage.php
@@ -1,719 +1,719 @@
-<?php
-/**
- * @version $Header: /cvsroot/bitweaver/_bit_fisheye/FisheyeImage.php,v 1.64 2007/07/09 21:03:32 gravyface Exp $
- * @package fisheye
- */
-
-/**
- * required setup
- */
-require_once( FISHEYE_PKG_PATH.'FisheyeBase.php' );
-
-define('FISHEYEIMAGE_CONTENT_TYPE_GUID', 'fisheyeimage');
-
-/**
- * @package fisheye
- */
-class FisheyeImage extends FisheyeBase {
- var $mImageId;
-
- function FisheyeImage($pImageId = NULL, $pContentId = NULL) {
- FisheyeBase::FisheyeBase();
- $this->mImageId = (int)$pImageId;
- $this->mContentId = (int)$pContentId;
- $this->mAdminContentPerm = 'p_fisheye_admin';
-
- $this->registerContentType(FISHEYEIMAGE_CONTENT_TYPE_GUID, array('content_type_guid' => FISHEYEIMAGE_CONTENT_TYPE_GUID,
- 'content_description' => 'Image',
- 'handler_class' => 'FisheyeImage',
- 'handler_package' => 'fisheye',
- 'handler_file' => 'FisheyeImage.php',
- 'maintainer_url' => 'http://www.bitweaver.org'
- ) );
- }
-
- function lookup( $pLookupHash ) {
- global $gBitDb;
- $ret = NULL;
-
- $lookupContentId = NULL;
- if (!empty($pLookupHash['image_id']) && is_numeric($pLookupHash['image_id'])) {
- if( $lookup = $gBitDb->getRow( "SELECT lc.`content_id`, lc.`content_type_guid` FROM `".BIT_DB_PREFIX."fisheye_image` fi INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON(lc.`content_id`=fi.`content_id`) WHERE `image_id`=?", array( $pLookupHash['image_id'] ) ) ) {
- $lookupContentId = $lookup['content_id'];
- $lookupContentGuid = $lookup['content_type_guid'];
- }
- } elseif (!empty($pLookupHash['content_id']) && is_numeric($pLookupHash['content_id'])) {
- $lookupContentId = $pLookupHash['content_id'];
- $lookupContentGuid = NULL;
- }
-
- if( BitBase::verifyId( $lookupContentId ) ) {
- $ret = LibertyBase::getLibertyObject( $lookupContentId, $lookupContentGuid );
- }
-
- return $ret;
- }
-
- function load() {
- if( $this->isValid() ) {
- global $gBitSystem;
- $gateSql = NULL;
- $selectSql = $joinSql = $whereSql = '';
- $bindVars = array();
-
- if ( @$this->verifyId( $this->mImageId ) ) {
- $whereSql = " WHERE fi.`image_id` = ?";
- $bindVars[] = $this->mImageId;
- } elseif ( @$this->verifyId( $this->mContentId ) ) {
- $whereSql = " WHERE fi.`content_id` = ?";
- $bindVars[] = $this->mContentId;
- }
-
- $this->getServicesSql( 'content_load_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
-
- $sql = "SELECT fi.*, lc.* $gateSql $selectSql
- , uue.`login` AS `modifier_user`, uue.`real_name` AS `modifier_real_name`
- , uuc.`login` AS `creator_user`, uuc.`real_name` AS `creator_real_name`, ufm.`favorite_content_id` AS `is_favorite`
- , lch.`hits`
- FROM `".BIT_DB_PREFIX."fisheye_image` fi
- INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lc.`content_id` = fi.`content_id`)
- LEFT JOIN `".BIT_DB_PREFIX."users_users` uue ON (uue.`user_id` = lc.`modifier_user_id`)
- LEFT JOIN `".BIT_DB_PREFIX."users_users` uuc ON (uuc.`user_id` = lc.`user_id`)
- LEFT JOIN `".BIT_DB_PREFIX."users_favorites_map` ufm ON (ufm.`favorite_content_id`=lc.`content_id` AND ufm.`user_id`=uuc.`user_id`)
- LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_hits` lch ON ( lch.`content_id` = lc.`content_id` ) $joinSql
- $whereSql";
- if( $this->mInfo = $this->mDb->getRow( $sql, array( $bindVars ) ) ) {
- $this->mImageId = $this->mInfo['image_id'];
- $this->mContentId = $this->mInfo['content_id'];
-
- $this->mInfo['creator'] = (isset( $this->mInfo['creator_real_name'] ) ? $this->mInfo['creator_real_name'] : $this->mInfo['creator_user'] );
- $this->mInfo['editor'] = (isset( $this->mInfo['modifier_real_name'] ) ? $this->mInfo['modifier_real_name'] : $this->mInfo['modifier_user'] );
-
- if( $gBitSystem->isPackageActive( 'gatekeeper' ) && !@$this->verifyId( $this->mInfo['security_id'] ) ) {
- // check to see if this image is in a protected gallery
- // this burns an extra select but avoids an big and gnarly LEFT JOIN sequence that may be hard to optimize on all DB's
- $query = "SELECT ls.* FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` fgim
- INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security_map` tsm ON(fgim.`gallery_content_id`=tsm.`content_id` )
- INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security` ls ON(tsm.`security_id`=ls.`security_id` )
- WHERE fgim.`item_content_id`=?";
- $grs = $this->mDb->query($query, array( $this->mContentId ) );
- if( $grs && $grs->RecordCount() ) {
- $this->mInfo = array_merge( $this->mInfo, $grs->fields );
- }
- }
-
- LibertyAttachable::load();
-
- if (!empty($this->mStorage) && count($this->mStorage) > 0) {
- reset($this->mStorage);
- $this->mInfo['image_file'] = current($this->mStorage);
- } else {
- $this->mInfo['image_file'] = NULL;
- }
- }
- } else {
- // We don't have an image_id or a content_id so there is no way to know what to load
- return NULL;
- }
-
- return count($this->mInfo);
- }
-
- function exportHtml( $pData = NULL ) {
-// if( empty( $pData ) ) {
-// $pData = $this->mInfo['data'];
-// }
-// $ret = FisheyeBase::parseData( $pData );
-// $ret .= '<img src="'.$this->mInfo['image_file']['source_url'].'" width="400" height="300" />';
- $ret = NULL;
- // make sure we have a valid image file.
- if( $this->isValid() && ($details = $this->getImageDetails() ) ) {
- if( $this->mInfo['width'] != $details['width'] || $this->mInfo['height'] != $details['height'] ) {
- // if our data got out of sync with the database, force an update
- $query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
- $this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
- $this->mInfo['width'] = $details['width'];
- $this->mInfo['height'] = $details['height'];
- }
-
- $ret = array( 'type' => $this->getContentType(),
- 'landscape' => $this->isLandscape(),
- 'url' => $this->getDisplayUrl(),
- 'content_id' => $this->mContentId,
- 'title' => $this->getTitle(),
- 'has_description' => !empty( $this->mInfo['data'] ),
- 'is_favorite' => $this->getField('is_favorite'),
- );
- }
- return $ret;
- }
-
- function isLandscape() {
- return( !empty( $this->mInfo['width'] ) && !empty( $this->mInfo['height'] ) && ($this->mInfo['width'] > $this->mInfo['height']) );
- }
-
- function verifyImageData(&$pStorageHash) {
- $pStorageHash['content_type_guid'] = $this->getContentType();
-
- if ( empty($pStorageHash['purge_from_galleries']) ) {
- $pStorageHash['purge_from_galleries'] = FALSE;
- }
-
- // let's add a default title
- if( empty( $pStorageHash['title'] ) && !empty( $pStorageHash['upload']['name'] ) ) {
- if( preg_match( '/^[A-Z]:\\\/', $pStorageHash['upload']['name'] ) ) {
- // MSIE shit file names if passthrough via gigaupload, etc.
- // basename will not work - see http://us3.php.net/manual/en/function.basename.php
- $tmp = preg_split("[\\\]",$pStorageHash['upload']['name']);
- $defaultName = $tmp[count($tmp) - 1];
- } elseif( strpos( '.', $pStorageHash['upload']['name'] ) ) {
- list( $defaultName, $ext ) = explode( '.', $pStorageHash['upload']['name'] );
- } else {
- $defaultName = $pStorageHash['upload']['name'];
- }
- $pStorageHash['title'] = str_replace( '_', ' ', substr( $defaultName, 0, strrpos( $defaultName, '.' ) ) );
- }
-
- if( !empty( $pStorageHash['resize'] ) ) {
- $pStorageHash['upload']['max_height'] = $pStorageHash['upload']['max_width'] = $pStorageHash['resize'];
- }
-
- return (count($this->mErrors) == 0);
- }
-
- function store(&$pStorageHash) {
- global $gBitSystem, $gLibertySystem;
- if ($this->verifyImageData($pStorageHash)) {
- // Save the current attachment ID for the image attached to this FisheyeImage so we can
- // delete it after saving the new one
- if (!empty($this->mInfo['image_file']) && !empty($this->mInfo['image_file']['attachment_id']) && !empty($pStorageHash['upload'])) {
- $currentImageAttachmentId = $this->mInfo['image_file']['attachment_id'];
- $pStorageHash['attachment_id'] = $currentImageAttachmentId;
- } else {
- $currentImageAttachmentId = NULL;
- }
-
- // LibertyAttachable will take care of thumbnail generation of the offline thumbnailer is not active
- if( !empty( $pStorageHash['upload'] ) ) {
- $pStorageHash['upload']['thumbnail'] = !$gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' );
- }
-
- if( LibertyAttachable::store( $pStorageHash ) ) {
- if( $currentImageAttachmentId && $currentImageAttachmentId != $this->mInfo['image_file']['attachment_id'] ) {
- $this->expungeAttachment($currentImageAttachmentId);
- }
- // get storage format back from LibertyAttachment
- $this->mContentId = $pStorageHash['content_id'];
- $this->mInfo['content_id'] = $this->mContentId;
-
- if ( isset($pStorageHash['storage_guid']) && !empty($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['upload']['source_file'])) {
- $imageDetails = $this->getImageDetails($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['upload']['source_file']);
- } else {
- $imageDetails = NULL;
- }
-
- if (!$imageDetails) {
- $imageDetails['width'] = (!empty($this->mInfo['width']) ? $this->mInfo['width'] : NULL);
- $imageDetails['height'] = (!empty($this->mInfo['height']) ? $this->mInfo['height'] : NULL);
- }
-
- if ($this->imageExistsInDatabase()) {
- $sql = "UPDATE `".BIT_DB_PREFIX."fisheye_image`
- SET `content_id` = ?, `width` = ?, `height` = ?
- WHERE `image_id` = ?";
- $bindVars = array($this->mContentId, $imageDetails['width'], $imageDetails['height'], $this->mImageId);
- } else {
- $this->mImageId = $this->mDb->GenID('fisheye_image_id_seq');
- $this->mInfo['image_id'] = $this->mImageId;
- $sql = "INSERT INTO `".BIT_DB_PREFIX."fisheye_image` (`image_id`, `content_id`, `width`, `height`) VALUES (?,?,?,?)";
- $bindVars = array($this->mImageId, $this->mContentId, $imageDetails['width'], $imageDetails['height']);
- }
- $rs = $this->mDb->query($sql, $bindVars);
-
- // check to see if we need offline thumbnailing
- if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
- $resize = !empty( $pStorageHash['resize'] ) ? (int)$pStorageHash['resize'] : NULL;
- $this->generateThumbnails( $resize );
- } else {
- if( !empty( $pStorageHash['resize'] ) && is_numeric( $pStorageHash['resize'] ) ) {
- $this->resizeOriginal( $pStorageHash['resize'] );
- }
- }
- }
- } else {
- $this->mErrors[] = "There were errors while attempting to save this gallery image";
- }
-
- return (count($this->mErrors) == 0);
- }
-
- function getExifField( $pExifField ) {
- $ret = NULL;
- if( function_exists( 'exif_read_data' ) ) {
- $pExifField = strtolower( $pExifField );
- $file = $this->getSourceFile();
- // only attempt to get exif data from jpg or tiff files - chokes otherwise
- if( empty( $this->mExif ) && preg_match( "!\.(jpe?g|tif{1,2})$!", $file ) ) {
- $this->mExif = array_change_key_case( exif_read_data( $file ), CASE_LOWER );
- }
- if( !empty( $this->mExif[$pExifField] ) ) {
- $ret = $this->mExif[$pExifField];
- }
- }
- return $ret;
- }
-
- function rotateImage( $pDegrees ) {
- global $gBitSystem;
- if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
- $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
- $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
- $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
- $fileHash['size'] = filesize( $fileHash['source_file'] );
- $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
- $fileHash['name'] = $this->mInfo['image_file']['filename'];
- if( $pDegrees == 'auto' ) {
- if( $exifOrientation = $this->getExifField( 'orientation' ) ) {
- switch( $exifOrientation ) {
- case 1: //) transform="";;
- break;
- case 2: //) transform="-flip horizontal";;
- break;
- case 3: //) transform="-rotate 180";;
- $pDegrees = 180;
- break;
- case 4: //) transform="-flip vertical";;
- break;
- case 5: //) transform="-transpose";;
- break;
- case 6: //) transform="-rotate 90";;
- // make sure image has not already been rotated
- if( $this->isLandscape() ) {
- $pDegrees = 90;
- }
- break;
- case 7: //) transform="-transverse";;
- break;
- case 8: //) transform="-rotate 270";;
- // make sure image has not already been rotated
- if( $this->isLandscape() ) {
- $pDegrees = 270;
- }
- break;
- // *) transform="";;
- }
- }
- }
- if( is_numeric( $pDegrees ) ) {
- $fileHash['degrees'] = $pDegrees;
- $rotateFunc = liberty_get_function( 'rotate' );
- if( $rotateFunc( $fileHash ) ) {
- liberty_clear_thumbnails( $fileHash );
- $this->mDb->query( "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=`height`, `height`=`width` WHERE `content_id`=?", array( $this->mContentId ) );
- $this->generateThumbnails();
- } else {
- $this->mErrors['rotate'] = $fileHash['error'];
- }
- } elseif( $pDegrees == 'auto' ) {
- $this->mErrors['rotate'] = "Image was not auto-rotated.";
- }
- }
- return (count($this->mErrors) == 0);
- }
-
-
- /**
- * convertColorspace
- *
- * @param string $pColorSpace - target color space, only 'grayscale' is currently supported, and only when using the MagickWand image processor
- * @access public
- * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure
- */
- function convertColorspace( $pColorSpace ) {
- $ret = FALSE;
- if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
- $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
- $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
- $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
- $fileHash['size'] = filesize( $fileHash['source_file'] );
- $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
- $fileHash['name'] = $this->mInfo['image_file']['filename'];
- if( $convertFunc = liberty_get_function( 'convert_colorspace' ) ) {
- if( $ret = $convertFunc( $fileHash, $pColorSpace ) ) {
- liberty_clear_thumbnails( $fileHash );
- $sql = "UPDATE `".BIT_DB_PREFIX."liberty_files SET `file_size`=? WHERE `file_id` = ?";
- $this->mDb->query( $sql, array( filesize( $fileHash['dest_file'] ), $this->mInfo['image_file']['file_id'] ) );
- $this->generateThumbnails();
- }
- }
- }
- return $ret;
- }
-
-
- function resizeOriginal( $pResizeOriginal ) {
- global $gBitSystem;
- if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
- $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
- $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
- $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
- $fileHash['size'] = filesize( $fileHash['source_file'] );
- $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
- $fileHash['name'] = $this->mInfo['image_file']['filename'];
- $fileHash['max_height'] = $fileHash['max_width'] = $pResizeOriginal;
- // make a copy of the fileHash that we can compare output after processing
- $preResize = $fileHash;
- $resizeFunc = liberty_get_function( 'resize' );
-
- if( !$resizeFunc( $fileHash ) ) {
- $this->mErrors['upload'] = $fileHash['errors'];
- } else {
- // Ack this is evil direct bashing of the liberty tables! XOXO spiderr
- // should be a cleaner way eventually
-
- // we need to update the souce_file in case it's changed from a non jpg to a jpg
- if( $fileHash['name'] != $preResize['name'] ) {
- $fileHash['source_file'] = dirname( $fileHash['source_file'] ).'/'.$fileHash['name'];
- // make absolutely certain that we have 2 image files and that they are different, then remove the original
- if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
- @unlink( $preResize['source_file'] );
- }
- }
- $details = $this->getImageDetails( $fileHash['source_file'] );
- // store all the values that might have changed due to the resize
- $storeHash = array(
- 'file_size' => $details['size'],
- 'mime_type' => $details['mime'],
- 'storage_path' => str_replace( BIT_ROOT_PATH, "", $fileHash['source_file'] ),
- );
- $this->mDb->associateUpdate( BIT_DB_PREFIX."liberty_files", $storeHash, array( 'file_id' => $this->mInfo['image_file']['file_id'] ) );
- //$query = "UPDATE `".BIT_DB_PREFIX."liberty_files` SET `file_size`=? WHERE `file_id`=?";
- //$this->mDb->query( $query, array( $details['size'], $this->mInfo['image_file']['file_id'] ) );
- $query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
- $this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
- // if we've come this far, we can try removing the original if it's different to the resized image
- // make absolutely certain that we have 2 image files and that they are different, then remove the original
- if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
- @unlink( $preResize['source_file'] );
- }
- }
- }
- return (count($this->mErrors) == 0);
- }
-
-
- function generateThumbnails( $pResizeOriginal=NULL ) {
- global $gBitSystem;
- $ret = FALSE;
- // LibertyAttachable will take care of thumbnail generation of the offline thumbnailer is not active
- if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
- $query = "DELETE FROM `".BIT_DB_PREFIX."liberty_process_queue`
- WHERE `content_id`=?";
- $this->mDb->query( $query, array( $this->mContentId ) );
- $query = "INSERT INTO `".BIT_DB_PREFIX."liberty_process_queue`
- (`content_id`, `queue_date`, `processor_parameters`) VALUES (?,?,?)";
- $this->mDb->query( $query, array( $this->mContentId, $gBitSystem->getUTCTime(), serialize( array( 'resize_original' => $pResizeOriginal ) ) ) );
- } else {
- $ret = $this->renderThumbnails();
- }
- return $ret;
- }
-
-
- function renderThumbnails( $pThumbSizes=NULL ) {
- if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
- $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
- $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
- $fileHash['size'] = filesize( $fileHash['source_file'] );
- $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
- $fileHash['name'] = $this->mInfo['image_file']['filename'];
- $fileHash['thumbnail_sizes'] = $pThumbSizes;
- // just generate thumbnails
- liberty_generate_thumbnails( $fileHash );
- if( !empty( $fileHash['error'] ) ) {
- $this->mErrors['thumbnail'] = $fileHash['error'];
- }
- }
- return( count($this->mErrors) == 0 );
- }
-
- function getSourceUrl() {
- $ret = NULL;
- if( !empty( $this->mInfo['image_file']['storage_path'] ) ) {
- $ret = BIT_ROOT_URL.dirname( $this->mInfo['image_file']['storage_path'] ).'/'.rawurlencode( basename( $this->mInfo['image_file']['storage_path'] ) );
- }
- return $ret;
- }
-
- function getSourceFile() {
- $ret = NULL;
- if( !empty( $this->mInfo['image_file']['storage_path'] ) ) {
- $ret = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
- }
- return $ret;
- }
-
- // Get resolution, etc
- function getImageDetails($pFilePath = NULL) {
- $info = NULL;
- $pFilePath = ($pFilePath ? $pFilePath : $this->getSourceFile());
-
- $checkFiles = array( $pFilePath, dirname( $pFilePath ).'/original.jpg' );
-
- foreach( $checkFiles as $cf ) {
- if ($cf && file_exists( $cf ) && filesize( $cf ) ) {
- if( $info = getimagesize( rtrim( $cf ) ) ) {
- $info['width'] = $info[0];
- $info['height'] = $info[1];
- $info['size'] = filesize( $cf );
- }
- }
- }
-
- return $info;
- }
-
- /**
- * Returns include file that will setup vars for display
- * @return the fully specified path to file to be included
- */
- function getRenderFile() {
- return FISHEYE_PKG_PATH."display_fisheye_image_inc.php";
- }
-
- /**
- * Returns template file used for display
- * @return the fully specified path to file to be included
- */
- function getRenderTemplate() {
- return 'bitpackage:fisheye/view_image.tpl';
- }
-
- /**
- * Function that returns link to display a piece of content
- * @param pImageId id of gallery to link
- * @param pMixed if a string, it is assumed to be the size, if an array, it is assumed to be a mInfo hash
- * @return the url to display the gallery.
- */
- function getDisplayUrl( $pImageId=NULL, $pMixed=NULL ) {
- $ret = '';
- if( !@BitBase::verifyId( $pImageId ) ) {
- $pImageId = $this->mImageId;
- }
-
- // if pMixed is an array, we assume it has all the pertinent information
- if( is_array( $pMixed )) {
- $info = $pMixed;
- } else {
- $info = &$this->mInfo;
- }
-
- $size = ( is_string( $pMixed ) && isset( $info['image_file']['thumbnail_url'][$pMixed] ) ) ? $pMixed : NULL ;
- global $gBitSystem;
- if( @BitBase::verifyId( $pImageId ) ) {
- if( $gBitSystem->isFeatureActive( 'pretty_urls' ) ) {
- $ret = FISHEYE_PKG_URL.'image/'.$pImageId;
- if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
- $ret .= $this->mGalleryPath;
- }
- if( $size ) {
- $ret .= '/'.$size;
- }
- } else {
- $ret = FISHEYE_PKG_URL.'view_image.php?image_id='.$pImageId;
- if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
- $ret .= '&gallery_path='.$this->mGalleryPath;
- }
- if( $size ) {
- $ret .= '&size='.$size;
- }
- }
- } elseif( @BitBase::verifyId( $info['content_id'] ) ) {
- $ret = FISHEYE_PKG_URL.'view_image.php?content_id='.$info['content_id'];
- }
- return $ret;
- }
-
-
- /**
- * Generate a valid display link for the Blog
- *
- * @param object PostId of the item to use
- * @param array Not used
- * @return object Fully formatted html link for use by Liberty
- */
- function getDisplayLink( $pTitle=NULL, $pMixed=NULL ) {
- global $gBitSystem;
- if( empty( $pTitle ) && !empty( $this ) ) {
- $pTitle = $this->getTitle();
- }
-
- if( empty( $pMixed ) && !empty( $this ) ) {
- $pMixed = $this->mInfo;
- }
-
- $ret = $pTitle;
- if( $gBitSystem->isPackageActive( 'fisheye' ) ) {
- $ret = '<a title="'.$pTitle.'" href="'.FisheyeImage::getDisplayUrl( NULL, $pMixed ).'">'.$pTitle.'</a>';
- }
- return $ret;
- }
-
-
- function loadThumbnail( $pSize='small' ) {
- $this->mInfo['image_file']['gallery_thumbnail_url'] = &$this->mInfo['image_file']['thumbnail_url'][$pSize];
- }
-
- function getThumbnailUrl( $pSize='small', $pInfoHash=NULL ) {
- $ret = NULL;
- if( !empty( $pInfoHash ) ) {
- // do some stuff if we are given a hash of stuff
- } else {
- if( empty( $this->mInfo['image_file']['gallery_thumbnail_url'] ) ) {
- $this->loadThumbnail( $pSize );
- }
- $ret = $this->mInfo['image_file']['gallery_thumbnail_url'];
- }
- return $ret;
- }
-
- function expunge($pExpungeAttachment = TRUE) {
- if( $this->isValid() ) {
- $this->mDb->StartTrans();
- $query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` WHERE `item_content_id` = ?";
- $rs = $this->mDb->query($query, array( $this->mContentId ));
- $query = "UPDATE `".BIT_DB_PREFIX."fisheye_gallery` SET `preview_content_id`=NULL WHERE `preview_content_id` = ?";
- $rs = $this->mDb->query($query, array( $this->mContentId ));
- $query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_image` WHERE `content_id` = ?";
- $rs = $this->mDb->query($query, array( $this->mContentId ));
- if( LibertyAttachable::expunge($pExpungeAttachment) ) {
- $this->mDb->CompleteTrans();
- } else {
- $this->mDb->RollbackTrans();
- }
- }
- return( count( $this->mErrors ) == 0 );
- }
-
- function expungingAttachment($pAttachmentId, $pContentIdArray) {
- foreach ($pContentIdArray as $id) {
- $this->mContentId = $id;
- // Vital that we call LibertyAttachable::expunge with false since the attachment is already being deleted.
- $this->expunge(FALSE);
- }
- }
-
- function isValid() {
- return( @$this->verifyId( $this->mImageId ) || @$this->verifyId( $this->mContentId ) );
- }
-
- function imageExistsInDatabase() {
- $ret = FALSE;
- if( $this->isValid() && $this->mImageId ) {
- $query = "SELECT COUNT(`image_id`)
- FROM `".BIT_DB_PREFIX."fisheye_image`
- WHERE `image_id` = ?";
-
- $bindVars = array($this->mImageId);
-
- if($this->mDb->getOne($query, $bindVars) > 0){
- $ret = TRUE;
- }
-
- }
- return $ret;
- }
-
-
- function getList( &$pListHash ) {
- global $gBitUser,$gBitSystem;
-
- $this->prepGetList( $pListHash );
- $bindVars = array();
- $distinct = '';
- $select = '';
- $mid = '';
- $join = '';
-
- if( @$this->verifyId( $pListHash['user_id'] ) ) {
- $mid .= " AND lc.`user_id` = ? ";
- $bindVars[] = $pListHash['user_id'];
- } elseif( !empty( $pListHash['recent_users'] )) {
- $distinct = " DISTINCT ON ( uu.`user_id` ) ";
- $pListHash['sort_mode'] = 'uu.user_id_desc';
- }
-
- if( @$this->verifyId( $pListHash['gallery_id'] ) ) {
- $mid .= " AND fg.`gallery_id` = ? ";
- $bindVars[] = $pListHash['gallery_id'];
- }
-
- if( !empty( $pListHash['search'] ) ) {
- $mid .= " AND UPPER(lc.`title`) LIKE ? ";
- $bindVars[] = '%'.strtoupper( $pListHash['search'] ).'%';
- }
-
- if( !empty( $pListHash['max_age'] ) && is_numeric( $pListHash['max_age'] ) ) {
- $mid .= " AND lc.`created` > ? ";
- $bindVars[] = $pListHash['max_age'];
- }
-
- $orderby = '';
- if ( !empty( $pListHash['sort_mode'] ) ) {
- //converted in prepGetList()
- $orderby = " ORDER BY ".$this->mDb->convertSortmode( $pListHash['sort_mode'] )." ";
- }
-
- $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
-
- $query = "SELECT $distinct fi.`image_id` AS `hash_key`, fi.*, lf.*, lc.*, fg.`gallery_id`, uu.`login`, uu.`real_name` $select $selectSql
- FROM `".BIT_DB_PREFIX."fisheye_image` fi
- INNER JOIN `".BIT_DB_PREFIX."liberty_attachments_map` lam ON(lam.`content_id`=fi.`content_id`)
- INNER JOIN `".BIT_DB_PREFIX."liberty_attachments` la ON(la.`attachment_id`=lam.`attachment_id`)
- INNER JOIN `".BIT_DB_PREFIX."liberty_files` lf ON(la.`foreign_id`=lf.`file_id`)
- , `".BIT_DB_PREFIX."users_users` uu, `".BIT_DB_PREFIX."liberty_content` lc $join
- LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery_image_map` tfgim2 ON(tfgim2.`item_content_id`=lc.`content_id`)
- LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery` fg ON(fg.`content_id`=tfgim2.`gallery_content_id`) $joinSql
- WHERE fi.`content_id` = lc.`content_id` AND uu.`user_id` = lc.`user_id` $mid $whereSql $orderby";
-
- if( $rs = $this->mDb->query( $query, $bindVars, $pListHash['max_records'], $pListHash['offset'] ) ) {
- $ret = $rs->GetAssoc();
- if( empty( $pListHash['no_thumbnails'] ) ) {
- foreach( array_keys( $ret ) as $imageId ) {
- $ret[$imageId]['thumbnail_url'] = liberty_fetch_thumbnail_url( $ret[$imageId]['storage_path'], 'avatar', FISHEYE_PKG_URL.'image/generating_thumbnails.png' );
- $ret[$imageId]['display_url'] = $this->getDisplayUrl( $imageId );
- $ret[$imageId]['has_machine_name'] = $this->isMachineName( $ret[$imageId]['title'] );
- }
- }
- }
-// $this->debug(0);
- return $ret;
- }
-
- /**
- * isCommentable
- *
- * @access public
- * @return TRUE on success, FALSE on failure
- */
- function isCommentable() {
- global $gGallery;
-
- // if we have a loaded gallery, we just use that to work out if we can add comments to this image
- if( is_object( $gGallery ) ) {
- return $gGallery->isCommentable();
- }
-
- $ret = FALSE;
- if( $parents = $this->getParentGalleries() ) {
- // @TODO: No idea how to work out if you can add a comment to this image
- // for now we'll take the mGalleryPath and use that gallery
- $gal = current( $parents );
- $query = "SELECT `pref_value` FROM `".BIT_DB_PREFIX."liberty_content_prefs` WHERE `content_id` = ? AND `pref_name` = ?";
- $ret = ( $this->mDb->getOne( $query, array( $gal['content_id'], 'allow_comments' )) == 'y' );
- }
- return $ret;
- }
-}
-
-?>
+<?php
+/**
+ * @version $Header: /cvsroot/bitweaver/_bit_fisheye/FisheyeImage.php,v 1.65 2007/07/10 00:08:14 squareing Exp $
+ * @package fisheye
+ */
+
+/**
+ * required setup
+ */
+require_once( FISHEYE_PKG_PATH.'FisheyeBase.php' );
+
+define('FISHEYEIMAGE_CONTENT_TYPE_GUID', 'fisheyeimage');
+
+/**
+ * @package fisheye
+ */
+class FisheyeImage extends FisheyeBase {
+ var $mImageId;
+
+ function FisheyeImage($pImageId = NULL, $pContentId = NULL) {
+ FisheyeBase::FisheyeBase();
+ $this->mImageId = (int)$pImageId;
+ $this->mContentId = (int)$pContentId;
+ $this->mAdminContentPerm = 'p_fisheye_admin';
+
+ $this->registerContentType(FISHEYEIMAGE_CONTENT_TYPE_GUID, array('content_type_guid' => FISHEYEIMAGE_CONTENT_TYPE_GUID,
+ 'content_description' => 'Image',
+ 'handler_class' => 'FisheyeImage',
+ 'handler_package' => 'fisheye',
+ 'handler_file' => 'FisheyeImage.php',
+ 'maintainer_url' => 'http://www.bitweaver.org'
+ ) );
+ }
+
+ function lookup( $pLookupHash ) {
+ global $gBitDb;
+ $ret = NULL;
+
+ $lookupContentId = NULL;
+ if (!empty($pLookupHash['image_id']) && is_numeric($pLookupHash['image_id'])) {
+ if( $lookup = $gBitDb->getRow( "SELECT lc.`content_id`, lc.`content_type_guid` FROM `".BIT_DB_PREFIX."fisheye_image` fi INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON(lc.`content_id`=fi.`content_id`) WHERE `image_id`=?", array( $pLookupHash['image_id'] ) ) ) {
+ $lookupContentId = $lookup['content_id'];
+ $lookupContentGuid = $lookup['content_type_guid'];
+ }
+ } elseif (!empty($pLookupHash['content_id']) && is_numeric($pLookupHash['content_id'])) {
+ $lookupContentId = $pLookupHash['content_id'];
+ $lookupContentGuid = NULL;
+ }
+
+ if( BitBase::verifyId( $lookupContentId ) ) {
+ $ret = LibertyBase::getLibertyObject( $lookupContentId, $lookupContentGuid );
+ }
+
+ return $ret;
+ }
+
+ function load() {
+ if( $this->isValid() ) {
+ global $gBitSystem;
+ $gateSql = NULL;
+ $selectSql = $joinSql = $whereSql = '';
+ $bindVars = array();
+
+ if ( @$this->verifyId( $this->mImageId ) ) {
+ $whereSql = " WHERE fi.`image_id` = ?";
+ $bindVars[] = $this->mImageId;
+ } elseif ( @$this->verifyId( $this->mContentId ) ) {
+ $whereSql = " WHERE fi.`content_id` = ?";
+ $bindVars[] = $this->mContentId;
+ }
+
+ $this->getServicesSql( 'content_load_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
+
+ $sql = "SELECT fi.*, lc.* $gateSql $selectSql
+ , uue.`login` AS `modifier_user`, uue.`real_name` AS `modifier_real_name`
+ , uuc.`login` AS `creator_user`, uuc.`real_name` AS `creator_real_name`, ufm.`favorite_content_id` AS `is_favorite`
+ , lch.`hits`
+ FROM `".BIT_DB_PREFIX."fisheye_image` fi
+ INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lc.`content_id` = fi.`content_id`)
+ LEFT JOIN `".BIT_DB_PREFIX."users_users` uue ON (uue.`user_id` = lc.`modifier_user_id`)
+ LEFT JOIN `".BIT_DB_PREFIX."users_users` uuc ON (uuc.`user_id` = lc.`user_id`)
+ LEFT JOIN `".BIT_DB_PREFIX."users_favorites_map` ufm ON (ufm.`favorite_content_id`=lc.`content_id` AND ufm.`user_id`=uuc.`user_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_hits` lch ON ( lch.`content_id` = lc.`content_id` ) $joinSql
+ $whereSql";
+ if( $this->mInfo = $this->mDb->getRow( $sql, array( $bindVars ) ) ) {
+ $this->mImageId = $this->mInfo['image_id'];
+ $this->mContentId = $this->mInfo['content_id'];
+
+ $this->mInfo['creator'] = (isset( $this->mInfo['creator_real_name'] ) ? $this->mInfo['creator_real_name'] : $this->mInfo['creator_user'] );
+ $this->mInfo['editor'] = (isset( $this->mInfo['modifier_real_name'] ) ? $this->mInfo['modifier_real_name'] : $this->mInfo['modifier_user'] );
+
+ if( $gBitSystem->isPackageActive( 'gatekeeper' ) && !@$this->verifyId( $this->mInfo['security_id'] ) ) {
+ // check to see if this image is in a protected gallery
+ // this burns an extra select but avoids an big and gnarly LEFT JOIN sequence that may be hard to optimize on all DB's
+ $query = "SELECT ls.* FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` fgim
+ INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security_map` tsm ON(fgim.`gallery_content_id`=tsm.`content_id` )
+ INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security` ls ON(tsm.`security_id`=ls.`security_id` )
+ WHERE fgim.`item_content_id`=?";
+ $grs = $this->mDb->query($query, array( $this->mContentId ) );
+ if( $grs && $grs->RecordCount() ) {
+ $this->mInfo = array_merge( $this->mInfo, $grs->fields );
+ }
+ }
+
+ LibertyAttachable::load();
+
+ if (!empty($this->mStorage) && count($this->mStorage) > 0) {
+ reset($this->mStorage);
+ $this->mInfo['image_file'] = current($this->mStorage);
+ } else {
+ $this->mInfo['image_file'] = NULL;
+ }
+ }
+ } else {
+ // We don't have an image_id or a content_id so there is no way to know what to load
+ return NULL;
+ }
+
+ return count($this->mInfo);
+ }
+
+ function exportHtml( $pData = NULL ) {
+// if( empty( $pData ) ) {
+// $pData = $this->mInfo['data'];
+// }
+// $ret = FisheyeBase::parseData( $pData );
+// $ret .= '<img src="'.$this->mInfo['image_file']['source_url'].'" width="400" height="300" />';
+ $ret = NULL;
+ // make sure we have a valid image file.
+ if( $this->isValid() && ($details = $this->getImageDetails() ) ) {
+ if( $this->mInfo['width'] != $details['width'] || $this->mInfo['height'] != $details['height'] ) {
+ // if our data got out of sync with the database, force an update
+ $query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
+ $this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
+ $this->mInfo['width'] = $details['width'];
+ $this->mInfo['height'] = $details['height'];
+ }
+
+ $ret = array( 'type' => $this->getContentType(),
+ 'landscape' => $this->isLandscape(),
+ 'url' => $this->getDisplayUrl(),
+ 'content_id' => $this->mContentId,
+ 'title' => $this->getTitle(),
+ 'has_description' => !empty( $this->mInfo['data'] ),
+ 'is_favorite' => $this->getField('is_favorite'),
+ );
+ }
+ return $ret;
+ }
+
+ function isLandscape() {
+ return( !empty( $this->mInfo['width'] ) && !empty( $this->mInfo['height'] ) && ($this->mInfo['width'] > $this->mInfo['height']) );
+ }
+
+ function verifyImageData(&$pStorageHash) {
+ $pStorageHash['content_type_guid'] = $this->getContentType();
+
+ if ( empty($pStorageHash['purge_from_galleries']) ) {
+ $pStorageHash['purge_from_galleries'] = FALSE;
+ }
+
+ // let's add a default title
+ if( empty( $pStorageHash['title'] ) && !empty( $pStorageHash['upload']['name'] ) ) {
+ if( preg_match( '/^[A-Z]:\\\/', $pStorageHash['upload']['name'] ) ) {
+ // MSIE shit file names if passthrough via gigaupload, etc.
+ // basename will not work - see http://us3.php.net/manual/en/function.basename.php
+ $tmp = preg_split("[\\\]",$pStorageHash['upload']['name']);
+ $defaultName = $tmp[count($tmp) - 1];
+ } elseif( strpos( '.', $pStorageHash['upload']['name'] ) ) {
+ list( $defaultName, $ext ) = explode( '.', $pStorageHash['upload']['name'] );
+ } else {
+ $defaultName = $pStorageHash['upload']['name'];
+ }
+ $pStorageHash['title'] = str_replace( '_', ' ', substr( $defaultName, 0, strrpos( $defaultName, '.' ) ) );
+ }
+
+ if( !empty( $pStorageHash['resize'] ) ) {
+ $pStorageHash['upload']['max_height'] = $pStorageHash['upload']['max_width'] = $pStorageHash['resize'];
+ }
+
+ return (count($this->mErrors) == 0);
+ }
+
+ function store(&$pStorageHash) {
+ global $gBitSystem, $gLibertySystem;
+ if ($this->verifyImageData($pStorageHash)) {
+ // Save the current attachment ID for the image attached to this FisheyeImage so we can
+ // delete it after saving the new one
+ if (!empty($this->mInfo['image_file']) && !empty($this->mInfo['image_file']['attachment_id']) && !empty($pStorageHash['upload'])) {
+ $currentImageAttachmentId = $this->mInfo['image_file']['attachment_id'];
+ $pStorageHash['attachment_id'] = $currentImageAttachmentId;
+ } else {
+ $currentImageAttachmentId = NULL;
+ }
+
+ // LibertyAttachable will take care of thumbnail generation of the offline thumbnailer is not active
+ if( !empty( $pStorageHash['upload'] ) ) {
+ $pStorageHash['upload']['thumbnail'] = !$gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' );
+ }
+
+ if( LibertyAttachable::store( $pStorageHash ) ) {
+ if( $currentImageAttachmentId && $currentImageAttachmentId != $this->mInfo['image_file']['attachment_id'] ) {
+ $this->expungeAttachment($currentImageAttachmentId);
+ }
+ // get storage format back from LibertyAttachment
+ $this->mContentId = $pStorageHash['content_id'];
+ $this->mInfo['content_id'] = $this->mContentId;
+
+ if ( isset($pStorageHash['storage_guid']) && !empty($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['upload']['source_file'])) {
+ $imageDetails = $this->getImageDetails($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['upload']['source_file']);
+ } else {
+ $imageDetails = NULL;
+ }
+
+ if (!$imageDetails) {
+ $imageDetails['width'] = (!empty($this->mInfo['width']) ? $this->mInfo['width'] : NULL);
+ $imageDetails['height'] = (!empty($this->mInfo['height']) ? $this->mInfo['height'] : NULL);
+ }
+
+ if ($this->imageExistsInDatabase()) {
+ $sql = "UPDATE `".BIT_DB_PREFIX."fisheye_image`
+ SET `content_id` = ?, `width` = ?, `height` = ?
+ WHERE `image_id` = ?";
+ $bindVars = array($this->mContentId, $imageDetails['width'], $imageDetails['height'], $this->mImageId);
+ } else {
+ $this->mImageId = $this->mDb->GenID('fisheye_image_id_seq');
+ $this->mInfo['image_id'] = $this->mImageId;
+ $sql = "INSERT INTO `".BIT_DB_PREFIX."fisheye_image` (`image_id`, `content_id`, `width`, `height`) VALUES (?,?,?,?)";
+ $bindVars = array($this->mImageId, $this->mContentId, $imageDetails['width'], $imageDetails['height']);
+ }
+ $rs = $this->mDb->query($sql, $bindVars);
+
+ // check to see if we need offline thumbnailing
+ if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
+ $resize = !empty( $pStorageHash['resize'] ) ? (int)$pStorageHash['resize'] : NULL;
+ $this->generateThumbnails( $resize );
+ } else {
+ if( !empty( $pStorageHash['resize'] ) && is_numeric( $pStorageHash['resize'] ) ) {
+ $this->resizeOriginal( $pStorageHash['resize'] );
+ }
+ }
+ }
+ } else {
+ $this->mErrors[] = "There were errors while attempting to save this gallery image";
+ }
+
+ return (count($this->mErrors) == 0);
+ }
+
+ function getExifField( $pExifField ) {
+ $ret = NULL;
+ if( function_exists( 'exif_read_data' ) ) {
+ $pExifField = strtolower( $pExifField );
+ $file = $this->getSourceFile();
+ // only attempt to get exif data from jpg or tiff files - chokes otherwise
+ if( empty( $this->mExif ) && preg_match( "!\.(jpe?g|tif{1,2})$!", $file ) ) {
+ $this->mExif = array_change_key_case( exif_read_data( $file ), CASE_LOWER );
+ }
+ if( !empty( $this->mExif[$pExifField] ) ) {
+ $ret = $this->mExif[$pExifField];
+ }
+ }
+ return $ret;
+ }
+
+ function rotateImage( $pDegrees ) {
+ global $gBitSystem;
+ if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
+ $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
+ $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
+ $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
+ $fileHash['size'] = filesize( $fileHash['source_file'] );
+ $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
+ $fileHash['name'] = $this->mInfo['image_file']['filename'];
+ if( $pDegrees == 'auto' ) {
+ if( $exifOrientation = $this->getExifField( 'orientation' ) ) {
+ switch( $exifOrientation ) {
+ case 1: //) transform="";;
+ break;
+ case 2: //) transform="-flip horizontal";;
+ break;
+ case 3: //) transform="-rotate 180";;
+ $pDegrees = 180;
+ break;
+ case 4: //) transform="-flip vertical";;
+ break;
+ case 5: //) transform="-transpose";;
+ break;
+ case 6: //) transform="-rotate 90";;
+ // make sure image has not already been rotated
+ if( $this->isLandscape() ) {
+ $pDegrees = 90;
+ }
+ break;
+ case 7: //) transform="-transverse";;
+ break;
+ case 8: //) transform="-rotate 270";;
+ // make sure image has not already been rotated
+ if( $this->isLandscape() ) {
+ $pDegrees = 270;
+ }
+ break;
+ // *) transform="";;
+ }
+ }
+ }
+ if( is_numeric( $pDegrees ) ) {
+ $fileHash['degrees'] = $pDegrees;
+ $rotateFunc = liberty_get_function( 'rotate' );
+ if( $rotateFunc( $fileHash ) ) {
+ liberty_clear_thumbnails( $fileHash );
+ $this->mDb->query( "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=`height`, `height`=`width` WHERE `content_id`=?", array( $this->mContentId ) );
+ $this->generateThumbnails();
+ } else {
+ $this->mErrors['rotate'] = $fileHash['error'];
+ }
+ } elseif( $pDegrees == 'auto' ) {
+ $this->mErrors['rotate'] = "Image was not auto-rotated.";
+ }
+ }
+ return (count($this->mErrors) == 0);
+ }
+
+
+ /**
+ * convertColorspace
+ *
+ * @param string $pColorSpace - target color space, only 'grayscale' is currently supported, and only when using the MagickWand image processor
+ * @access public
+ * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure
+ */
+ function convertColorspace( $pColorSpace ) {
+ $ret = FALSE;
+ if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
+ $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
+ $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
+ $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
+ $fileHash['size'] = filesize( $fileHash['source_file'] );
+ $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
+ $fileHash['name'] = $this->mInfo['image_file']['filename'];
+ if( $convertFunc = liberty_get_function( 'convert_colorspace' ) ) {
+ if( $ret = $convertFunc( $fileHash, $pColorSpace ) ) {
+ liberty_clear_thumbnails( $fileHash );
+ $sql = "UPDATE `".BIT_DB_PREFIX."liberty_files SET `file_size`=? WHERE `file_id` = ?";
+ $this->mDb->query( $sql, array( filesize( $fileHash['dest_file'] ), $this->mInfo['image_file']['file_id'] ) );
+ $this->generateThumbnails();
+ }
+ }
+ }
+ return $ret;
+ }
+
+
+ function resizeOriginal( $pResizeOriginal ) {
+ global $gBitSystem;
+ if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
+ $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
+ $fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
+ $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
+ $fileHash['size'] = filesize( $fileHash['source_file'] );
+ $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
+ $fileHash['name'] = $this->mInfo['image_file']['filename'];
+ $fileHash['max_height'] = $fileHash['max_width'] = $pResizeOriginal;
+ // make a copy of the fileHash that we can compare output after processing
+ $preResize = $fileHash;
+ $resizeFunc = liberty_get_function( 'resize' );
+
+ if( !$resizeFunc( $fileHash ) ) {
+ $this->mErrors['upload'] = $fileHash['errors'];
+ } else {
+ // Ack this is evil direct bashing of the liberty tables! XOXO spiderr
+ // should be a cleaner way eventually
+
+ // we need to update the souce_file in case it's changed from a non jpg to a jpg
+ if( $fileHash['name'] != $preResize['name'] ) {
+ $fileHash['source_file'] = dirname( $fileHash['source_file'] ).'/'.$fileHash['name'];
+ // make absolutely certain that we have 2 image files and that they are different, then remove the original
+ if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
+ @unlink( $preResize['source_file'] );
+ }
+ }
+ $details = $this->getImageDetails( $fileHash['source_file'] );
+ // store all the values that might have changed due to the resize
+ $storeHash = array(
+ 'file_size' => $details['size'],
+ 'mime_type' => $details['mime'],
+ 'storage_path' => str_replace( BIT_ROOT_PATH, "", $fileHash['source_file'] ),
+ );
+ $this->mDb->associateUpdate( BIT_DB_PREFIX."liberty_files", $storeHash, array( 'file_id' => $this->mInfo['image_file']['file_id'] ) );
+ //$query = "UPDATE `".BIT_DB_PREFIX."liberty_files` SET `file_size`=? WHERE `file_id`=?";
+ //$this->mDb->query( $query, array( $details['size'], $this->mInfo['image_file']['file_id'] ) );
+ $query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
+ $this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
+ // if we've come this far, we can try removing the original if it's different to the resized image
+ // make absolutely certain that we have 2 image files and that they are different, then remove the original
+ if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
+ @unlink( $preResize['source_file'] );
+ }
+ }
+ }
+ return (count($this->mErrors) == 0);
+ }
+
+
+ function generateThumbnails( $pResizeOriginal=NULL ) {
+ global $gBitSystem;
+ $ret = FALSE;
+ // LibertyAttachable will take care of thumbnail generation of the offline thumbnailer is not active
+ if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
+ $query = "DELETE FROM `".BIT_DB_PREFIX."liberty_process_queue`
+ WHERE `content_id`=?";
+ $this->mDb->query( $query, array( $this->mContentId ) );
+ $query = "INSERT INTO `".BIT_DB_PREFIX."liberty_process_queue`
+ (`content_id`, `queue_date`, `processor_parameters`) VALUES (?,?,?)";
+ $this->mDb->query( $query, array( $this->mContentId, $gBitSystem->getUTCTime(), serialize( array( 'resize_original' => $pResizeOriginal ) ) ) );
+ } else {
+ $ret = $this->renderThumbnails();
+ }
+ return $ret;
+ }
+
+
+ function renderThumbnails( $pThumbSizes=NULL ) {
+ if( !empty( $this->mInfo['image_file'] ) || $this->load() ) {
+ $fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
+ $fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
+ $fileHash['size'] = filesize( $fileHash['source_file'] );
+ $fileHash['dest_path'] = dirname( $this->mInfo['image_file']['storage_path'] ).'/';
+ $fileHash['name'] = $this->mInfo['image_file']['filename'];
+ $fileHash['thumbnail_sizes'] = $pThumbSizes;
+ // just generate thumbnails
+ liberty_generate_thumbnails( $fileHash );
+ if( !empty( $fileHash['error'] ) ) {
+ $this->mErrors['thumbnail'] = $fileHash['error'];
+ }
+ }
+ return( count($this->mErrors) == 0 );
+ }
+
+ function getSourceUrl() {
+ $ret = NULL;
+ if( !empty( $this->mInfo['image_file']['storage_path'] ) ) {
+ $ret = BIT_ROOT_URL.dirname( $this->mInfo['image_file']['storage_path'] ).'/'.rawurlencode( basename( $this->mInfo['image_file']['storage_path'] ) );
+ }
+ return $ret;
+ }
+
+ function getSourceFile() {
+ $ret = NULL;
+ if( !empty( $this->mInfo['image_file']['storage_path'] ) ) {
+ $ret = BIT_ROOT_PATH.$this->mInfo['image_file']['storage_path'];
+ }
+ return $ret;
+ }
+
+ // Get resolution, etc
+ function getImageDetails($pFilePath = NULL) {
+ $info = NULL;
+ $pFilePath = ($pFilePath ? $pFilePath : $this->getSourceFile());
+
+ $checkFiles = array( $pFilePath, dirname( $pFilePath ).'/original.jpg' );
+
+ foreach( $checkFiles as $cf ) {
+ if ($cf && file_exists( $cf ) && filesize( $cf ) ) {
+ if( $info = getimagesize( rtrim( $cf ) ) ) {
+ $info['width'] = $info[0];
+ $info['height'] = $info[1];
+ $info['size'] = filesize( $cf );
+ }
+ }
+ }
+
+ return $info;
+ }
+
+ /**
+ * Returns include file that will setup vars for display
+ * @return the fully specified path to file to be included
+ */
+ function getRenderFile() {
+ return FISHEYE_PKG_PATH."display_fisheye_image_inc.php";
+ }
+
+ /**
+ * Returns template file used for display
+ * @return the fully specified path to file to be included
+ */
+ function getRenderTemplate() {
+ return 'bitpackage:fisheye/view_image.tpl';
+ }
+
+ /**
+ * Function that returns link to display a piece of content
+ * @param pImageId id of gallery to link
+ * @param pMixed if a string, it is assumed to be the size, if an array, it is assumed to be a mInfo hash
+ * @return the url to display the gallery.
+ */
+ function getDisplayUrl( $pImageId=NULL, $pMixed=NULL ) {
+ $ret = '';
+ if( !@BitBase::verifyId( $pImageId ) ) {
+ $pImageId = $this->mImageId;
+ }
+
+ // if pMixed is an array, we assume it has all the pertinent information
+ if( is_array( $pMixed )) {
+ $info = $pMixed;
+ } else {
+ $info = &$this->mInfo;
+ }
+
+ $size = ( is_string( $pMixed ) && isset( $info['image_file']['thumbnail_url'][$pMixed] ) ) ? $pMixed : NULL ;
+ global $gBitSystem;
+ if( @BitBase::verifyId( $pImageId ) ) {
+ if( $gBitSystem->isFeatureActive( 'pretty_urls' ) ) {
+ $ret = FISHEYE_PKG_URL.'image/'.$pImageId;
+ if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
+ $ret .= $this->mGalleryPath;
+ }
+ if( $size ) {
+ $ret .= '/'.$size;
+ }
+ } else {
+ $ret = FISHEYE_PKG_URL.'view_image.php?image_id='.$pImageId;
+ if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
+ $ret .= '&gallery_path='.$this->mGalleryPath;
+ }
+ if( $size ) {
+ $ret .= '&size='.$size;
+ }
+ }
+ } elseif( @BitBase::verifyId( $info['content_id'] ) ) {
+ $ret = FISHEYE_PKG_URL.'view_image.php?content_id='.$info['content_id'];
+ }
+ return $ret;
+ }
+
+
+ /**
+ * Generate a valid display link for the Blog
+ *
+ * @param object PostId of the item to use
+ * @param array Not used
+ * @return object Fully formatted html link for use by Liberty
+ */
+ function getDisplayLink( $pTitle=NULL, $pMixed=NULL ) {
+ global $gBitSystem;
+ if( empty( $pTitle ) && !empty( $this ) ) {
+ $pTitle = $this->getTitle();
+ }
+
+ if( empty( $pMixed ) && !empty( $this ) ) {
+ $pMixed = $this->mInfo;
+ }
+
+ $ret = $pTitle;
+ if( $gBitSystem->isPackageActive( 'fisheye' ) ) {
+ $ret = '<a title="'.$pTitle.'" href="'.FisheyeImage::getDisplayUrl( NULL, $pMixed ).'">'.$pTitle.'</a>';
+ }
+ return $ret;
+ }
+
+
+ function loadThumbnail( $pSize='small' ) {
+ $this->mInfo['image_file']['gallery_thumbnail_url'] = &$this->mInfo['image_file']['thumbnail_url'][$pSize];
+ }
+
+ function getThumbnailUrl( $pSize='small', $pInfoHash=NULL ) {
+ $ret = NULL;
+ if( !empty( $pInfoHash ) ) {
+ // do some stuff if we are given a hash of stuff
+ } else {
+ if( empty( $this->mInfo['image_file']['gallery_thumbnail_url'] ) ) {
+ $this->loadThumbnail( $pSize );
+ }
+ $ret = $this->mInfo['image_file']['gallery_thumbnail_url'];
+ }
+ return $ret;
+ }
+
+ function expunge($pExpungeAttachment = TRUE) {
+ if( $this->isValid() ) {
+ $this->mDb->StartTrans();
+ $query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` WHERE `item_content_id` = ?";
+ $rs = $this->mDb->query($query, array( $this->mContentId ));
+ $query = "UPDATE `".BIT_DB_PREFIX."fisheye_gallery` SET `preview_content_id`=NULL WHERE `preview_content_id` = ?";
+ $rs = $this->mDb->query($query, array( $this->mContentId ));
+ $query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_image` WHERE `content_id` = ?";
+ $rs = $this->mDb->query($query, array( $this->mContentId ));
+ if( LibertyAttachable::expunge($pExpungeAttachment) ) {
+ $this->mDb->CompleteTrans();
+ } else {
+ $this->mDb->RollbackTrans();
+ }
+ }
+ return( count( $this->mErrors ) == 0 );
+ }
+
+ function expungingAttachment($pAttachmentId, $pContentIdArray) {
+ foreach ($pContentIdArray as $id) {
+ $this->mContentId = $id;
+ // Vital that we call LibertyAttachable::expunge with false since the attachment is already being deleted.
+ $this->expunge(FALSE);
+ }
+ }
+
+ function isValid() {
+ return( @$this->verifyId( $this->mImageId ) || @$this->verifyId( $this->mContentId ) );
+ }
+
+ function imageExistsInDatabase() {
+ $ret = FALSE;
+ if( $this->isValid() && $this->mImageId ) {
+ $query = "SELECT COUNT(`image_id`)
+ FROM `".BIT_DB_PREFIX."fisheye_image`
+ WHERE `image_id` = ?";
+
+ $bindVars = array($this->mImageId);
+
+ if($this->mDb->getOne($query, $bindVars) > 0){
+ $ret = TRUE;
+ }
+
+ }
+ return $ret;
+ }
+
+
+ function getList( &$pListHash ) {
+ global $gBitUser,$gBitSystem;
+
+ $this->prepGetList( $pListHash );
+ $bindVars = array();
+ $distinct = '';
+ $select = '';
+ $mid = '';
+ $join = '';
+
+ if( @$this->verifyId( $pListHash['user_id'] ) ) {
+ $mid .= " AND lc.`user_id` = ? ";
+ $bindVars[] = $pListHash['user_id'];
+ } elseif( !empty( $pListHash['recent_users'] )) {
+ $distinct = " DISTINCT ON ( uu.`user_id` ) ";
+ $pListHash['sort_mode'] = 'uu.user_id_desc';
+ }
+
+ if( @$this->verifyId( $pListHash['gallery_id'] ) ) {
+ $mid .= " AND fg.`gallery_id` = ? ";
+ $bindVars[] = $pListHash['gallery_id'];
+ }
+
+ if( !empty( $pListHash['search'] ) ) {
+ $mid .= " AND UPPER(lc.`title`) LIKE ? ";
+ $bindVars[] = '%'.strtoupper( $pListHash['search'] ).'%';
+ }
+
+ if( !empty( $pListHash['max_age'] ) && is_numeric( $pListHash['max_age'] ) ) {
+ $mid .= " AND lc.`created` > ? ";
+ $bindVars[] = $pListHash['max_age'];
+ }
+
+ $orderby = '';
+ if ( !empty( $pListHash['sort_mode'] ) ) {
+ //converted in prepGetList()
+ $orderby = " ORDER BY ".$this->mDb->convertSortmode( $pListHash['sort_mode'] )." ";
+ }
+
+ $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
+
+ $query = "SELECT $distinct fi.`image_id` AS `hash_key`, fi.*, lf.*, lc.*, fg.`gallery_id`, uu.`login`, uu.`real_name` $select $selectSql
+ FROM `".BIT_DB_PREFIX."fisheye_image` fi
+ INNER JOIN `".BIT_DB_PREFIX."liberty_attachments_map` lam ON(lam.`content_id`=fi.`content_id`)
+ INNER JOIN `".BIT_DB_PREFIX."liberty_attachments` la ON(la.`attachment_id`=lam.`attachment_id`)
+ INNER JOIN `".BIT_DB_PREFIX."liberty_files` lf ON(la.`foreign_id`=lf.`file_id`)
+ , `".BIT_DB_PREFIX."users_users` uu, `".BIT_DB_PREFIX."liberty_content` lc $join
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery_image_map` tfgim2 ON(tfgim2.`item_content_id`=lc.`content_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery` fg ON(fg.`content_id`=tfgim2.`gallery_content_id`) $joinSql
+ WHERE fi.`content_id` = lc.`content_id` AND uu.`user_id` = lc.`user_id` $mid $whereSql $orderby";
+
+ if( $rs = $this->mDb->query( $query, $bindVars, $pListHash['max_records'], $pListHash['offset'] ) ) {
+ $ret = $rs->GetAssoc();
+ if( empty( $pListHash['no_thumbnails'] ) ) {
+ foreach( array_keys( $ret ) as $imageId ) {
+ $ret[$imageId]['thumbnail_url'] = liberty_fetch_thumbnail_url( $ret[$imageId]['storage_path'], 'avatar', FISHEYE_PKG_URL.'image/generating_thumbnails.png' );
+ $ret[$imageId]['display_url'] = $this->getDisplayUrl( $imageId );
+ $ret[$imageId]['has_machine_name'] = $this->isMachineName( $ret[$imageId]['title'] );
+ }
+ }
+ }
+// $this->debug(0);
+ return $ret;
+ }
+
+ /**
+ * isCommentable
+ *
+ * @access public
+ * @return TRUE on success, FALSE on failure
+ */
+ function isCommentable() {
+ global $gGallery;
+
+ // if we have a loaded gallery, we just use that to work out if we can add comments to this image
+ if( is_object( $gGallery ) ) {
+ return $gGallery->isCommentable();
+ }
+
+ $ret = FALSE;
+ if( $parents = $this->getParentGalleries() ) {
+ // @TODO: No idea how to work out if you can add a comment to this image
+ // for now we'll take the mGalleryPath and use that gallery
+ $gal = current( $parents );
+ $query = "SELECT `pref_value` FROM `".BIT_DB_PREFIX."liberty_content_prefs` WHERE `content_id` = ? AND `pref_name` = ?";
+ $ret = ( $this->mDb->getOne( $query, array( $gal['content_id'], 'allow_comments' )) == 'y' );
+ }
+ return $ret;
+ }
+}
+
+?>