2025-06-16 18:28:08 +05:00

1007 lines
34 KiB
PHP
Executable File

<?php
/**
* $Id: ImageManagerPlugin.php 567 2008-11-06 16:49:12Z spocke $
*
* @package MCImageManager
* @author Moxiecode
* @copyright Copyright © 2007, Moxiecode Systems AB, All rights reserved.
*/
require_once($basepath . "ImageManager/Utils/MCImageToolsGD.php");
/**
* This plugin class contans the core logic of the MCImageManager application.
*
* @package MCImageManager
*/
class Moxiecode_ImageManagerPlugin extends Moxiecode_ManagerPlugin {
/**#@+
* @access public
*/
/**
* Constructs a new imagemanager instance.
*/
function Moxiecode_ImageManagerPlugin() {
}
function onPreInit(&$man, $prefix) {
global $mcImageManagerConfig;
if ($prefix == "im") {
$man->setConfig($mcImageManagerConfig, false);
$man->setLangPackPath("im");
return false;
}
return true;
}
/**
* Gets executed when a RPC command is to be executed.
*
* @param MCManager $man MCManager reference that the plugin is assigned to.
* @param string $cmd RPC Command to be executed.
* @param object $input RPC input object data.
* @return object Result data from RPC call or null if it should be passed to the next handler in chain.
*/
function onRPC(&$man, $cmd, $input) {
switch ($cmd) {
case "getMediaInfo":
return $this->_getMediaInfo($man, $input);
case "resizeImage":
$result = new Moxiecode_ResultSet("status,file,message");
$file = $man->getFile($input["path"]);
/*
if ($man->verifyFile($file, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg());
return $result->toArray();
}*/
$filedata = array();
$filedata["path"] = $man->encryptPath($file->getAbsolutePath());
$filedata["width"] = isset($input["width"]) ? $input["width"] : 0;
$filedata["height"] = isset($input["height"]) ? $input["height"] : 0;
$filedata["target"] = isset($input["target"]) ? $input["target"] : "";
$filedata["temp"] = isset($input["temp"]) ? $input["temp"] : "";
$this->_resizeImage($man, $file, $filedata, $result);
return $result->toArray();
case "cropImage":
$result = new Moxiecode_ResultSet("status,file,message");
$file = $man->getFile($input["path"]);
/*
if ($man->verifyFile($file, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg());
return $result->toArray();
}*/
$filedata = array();
$filedata["path"] = $man->encryptPath($file->getAbsolutePath());
$filedata["width"] = $input["width"];
$filedata["height"] = $input["height"];
$filedata["top"] = $input["top"];
$filedata["left"] = $input["left"];
$filedata["target"] = isset($input["target"]) ? $input["target"] : "";
$filedata["temp"] = isset($input["temp"]) ? $input["temp"] : "";
$this->_cropImage($man, $file, $filedata, $result);
return $result->toArray();
case "rotateImage":
$result = new Moxiecode_ResultSet("status,file,message");
$file = $man->getFile($input["path"]);
/*
if ($man->verifyFile($file, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg());
return $result->toArray();
}*/
$filedata = array();
$filedata["path"] = $file->getAbsolutePath();
$filedata["angle"] = $input["angle"];
$filedata["target"] = isset($input["target"]) ? $input["target"] : "";
$filedata["temp"] = isset($input["temp"]) ? $input["temp"] : "";
$this->_rotateImage($man, $file, $filedata, $result);
return $result->toArray();
case "flipImage":
$result = new Moxiecode_ResultSet("status,file,message");
$file = $man->getFile($input["path"]);
/*
if ($man->verifyFile($file, "edit") < 0) {
$result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg());
return $result->toArray();
}*/
$filedata = array();
$filedata["path"] = $file->getAbsolutePath();
$filedata["vertical"] = isset($input["vertical"]) ? $input["vertical"] : false;
$filedata["horizontal"] = isset($input["horizontal"]) ? $input["horizontal"] : false;
$filedata["target"] = isset($input["target"]) ? $input["target"] : "";
$filedata["temp"] = isset($input["temp"]) ? $input["temp"] : "";
$this->_flipImage($man, $file, $filedata, $result);
return $result->toArray();
case "saveImage":
$config = $man->getConfig();
$result = new Moxiecode_ResultSet("status,file,message");
$file = $man->getFile($input["path"]);
if (checkBool($config["general.demo"])) {
$result->add("FAILED", $man->encryptPath($input["target"]), "{#error.demo}");
$this->_cleanUp($man, $file->getParent());
return $result->toArray();
}
/*if ($man->verifyFile($file, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg());
$this->_cleanUp($man, $file->getParent());
return $result->toArray();
}*/
$filedata = array();
$filedata["path"] = $file->getAbsolutePath();
if (isset($input["target"]) && $input["target"] != "") {
$targetFile = $man->getFile(utf8_encode($file->getParent()), $input["target"]);
$filedata["target"] = utf8_encode($targetFile->getAbsolutePath());
}
$this->_saveImage($man, $file, $filedata, $result);
$this->_cleanUp($man, $file->getParent());
return $result->toArray();
}
return null;
}
/**
* Gets called when data is streamed to client. This method should setup
* HTTP headers, content type etc and simply send out the binary data to the client and the return false
* ones that is done.
*
* @param MCManager $man MCManager reference that the plugin is assigned to.
* @param string $cmd Stream command that is to be performed.
* @param string $input Array of input arguments.
* @return bool true/false if the execution of the event chain should continue.
*/
function onStream(&$man, $cmd, $input) {
switch ($cmd) {
case "thumb":
return $this->_streamThumb($man, $input);
}
return null;
}
/**
* Gets called before a file action occurs for example before a rename or copy.
*
* @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to.
* @param int $action File action constant for example DELETE_ACTION.
* @param BaseFile $file1 File object 1 for example from in a copy operation.
* @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete.
* @return bool true/false if the execution of the event chain should continue.
*/
function onBeforeFileAction(&$man, $action, $file1, $file2) {
if ($action == DELETE_ACTION) {
// Delete format images
$config = $file1->getConfig();
if (checkBool($config['filesystem.delete_format_images'])) {
$imageutils = new $config['thumbnail'];
$imageutils->deleteFormatImages($file1->getAbsolutePath(), $config["upload.format"]);
$imageutils->deleteFormatImages($file1->getAbsolutePath(), $config["edit.format"]);
}
}
return true;
}
/**
* Gets called after a file action was perforem for example after a rename or copy.
*
* @param MCManager $man MCManager reference that the plugin is assigned to.
* @param int $action File action constant for example DELETE_ACTION.
* @param string $file1 File object 1 for example from in a copy operation.
* @param string $file2 File object 2 for example to in a copy operation. Might be null in for example a delete.
* @return bool true/false if the execution of the event chain should continue.
*/
function onFileAction(&$man, $action, $file1, $file2) {
switch ($action) {
case ADD_ACTION:
$config = $file1->getConfig();
if ($config["upload.format"]) {
$imageutils = new $config['thumbnail'];
$imageutils->formatImage($file1->getAbsolutePath(), $config["upload.format"], $config['upload.autoresize_jpeg_quality']);
}
if (checkBool($config["upload.create_thumbnail"]))
$thumbnail = $this->_createThumb($man, $file1);
if (checkBool($config['upload.autoresize'])) {
$ext = getFileExt($file1->getName());
if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png')))
return true;
$imageInfo = @getimagesize($file1->getAbsolutePath());
$fileWidth = $imageInfo[0];
$fileHeight = $imageInfo[1];
$imageutils = new $config['thumbnail'];
$percentage = min($config['upload.max_width'] / $fileWidth, $config['upload.max_height'] / $fileHeight);
if ($percentage <= 1)
$result = $imageutils->resizeImage($file1->getAbsolutePath(), $file1->getAbsolutePath(), round($fileWidth * $percentage), round($fileHeight * $percentage), $ext, $config['upload.autoresize_jpeg_quality']);
}
break;
case DELETE_ACTION:
$config = $file1->getConfig();
if ($config['thumbnail.delete'] == true) {
$thumbnailFolder = $man->getFile(dirname($file1->getAbsolutePath()) ."/". $config['thumbnail.folder']);
$thumbnailPath = $thumbnailFolder->getAbsolutePath() . "/" . $config['thumbnail.prefix'] . basename($file1->getAbsolutePath());
$thumbnail = $man->getFile($thumbnailPath);
if ($thumbnail->exists())
$thumbnail->delete();
// Check if thumbnail directory should be deleted
if ($thumbnailFolder->exists()) {
$files = $thumbnailFolder->listFiles();
if (count($files) == 0)
$thumbnailFolder->delete();
}
}
break;
}
return true; // Pass to next plugin
}
/**
* Gets called when custom data is to be added for a file custom data can for example be
* plugin specific name value items that should get added into a file listning.
*
* @param MCManager $man MCManager reference that the plugin is assigned to.
* @param BaseFile $file File reference to add custom info/data to.
* @param string $type Where is the info needed for example list or info.
* @param Array $custom Name/Value array to add custom items to.
* @return bool true/false if the execution of the event chain should continue.
*/
function onCustomInfo(&$man, &$file, $type, &$input) {
// Is file and image
$config = $file->getConfig();
$input["editable"] = false;
if ($file->isFile() && ($type == "list" || $type == "insert" || $type == "info")) {
// Should we get config on each file here?
//$config = $file->getConfig();
$ext = getFileExt($file->getName());
if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png', 'bmp')))
return true;
$imageutils = new $config['thumbnail'];
$canEdit = $imageutils->canEdit($ext);
$imageInfo = @getimagesize($file->getAbsolutePath());
$fileWidth = $imageInfo[0];
$fileHeight = $imageInfo[1];
$targetWidth = $config['thumbnail.width'];
$targetHeight = $config['thumbnail.height'];
// Check thumnail size
if ($config['thumbnail.scale_mode'] == "percentage") {
$percentage = min($config['thumbnail.width'] / $fileWidth, $config['thumbnail.height'] / $fileHeight);
if ($percentage <= 1) {
$targetWidth = round($fileWidth * $percentage);
$targetHeight = round($fileHeight * $percentage);
} else {
$targetWidth = $fileWidth;
$targetHeight = $fileHeight;
}
}
$input["thumbnail"] = true;
// Check against config.
if (($config["thumbnail.max_width"] != "" && $fileWidth > $config["thumbnail.max_width"]) || ($config["thumbnail.max_height"] != "" && $fileHeight > $config["thumbnail.max_height"]))
$input["thumbnail"] = false;
else {
$input["twidth"] = $targetWidth;
$input["theight"] = $targetHeight;
}
// Get thumbnail URL
if ($type == "insert") {
$thumbFile = $man->getFile($file->getParent() . "/" . $config['thumbnail.folder'] . "/" . $config['thumbnail.prefix'] . $file->getName());
if ($thumbFile->exists())
$input["thumbnail_url"] = $man->convertPathToURI($thumbFile->getAbsolutePath(), $config['preview.wwwroot']);
}
$input["width"] = $fileWidth;
$input["height"] = $fileHeight;
$input["editable"] = $canEdit;
}
return true;
}
// * * * * * * * Private methods
/**
* SaveImage
* TODO: Check for PX or %
*/
function _saveImage(&$man, &$file, &$filedata, &$result) {
$config =& $file->getConfig();
// Find out if we have a temp file.
$ext = getFileExt($file->getName());
if (!$man->isToolEnabled("edit", $config)) {
trigger_error("{#error.no_access}", FATAL);
die();
}
// To file to save
if (!$file->exists()) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}");
return;
}
if (strpos($file->getName(), "mcic_") !== 0)
$tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext;
else
$tmpImage = $file->getName();
$tempFile =& $man->getFile(utf8_encode(dirname($file->getAbsolutePath()) . "/" . $tmpImage));
$tempFile->setTriggerEvents(false);
/*
Failed when mcic_ was found due to exclude in filesystem conf
if ($man->verifyFile($tempFile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($tempFile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
*/
// NOTE: add check for R/W
if ($tempFile->exists()) {
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
// Delete format images
$config = $targetfile->getConfig();
$imageutils = new $config['thumbnail'];
$imageutils->deleteFormatImages($targetfile->getAbsolutePath(), $config["upload.format"]);
// Just ignore it if it's the same file
if ($tempFile->getAbsolutePath() != $targetfile->getAbsolutePath()) {
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
if ($targetfile->exists())
$targetfile->delete();
$tempFile->renameTo($targetfile);
$targetfile->importFile();
// Reformat
if ($config["edit.format"]) {
$imageutils = new $config['thumbnail'];
$imageutils->formatImage($targetfile->getAbsolutePath(), $config["edit.format"], $config['edit.jpeg_quality']);
}
}
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.save_success}");
} else {
$file->delete();
$tempFile->renameTo($file);
$file->importFile();
$result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.save_success}");
}
} else {
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
// Just ignore it if it's the same file
if ($file->getAbsolutePath() != $targetfile->getAbsolutePath()) {
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
if ($targetfile->exists())
$targetfile->delete();
$file->copyTo($targetfile);
$targetfile->importFile();
}
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.save_success}");
} else {
// No temp, no target, abort!
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.save_failed}");
}
}
}
/**
* CropImage
* TODO: Check for PX or %
*/
function _cropImage(&$man, &$file, &$filedata, &$result) {
$ext = getFileExt($file->getName());
$config = $file->getConfig();
$imageutils = new $config['thumbnail'];
if (!$man->isToolEnabled("edit", $config)) {
trigger_error("{#error.no_access}", FATAL);
die();
}
// To file to crop
if (!$file->exists()) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}");
return;
}
if ($filedata["temp"]) {
if (strpos($file->getName(), "mcic_") !== 0)
$tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext;
else
$tmpImage = $file->getName();
$tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage);
$tempFile->setTriggerEvents(false);
$status = $imageutils->cropImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $filedata["top"], $filedata["left"], $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]);
if ($status) {
$tempFile->importFile();
$result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.crop_success}");
} else {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.crop_failed}");
}
} else {
if (checkBool($config["general.demo"])) {
$result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}");
return $result->toArray();
}
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
if ($targetfile->isDirectory()) {
$targetfile = $man->getFile($man->addTrailingSlash($targetfile->getAbsolutePath()) . $file->getName());
}
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
} else
$targetfile = $file;
$status = $imageutils->cropImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $filedata["top"], $filedata["left"], $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]);
if ($status) {
$targetfile->importFile();
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.crop_success}");
} else {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.no_access}");
}
}
}
/**
* ResizeImage
*/
function _resizeImage(&$man, &$file, &$filedata, &$result) {
$ext = getFileExt($file->getName());
$config = $file->getConfig();
$imageutils = new $config['thumbnail'];
if (!$man->isToolEnabled("edit", $config)) {
trigger_error("{#error.no_access}", FATAL);
die();
}
// To file to resize
if (!$file->exists()) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}");
return;
}
if ($filedata["temp"]) {
if (strpos($file->getName(), "mcic_") !== 0)
$tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext;
else
$tmpImage = $file->getName();
$tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage);
$tempFile->setTriggerEvents(false);
$status = $imageutils->resizeImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]);
if ($status) {
$tempFile->importFile();
$result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.resize_success}");
} else {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.resize_failed}");
}
} else {
if (checkBool($config["general.demo"])) {
$result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}");
return $result->toArray();
}
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
if ($targetfile->isDirectory()) {
$targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName());
}
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
} else
$targetfile = $file;
$status = $imageutils->resizeImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]);
if ($status) {
$targetfile->importFile();
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.resize_success}");
} else {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.resize_failed}");
}
}
}
/**
* RotateImage
*/
function _rotateImage(&$man, &$file, &$filedata, &$result) {
$ext = getFileExt($file->getName());
$config = $file->getConfig();
$imageutils = new $config['thumbnail'];
if (!$man->isToolEnabled("edit", $config)) {
trigger_error("{#error.no_access}", FATAL);
die();
}
// To file to rotate
if (!$file->exists()) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}");
return;
}
if ($filedata["temp"]) {
if (strpos($file->getName(), "mcic_") !== 0)
$tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext;
else
$tmpImage = $file->getName();
$tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage);
$tempFile->setTriggerEvents(false);
$status = $imageutils->rotateImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $ext, $filedata["angle"], $config["edit.jpeg_quality"]);
if ($status) {
$tempFile->importFile();
$result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.rotate_success}");
} else {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.rotate_failed}");
}
} else {
if (checkBool($config["general.demo"])) {
$result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}");
return $result->toArray();
}
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
if ($targetfile->isDirectory()) {
$targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName());
}
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
} else
$targetfile = $file;
$status = $imageutils->rotateImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $ext, $filedata["angle"], $config["edit.jpeg_quality"]);
if ($status) {
$targetfile->importFile();
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.rotate_success}");
} else {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.rotate_failed}");
}
}
}
/**
* FlipImage
*/
function _flipImage(&$man, &$file, &$filedata, &$result) {
$ext = getFileExt($file->getName());
$config = $file->getConfig();
$imageutils = new $config['thumbnail'];
if (!$man->isToolEnabled("edit", $config)) {
trigger_error("{#error.no_access}", FATAL);
die();
}
// To file to flip
if (!$file->exists()) {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}");
return;
}
if ($filedata["temp"]) {
if (strpos($file->getName(), "mcic_") !== 0)
$tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext;
else
$tmpImage = $file->getName();
$tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage);
$tempFile->setTriggerEvents(false);
$status = $imageutils->flipImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $ext, $filedata["vertical"], $filedata["horizontal"]);
if ($status) {
$tempFile->importFile();
$result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.flip_success}");
} else {
$result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.flip_failed}");
}
} else {
if (checkBool($config["general.demo"])) {
$result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}");
return $result->toArray();
}
if ($filedata["target"] != "") {
$targetfile = $man->getFile($filedata["target"]);
if ($targetfile->isDirectory()) {
$targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName());
}
if ($man->verifyFile($targetfile, "edit") < 0) {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg());
return;
}
} else
$targetfile = $file;
$status = $imageutils->flipImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $ext, $filedata["vertical"], $filedata["horizontal"], $config["edit.jpeg_quality"]);
if ($status) {
$targetfile->importFile();
$result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.flip_success}");
} else {
$result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.flip_failed}");
}
}
}
/**
* Clean up temp files, input is dir path.
*/
function _cleanUp(&$man, $path) {
$filedir =& $man->getFile($path);
$config = $filedir->getConfig();
if ($man->verifyFile($filedir, "edit") < 0)
return;
// If we can't access this dir, we just return.
if (!$filedir->canWrite())
return;
// Delete old files
$files = $filedir->listFiles();
foreach ($files as $file) {
if (strpos($file->getName(), "mcic_") === 0 && time() - $file->getLastModified() > 3600) {
$file->setTriggerEvents(false);
$file->delete();
}
}
}
/**
* Lists file.
*/
function _getMediaInfo(&$man, $input) {
// Convert URL to path
if (isset($input["url"])) {
$url = parse_url($input["url"]);
$input["path"] = $man->resolveURI($url["path"]);
if (!$man->verifyPath($input["path"]))
trigger_error(sprintf("Could not resolve URL: %s to a filesystem path. Could be that the image is outside the configured filesystem.rootpath.", $input["url"]), FATAL);
}
$file =& $man->getFile($input["path"]);
$config = $file->getConfig();
$parent =& $file->getParentFile();
$files = array();
if ($parent->isDirectory()) {
// Setup file filter
$fileFilter = new Moxiecode_BasicFileFilter();
//$fileFilter->setDebugMode(true);
$fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']);
$fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']);
$fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']);
$fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']);
$fileFilter->setIncludeExtensions($config['filesystem.extensions']);
$fileFilter->setOnlyFiles(true);
// List files
$files =& $parent->listFilesFiltered($fileFilter);
}
$match = false;
$prev = "";
$next = "";
foreach($files as $curfile) {
if ($curfile->getAbsolutePath() == $file->getAbsolutePath()) {
$match = true;
continue;
} else if (!$match)
$prev = $curfile->getAbsolutePath();
if ($match) {
$next = $curfile->getAbsolutePath();
break;
}
}
$ext = getFileExt($file->getName());
// Input default size?
$width = "425";
$height = "350";
// All types that getimagesize support
$imagearray = array('gif', 'jpg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'jpc', 'jp2', 'jpx', 'jb2', 'swc', 'iff', 'wbmp', 'xbm');
if (in_array($ext, $imagearray)) {
$sizeinfo = @getimagesize($file->getAbsolutePath());
if ($sizeinfo) {
$width = $sizeinfo[0];
$height = $sizeinfo[1];
}
}
$result = new Moxiecode_ResultSet("name,path,url,size,type,created,modified,width,height,attribs,next,prev,custom");
$custom = array();
$man->dispatchEvent("onCustomInfo", array(&$file, "info", &$custom));
$attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-");
$url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getAbsolutePath(), $config['preview.wwwroot']);
$result->add(
utf8_encode($file->getName()),
$man->encryptPath($file->getAbsolutePath()),
utf8_encode($url),
$file->getLength(),
$ext,
date($config['filesystem.datefmt'], $file->getCreationDate()),
date($config['filesystem.datefmt'], $file->getLastModified()),
$width,
$height,
$attribs,
$man->encryptPath($next),
$man->encryptPath($prev),
$custom);
return $result->toArray();
}
function _createThumb(&$man, &$file) {
$config = $file->getConfig();
$imageutils = new $config['thumbnail'];
$ext = getFileExt($file->getName());
$canEdit = $imageutils->canEdit($ext);
if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png', 'bmp')))
return false;
// Check if we have an EXIF JPG file.
if (($config['thumbnail.use_exif'] == true) && (function_exists("exif_thumbnail")) && (strtolower($ext) == "jpg" || strtolower($ext) == "jpeg")) {
$image = @exif_thumbnail($file->getAbsolutePath(), $exif_width, $exif_height, $exif_type);
if ($image !== false)
return false;
}
// Check for thumbnails
$havethumbnail = true;
// No folder or not enabled = no thumbnail, could check for thumbnail folder and delete it perhaps?
if (($config['thumbnail.folder'] == "") || ($config['thumbnail.enabled'] == false))
$havethumbnail = false;
// If we dont have GD we dont have a thumbnail.
if (!$canEdit)
$havethumbnail = false;
// Check so that we aren't inside a thumbnail folder.
$parentFile = $file->getParentFile();
if ($config['thumbnail.folder'] == $parentFile->getName())
$havethumbnail = false;
// Ok, no thumbnail? Then lets just stream the original image.
if (!$havethumbnail)
return false;
// Ok, we have a thumbnail or should generate one, now lets check some stuff about it.
$thumbnailFolder = $man->getFile(dirname($file->getAbsolutePath()) ."/". $config['thumbnail.folder']);
if ((!$thumbnailFolder->exists()) && ($config['thumbnail.auto_generate'] == true))
$thumbnailFolder->mkdir();
$thumbnailPath = $thumbnailFolder->getAbsolutePath() . "/" . $config['thumbnail.prefix'] . basename($file->getAbsolutePath());
$thumbnail = $man->getFile(utf8_encode($thumbnailPath));
$thumbnail->setTriggerEvents(false);
$thumbnailQuality = $config['thumbnail.jpeg_quality'];
$thumbnailResult = false;
$imageInfo = @getimagesize($file->getAbsolutePath());
$fileWidth = $imageInfo[0];
$fileHeight = $imageInfo[1];
$fileType = $imageInfo[2];
$thumbnailType = $fileType;
// Calculate thumbnail width and height
$targetWidth = $config['thumbnail.width'];
$targetHeight = $config['thumbnail.height'];
if ($config['thumbnail.scale_mode'] == "percentage") {
$percentage = min($config['thumbnail.width'] / $fileWidth, $config['thumbnail.height'] / $fileHeight);
if ($percentage <= 1) {
$targetWidth = round($fileWidth * $percentage);
$targetHeight = round($fileHeight * $percentage);
} else {
$targetWidth = $fileWidth;
$targetHeight = $fileHeight;
}
}
if ($thumbnail->exists()) {
$thumbnailInfo = @getimagesize($thumbnail->getAbsolutePath());
$thumbnailWidth = $thumbnailInfo[0];
$thumbnailHeight = $thumbnailInfo[1];
$thumbnailType = $thumbnailInfo[2];
// Check width and height against config
//debug($thumbnailHeight . " - " . $targetHeight . " - " . $thumbnailWidth . " - " . $targetWidth);
if (($thumbnailHeight != $targetHeight) || ($thumbnailWidth != $targetWidth)) {
$thumbnail->delete();
$thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality);
}
// Check modificationdate against original image
if ($file->getLastModified() != $thumbnail->getLastModified()) {
$thumbnail->delete();
$thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality);
}
if ($thumbnailResult)
$thumbnail->setLastModified($file->getLastModified());
} else if ((!$thumbnail->exists()) && ($config['thumbnail.auto_generate'] == true)) {
$thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality);
if ($thumbnailResult) {
$thumbnailInfo = @getimagesize($thumbnail->getAbsolutePath());
$thumbnailType = $thumbnailInfo[2];
$thumbnail->setLastModified($file->getLastModified());
$thumbnail->importFile();
}
}
// failsafe check
if ($thumbnail->exists() && $thumbnailType)
return $thumbnail;
return false;
}
function _streamThumb(&$man, $input) {
if (!$man->verifyPath($input["path"]) < 0) {
trigger_error("Path verification failed.", FATAL);
die();
}
$path = $man->decryptPath($input["path"]);
$file =& $man->getFile($path);
$ext = getFileExt($file->getName());
$config = $file->getConfig();
$urlprefix = $man->toUnixPath($config['preview.urlprefix']);
$urlsuffix = $man->toUnixPath($config['preview.urlsuffix']);
// NOTE: Verify more stuff here before proceeding.
if ($man->verifyFile($file, "thumbnail", $config) < 0) {
trigger_error("Path verification failed.", FATAL);
die();
}
//$imageutils = new $config['thumbnail'];
//$canEdit = $imageutils->canEdit($ext);
// Check if we have an EXIF JPG file.
if (($config['thumbnail.use_exif'] == true) && (function_exists("exif_thumbnail")) && (strtolower($ext) == "jpg" || strtolower($ext) == "jpeg")) {
$image = @exif_thumbnail($file->getAbsolutePath(), $exif_width, $exif_height, $exif_type);
if ($image !== false) {
header('Content-type: '. image_type_to_mime_type($exif_type));
echo $image;
return null;
}
}
$thumbnail = $this->_createThumb($man, $file);
if ($thumbnail != false) {
header('Content-type: ' . mapMimeTypeFromUrl($thumbnail->getName(), "../" . $config['stream.mimefile']));
if (!readfile($thumbnail->getAbsolutePath()))
header("Location: ". $urlprefix . $man->convertPathToURI($thumbnail->getAbsolutePath(), $config['preview.wwwroot']) . $urlsuffix);
} else {
header('Content-type: ' . mapMimeTypeFromUrl($file->getName(), "../" . $config['stream.mimefile']));
if (!readfile($file->getAbsolutePath()))
header("Location: " . $urlprefix . $man->convertPathToURI($file->getAbsolutePath(), $config['preview.wwwroot']) . $urlsuffix);
}
return null;
}
/**#@-*/
}
// Add plugin to MCManager
$man->registerPlugin("imagemanager", new Moxiecode_ImageManagerPlugin(), "im");
?>