function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    $found = true;
                    break;
                }
                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    $found = true;
                    break;
                }
            }
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }
function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    $found = true;
                    break;
                }
                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    $found = true;
                    break;
                }
            }
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }
function getDownloadURL ( $ base , $ packageinfo , $ prefstate , $ installed , $ channel = false ) { $ states = $ this -> betterStates ( $ prefstate , true ) ; if ( ! $ states ) { return PEAR :: raiseError ( '"' . $ prefstate . '" is not a valid state' ) ; } $ channel = $ packageinfo [ 'channel' ] ; $ package = $ packageinfo [ 'package' ] ; $ state = isset ( $ packageinfo [ 'state' ] ) ? $ packageinfo [ 'state' ] : null ; $ version = isset ( $ packageinfo [ 'version' ] ) ? $ packageinfo [ 'version' ] : null ; $ restFile = $ base . 'r/' . strtolower ( $ package ) . '/allreleases.xml' ; $ info = $ this -> _rest -> retrieveData ( $ restFile , false , false , $ channel ) ; if ( PEAR :: isError ( $ info ) ) { return PEAR :: raiseError ( 'No releases available for package "' . $ channel . '/' . $ package . '"' ) ; } if ( ! isset ( $ info [ 'r' ] ) ) { return false ; } $ release = $ found = false ; if ( ! is_array ( $ info [ 'r' ] ) || ! isset ( $ info [ 'r' ] [ 0 ] ) ) { $ info [ 'r' ] = array ( $ info [ 'r' ] ) ; } foreach ( $ info [ 'r' ] as $ release ) { if ( ! isset ( $ this -> _rest -> _options [ 'force' ] ) && ( $ installed && version_compare ( $ release [ 'v' ] , $ installed , '<' ) ) ) { continue ; } if ( isset ( $ state ) ) { // try our preferred state first if ( $ release [ 's' ] == $ state ) { $ found = true ; break ; } // see if there is something newer and more stable // bug #7221 if ( in_array ( $ release [ 's' ] , $ this -> betterStates ( $ state ) , true ) ) { $ found = true ; break ; } } elseif ( isset ( $ version ) ) { if ( $ release [ 'v' ] == $ version ) { $ found = true ; break ; } } else { if ( in_array ( $ release [ 's' ] , $ states ) ) { $ found = true ; break ; } } } return $ this -> _returnDownloadURL ( $ base , $ package , $ release , $ info , $ found , false , $ channel ) ; }
Retrieve information about a remote package to be downloaded from a REST server

@param string $base The uri to prepend to all REST calls
@param array $packageinfo an array of format:
<pre>
array(
'package' => 'packagename',
'channel' => 'channelname',
['state' => 'alpha' (or valid state),]
-or-
['version' => '1.whatever']
</pre>
@param string $prefstate Current preferred_state config variable value
@param bool $installed the installed version of this package to compare against
@return array|false|PEAR_Error see {@link _returnDownloadURL()}
Retrieve information about a remote package to be downloaded from a REST server