1<?php
2/**
3 * Portions Copyright 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)
4 * Copyright 2007-2016 Horde LLC (http://www.horde.org/)
5 *
6 * @category Horde
7 * @package Feed
8 */
9
10/**
11 * The Horde_Feed_Base class is an abstract class representing feeds.
12 *
13 * Horde_Feed_Base implements two core PHP 5 interfaces: ArrayAccess
14 * and Iterator. In both cases the collection being treated as an
15 * array is considered to be the entry collection, such that iterating
16 * over the feed takes you through each of the feed's entries.
17 *
18 * @category Horde
19 * @package Feed
20 */
21abstract class Horde_Feed_Base extends Horde_Xml_Element_List
22{
23    /**
24     * Our root ("home") URI
25     *
26     * @var string
27     */
28    protected $_uri;
29
30    /**
31     * @var Horde_Http_Client
32     */
33    protected $_httpClient;
34
35    /**
36     * Feed constructor
37     *
38     * The Horde_Feed_Base constructor takes the URI of a feed or a
39     * feed represented as a string and loads it as XML.
40     *
41     * @throws Horde_Feed_Exception If loading the feed failed.
42     *
43     * @param mixed $xml The feed as a string, a DOMElement, or null.
44     * @param string $uri The full URI of the feed, or null if unknown.
45     */
46    public function __construct($xml = null, $uri = null, Horde_Http_Client $httpClient = null)
47    {
48        $this->_uri = $uri;
49
50        if (is_null($httpClient)) {
51            $httpClient = new Horde_Http_Client();
52        }
53        $this->_httpClient = $httpClient;
54
55        try {
56            parent::__construct($xml);
57        } catch (Horde_Xml_Element_Exception $e) {
58            throw new Horde_Feed_Exception('Unable to load feed: ' . $e->getMessage());
59        }
60    }
61
62    /**
63     * Handle null or array values for $this->_element by initializing
64     * with $this->_emptyXml, and importing the array with
65     * Horde_Xml_Element::fromArray() if necessary.
66     *
67     * @see Horde_Xml_Element::__wakeup
68     * @see Horde_Xml_Element::fromArray
69     */
70    public function __wakeup()
71    {
72        // If we've been passed an array, we'll store it for importing
73        // after initializing with the default "empty" feed XML.
74        $importArray = null;
75        if (is_null($this->_element)) {
76            $this->_element = $this->_emptyXml;
77        } elseif (is_array($this->_element)) {
78            $importArray = $this->_element;
79            $this->_element = $this->_emptyXml;
80        }
81
82        parent::__wakeup();
83
84        if (!is_null($importArray)) {
85            $this->fromArray($importArray);
86        }
87    }
88
89    /**
90     * Required by the Iterator interface.
91     *
92     * @internal
93     *
94     * @return mixed The current row, or null if no rows.
95     */
96    public function current()
97    {
98        return new $this->_listItemClassName(
99            $this->_listItems[$this->_listItemIndex], $this->_httpClient);
100    }
101}
102