| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2010, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * A sample module to show best practices for StatusNet plugins | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    James Walker <james@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class XRD | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const XML_NS = 'http://www.w3.org/2000/xmlns/'; | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     const XRD_NS = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const HOST_META_NS = 'http://host-meta.net/xrd/1.0'; | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     public $expires; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $subject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $host; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $alias = array(); | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     public $types = array(); | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     public $links = array(); | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     public static function parse($xml) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $xrd = new XRD(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $dom = new DOMDocument(); | 
					
						
							| 
									
										
										
										
											2010-03-23 14:18:45 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Don't spew XML warnings to output
 | 
					
						
							|  |  |  |         $old = error_reporting(); | 
					
						
							|  |  |  |         error_reporting($old & ~E_WARNING); | 
					
						
							|  |  |  |         $ok = $dom->loadXML($xml); | 
					
						
							|  |  |  |         error_reporting($old); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$ok) { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             // TRANS: Exception.
 | 
					
						
							|  |  |  |             throw new Exception(_m('Invalid XML.')); | 
					
						
							| 
									
										
										
										
											2010-03-01 16:35:36 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |         $xrd_element = $dom->getElementsByTagName('XRD')->item(0); | 
					
						
							| 
									
										
										
										
											2010-03-03 18:31:35 -08:00
										 |  |  |         if (!$xrd_element) { | 
					
						
							| 
									
										
										
										
											2010-09-19 15:17:36 +02:00
										 |  |  |             // TRANS: Exception.
 | 
					
						
							|  |  |  |             throw new Exception(_m('Invalid XML, missing XRD root.')); | 
					
						
							| 
									
										
										
										
											2010-03-03 18:31:35 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Check for host-meta host
 | 
					
						
							| 
									
										
										
										
											2010-03-01 16:35:36 -08:00
										 |  |  |         $host = $xrd_element->getElementsByTagName('Host')->item(0); | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |         if ($host) { | 
					
						
							| 
									
										
										
										
											2010-03-01 16:35:36 -08:00
										 |  |  |             $xrd->host = $host->nodeValue; | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Loop through other elements
 | 
					
						
							|  |  |  |         foreach ($xrd_element->childNodes as $node) { | 
					
						
							| 
									
										
										
										
											2010-03-01 16:35:36 -08:00
										 |  |  |             if (!($node instanceof DOMElement)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |             switch ($node->tagName) { | 
					
						
							|  |  |  |             case 'Expires': | 
					
						
							|  |  |  |                 $xrd->expires = $node->nodeValue; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case 'Subject': | 
					
						
							|  |  |  |                 $xrd->subject = $node->nodeValue; | 
					
						
							|  |  |  |                 break; | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |             case 'Alias': | 
					
						
							|  |  |  |                 $xrd->alias[] = $node->nodeValue; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             case 'Link': | 
					
						
							|  |  |  |                 $xrd->links[] = $xrd->parseLink($node); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             case 'Type': | 
					
						
							|  |  |  |                 $xrd->types[] = $xrd->parseType($node); | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $xrd; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function toXML() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-08-02 16:42:28 -04:00
										 |  |  |         $xs = new XMLStringer(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $xs->startXML(); | 
					
						
							|  |  |  |         $xs->elementStart('XRD', array('xmlns' => XRD::XRD_NS)); | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($this->host) { | 
					
						
							| 
									
										
										
										
											2010-08-02 16:42:28 -04:00
										 |  |  |             $xs->element('hm:Host', array('xmlns:hm' => XRD::HOST_META_NS), $this->host); | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 16:42:28 -04:00
										 |  |  |         if ($this->expires) { | 
					
						
							|  |  |  |             $xs->element('Expires', null, $this->expires); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($this->subject) { | 
					
						
							|  |  |  |             $xs->element('Subject', null, $this->subject); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($this->alias as $alias) { | 
					
						
							|  |  |  |             $xs->element('Alias', null, $alias); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($this->links as $link) { | 
					
						
							|  |  |  |             $titles = array(); | 
					
						
							|  |  |  |             if (isset($link['title'])) { | 
					
						
							|  |  |  |                 $titles = $link['title']; | 
					
						
							|  |  |  |                 unset($link['title']); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $xs->elementStart('Link', $link); | 
					
						
							|  |  |  |             foreach ($titles as $title) { | 
					
						
							|  |  |  |                 $xs->element('Title', null, $title); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $xs->elementEnd('Link'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 16:42:28 -04:00
										 |  |  |         $xs->elementEnd('XRD'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $xs->getString(); | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function parseType($element) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-09-03 01:35:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |     function parseLink($element) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $link = array(); | 
					
						
							|  |  |  |         $link['rel'] = $element->getAttribute('rel'); | 
					
						
							|  |  |  |         $link['type'] = $element->getAttribute('type'); | 
					
						
							|  |  |  |         $link['href'] = $element->getAttribute('href'); | 
					
						
							|  |  |  |         $link['template'] = $element->getAttribute('template'); | 
					
						
							|  |  |  |         foreach ($element->childNodes as $node) { | 
					
						
							| 
									
										
										
										
											2010-03-03 09:31:14 -08:00
										 |  |  |             if ($node instanceof DOMElement) { | 
					
						
							|  |  |  |                 switch($node->tagName) { | 
					
						
							|  |  |  |                 case 'Title': | 
					
						
							|  |  |  |                     $link['title'][] = $node->nodeValue; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-02-09 01:37:45 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $link; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |