<?php

/**

 * @version		$Id: install.php 47 2009-05-26 18:06:30Z happynoodleboy $

 * @package		Joomla

 * @subpackage	Menus

 * @copyright	Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.

 * @license		GNU/GPL, see LICENSE.php

 * Joomla! is free software. This version may have been modified pursuant to the

 * GNU General Public License, and as distributed it includes or is derivative

 * of works licensed under the GNU General Public License or other free or open

 * source software licenses. See COPYRIGHT.php for copyright notices and

 * details.

 */



// Check to ensure this file is included in Joomla!

defined('_JEXEC') or die();



jimport( 'joomla.application.component.model' );

//jimport( 'joomla.installer.installer' );

jimport('joomla.installer.helper');



/**

 * Extension Manager Install Model

 *

 * @package		Joomla

 * @subpackage	Installer

 * @since		1.5

 */

class InstallerModelInstall extends JModel

{

	/** @var object JTable object */

	var $_table = null;



	/** @var object JTable object */

	var $_url = null;



	/**

	 * Overridden constructor

	 * @access	protected

	 */

	function __construct()

	{

		parent::__construct();



	}

	

	function cancel()

	{

		$this->setRedirect( JRoute::_( 'index.php?option=com_jce&client='. $client, false ) );

	}



	function install()

	{

		global $mainframe;



		$this->setState('action', 'install');



		switch(JRequest::getWord('installtype'))

		{

			case 'folder':

				$package = $this->_getPackageFromFolder();

				break;



			case 'upload':

				$package = $this->_getPackageFromUpload();

				break;



			case 'url':

				$package = $this->_getPackageFromUrl();

				break;



			default:

				$this->setState('message', 'No Install Type Found');

				return false;

				break;

		}



		// Was the package unpacked?

		if (!$package) {

			$this->setState('message', 'Unable to find install package');

			return false;

		}



		// Get a database connector

		//$db = & JFactory::getDBO();



		// Get an installer instance

		require_once( JPATH_COMPONENT .DS. 'installer' .DS. 'installer.php' );

		$installer =& JCEInstaller::getInstance();



		// Install the package

		if (!$installer->install($package['dir'])) {

			// There was an error installing the package

			$msg = JText::sprintf('INSTALLEXT', JText::_($package['type']), JText::_('Error'));

			$result = false;

		} else {

			// Package installed sucessfully

			$msg = JText::sprintf('INSTALLEXT', JText::_($package['type']), JText::_('Success'));

			$result = true;

		}



		// Set some model state values

		$mainframe->enqueueMessage($msg);

		$this->setState('name', $installer->get('name'));

		$this->setState('result', $result);

		$this->setState('message', $installer->message);

		$this->setState('extension.message', $installer->get('extension.message'));



		// Cleanup the install files

		if (!is_file($package['packagefile'])) {

			$config =& JFactory::getConfig();

			$package['packagefile'] = $config->getValue('config.tmp_path').DS.$package['packagefile'];

		}



		JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);



		return $result;

	}



	/**

	 * @param string The class name for the installer

	 */

	function _getPackageFromUpload()

	{

		// Get the uploaded file information

		$userfile = JRequest::getVar('install_package', null, 'files', 'array' );



		// Make sure that file uploads are enabled in php

		if (!(bool) ini_get('file_uploads')) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('WARNINSTALLFILE'));

			return false;

		}



		// Make sure that zlib is loaded so that the package can be unpacked

		if (!extension_loaded('zlib')) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('WARNINSTALLZLIB'));

			return false;

		}



		// If there is no uploaded file, we have a problem...

		if (!is_array($userfile) ) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('No file selected'));

			return false;

		}



		// Check if there was a problem uploading the file.

		if ( $userfile['error'] || $userfile['size'] < 1 )

		{

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('WARNINSTALLUPLOADERROR'));

			return false;

		}



		// Build the appropriate paths

		$config =& JFactory::getConfig();

		$tmp_dest 	= $config->getValue('config.tmp_path').DS.$userfile['name'];

		$tmp_src	= $userfile['tmp_name'];



		// Move uploaded file

		jimport('joomla.filesystem.file');

		$uploaded = JFile::upload($tmp_src, $tmp_dest);



		// Unpack the downloaded package file

		$package = JInstallerHelper::unpack($tmp_dest);



		return $package;

	}



	/**

	 * Install an extension from a directory

	 *

	 * @static

	 * @return boolean True on success

	 * @since 1.0

	 */

	function _getPackageFromFolder()

	{

		// Get the path to the package to install

		$p_dir = JRequest::getString('install_directory');

		$p_dir = JPath::clean( $p_dir );



		// Did you give us a valid directory?

		if (!is_dir($p_dir)) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('Please enter a package directory'));

			return false;

		}



		// Detect the package type

		$type = JInstallerHelper::detectType($p_dir);



		// Did you give us a valid package?

		if (!$type) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('Path does not have a valid package'));

			return false;

		}



		$package['packagefile'] = null;

		$package['extractdir'] = null;

		$package['dir'] = $p_dir;

		$package['type'] = $type;



		return $package;

	}



	/**

	 * Install an extension from a URL

	 *

	 * @static

	 * @return boolean True on success

	 * @since 1.5

	 */

	function _getPackageFromUrl()

	{

		// Get a database connector

		$db = & JFactory::getDBO();



		// Get the URL of the package to install

		$url = JRequest::getString('install_url');



		// Did you give us a URL?

		if (!$url) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('Please enter a URL'));

			return false;

		}



		// Download the package at the URL given

		$p_file = JInstallerHelper::downloadPackage($url);



		// Was the package downloaded?

		if (!$p_file) {

			JError::raiseWarning('SOME_ERROR_CODE', JText::_('Invalid URL'));

			return false;

		}



		$config =& JFactory::getConfig();

		$tmp_dest 	= $config->getValue('config.tmp_path');



		// Unpack the downloaded package file

		$package = JInstallerHelper::unpack($tmp_dest.DS.$p_file);



		return $package;

	}

}