You've already forked joomla_test
							
							
		
			
	
	
		
			483 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			483 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /** | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Google | ||
|  |  * | ||
|  |  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved | ||
|  |  * @license     GNU General Public License version 2 or later; see LICENSE | ||
|  |  */ | ||
|  | 
 | ||
|  | defined('JPATH_PLATFORM') or die; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Google Picasa data class for the Joomla Platform. | ||
|  |  * | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Google | ||
|  |  * @since       12.3 | ||
|  |  */ | ||
|  | class JGoogleDataPicasaAlbum extends JGoogleData | ||
|  | { | ||
|  | 	/** | ||
|  | 	 * @var    SimpleXMLElement  The album's XML | ||
|  | 	 * @since  12.3 | ||
|  | 	 */ | ||
|  | 	protected $xml; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Constructor. | ||
|  | 	 * | ||
|  | 	 * @param   SimpleXMLElement  $xml      XML from Google | ||
|  | 	 * @param   JRegistry         $options  Google options object | ||
|  | 	 * @param   JGoogleAuth       $auth     Google data http client object | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function __construct(SimpleXMLElement $xml, JRegistry $options = null, JGoogleAuth $auth = null) | ||
|  | 	{ | ||
|  | 		$this->xml = $xml; | ||
|  | 
 | ||
|  | 		parent::__construct($options, $auth); | ||
|  | 
 | ||
|  | 		if (isset($this->auth) && !$this->auth->getOption('scope')) | ||
|  | 		{ | ||
|  | 			$this->auth->setOption('scope', 'https://picasaweb.google.com/data/'); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to delete a Picasa album | ||
|  | 	 * | ||
|  | 	 * @param   mixed  $match  Check for most up to date album | ||
|  | 	 * | ||
|  | 	 * @return  boolean  Success or failure. | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 * @throws UnexpectedValueException | ||
|  | 	 */ | ||
|  | 	public function delete($match = '*') | ||
|  | 	{ | ||
|  | 		if ($this->isAuthenticated()) | ||
|  | 		{ | ||
|  | 			$url = $this->getLink(); | ||
|  | 
 | ||
|  | 			if ($match === true) | ||
|  | 			{ | ||
|  | 				$match = $this->xml->xpath('./@gd:etag'); | ||
|  | 				$match = $match[0]; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			try | ||
|  | 			{ | ||
|  | 				$jdata = $this->query($url, null, array('GData-Version' => 2, 'If-Match' => $match), 'delete'); | ||
|  | 			} | ||
|  | 			catch (Exception $e) | ||
|  | 			{ | ||
|  | 				if (strpos($e->getMessage(), 'Error code 412 received requesting data: Mismatch: etags') === 0) | ||
|  | 				{ | ||
|  | 					throw new RuntimeException("Etag match failed: `$match`."); | ||
|  | 				} | ||
|  | 				throw $e; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			if ($jdata->body != '') | ||
|  | 			{ | ||
|  | 				throw new UnexpectedValueException("Unexpected data received from Google: `{$jdata->body}`."); | ||
|  | 			} | ||
|  | 			$this->xml = null; | ||
|  | 
 | ||
|  | 			return true; | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the album link | ||
|  | 	 * | ||
|  | 	 * @param   string  $type  Type of link to return | ||
|  | 	 * | ||
|  | 	 * @return  string  Link or false on failure | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getLink($type = 'edit') | ||
|  | 	{ | ||
|  | 		$links = $this->xml->link; | ||
|  | 
 | ||
|  | 		foreach ($links as $link) | ||
|  | 		{ | ||
|  | 			if ($link->attributes()->rel == $type) | ||
|  | 			{ | ||
|  | 				return (string) $link->attributes()->href; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the title of the album | ||
|  | 	 * | ||
|  | 	 * @return  string  Album title | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getTitle() | ||
|  | 	{ | ||
|  | 		return (string) $this->xml->children()->title; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the summary of the album | ||
|  | 	 * | ||
|  | 	 * @return  string  Album summary | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getSummary() | ||
|  | 	{ | ||
|  | 		return (string) $this->xml->children()->summary; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the location of the album | ||
|  | 	 * | ||
|  | 	 * @return  string  Album location | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getLocation() | ||
|  | 	{ | ||
|  | 		return (string) $this->xml->children('gphoto', true)->location; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the access level of the album | ||
|  | 	 * | ||
|  | 	 * @return  string  Album access level | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getAccess() | ||
|  | 	{ | ||
|  | 		return (string) $this->xml->children('gphoto', true)->access; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to get the time of the album | ||
|  | 	 * | ||
|  | 	 * @return  double  Album time | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function getTime() | ||
|  | 	{ | ||
|  | 		return (double) $this->xml->children('gphoto', true)->timestamp / 1000; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to set the title of the album | ||
|  | 	 * | ||
|  | 	 * @param   string  $title  New album title | ||
|  | 	 * | ||
|  | 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function setTitle($title) | ||
|  | 	{ | ||
|  | 		$this->xml->children()->title = $title; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to set the summary of the album | ||
|  | 	 * | ||
|  | 	 * @param   string  $summary  New album summary | ||
|  | 	 * | ||
|  | 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function setSummary($summary) | ||
|  | 	{ | ||
|  | 		$this->xml->children()->summary = $summary; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to set the location of the album | ||
|  | 	 * | ||
|  | 	 * @param   string  $location  New album location | ||
|  | 	 * | ||
|  | 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function setLocation($location) | ||
|  | 	{ | ||
|  | 		$this->xml->children('gphoto', true)->location = $location; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to set the access level of the album | ||
|  | 	 * | ||
|  | 	 * @param   string  $access  New album access | ||
|  | 	 * | ||
|  | 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function setAccess($access) | ||
|  | 	{ | ||
|  | 		$this->xml->children('gphoto', true)->access = $access; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to set the time of the album | ||
|  | 	 * | ||
|  | 	 * @param   int  $time  New album time | ||
|  | 	 * | ||
|  | 	 * @return  JGoogleDataPicasaAlbum  The object for method chaining | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function setTime($time) | ||
|  | 	{ | ||
|  | 		$this->xml->children('gphoto', true)->timestamp = $time * 1000; | ||
|  | 
 | ||
|  | 		return $this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to modify a Picasa Album | ||
|  | 	 * | ||
|  | 	 * @param   string  $match  Optional eTag matching parameter | ||
|  | 	 * | ||
|  | 	 * @return  mixed  Data from Google. | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 */ | ||
|  | 	public function save($match = '*') | ||
|  | 	{ | ||
|  | 		if ($this->isAuthenticated()) | ||
|  | 		{ | ||
|  | 			$url = $this->getLink(); | ||
|  | 
 | ||
|  | 			if ($match === true) | ||
|  | 			{ | ||
|  | 				$match = $this->xml->xpath('./@gd:etag'); | ||
|  | 				$match = $match[0]; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			try | ||
|  | 			{ | ||
|  | 				$headers = array('GData-Version' => 2, 'Content-type' => 'application/atom+xml', 'If-Match' => $match); | ||
|  | 				$jdata = $this->query($url, $this->xml->asXML(), $headers, 'put'); | ||
|  | 			} | ||
|  | 			catch (Exception $e) | ||
|  | 			{ | ||
|  | 				if (strpos($e->getMessage(), 'Error code 412 received requesting data: Mismatch: etags') === 0) | ||
|  | 				{ | ||
|  | 					throw new RuntimeException("Etag match failed: `$match`."); | ||
|  | 				} | ||
|  | 				throw $e; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			$this->xml = $this->safeXML($jdata->body); | ||
|  | 
 | ||
|  | 			return $this; | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Refresh Picasa Album | ||
|  | 	 * | ||
|  | 	 * @return  mixed  Data from Google | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 * @throws UnexpectedValueException | ||
|  | 	 */ | ||
|  | 	public function refresh() | ||
|  | 	{ | ||
|  | 		if ($this->isAuthenticated()) | ||
|  | 		{ | ||
|  | 			$url = $this->getLink(); | ||
|  | 			$jdata = $this->query($url, null, array('GData-Version' => 2)); | ||
|  | 			$this->xml = $this->safeXML($jdata->body); | ||
|  | 
 | ||
|  | 			return $this; | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to retrieve a list of Picasa Photos | ||
|  | 	 * | ||
|  | 	 * @return  mixed  Data from Google | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 * @throws UnexpectedValueException | ||
|  | 	 */ | ||
|  | 	public function listPhotos() | ||
|  | 	{ | ||
|  | 		if ($this->isAuthenticated()) | ||
|  | 		{ | ||
|  | 			$url = $this->getLink('http://schemas.google.com/g/2005#feed'); | ||
|  | 			$jdata = $this->query($url, null, array('GData-Version' => 2)); | ||
|  | 			$xml = $this->safeXML($jdata->body); | ||
|  | 
 | ||
|  | 			if (isset($xml->children()->entry)) | ||
|  | 			{ | ||
|  | 				$items = array(); | ||
|  | 
 | ||
|  | 				foreach ($xml->children()->entry as $item) | ||
|  | 				{ | ||
|  | 					$items[] = new JGoogleDataPicasaPhoto($item, $this->options, $this->auth); | ||
|  | 				} | ||
|  | 				return $items; | ||
|  | 			} | ||
|  | 			else | ||
|  | 			{ | ||
|  | 				throw new UnexpectedValueException("Unexpected data received from Google: `{$jdata->body}`."); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Add photo | ||
|  | 	 * | ||
|  | 	 * @param   string  $file     Path of file to upload | ||
|  | 	 * @param   string  $title    Title to give to file (defaults to filename) | ||
|  | 	 * @param   string  $summary  Description of the file | ||
|  | 	 * | ||
|  | 	 * @return  mixed  Data from Google | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 * @throws  RuntimeException | ||
|  | 	 */ | ||
|  | 	public function upload($file, $title = '', $summary = '') | ||
|  | 	{ | ||
|  | 		if ($this->isAuthenticated()) | ||
|  | 		{ | ||
|  | 			jimport('joomla.filesystem.file'); | ||
|  | 			$title = $title != '' ? $title : JFile::getName($file); | ||
|  | 
 | ||
|  | 			if (!($type = $this->getMIME($file))) | ||
|  | 			{ | ||
|  | 				throw new RuntimeException("Inappropriate file type."); | ||
|  | 			} | ||
|  | 			if (!($data = JFile::read($file))) | ||
|  | 			{ | ||
|  | 				throw new RuntimeException("Cannot access file: `$file`"); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			$xml = new SimpleXMLElement('<entry></entry>'); | ||
|  | 			$xml->addAttribute('xmlns', 'http://www.w3.org/2005/Atom'); | ||
|  | 			$xml->addChild('title', $title); | ||
|  | 			$xml->addChild('summary', $summary); | ||
|  | 			$cat = $xml->addChild('category', ''); | ||
|  | 			$cat->addAttribute('scheme', 'http://schemas.google.com/g/2005#kind'); | ||
|  | 			$cat->addAttribute('term', 'http://schemas.google.com/photos/2007#photo'); | ||
|  | 
 | ||
|  | 			$post = "Media multipart posting\n"; | ||
|  | 			$post .= "--END_OF_PART\n"; | ||
|  | 			$post .= "Content-Type: application/atom+xml\n\n"; | ||
|  | 			$post .= $xml->asXML() . "\n"; | ||
|  | 			$post .= "--END_OF_PART\n"; | ||
|  | 			$post .= "Content-Type: {$type}\n\n"; | ||
|  | 			$post .= $data; | ||
|  | 
 | ||
|  | 			$jdata = $this->query($this->getLink(), $post, array('GData-Version' => 2, 'Content-Type: multipart/related'), 'post'); | ||
|  | 
 | ||
|  | 			return new JGoogleDataPicasaPhoto($this->safeXML($jdata->body), $this->options, $this->auth); | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Add photo | ||
|  | 	 * | ||
|  | 	 * @param   string  $file  Filename | ||
|  | 	 * | ||
|  | 	 * @return  mixed  Data from Google | ||
|  | 	 * | ||
|  | 	 * @since   12.3 | ||
|  | 	 * @throws UnexpectedValueException | ||
|  | 	 */ | ||
|  | 	protected function getMIME($file) | ||
|  | 	{ | ||
|  | 		switch (strtolower(JFile::getExt($file))) | ||
|  | 		{ | ||
|  | 			case 'bmp': | ||
|  | 			case 'bm': | ||
|  | 			return 'image/bmp'; | ||
|  | 			case 'gif': | ||
|  | 			return 'image/gif'; | ||
|  | 			case 'jpg': | ||
|  | 			case 'jpeg': | ||
|  | 			case 'jpe': | ||
|  | 			case 'jif': | ||
|  | 			case 'jfif': | ||
|  | 			case 'jfi': | ||
|  | 			return 'image/jpeg'; | ||
|  | 			case 'png': | ||
|  | 			return 'image/png'; | ||
|  | 			case '3gp': | ||
|  | 			return 'video/3gpp'; | ||
|  | 			case 'avi': | ||
|  | 			return 'video/avi'; | ||
|  | 			case 'mov': | ||
|  | 			case 'moov': | ||
|  | 			case 'qt': | ||
|  | 			return 'video/quicktime'; | ||
|  | 			case 'mp4': | ||
|  | 			case 'm4a': | ||
|  | 			case 'm4p': | ||
|  | 			case 'm4b': | ||
|  | 			case 'm4r': | ||
|  | 			case 'm4v': | ||
|  | 			return 'video/mp4'; | ||
|  | 			case 'mpg': | ||
|  | 			case 'mpeg': | ||
|  | 			case 'mp1': | ||
|  | 			case 'mp2': | ||
|  | 			case 'mp3': | ||
|  | 			case 'm1v': | ||
|  | 			case 'm1a': | ||
|  | 			case 'm2a': | ||
|  | 			case 'mpa': | ||
|  | 			case 'mpv': | ||
|  | 			return 'video/mpeg'; | ||
|  | 			case 'asf': | ||
|  | 			return 'video/x-ms-asf'; | ||
|  | 			case 'wmv': | ||
|  | 			return 'video/x-ms-wmv'; | ||
|  | 			default: | ||
|  | 			return false; | ||
|  | 		} | ||
|  | 	} | ||
|  | } |