X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Fmain%2Fclasses%2Fresponse%2Fimage%2Fclass_ImageResponse.php;fp=inc%2Fmain%2Fclasses%2Fresponse%2Fimage%2Fclass_ImageResponse.php;h=e6c5190d2e2494d534ccfb4cf56afdda20329e17;hb=751f9e6c51f00dba27757b72fc85490e51fd3797;hp=0000000000000000000000000000000000000000;hpb=5203f9bd014ad46fbc7ee54e7223dcd46e14e3b4;p=core.git diff --git a/inc/main/classes/response/image/class_ImageResponse.php b/inc/main/classes/response/image/class_ImageResponse.php new file mode 100644 index 00000000..e6c5190d --- /dev/null +++ b/inc/main/classes/response/image/class_ImageResponse.php @@ -0,0 +1,243 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * The extended headers are taken from phpMyAdmin setup tool, written by + * Michal Cihar , licensed under GNU GPL 2.0. + */ +class ImageResponse extends BaseResponse implements Responseable { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + + // Set response type + $this->setResponseType('image'); + } + + /** + * Creates an object of this class + * + * @param $applicationInstance An instance of a manageable application + * @return $responseInstance A prepared instance of this class + */ + public static final function createImageResponse (ManageableApplication $applicationInstance) { + // Get a new instance + $responseInstance = new ImageResponse(); + + // Set the application instance + $responseInstance->setApplicationInstance($applicationInstance); + + // Initialize the template engine here + $responseInstance->initTemplateEngine($applicationInstance); + + // Init web output instance + $responseInstance->initWebOutputInstance(); + + // Return the prepared instance + return $responseInstance; + } + + /** + * Initializes the template engine instance + * + * @param $applicationInstance An instance of a manageable application + * @return void + */ + public final function initTemplateEngine (ManageableApplication $applicationInstance) { + // Get config instance + $cfg = $this->getConfigInstance(); + + // Set new template engine + $cfg->setConfigEntry('html_template_class' , $cfg->getConfigEntry('image_template_class')); + $cfg->setConfigEntry('raw_template_extension' , '.img'); + $cfg->setConfigEntry('code_template_extension', '.xml'); + $cfg->setConfigEntry('tpl_base_path' , 'templates/images/'); + // @TODO Please fix this + $cfg->setConfigEntry('code_template_type' , 'image'); + + // Get a prepared instance + $this->setTemplateInstance($this->prepareTemplateInstance($applicationInstance)); + } + + /** + * Adds a cookie to the response + * + * @param $cookieName Cookie's name + * @param $cookieValue Value to store in the cookie + * @param $encrypted Do some extra encryption on the value + * @param $expires Timestamp of expiration (default: configured) + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + * @todo Encryption of cookie data not yet supported. + * @todo Why are these parameters conflicting? + * @todo If the return statement is removed and setcookie() commented out, + * @todo this will send only one cookie out, the first one. + */ + public function addCookie ($cookieName, $cookieValue, $encrypted = FALSE, $expires = NULL) { + // Are headers already sent? + if (headers_sent()) { + // Throw an exception here + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Shall we encrypt the cookie? + if ($encrypted === TRUE) { + // Unsupported at the moment + $this->partialStub('Encryption is unsupported at the moment.'); + } // END - if + + // For slow browsers set the cookie array element first + $_COOKIE[$cookieName] = $cookieValue; + + // Get all config entries + if (is_null($expires)) { + $expires = (time() + $this->getConfigInstance()->getConfigEntry('cookie_expire')); + } // END - if + + $path = $this->getConfigInstance()->getConfigEntry('cookie_path'); + $domain = $this->getConfigInstance()->getConfigEntry('cookie_domain'); + + setcookie($cookieName, $cookieValue, $expires); + //, $path, $domain, (isset($_SERVER['HTTPS'])) + return; + + // Now construct the full header + $cookieString = $cookieName . '=' . $cookieValue . '; '; + $cookieString .= 'expires=' . date('D, d-F-Y H:i:s', $expires) . ' GMT'; + // TODO Why is this not always working? $cookieString .= '; path=' . $path . '; domain=' . $domain; + + // Set the cookie as a header + $this->cookies[$cookieName] = $cookieString; + } + + /** + * Redirect to a configured URL. The URL can be absolute or relative. In + * case of relative URL it will be extended automatically. + * + * @param $configEntry The configuration entry which holds our URL + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + */ + public function redirectToConfiguredUrl ($configEntry) { + // Is the header not yet sent? + if (headers_sent()) { + // Throw an exception here + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Assign application data + $this->getTemplateInstance()->assignApplicationData($this->getApplicationInstance()); + + // Get the url from config + $url = $this->getConfigInstance()->getConfigEntry($configEntry . '_url'); + + // Compile the URL + $url = $this->getTemplateInstance()->compileRawCode($url); + + // Do we have a 'http' in front of the URL? + if (substr(strtolower($url), 0, 4) != 'http') { + // Is there a / in front of the relative URL? + if (substr($url, 0, 1) == '/') $url = substr($url, 1); + + // No, then extend it with our base URL + $url = $this->getConfigInstance()->getConfigEntry('base_url') . '/' . $url; + } // END - if + + // Add redirect header + $this->addHeader('Location', str_replace('&', '&', $url)); + + // Set correct response status + $this->setResponseStatus('301 Moved Permanently'); + + // Clear the body + $this->setResponseBody(''); + + // Flush the result + $this->flushBuffer(); + + // All done here... + exit(); + } + + /** + * Flushs the cached HTTP response to the outer world + * + * @param $force Whether we shall force the output or abort if headers are + * already sent with an exception + * @return void + */ + public function flushBuffer ($force = FALSE) { + // Finish the image + $this->getImageInstance()->finishImage(); + + // Get image content + $content = $this->getImageInstance()->getContent(); + + // Set it as response body + $this->setResponseBody($content); + + // Set content type + $this->addHeader('Content-type', 'image/' . $this->getImageInstance()->getImageType()); + + // Call parent method + parent::flushBuffer($force); + } + + /** + * Expires the given cookie if it is set + * + * @param $cookieName Cookie to expire + * @return void + */ + public function expireCookie ($cookieName) { + // Is the cookie there? + if (isset($_COOKIE[$cookieName])) { + // Then expire it with 20 minutes past + $this->addCookie($cookieName, '', FALSE, (time() - 1200)); + + // Remove it from array + unset($_COOKIE[$cookieName]); + } // END - if + } + + /** + * Refreshs a given cookie. This will make the cookie live longer + * + * @param $cookieName Cookie to refresh + * @return void + */ + public function refreshCookie ($cookieName) { + // Only update existing cookies + if (isset($_COOKIE[$cookieName])) { + // Update the cookie + $this->addCookie($cookieName, $_COOKIE[$cookieName], FALSE); + } // END - if + } +} + +// [EOF] +?>