forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			258 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			258 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Part of XML_XRD
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * PHP version 5
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @category XML
							 | 
						||
| 
								 | 
							
								 * @package  XML_XRD
							 | 
						||
| 
								 | 
							
								 * @author   Christian Weiske <cweiske@php.net>
							 | 
						||
| 
								 | 
							
								 * @license  http://www.gnu.org/copyleft/lesser.html LGPL
							 | 
						||
| 
								 | 
							
								 * @link     http://pear.php.net/package/XML_XRD
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require_once 'XML/XRD/PropertyAccess.php';
							 | 
						||
| 
								 | 
							
								require_once 'XML/XRD/Element/Link.php';
							 | 
						||
| 
								 | 
							
								require_once 'XML/XRD/Loader.php';
							 | 
						||
| 
								 | 
							
								require_once 'XML/XRD/Serializer.php';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Main class used to load XRD documents from string or file.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * After loading the file, access to links is possible with get() and getAll(),
							 | 
						||
| 
								 | 
							
								 * as well as foreach-iterating over the XML_XRD object.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Property access is possible with getProperties() and array access (foreach)
							 | 
						||
| 
								 | 
							
								 * on the XML_XRD object.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Verification that the subject/aliases match the requested URL can be done with
							 | 
						||
| 
								 | 
							
								 * describes().
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @category XML
							 | 
						||
| 
								 | 
							
								 * @package  XML_XRD
							 | 
						||
| 
								 | 
							
								 * @author   Christian Weiske <cweiske@php.net>
							 | 
						||
| 
								 | 
							
								 * @license  http://www.gnu.org/copyleft/lesser.html LGPL
							 | 
						||
| 
								 | 
							
								 * @version  Release: @package_version@
							 | 
						||
| 
								 | 
							
								 * @link     http://pear.php.net/package/XML_XRD
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class XML_XRD extends XML_XRD_PropertyAccess implements IteratorAggregate
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * XRD file/string loading dispatcher
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var XML_XRD_Loader
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $loader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * XRD serializing dispatcher
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var XML_XRD_Serializer
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $serializer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * XRD subject
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var string
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $subject;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Array of subject alias strings
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $aliases = array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Array of link objects
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $links = array();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Unix timestamp when the document expires.
							 | 
						||
| 
								 | 
							
								     * NULL when no expiry date set.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var integer|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $expires;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * xml:id of the XRD document
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var string|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public $id;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Loads the contents of the given file.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Note: Only use file type auto-detection for local files.
							 | 
						||
| 
								 | 
							
								     * Do not use it on remote files as the file gets requested several times.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $file Path to an XRD file
							 | 
						||
| 
								 | 
							
								     * @param string $type File type: xml or json, NULL for auto-detection
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return void
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws XML_XRD_Loader_Exception When the file is invalid or cannot be
							 | 
						||
| 
								 | 
							
								     *                                   loaded
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function loadFile($file, $type = null)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!isset($this->loader)) {
							 | 
						||
| 
								 | 
							
								            $this->loader = new XML_XRD_Loader($this);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $this->loader->loadFile($file, $type);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Loads the contents of the given string
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $str  XRD string
							 | 
						||
| 
								 | 
							
								     * @param string $type File type: xml or json, NULL for auto-detection
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return void
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws XML_XRD_Loader_Exception When the string is invalid or cannot be
							 | 
						||
| 
								 | 
							
								     *                                   loaded
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function loadString($str, $type = null)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!isset($this->loader)) {
							 | 
						||
| 
								 | 
							
								            $this->loader = new XML_XRD_Loader($this);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $this->loader->loadString($str, $type);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Checks if the XRD document describes the given URI.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * This should always be used to make sure the XRD file
							 | 
						||
| 
								 | 
							
								     * is the correct one for e.g. the given host, and not a copycat.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Checks against the subject and aliases
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $uri An URI that the document is expected to describe
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return boolean True or false
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function describes($uri)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($this->subject == $uri) {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        foreach ($this->aliases as $alias) {
							 | 
						||
| 
								 | 
							
								            if ($alias == $uri) {
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Get the link with highest priority for the given relation and type.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string  $rel          Relation name
							 | 
						||
| 
								 | 
							
								     * @param string  $type         MIME Type
							 | 
						||
| 
								 | 
							
								     * @param boolean $typeFallback When true and no link with the given type
							 | 
						||
| 
								 | 
							
								     *                              could be found, the best link without a
							 | 
						||
| 
								 | 
							
								     *                              type will be returned
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return XML_XRD_Element_Link Link object or NULL if none found
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function get($rel, $type = null, $typeFallback = true)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $links = $this->getAll($rel, $type, $typeFallback);
							 | 
						||
| 
								 | 
							
								        if (count($links) == 0) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $links[0];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Get all links with the given relation and type, highest priority first.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string  $rel          Relation name
							 | 
						||
| 
								 | 
							
								     * @param string  $type         MIME Type
							 | 
						||
| 
								 | 
							
								     * @param boolean $typeFallback When true and no link with the given type
							 | 
						||
| 
								 | 
							
								     *                              could be found, the best link without a
							 | 
						||
| 
								 | 
							
								     *                              type will be returned
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return array Array of XML_XRD_Element_Link objects
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getAll($rel, $type = null, $typeFallback = true)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $links = array();
							 | 
						||
| 
								 | 
							
								        $exactType = false;
							 | 
						||
| 
								 | 
							
								        foreach ($this->links as $link) {
							 | 
						||
| 
								 | 
							
								            if ($link->rel == $rel
							 | 
						||
| 
								 | 
							
								                && ($type === null || $link->type == $type
							 | 
						||
| 
								 | 
							
								                || $typeFallback && $link->type === null)
							 | 
						||
| 
								 | 
							
								            ) {
							 | 
						||
| 
								 | 
							
								                $links[]    = $link;
							 | 
						||
| 
								 | 
							
								                $exactType |= $typeFallback && $type !== null
							 | 
						||
| 
								 | 
							
								                    && $link->type == $type;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ($exactType) {
							 | 
						||
| 
								 | 
							
								            //remove all links without type
							 | 
						||
| 
								 | 
							
								            $exactlinks = array();
							 | 
						||
| 
								 | 
							
								            foreach ($links as $link) {
							 | 
						||
| 
								 | 
							
								                if ($link->type !== null) {
							 | 
						||
| 
								 | 
							
								                    $exactlinks[] = $link;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $links = $exactlinks;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $links;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Return the iterator object to loop over the links
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Part of the IteratorAggregate interface
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return Traversable Iterator for the links
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getIterator()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return new ArrayIterator($this->links);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Converts this XRD object to XML or JSON.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $type Serialization type: xml or json
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return string Generated content
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function to($type)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!isset($this->serializer)) {
							 | 
						||
| 
								 | 
							
								            $this->serializer = new XML_XRD_Serializer($this);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $this->serializer->to($type);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Converts this XRD object to XML.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return string Generated XML
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @deprecated use to('xml')
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function toXML()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return $this->to('xml');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								?>
							 |