1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
<?php
/**
* The IMAP_Cache:: class facilitates in caching output from the PHP imap
* extension in the current session.
*
* $Horde: framework/IMAP/IMAP/Cache.php,v 1.4.12.11 2006/04/28 15:43:40 slusarz Exp $
*
* Copyright 2003-2006 Michael Slusarz <slusarz@bigworm.colorado.edu>
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
*
* @author Michael Slusarz <slusarz@bigworm.colorado.edu>
* @since Horde 3.0
* @package Horde_IMAP
*/
class IMAP_Cache {
/**
* Pointer to the session cache.
*
* @var array
*/
var $_cache;
/**
* The cached results of imap_status() calls.
*
* @var array
*/
var $_statuscache = array();
/**
* Returns a reference to the global IMAP_Cache object, only creating
* it if it doesn't already exist.
*
* This method must be invoked as:
* $imap_cache = &IMAP_Cache::singleton();
*
* @return IMAP_Cache The IMAP_Cache instance.
*/
function &singleton()
{
static $object;
if (!isset($object)) {
$object = new IMAP_Cache();
}
return $object;
}
/**
* Constructor
*/
function IMAP_Cache()
{
if (!isset($_SESSION['imap_cache'])) {
$_SESSION['imap_cache'] = array();
}
$this->_cache = &$_SESSION['imap_cache'];
}
/**
* Get data from the cache.
*
* @param resource $imap The IMAP resource stream.
* @param string $mailbox The full ({hostname}mailbox) mailbox name.
* @param string $key The name of a specific entry to return.
* @param boolean $check Check for updated mailbox?
*
* @return mixed The data requested, or false if not available.
*/
function getCache($imap, $mailbox, $key = null, $check = true)
{
if (isset($this->_cache[$mailbox])) {
if (!$check || $this->checkCache($imap, $mailbox)) {
$ptr = &$this->_cache[$mailbox];
if (!is_null($key)) {
if (isset($ptr['d'][$key])) {
return $ptr['d'][$key];
}
} else {
return $ptr['d'];
}
}
}
return false;
}
/**
* Is the cache information up-to-date?
*
* @param resource $imap The IMAP resource stream.
* @param string $mailbox The full ({hostname}mailbox) mailbox name.
* @param boolean $update Should the cache ID string be updated?
*
* @return boolean True if cache information up-to-date, false if not.
*/
function checkCache($imap, $mailbox, $update = false)
{
if (isset($this->_cache[$mailbox])) {
$id = $this->_getCacheID($imap, $mailbox);
if ($this->_cache[$mailbox]['k'] == $id) {
return true;
} elseif ($update) {
$this->storeCache($imap, $mailbox);
}
} elseif ($update) {
$this->storeCache($imap, $mailbox);
}
return false;
}
/**
* Store data in the cache.
*
* @param resource $imap The IMAP resource stream.
* @param string $mailbox The full ({hostname}mailbox) mailbox name.
* @param array $values The data to add to the cache.
*/
function storeCache($imap, $mailbox, $values = array())
{
if (!isset($this->_cache[$mailbox])) {
$this->_cache[$mailbox] = array('d' => array());
}
$ptr = &$this->_cache[$mailbox];
$ptr = array(
'k' => $this->_getCacheID($imap, $mailbox),
'd' => array_merge($ptr['d'], $values)
);
}
/**
* Returns and caches the results of an imap_status() call.
*
* @since Horde 3.1.2
*
* @param resource $imap The IMAP resource string.
* @param string $mailbox The full ({hostname}mailbox) mailbox name.
*
* @return stdClass The imap_status() object or the empty string.
*/
function getStatus($imap, $mailbox)
{
$this->_getCacheID($imap, $mailbox);
return $this->_statuscache[$mailbox];
}
/**
* Generate the unique ID string for the mailbox.
*
* @access private
*
* @param resource $imap The IMAP resource stream.
* @param string $mailbox The full ({hostname}mailbox) mailbox name.
*
* @return string A unique string for the current state of the mailbox.
*/
function _getCacheID($imap, $mailbox)
{
if (!isset($this->_statuscache[$mailbox])) {
$this->_statuscache[$mailbox] = @imap_status($imap, $mailbox, SA_ALL);
if (!$this->_statuscache[$mailbox]) {
Horde::logMessage(imap_last_error(), __FILE__, __LINE__, PEAR_LOG_NOTICE);
}
}
if ($this->_statuscache[$mailbox]) {
$ob = $this->_statuscache[$mailbox];
return implode('|', array($ob->messages, $ob->recent, $ob->unseen, $ob->uidnext, $ob->uidvalidity));
} else {
return $mailbox;
}
}
}
|