]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/atom10feed.php
got uploads sortof working - database portion doesn't work though.
[quix0rs-gnu-social.git] / lib / atom10feed.php
index 01fc69072c6ae9ba383f22ca33cc206819943d4f..a46d49f3509518ff0c7a4a89fa6a403da0f4e59e 100644 (file)
 <?php
+/**
+ * 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/
+ */
+
+if (!defined('STATUSNET'))
+{
+    exit(1);
+}
 
 class Atom10FeedException extends Exception
 {
 }
 
+/**
+ * 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/
+ */
 class Atom10Feed extends XMLStringer
 {
     public  $xw;
+
+    // @fixme most of these should probably be read-only properties
     private $namespaces;
     private $authors;
+    private $subject;
     private $categories;
     private $contributors;
     private $generator;
     private $icon;
     private $links;
-    private $logo;
+    private $selfLink;
+    private $selfLinkType;
+    public $logo;
     private $rights;
-    private $subtitle;
-    private $title;
+    public $subtitle;
+    public $title;
     private $published;
     private $updated;
     private $entries;
 
     /**
-     * undocumented function
+     * Constructor
      *
-     * @param array $entries an array of FeedItems
+     * @param boolean $indent  flag to turn indenting on or off
      *
      * @return void
-     *
      */
     function __construct($indent = true) {
         parent::__construct($indent);
         $this->namespaces = array();
+        $this->authors    = array();
         $this->links      = array();
         $this->entries    = array();
-        $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom');
+        $this->addNamespace('', 'http://www.w3.org/2005/Atom');
     }
 
+    /**
+     * Add another namespace to the feed
+     *
+     * @param string $namespace the namespace
+     * @param string $uri       namspace uri
+     *
+     * @return void
+     */
     function addNamespace($namespace, $uri)
     {
         $ns = array($namespace => $uri);
         $this->namespaces = array_merge($this->namespaces, $ns);
     }
 
+    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(
+                'author element must contain a name element.'
+            );
+        }
+
+        if (isset($uri)) {
+            $xs->element('uri', null, $uri);
+        }
+
+        if (isset($email)) {
+            $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);
+        }
+    }
+
+    /**
+     * Add a activity feed subject via raw XML string
+     *
+     * @param string $xmlSubject An XML string representation of the subject
+     *
+     * @return void
+     */
+    function setActivitySubject($xmlSubject)
+    {
+        $this->subject = $xmlSubject;
+    }
+
     function getNamespaces()
     {
         return $this->namespaces;
@@ -53,15 +166,40 @@ class Atom10Feed extends XMLStringer
     {
         $this->xw->startDocument('1.0', 'UTF-8');
         $commonAttrs = array('xml:lang' => 'en-US');
-        $commonAttrs = array_merge($commonAttrs, $this->namespaces);
+        foreach ($this->namespaces as $prefix => $uri) {
+            if ($prefix == '') {
+                $attr = 'xmlns';
+            } else {
+                $attr = 'xmlns:' . $prefix;
+            }
+            $commonAttrs[$attr] = $uri;
+        }
         $this->elementStart('feed', $commonAttrs);
 
+        $this->element(
+            'generator', array(
+                'uri'     => 'http://status.net',
+                'version' => STATUSNET_VERSION
+            ),
+            'StatusNet'
+        );
+
         $this->element('id', null, $this->id);
         $this->element('title', null, $this->title);
         $this->element('subtitle', null, $this->subtitle);
-        $this->element('logo', null, $this->logo);
+
+        if (!empty($this->logo)) {
+            $this->element('logo', null, $this->logo);
+        }
+
         $this->element('updated', null, $this->updated);
 
+        $this->renderAuthors();
+
+        if ($this->selfLink) {
+            $this->addLink($this->selfLink, array('rel' => 'self',
+                                                  'type' => $this->selfLinkType));
+        }
         $this->renderLinks();
     }
 
@@ -83,9 +221,9 @@ class Atom10Feed extends XMLStringer
         }
     }
 
-    function addEntryRaw($entry)
+    function addEntryRaw($xmlEntry)
     {
-        array_push($this->entries, $entry);
+        array_push($this->entries, $xmlEntry);
     }
 
     function addEntry($entry)
@@ -108,11 +246,20 @@ class Atom10Feed extends XMLStringer
 
     function getString()
     {
-        $this->validate();
+        if (Event::handle('StartApiAtom', array($this))) {
+
+            $this->validate();
+            $this->initFeed();
 
-        $this->initFeed();
-        $this->renderEntries();
-        $this->endFeed();
+            if (!empty($this->subject)) {
+                $this->raw($this->subject);
+            }
+
+            $this->renderEntries();
+            $this->endFeed();
+
+            Event::handle('EndApiAtom', array($this));
+        }
 
         return $this->xw->outputMemory();
     }
@@ -122,6 +269,12 @@ class Atom10Feed extends XMLStringer
         $this->id = $id;
     }
 
+    function setSelfLink($url, $type='application/atom+xml')
+    {
+        $this->selfLink = $url;
+        $this->selfLinkType = $type;
+    }
+
     function setTitle($title)
     {
         $this->title = $title;
@@ -172,6 +325,3 @@ class Atom10Feed extends XMLStringer
     }
 
 }
-
-
-