<?PHP
/**
 * patTemplate Template cache that stores data on filesystem
 *
 * $Id: File.php 10381 2008-06-01 03:35:53Z pasamio $
 *
 * @package		patTemplate
 * @subpackage	Caches
 * @author		Stephan Schmidt <schst@php.net>
 */

// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();

/**
 * patTemplate Template cache that stores data on filesystem
 *
 * $Id: File.php 10381 2008-06-01 03:35:53Z pasamio $
 *
 * Possible parameters for the cache are:
 * - cacheFolder : set the folder from which to load the cache
 * - lifetime : seconds for which the cache is valid, if set to auto, it will check
 *   whether the cache is older than the original file (if the reader supports this)
 * - prefix for the filenames
 *
 * @package		patTemplate
 * @subpackage	Caches
 * @author		Stephan Schmidt <schst@php.net>
 */
class patTemplate_TemplateCache_File extends patTemplate_TemplateCache
{
	/**
	* parameters of the cache
	*
	* @access	private
	* @var		array
	*/
	var $_params = array(
						 'cacheFolder' => './cache',
						 'lifetime'	   => 'auto',
						 'prefix'	   => '',
						 'filemode'	=> null
						);


	/**
	* load template from cache
	*
	* @access	public
	* @param	string			cache key
	* @param	integer			modification time of original template
	* @return	array|boolean	either an array containing the templates or false cache could not be loaded
	*/
	function load($key, $modTime = -1)
	{
		$filename = $this->_getCachefileName( $key );
		if (!file_exists($filename) || !is_readable($filename)) {
			return false;
		}

		$generatedOn = filemtime( $filename );
		$ttl		 = $this->getParam('lifetime');
		if ($ttl == 'auto') {
			if ($modTime < 1) {
				return false;
			}
			if ($modTime > $generatedOn) {
				return false;
			}
			return unserialize(file_get_contents($filename));
		} elseif(is_int( $ttl)) {
			if ($generatedOn + $ttl < time()) {
				return false;
			}
			return unserialize( file_get_contents( $filename ) );
		}

		return false;
	}

	/**
	* write template to cache
	*
	* @access	public
	* @param	string		cache key
	* @param	array		templates to store
	* @return	boolean		true on success
	*/
	function write( $key, $templates )
	{
		$cacheFile = $this->_getCachefileName($key);
		$fp = @fopen($cacheFile, 'w');
		if (!$fp) {
			return false;
		}
		flock( $fp, LOCK_EX );
		fputs( $fp, serialize($templates));
		flock( $fp, LOCK_UN );
		$filemode = $this->getParam('filemode');
		if ($filemode !== null) {
			chmod($cacheFile, $filemode);
		}
		return true;
	}

	/**
	* get the cache filename
	*
	* @access	private
	* @param	string		cache key
	* @return	string		cache file name
	*/
	function _getCachefileName( $key )
	{
		return $this->getParam( 'cacheFolder' ) . '/' . $this->getParam( 'prefix' ).$key . '.cache';
	}
}
?>
