This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
lnkohana/modules/khemail/vendor/swift/classes/Swift/KeyCache/DiskKeyCache.php
2013-04-22 14:19:54 +10:00

317 lines
7.6 KiB
PHP

<?php
/*
* This file is part of SwiftMailer.
* (c) 2004-2009 Chris Corbyn
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
//@require 'Swift/KeyCache.php';
//@require 'Swift/KeyCacheInputStream.php';
//@require 'Swift/InputByteStream.php';
//@require 'Swift/OutputByteStrean.php';
//@require 'Swift/SwiftException.php';
//@require 'Swift/IoException.php';
/**
* A KeyCache which streams to and from disk.
* @package Swift
* @subpackage KeyCache
* @author Chris Corbyn
*/
class Swift_KeyCache_DiskKeyCache implements Swift_KeyCache
{
/** Signal to place pointer at start of file */
const POSITION_START = 0;
/** Signal to place pointer at end of file */
const POSITION_END = 1;
/**
* An InputStream for cloning.
* @var Swift_KeyCache_KeyCacheInputStream
* @access private
*/
private $_stream;
/**
* A path to write to.
* @var string
* @access private
*/
private $_path;
/**
* Stored keys.
* @var array
* @access private
*/
private $_keys = array();
/**
* Will be true if magic_quotes_runtime is turned on.
* @var boolean
* @access private
*/
private $_quotes = false;
/**
* Create a new DiskKeyCache with the given $stream for cloning to make
* InputByteStreams, and the given $path to save to.
* @param Swift_KeyCache_KeyCacheInputStream $stream
* @param string $path to save to
*/
public function __construct(Swift_KeyCache_KeyCacheInputStream $stream, $path)
{
$this->_stream = $stream;
$this->_path = $path;
$this->_quotes = get_magic_quotes_runtime();
}
/**
* Set a string into the cache under $itemKey for the namespace $nsKey.
* @param string $nsKey
* @param string $itemKey
* @param string $string
* @param int $mode
* @throws Swift_IoException
* @see MODE_WRITE, MODE_APPEND
*/
public function setString($nsKey, $itemKey, $string, $mode)
{
$this->_prepareCache($nsKey);
switch ($mode)
{
case self::MODE_WRITE:
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
break;
case self::MODE_APPEND:
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END);
break;
default:
throw new Swift_SwiftException(
'Invalid mode [' . $mode . '] used to set nsKey='.
$nsKey . ', itemKey=' . $itemKey
);
break;
}
fwrite($fp, $string);
}
/**
* Set a ByteStream into the cache under $itemKey for the namespace $nsKey.
* @param string $nsKey
* @param string $itemKey
* @param Swift_OutputByteStream $os
* @param int $mode
* @see MODE_WRITE, MODE_APPEND
* @throws Swift_IoException
*/
public function importFromByteStream($nsKey, $itemKey, Swift_OutputByteStream $os,
$mode)
{
$this->_prepareCache($nsKey);
switch ($mode)
{
case self::MODE_WRITE:
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
break;
case self::MODE_APPEND:
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END);
break;
default:
throw new Swift_SwiftException(
'Invalid mode [' . $mode . '] used to set nsKey='.
$nsKey . ', itemKey=' . $itemKey
);
break;
}
while (false !== $bytes = $os->read(8192))
{
fwrite($fp, $bytes);
}
}
/**
* Provides a ByteStream which when written to, writes data to $itemKey.
* NOTE: The stream will always write in append mode.
* @param string $nsKey
* @param string $itemKey
* @return Swift_InputByteStream
*/
public function getInputByteStream($nsKey, $itemKey,
Swift_InputByteStream $writeThrough = null)
{
$is = clone $this->_stream;
$is->setKeyCache($this);
$is->setNsKey($nsKey);
$is->setItemKey($itemKey);
if (isset($writeThrough))
{
$is->setWriteThroughStream($writeThrough);
}
return $is;
}
/**
* Get data back out of the cache as a string.
* @param string $nsKey
* @param string $itemKey
* @return string
* @throws Swift_IoException
*/
public function getString($nsKey, $itemKey)
{
$this->_prepareCache($nsKey);
if ($this->hasKey($nsKey, $itemKey))
{
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
if ($this->_quotes)
{
set_magic_quotes_runtime(0);
}
$str = '';
while (!feof($fp) && false !== $bytes = fread($fp, 8192))
{
$str .= $bytes;
}
if ($this->_quotes)
{
set_magic_quotes_runtime(1);
}
return $str;
}
}
/**
* Get data back out of the cache as a ByteStream.
* @param string $nsKey
* @param string $itemKey
* @param Swift_InputByteStream $is to write the data to
*/
public function exportToByteStream($nsKey, $itemKey, Swift_InputByteStream $is)
{
if ($this->hasKey($nsKey, $itemKey))
{
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
if ($this->_quotes)
{
set_magic_quotes_runtime(0);
}
while (!feof($fp) && false !== $bytes = fread($fp, 8192))
{
$is->write($bytes);
}
if ($this->_quotes)
{
set_magic_quotes_runtime(1);
}
}
}
/**
* Check if the given $itemKey exists in the namespace $nsKey.
* @param string $nsKey
* @param string $itemKey
* @return boolean
*/
public function hasKey($nsKey, $itemKey)
{
return is_file($this->_path . '/' . $nsKey . '/' . $itemKey);
}
/**
* Clear data for $itemKey in the namespace $nsKey if it exists.
* @param string $nsKey
* @param string $itemKey
*/
public function clearKey($nsKey, $itemKey)
{
if ($this->hasKey($nsKey, $itemKey))
{
$fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END);
fclose($fp);
unlink($this->_path . '/' . $nsKey . '/' . $itemKey);
}
unset($this->_keys[$nsKey][$itemKey]);
}
/**
* Clear all data in the namespace $nsKey if it exists.
* @param string $nsKey
*/
public function clearAll($nsKey)
{
if (array_key_exists($nsKey, $this->_keys))
{
foreach ($this->_keys[$nsKey] as $itemKey=>$null)
{
$this->clearKey($nsKey, $itemKey);
}
rmdir($this->_path . '/' . $nsKey);
unset($this->_keys[$nsKey]);
}
}
// -- Private methods
/**
* Initialize the namespace of $nsKey if needed.
* @param string $nsKey
* @access private
*/
private function _prepareCache($nsKey)
{
$cacheDir = $this->_path . '/' . $nsKey;
if (!is_dir($cacheDir))
{
if (!mkdir($cacheDir))
{
throw new Swift_IoException('Failed to create cache directory ' . $cacheDir);
}
$this->_keys[$nsKey] = array();
}
}
/**
* Get a file handle on the cache item.
* @param string $nsKey
* @param string $itemKey
* @param int $position
* @return resource
* @access private
*/
private function _getHandle($nsKey, $itemKey, $position)
{
if (!isset($this->_keys[$nsKey]) || !array_key_exists($itemKey, $this->_keys[$nsKey]))
{
$fp = fopen($this->_path . '/' . $nsKey . '/' . $itemKey, 'w+b');
$this->_keys[$nsKey][$itemKey] = $fp;
}
if (self::POSITION_START == $position)
{
fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_SET);
}
else
{
fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_END);
}
return $this->_keys[$nsKey][$itemKey];
}
/**
* Destructor.
*/
public function __destruct()
{
foreach ($this->_keys as $nsKey=>$null)
{
$this->clearAll($nsKey);
}
}
}