--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/EventManager/ResponseCollection.php Thu Mar 21 19:52:38 2013 +0100
@@ -0,0 +1,424 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category Zend
+ * @package Zend_EventManager
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+ class SplStack implements Iterator, ArrayAccess, Countable
+ {
+ /**
+ * Delete items during iteration
+ */
+ const IT_MODE_DELETE = 1;
+
+ /**
+ * Keep items during iteration
+ */
+ const IT_MODE_KEEP = 0;
+
+ /**
+ * Mode used when iterating
+ * @var int
+ */
+ protected $mode = self::IT_MODE_KEEP;
+
+ /**
+ * Count of elements in the stack
+ *
+ * @var int
+ */
+ protected $count = 0;
+
+ /**
+ * Data represented by this stack
+ *
+ * @var array
+ */
+ protected $data = array();
+
+ /**
+ * Sorted stack of values
+ *
+ * @var false|array
+ */
+ protected $stack = false;
+
+ /**
+ * Set the iterator mode
+ *
+ * Must be set to one of IT_MODE_DELETE or IT_MODE_KEEP
+ *
+ * @todo Currently, IteratorMode is ignored, as we use the default (keep); should this be implemented?
+ * @param int $mode
+ * @return void
+ * @throws InvalidArgumentException
+ */
+ public function setIteratorMode($mode)
+ {
+ $expected = array(
+ self::IT_MODE_DELETE => true,
+ self::IT_MODE_KEEP => true,
+ );
+
+ if (!isset($expected[$mode])) {
+ throw new InvalidArgumentException(sprintf('Invalid iterator mode specified ("%s")', $mode));
+ }
+
+ $this->mode = $mode;
+ }
+
+ /**
+ * Return last element in the stack
+ *
+ * @return mixed
+ */
+ public function bottom()
+ {
+ $this->rewind();
+ $value = array_pop($this->stack);
+ array_push($this->stack, $value);
+ return $value;
+ }
+
+ /**
+ * Countable: return count of items in the stack
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->count;
+ }
+
+ /**
+ * Iterator: return current item in the stack
+ *
+ * @return mixed
+ */
+ public function current()
+ {
+ if (!$this->stack) {
+ $this->rewind();
+ }
+ return current($this->stack);
+ }
+
+ /**
+ * Get iteration mode
+ *
+ * @return int
+ */
+ public function getIteratorMode()
+ {
+ return $this->mode;
+ }
+
+ /**
+ * Is the stack empty?
+ *
+ * @return bool
+ */
+ public function isEmpty()
+ {
+ return ($this->count === 0);
+ }
+
+ /**
+ * Iterator: return key of current item in the stack
+ *
+ * @return mixed
+ */
+ public function key()
+ {
+ if (!$this->stack) {
+ $this->rewind();
+ }
+ return key($this->stack);
+ }
+
+ /**
+ * Iterator: advance pointer to next item in the stack
+ *
+ * @return void
+ */
+ public function next()
+ {
+ if (!$this->stack) {
+ $this->rewind();
+ }
+ return next($this->stack);
+ }
+
+ /**
+ * ArrayAccess: does an item exist at the specified offset?
+ *
+ * @param mixed $index
+ * @return bool
+ */
+ public function offsetExists($index)
+ {
+ return array_key_exists($index, $this->data);
+ }
+
+ /**
+ * ArrayAccess: get the item at the specified offset
+ *
+ * @param mixed $index
+ * @return mixed
+ * @throws OutOfRangeException
+ */
+ public function offsetGet($index)
+ {
+ if (!$this->offsetExists($index)) {
+ throw OutOfRangeException(sprintf('Invalid index ("%s") specified', $index));
+ }
+ return $this->data[$index];
+ }
+
+ /**
+ * ArrayAccess: add an item at the specified offset
+ *
+ * @param mixed $index
+ * @param mixed $newval
+ * @return void
+ */
+ public function offsetSet($index, $newval)
+ {
+ $this->data[$index] = $newval;
+ $this->stack = false;
+ $this->count++;
+ }
+
+ /**
+ * ArrayAccess: unset the item at the specified offset
+ *
+ * @param mixed $index
+ * @return void
+ * @throws OutOfRangeException
+ */
+ public function offsetUnset($index)
+ {
+ if (!$this->offsetExists($index)) {
+ throw OutOfRangeException(sprintf('Invalid index ("%s") specified', $index));
+ }
+ unset($this->data[$index]);
+ $this->stack = false;
+ $this->count--;
+ }
+
+ /**
+ * Pop a node from the end of the stack
+ *
+ * @return mixed
+ * @throws RuntimeException
+ */
+ public function pop()
+ {
+ $val = array_pop($this->data);
+ $this->stack = false;
+ $this->count--;
+ return $val;
+ }
+
+ /**
+ * Move the iterator to the previous node
+ *
+ * @todo Does this need to be implemented?
+ * @return void
+ */
+ public function prev()
+ {
+ }
+
+ /**
+ * Push an element to the list
+ *
+ * @param mixed $value
+ * @return void
+ */
+ public function push($value)
+ {
+ array_push($this->data, $value);
+ $this->count++;
+ $this->stack = false;
+ }
+
+ /**
+ * Iterator: rewind to beginning of stack
+ *
+ * @return void
+ */
+ public function rewind()
+ {
+ if (is_array($this->stack)) {
+ return reset($this->stack);
+ }
+ $this->stack = array_reverse($this->data, true);
+ }
+
+ /**
+ * Serialize the storage
+ *
+ * @return string
+ */
+ public function serialize()
+ {
+ return serialize($this->data);
+ }
+
+ /**
+ * Shifts a node from the beginning of the list
+ *
+ * @return mixed
+ * @throws RuntimeException
+ */
+ public function shift()
+ {
+ $val = array_shift($this->data);
+ $this->stack = false;
+ $this->count--;
+ return $val;
+ }
+
+ /**
+ * Peek at the top node of the stack
+ *
+ * @return mixed
+ */
+ public function top()
+ {
+ $this->rewind();
+ $value = array_shift($this->stack);
+ array_unshift($this->stack, $value);
+ return $value;
+ }
+
+ /**
+ * Unserialize the storage
+ *
+ * @param string
+ * @return void
+ */
+ public function unserialize($serialized)
+ {
+ $this->data = unserialize($serialized);
+ $this->stack = false;
+ }
+
+ /**
+ * Unshift a node onto the beginning of the list
+ *
+ * @param mixed $value
+ * @return void
+ */
+ public function unshift($value)
+ {
+ array_unshift($this->data, $value);
+ $this->count++;
+ $this->stack = false;
+ }
+
+ /**
+ * Iterator: is the current pointer valid?
+ *
+ * @return bool
+ */
+ public function valid()
+ {
+ $key = key($this->stack);
+ $var = ($key !== null && $key !== false);
+ return $var;
+ }
+ }
+}
+
+/**
+ * Collection of signal handler return values
+ *
+ * @category Zend
+ * @package Zend_EventManager
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+class Zend_EventManager_ResponseCollection extends SplStack
+{
+ protected $stopped = false;
+
+ /**
+ * Did the last response provided trigger a short circuit of the stack?
+ *
+ * @return bool
+ */
+ public function stopped()
+ {
+ return $this->stopped;
+ }
+
+ /**
+ * Mark the collection as stopped (or its opposite)
+ *
+ * @param bool $flag
+ * @return Zend_EventManager_ResponseCollection
+ */
+ public function setStopped($flag)
+ {
+ $this->stopped = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Convenient access to the first handler return value.
+ *
+ * @return mixed The first handler return value
+ */
+ public function first()
+ {
+ return parent::bottom();
+ }
+
+ /**
+ * Convenient access to the last handler return value.
+ *
+ * If the collection is empty, returns null. Otherwise, returns value
+ * returned by last handler.
+ *
+ * @return mixed The last handler return value
+ */
+ public function last()
+ {
+ if (count($this) === 0) {
+ return null;
+ }
+ return parent::top();
+ }
+
+ /**
+ * Check if any of the responses match the given value.
+ *
+ * @param mixed $value The value to look for among responses
+ */
+ public function contains($value)
+ {
+ foreach ($this as $response) {
+ if ($response === $value) {
+ return true;
+ }
+ }
+ return false;
+ }
+}