| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Class for building an Atom feed in memory | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Feed | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-11 13:54:40 -08:00
										 |  |  | if (!defined('STATUSNET')) | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  | { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Atom10FeedException extends Exception | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class for building an Atom feed in memory.  Get the finished doc | 
					
						
							|  |  |  |  * as a string with Atom10Feed::getString(). | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Feed | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  | class Atom10Feed extends XMLStringer | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public  $xw; | 
					
						
							| 
									
										
										
										
											2010-03-03 12:51:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // @fixme most of these should probably be read-only properties
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     private $namespaces; | 
					
						
							|  |  |  |     private $authors; | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |     private $subject; | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     private $categories; | 
					
						
							|  |  |  |     private $contributors; | 
					
						
							|  |  |  |     private $generator; | 
					
						
							|  |  |  |     private $icon; | 
					
						
							|  |  |  |     private $links; | 
					
						
							| 
									
										
										
										
											2010-03-03 12:51:23 -08:00
										 |  |  |     private $selfLink; | 
					
						
							|  |  |  |     private $selfLinkType; | 
					
						
							|  |  |  |     public $logo; | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     private $rights; | 
					
						
							| 
									
										
										
										
											2010-03-03 12:51:23 -08:00
										 |  |  |     public $subtitle; | 
					
						
							|  |  |  |     public $title; | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     private $published; | 
					
						
							|  |  |  |     private $updated; | 
					
						
							|  |  |  |     private $entries; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  |      * Constructor | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  |      * @param boolean $indent  flag to turn indenting on or off | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function __construct($indent = true) { | 
					
						
							|  |  |  |         parent::__construct($indent); | 
					
						
							|  |  |  |         $this->namespaces = array(); | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |         $this->authors    = array(); | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $this->links      = array(); | 
					
						
							|  |  |  |         $this->entries    = array(); | 
					
						
							| 
									
										
										
										
											2010-02-18 18:20:48 +00:00
										 |  |  |         $this->addNamespace('', 'http://www.w3.org/2005/Atom'); | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 21:21:42 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add another namespace to the feed | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $namespace the namespace | 
					
						
							|  |  |  |      * @param string $uri       namspace uri | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     function addNamespace($namespace, $uri) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $ns = array($namespace => $uri); | 
					
						
							|  |  |  |         $this->namespaces = array_merge($this->namespaces, $ns); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |     function addAuthor($name, $uri = null, $email = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $xs = new XMLStringer(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $xs->elementStart('author'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($name)) { | 
					
						
							|  |  |  |             $xs->element('name', null, $name); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             throw new Atom10FeedException( | 
					
						
							| 
									
										
										
										
											2011-04-01 19:46:40 +02:00
										 |  |  |                 // TRANS: Atom feed exception thrown when an author element does not contain a name element.
 | 
					
						
							| 
									
										
										
										
											2011-01-14 21:53:39 +01:00
										 |  |  |                 _('Author element must contain a name element.') | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 01:21:34 -08:00
										 |  |  |         if (isset($uri)) { | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |             $xs->element('uri', null, $uri); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 01:21:34 -08:00
										 |  |  |         if (isset($email)) { | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |             $xs->element('email', null, $email); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $xs->elementEnd('author'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         array_push($this->authors, $xs->getString()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add an Author to the feed via raw XML string | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $xmlAuthor An XML string representation author | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function addAuthorRaw($xmlAuthor) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         array_push($this->authors, $xmlAuthor); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function renderAuthors() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach ($this->authors as $author) { | 
					
						
							|  |  |  |             $this->raw($author); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-12-27 10:03:34 -08:00
										 |  |  |      * Deprecated <activity:subject>; ignored | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param string $xmlSubject An XML string representation of the subject | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-12-27 10:03:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |     function setActivitySubject($xmlSubject) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-01-14 21:53:39 +01:00
										 |  |  |         // TRANS: Server exception thrown when using the method setActivitySubject() in the class Atom10Feed.
 | 
					
						
							|  |  |  |         throw new ServerException(_('Do not use this method!')); | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     function getNamespaces() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->namespaces; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function initFeed() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-09-24 01:17:04 +02:00
										 |  |  |         $this->startXML(); | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $commonAttrs = array('xml:lang' => 'en-US'); | 
					
						
							| 
									
										
										
										
											2010-02-18 18:20:48 +00:00
										 |  |  |         foreach ($this->namespaces as $prefix => $uri) { | 
					
						
							|  |  |  |             if ($prefix == '') { | 
					
						
							|  |  |  |                 $attr = 'xmlns'; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $attr = 'xmlns:' . $prefix; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $commonAttrs[$attr] = $uri; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $this->elementStart('feed', $commonAttrs); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-04 01:16:25 -08:00
										 |  |  |         $this->element( | 
					
						
							|  |  |  |             'generator', array( | 
					
						
							| 
									
										
										
										
											2010-03-11 23:44:50 +00:00
										 |  |  |                 'uri'     => 'http://status.net', | 
					
						
							| 
									
										
										
										
											2010-03-04 01:16:25 -08:00
										 |  |  |                 'version' => STATUSNET_VERSION | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             'StatusNet' | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $this->element('id', null, $this->id); | 
					
						
							|  |  |  |         $this->element('title', null, $this->title); | 
					
						
							|  |  |  |         $this->element('subtitle', null, $this->subtitle); | 
					
						
							| 
									
										
										
										
											2010-02-11 13:54:40 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($this->logo)) { | 
					
						
							|  |  |  |             $this->element('logo', null, $this->logo); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $this->element('updated', null, $this->updated); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 19:00:35 -08:00
										 |  |  |         $this->renderAuthors(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-03 12:51:23 -08:00
										 |  |  |         if ($this->selfLink) { | 
					
						
							|  |  |  |             $this->addLink($this->selfLink, array('rel' => 'self', | 
					
						
							|  |  |  |                                                   'type' => $this->selfLinkType)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |         $this->renderLinks(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Check that all required elements have been set, etc. | 
					
						
							|  |  |  |      * Throws an Atom10FeedException if something's missing. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function validate() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function renderLinks() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach ($this->links as $attrs) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             $this->element('link', $attrs, null); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |     function addEntryRaw($xmlEntry) | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  |         array_push($this->entries, $xmlEntry); | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function addEntry($entry) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         array_push($this->entries, $entry->getString()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function renderEntries() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach ($this->entries as $entry) { | 
					
						
							|  |  |  |             $this->raw($entry); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function endFeed() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->elementEnd('feed'); | 
					
						
							|  |  |  |         $this->xw->endDocument(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function getString() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-12 19:00:35 -08:00
										 |  |  |         if (Event::handle('StartApiAtom', array($this))) { | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 19:00:35 -08:00
										 |  |  |             $this->validate(); | 
					
						
							|  |  |  |             $this->initFeed(); | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 19:00:35 -08:00
										 |  |  |             if (!empty($this->subject)) { | 
					
						
							|  |  |  |                 $this->raw($this->subject); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $this->renderEntries(); | 
					
						
							|  |  |  |             $this->endFeed(); | 
					
						
							| 
									
										
										
										
											2010-02-12 12:22:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-12 19:00:35 -08:00
										 |  |  |             Event::handle('EndApiAtom', array($this)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $this->xw->outputMemory(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function setId($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->id = $id; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-03 12:51:23 -08:00
										 |  |  |     function setSelfLink($url, $type='application/atom+xml') | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->selfLink = $url; | 
					
						
							|  |  |  |         $this->selfLinkType = $type; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |     function setTitle($title) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->title = $title; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function setSubtitle($subtitle) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->subtitle = $subtitle; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function setLogo($logo) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->logo = $logo; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function setUpdated($dt) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->updated = common_date_iso8601($dt); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function setPublished($dt) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->published = common_date_iso8601($dt); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Adds a link element into the Atom document | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Assumes you want rel="alternate" and type="text/html" unless | 
					
						
							|  |  |  |      * you send in $otherAttrs. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-02-10 18:55:14 -08:00
										 |  |  |      * @param string $uri            the uri the href needs to point to | 
					
						
							| 
									
										
										
										
											2010-02-10 14:24:16 -08:00
										 |  |  |      * @param array  $otherAttrs     other attributes to stick in | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function addLink($uri, $otherAttrs = null) { | 
					
						
							|  |  |  |         $attrs = array('href' => $uri); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (is_null($otherAttrs)) { | 
					
						
							|  |  |  |             $attrs['rel']  = 'alternate'; | 
					
						
							|  |  |  |             $attrs['type'] = 'text/html'; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $attrs = array_merge($attrs, $otherAttrs); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         array_push($this->links, $attrs); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |