home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / tmp / PEAR-1.7.1 / PEAR / REST / 13.php < prev   
Encoding:
PHP Script  |  2008-02-15  |  11.6 KB  |  280 lines

  1. <?php
  2. /**
  3.  * PEAR_REST_13
  4.  *
  5.  * PHP versions 4 and 5
  6.  *
  7.  * LICENSE: This source file is subject to version 3.0 of the PHP license
  8.  * that is available through the world-wide-web at the following URI:
  9.  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  10.  * the PHP License and are unable to obtain it through the web, please
  11.  * send a note to license@php.net so we can mail you a copy immediately.
  12.  *
  13.  * @category   pear
  14.  * @package    PEAR
  15.  * @author     Greg Beaver <cellog@php.net>
  16.  * @copyright  1997-2008 The PHP Group
  17.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  18.  * @version    CVS: $Id: 13.php,v 1.5 2008/01/03 20:26:37 cellog Exp $
  19.  * @link       http://pear.php.net/package/PEAR
  20.  * @since      File available since Release 1.4.0a12
  21.  */
  22.  
  23. /**
  24.  * For downloading REST xml/txt files
  25.  */
  26. require_once 'PEAR/REST.php';
  27. require_once 'PEAR/REST/10.php';
  28.  
  29. /**
  30.  * Implement REST 1.3
  31.  *
  32.  * @category   pear
  33.  * @package    PEAR
  34.  * @author     Greg Beaver <cellog@php.net>
  35.  * @copyright  1997-2008 The PHP Group
  36.  * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
  37.  * @version    Release: 1.7.1
  38.  * @link       http://pear.php.net/package/PEAR
  39.  * @since      Class available since Release 1.4.0a12
  40.  */
  41. class PEAR_REST_13 extends PEAR_REST_10
  42. {
  43.     /**
  44.      * Retrieve information about a remote package to be downloaded from a REST server
  45.      *
  46.      * This is smart enough to resolve the minimum PHP version dependency prior to download
  47.      * @param string $base The uri to prepend to all REST calls
  48.      * @param array $packageinfo an array of format:
  49.      * <pre>
  50.      *  array(
  51.      *   'package' => 'packagename',
  52.      *   'channel' => 'channelname',
  53.      *  ['state' => 'alpha' (or valid state),]
  54.      *  -or-
  55.      *  ['version' => '1.whatever']
  56.      * </pre>
  57.      * @param string $prefstate Current preferred_state config variable value
  58.      * @param bool $installed the installed version of this package to compare against
  59.      * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
  60.      */
  61.     function getDownloadURL($base, $packageinfo, $prefstate, $installed)
  62.     {
  63.         $channel = $packageinfo['channel'];
  64.         $package = $packageinfo['package'];
  65.         $states = $this->betterStates($prefstate, true);
  66.         if (!$states) {
  67.             return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
  68.         }
  69.         $state   = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
  70.         $version = isset($packageinfo['version']) ? $packageinfo['version'] : null;
  71.         $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
  72.             '/allreleases2.xml');
  73.         if (PEAR::isError($info)) {
  74.             return PEAR::raiseError('No releases available for package "' .
  75.                 $channel . '/' . $package . '"');
  76.         }
  77.         if (!isset($info['r'])) {
  78.             return false;
  79.         }
  80.         $release = $found = false;
  81.         if (!is_array($info['r']) || !isset($info['r'][0])) {
  82.             $info['r'] = array($info['r']);
  83.         }
  84.         $skippedphp = false;
  85.         foreach ($info['r'] as $release) {
  86.             if (!isset($this->_rest->_options['force']) && ($installed &&
  87.                   version_compare($release['v'], $installed, '<'))) {
  88.                 continue;
  89.             }
  90.             if (isset($state)) {
  91.                 // try our preferred state first
  92.                 if ($release['s'] == $state) {
  93.                     if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
  94.                         // skip releases that require a PHP version newer than our PHP version
  95.                         $skippedphp = $release;
  96.                         continue;
  97.                     }
  98.                     $found = true;
  99.                     break;
  100.                 }
  101.                 // see if there is something newer and more stable
  102.                 // bug #7221
  103.                 if (in_array($release['s'], $this->betterStates($state), true)) {
  104.                     if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
  105.                         // skip releases that require a PHP version newer than our PHP version
  106.                         $skippedphp = $release;
  107.                         continue;
  108.                     }
  109.                     $found = true;
  110.                     break;
  111.                 }
  112.             } elseif (isset($version)) {
  113.                 if ($release['v'] == $version) {
  114.                     if (!isset($this->_rest->_options['force']) &&
  115.                           !isset($version) &&
  116.                           version_compare($release['m'], phpversion(), '>')) {
  117.                         // skip releases that require a PHP version newer than our PHP version
  118.                         $skippedphp = $release;
  119.                         continue;
  120.                     }
  121.                     $found = true;
  122.                     break;
  123.                 }
  124.             } else {
  125.                 if (in_array($release['s'], $states)) {
  126.                     if (version_compare($release['m'], phpversion(), '>')) {
  127.                         // skip releases that require a PHP version newer than our PHP version
  128.                         $skippedphp = $release;
  129.                         continue;
  130.                     }
  131.                     $found = true;
  132.                     break;
  133.                 }
  134.             }
  135.         }
  136.         if (!$found && $skippedphp) {
  137.             $found = null;
  138.         }
  139.         return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp);
  140.     }
  141.  
  142.     function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
  143.                                $prefstate = 'stable', $installed = false)
  144.     {
  145.         $channel = $dependency['channel'];
  146.         $package = $dependency['name'];
  147.         $states = $this->betterStates($prefstate, true);
  148.         if (!$states) {
  149.             return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
  150.         }
  151.         $state   = isset($dependency['state'])   ? $dependency['state']   : null;
  152.         $version = isset($dependency['version']) ? $dependency['version'] : null;
  153.         $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
  154.             '/allreleases2.xml');
  155.         if (PEAR::isError($info)) {
  156.             return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
  157.                 . '" dependency "' . $channel . '/' . $package . '" has no releases');
  158.         }
  159.         if (!is_array($info) || !isset($info['r'])) {
  160.             return false;
  161.         }
  162.         $exclude = array();
  163.         $min = $max = $recommended = false;
  164.         if ($xsdversion == '1.0') {
  165.             $pinfo['package'] = $dependency['name'];
  166.             $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this
  167.             switch ($dependency['rel']) {
  168.                 case 'ge' :
  169.                     $min = $dependency['version'];
  170.                 break;
  171.                 case 'gt' :
  172.                     $min = $dependency['version'];
  173.                     $exclude = array($dependency['version']);
  174.                 break;
  175.                 case 'eq' :
  176.                     $recommended = $dependency['version'];
  177.                 break;
  178.                 case 'lt' :
  179.                     $max = $dependency['version'];
  180.                     $exclude = array($dependency['version']);
  181.                 break;
  182.                 case 'le' :
  183.                     $max = $dependency['version'];
  184.                 break;
  185.                 case 'ne' :
  186.                     $exclude = array($dependency['version']);
  187.                 break;
  188.             }
  189.         } else {
  190.             $pinfo['package'] = $dependency['name'];
  191.             $min = isset($dependency['min']) ? $dependency['min'] : false;
  192.             $max = isset($dependency['max']) ? $dependency['max'] : false;
  193.             $recommended = isset($dependency['recommended']) ?
  194.                 $dependency['recommended'] : false;
  195.             if (isset($dependency['exclude'])) {
  196.                 if (!isset($dependency['exclude'][0])) {
  197.                     $exclude = array($dependency['exclude']);
  198.                 }
  199.             }
  200.         }
  201.         $found = false;
  202.         $release = false;
  203.         $skippedphp = false;
  204.         if (!is_array($info['r']) || !isset($info['r'][0])) {
  205.             $info['r'] = array($info['r']);
  206.         }
  207.         foreach ($info['r'] as $release) {
  208.             if (!isset($this->_rest->_options['force']) && ($installed &&
  209.                   version_compare($release['v'], $installed, '<'))) {
  210.                 continue;
  211.             }
  212.             if (in_array($release['v'], $exclude)) { // skip excluded versions
  213.                 continue;
  214.             }
  215.             // allow newer releases to say "I'm OK with the dependent package"
  216.             if ($xsdversion == '2.0' && isset($release['co'])) {
  217.                 if (!is_array($release['co']) || !isset($release['co'][0])) {
  218.                     $release['co'] = array($release['co']);
  219.                 }
  220.                 foreach ($release['co'] as $entry) {
  221.                     if (isset($entry['x']) && !is_array($entry['x'])) {
  222.                         $entry['x'] = array($entry['x']);
  223.                     } elseif (!isset($entry['x'])) {
  224.                         $entry['x'] = array();
  225.                     }
  226.                     if ($entry['c'] == $deppackage['channel'] &&
  227.                           strtolower($entry['p']) == strtolower($deppackage['package']) &&
  228.                           version_compare($deppackage['version'], $entry['min'], '>=') &&
  229.                           version_compare($deppackage['version'], $entry['max'], '<=') &&
  230.                           !in_array($release['v'], $entry['x'])) {
  231.                         if (version_compare($release['m'], phpversion(), '>')) {
  232.                             // skip dependency releases that require a PHP version
  233.                             // newer than our PHP version
  234.                             $skippedphp = $release;
  235.                             continue;
  236.                         }
  237.                         $recommended = $release['v'];
  238.                         break;
  239.                     }
  240.                 }
  241.             }
  242.             if ($recommended) {
  243.                 if ($release['v'] != $recommended) { // if we want a specific
  244.                     // version, then skip all others
  245.                     continue;
  246.                 } else {
  247.                     if (!in_array($release['s'], $states)) {
  248.                         // the stability is too low, but we must return the
  249.                         // recommended version if possible
  250.                         return $this->_returnDownloadURL($base, $package, $release, $info, true);
  251.                     }
  252.                 }
  253.             }
  254.             if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
  255.                 continue;
  256.             }
  257.             if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
  258.                 continue;
  259.             }
  260.             if ($installed && version_compare($release['v'], $installed, '<')) {
  261.                 continue;
  262.             }
  263.             if (in_array($release['s'], $states)) { // if in the preferred state...
  264.                 if (version_compare($release['m'], phpversion(), '>')) {
  265.                     // skip dependency releases that require a PHP version
  266.                     // newer than our PHP version
  267.                     $skippedphp = $release;
  268.                     continue;
  269.                 }
  270.                 $found = true; // ... then use it
  271.                 break;
  272.             }
  273.         }
  274.         if (!$found && $skippedphp) {
  275.             $found = null;
  276.         }
  277.         return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp);
  278.     }
  279. }
  280. ?>