* @category Horde * @copyright 2015-2017 Horde LLC * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1 * @package Mime * @since 2.9.0 */ class Horde_Mime_Part_Iterator implements Countable, Iterator { /** * Include the base when iterating? * * @var boolean */ protected $_includeBase; /** * Base part. * * @var Horde_Mime_Part */ protected $_part; /** * State data. * * @var object */ protected $_state; /** * Constructor. */ public function __construct(Horde_Mime_Part $part, $base = false) { $this->_includeBase = (bool)$base; $this->_part = $part; } /* Countable methods. */ /** * Returns the number of message parts. * * @return integer Number of message parts. */ public function count() { return count(iterator_to_array($this)); } /* RecursiveIterator methods. */ /** */ public function current() { return $this->valid() ? $this->_state->current : null; } /** */ public function key() { return ($curr = $this->current()) ? $curr->getMimeId() : null; } /** */ public function next() { if (!isset($this->_state)) { return; } $out = $this->_state->current->getPartByIndex($this->_state->index++); if ($out) { $this->_state->recurse[] = array( $this->_state->current, $this->_state->index ); $this->_state->current = $out; $this->_state->index = 0; } elseif ($tmp = array_pop($this->_state->recurse)) { $this->_state->current = $tmp[0]; $this->_state->index = $tmp[1]; $this->next(); } else { unset($this->_state); } } /** */ public function rewind() { $this->_state = new stdClass; $this->_state->current = $this->_part; $this->_state->index = 0; $this->_state->recurse = array(); if (!$this->_includeBase) { $this->next(); } } /** */ public function valid() { return !empty($this->_state); } }