forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			157 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.2 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/Loader/Exception.php'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * File/string loading dispatcher. | ||
|  |  * Loads the correct loader for the type of XRD file (XML or JSON). | ||
|  |  * Also provides type auto-detection. | ||
|  |  * | ||
|  |  * @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_Loader | ||
|  | { | ||
|  |     public function __construct(XML_XRD $xrd) | ||
|  |     { | ||
|  |         $this->xrd = $xrd; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 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 ($type === null) { | ||
|  |             $type = $this->detectTypeFromFile($file); | ||
|  |         } | ||
|  |         $loader = $this->getLoader($type); | ||
|  |         $loader->loadFile($file); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 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 ($type === null) { | ||
|  |             $type = $this->detectTypeFromString($str); | ||
|  |         } | ||
|  |         $loader = $this->getLoader($type); | ||
|  |         $loader->loadString($str); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Creates a XRD loader object for the given type | ||
|  |      * | ||
|  |      * @param string $type File type: xml or json | ||
|  |      * | ||
|  |      * @return XML_XRD_Loader | ||
|  |      */ | ||
|  |     protected function getLoader($type) | ||
|  |     { | ||
|  |         $class = 'XML_XRD_Loader_' . strtoupper($type); | ||
|  |         $file = str_replace('_', '/', $class) . '.php'; | ||
|  |         include_once $file; | ||
|  |         if (class_exists($class)) { | ||
|  |             return new $class($this->xrd); | ||
|  |         } | ||
|  | 
 | ||
|  |         throw new XML_XRD_Loader_Exception( | ||
|  |             'No loader for XRD type "' . $type . '"', | ||
|  |             XML_XRD_Loader_Exception::NO_LOADER | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Tries to detect the file type (xml or json) from the file content | ||
|  |      * | ||
|  |      * @param string $file File name to check | ||
|  |      * | ||
|  |      * @return string File type ('xml' or 'json') | ||
|  |      * | ||
|  |      * @throws XML_XRD_Loader_Exception When opening the file fails. | ||
|  |      */ | ||
|  |     public function detectTypeFromFile($file) | ||
|  |     { | ||
|  |         if (!file_exists($file)) { | ||
|  |             throw new XML_XRD_Loader_Exception( | ||
|  |                 'Error loading XRD file: File does not exist', | ||
|  |                 XML_XRD_Loader_Exception::OPEN_FILE | ||
|  |             ); | ||
|  |         } | ||
|  |         $handle = fopen($file, 'r'); | ||
|  |         if (!$handle) { | ||
|  |             throw new XML_XRD_Loader_Exception( | ||
|  |                 'Cannot open file to determine type', | ||
|  |                 XML_XRD_Loader_Exception::OPEN_FILE | ||
|  |             ); | ||
|  |         } | ||
|  | 
 | ||
|  |         $str = (string)fgets($handle, 10); | ||
|  |         fclose($handle); | ||
|  |         return $this->detectTypeFromString($str); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Tries to detect the file type from the content of the file | ||
|  |      * | ||
|  |      * @param string $str Content of XRD file | ||
|  |      * | ||
|  |      * @return string File type ('xml' or 'json') | ||
|  |      * | ||
|  |      * @throws XML_XRD_Loader_Exception When the type cannot be detected | ||
|  |      */ | ||
|  |     public function detectTypeFromString($str) | ||
|  |     { | ||
|  |         if (substr($str, 0, 1) == '{') { | ||
|  |             return 'json'; | ||
|  |         } else if (substr($str, 0, 5) == '<?xml') { | ||
|  |             return 'xml'; | ||
|  |         } | ||
|  | 
 | ||
|  |         throw new XML_XRD_Loader_Exception( | ||
|  |             'Detecting file type failed', | ||
|  |             XML_XRD_Loader_Exception::DETECT_TYPE | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |