See Release Notes
Long Term Support Release
<?php /** * Copyright 2014-2017 Horde LLC (http://www.horde.org/) * * See the enclosed file LICENSE for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @category Horde * @copyright 2014-2017 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Imap_Client */ /** * Query the search charsets available on a server. * * @author Michael Slusarz <slusarz@horde.org> * @category Horde * @copyright 2014-2017 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Imap_Client * @since 2.24.0 * * @property-read array $charsets The list of valid charsets that have been * discovered on the server. */ class Horde_Imap_Client_Data_SearchCharset implements Serializable, SplSubject { /** * Base client object. * * @var Horde_Imap_Client_Base */ protected $_baseob; /** * Charset data. * * @var array */ protected $_charsets = array( 'US-ASCII' => true ); /** * Observers. * * @var array */ protected $_observers = array(); /** */ public function __get($name) { switch ($name) { case 'charsets': return array_keys(array_filter($this->_charsets)); } } /** */ public function setBaseOb(Horde_Imap_Client_Base $ob) { $this->_baseob = $ob; } /** * Query the validity of a charset. * * @param string $charset The charset to query. * @param boolean $cached If true, only query cached values. * * @return boolean True if the charset is valid for searching. */ public function query($charset, $cached = false) { $charset = Horde_String::upper($charset); if (isset($this->_charsets[$charset])) { return $this->_charsets[$charset]; } elseif ($cached) { return null; } if (!$this->_baseob) { throw new RuntimeException( 'Base object needs to be defined to query for charset.' ); } /* Use a dummy search query and search for BADCHARSET response. */ $query = new Horde_Imap_Client_Search_Query(); $query->charset($charset, false); $query->ids($this->_baseob->getIdsOb(1, true)); $query->text('a'); try { $this->_baseob->search('INBOX', $query, array( 'nocache' => true, 'sequence' => true )); $this->_charsets[$charset] = true; } catch (Horde_Imap_Client_Exception $e) { $this->_charsets[$charset] = ($e->getCode() !== Horde_Imap_Client_Exception::BADCHARSET); } $this->notify(); return $this->_charsets[$charset]; } /** * Set the validity of a given charset. * * @param string $charset The charset. * @param boolean $valid Is charset valid? */ public function setValid($charset, $valid = true) { $charset = Horde_String::upper($charset); $valid = (bool)$valid; if (!isset($this->_charsets[$charset]) || ($this->_charsets[$charset] !== $valid)) { $this->_charsets[$charset] = $valid; $this->notify(); } } /* SplSubject methods. */ /** */> #[ReturnTypeWillChange]public function attach(SplObserver $observer) { $this->detach($observer); $this->_observers[] = $observer; } /** */> #[ReturnTypeWillChange]public function detach(SplObserver $observer) { if (($key = array_search($observer, $this->_observers, true)) !== false) { unset($this->_observers[$key]); } } /** * Notification is triggered internally whenever the object's internal * data storage is altered. */> #[ReturnTypeWillChange]public function notify() { foreach ($this->_observers as $val) { $val->update($this); } } /* Serializable methods. */ /** */ public function serialize() {< return json_encode($this->_charsets);> return serialize($this->__serialize());} /** */ public function unserialize($data) {< $this->_charsets = json_decode($data, true);> $data = @unserialize($data); > if (!is_array($data)) { > throw new Exception('Cache version change'); > } > $this->__unserialize($data); > } > > /** > * @return array > */ > public function __serialize() > { > return $this->_charsets; > } > > public function __unserialize(array $data) > { > $this->_charsets = $data;} }