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'); | ||
|  |     } | ||
|  | } | ||
|  | ?>
 |