]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/LRDD/extlib/XML/XRD/Loader.php
Implemented WebFinger and replaced our XRD with PEAR XML_XRD
[quix0rs-gnu-social.git] / plugins / LRDD / extlib / XML / XRD / Loader.php
diff --git a/plugins/LRDD/extlib/XML/XRD/Loader.php b/plugins/LRDD/extlib/XML/XRD/Loader.php
new file mode 100644 (file)
index 0000000..7d497ad
--- /dev/null
@@ -0,0 +1,156 @@
+<?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
+        );
+    }
+
+
+}
+
+?>