Вход Регистрация
Файл: mp3/MP3/PEAR/REST/11.php
Строк: 197
<?php
/**
 * PEAR_REST_11 - implement faster list-all/remote-list command
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    CVS: $Id: 11.php 313023 2011-07-06 19:17:11Z dufuz $
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.3
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';

/**
 * Implement REST 1.1
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.9.4
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.3
 */
class PEAR_REST_11
{
    
/**
     * @var PEAR_REST
     */
    
var $_rest;

    function 
PEAR_REST_11($config$options = array())
    {
        
$this->_rest = &new PEAR_REST($config$options);
    }

    function 
listAll($base$dostable$basic true$searchpackage false$searchsummary false$channel false)
    {
        
$categorylist $this->_rest->retrieveData($base 'c/categories.xml'falsefalse$channel);
        if (
PEAR::isError($categorylist)) {
            return 
$categorylist;
        }

        
$ret = array();
        if (!
is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
            
$categorylist['c'] = array($categorylist['c']);
        }

        
PEAR::pushErrorHandling(PEAR_ERROR_RETURN);

        foreach (
$categorylist['c'] as $progress => $category) {
            
$category $category['_content'];
            
$packagesinfo $this->_rest->retrieveData($base .
                
'c/' urlencode($category) . '/packagesinfo.xml'falsefalse$channel);

            if (
PEAR::isError($packagesinfo)) {
                continue;
            }

            if (!
is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
                continue;
            }

            if (!
is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
                
$packagesinfo['pi'] = array($packagesinfo['pi']);
            }

            foreach (
$packagesinfo['pi'] as $packageinfo) {
                if (empty(
$packageinfo)) {
                    continue;
                }

                
$info     $packageinfo['p'];
                
$package  $info['n'];
                
$releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
                unset(
$latest);
                unset(
$unstable);
                unset(
$stable);
                unset(
$state);

                if (
$releases) {
                    if (!isset(
$releases['r'][0])) {
                        
$releases['r'] = array($releases['r']);
                    }

                    foreach (
$releases['r'] as $release) {
                        if (!isset(
$latest)) {
                            if (
$dostable && $release['s'] == 'stable') {
                                
$latest $release['v'];
                                
$state 'stable';
                            }
                            if (!
$dostable) {
                                
$latest $release['v'];
                                
$state $release['s'];
                            }
                        }

                        if (!isset(
$stable) && $release['s'] == 'stable') {
                            
$stable $release['v'];
                            if (!isset(
$unstable)) {
                                
$unstable $stable;
                            }
                        }

                        if (!isset(
$unstable) && $release['s'] != 'stable') {
                            
$unstable $release['v'];
                            
$state $release['s'];
                        }

                        if (isset(
$latest) && !isset($state)) {
                            
$state $release['s'];
                        }

                        if (isset(
$latest) && isset($stable) && isset($unstable)) {
                            break;
                        }
                    }
                }

                if (
$basic) { // remote-list command
                    
if (!isset($latest)) {
                        
$latest false;
                    }

                    if (
$dostable) {
                        
// $state is not set if there are no releases
                        
if (isset($state) && $state == 'stable') {
                            
$ret[$package] = array('stable' => $latest);
                        } else {
                            
$ret[$package] = array('stable' => '-n/a-');
                        }
                    } else {
                        
$ret[$package] = array('stable' => $latest);
                    }

                    continue;
                }

                
// list-all command
                
if (!isset($unstable)) {
                    
$unstable false;
                    
$state 'stable';
                    if (isset(
$stable)) {
                        
$latest $unstable $stable;
                    }
                } else {
                    
$latest $unstable;
                }

                if (!isset(
$latest)) {
                    
$latest false;
                }

                
$deps = array();
                if (
$latest && isset($packageinfo['deps'])) {
                    if (!
is_array($packageinfo['deps']) ||
                          !isset(
$packageinfo['deps'][0])
                    ) {
                        
$packageinfo['deps'] = array($packageinfo['deps']);
                    }

                    
$d false;
                    foreach (
$packageinfo['deps'] as $dep) {
                        if (
$dep['v'] == $latest) {
                            
$d unserialize($dep['d']);
                        }
                    }

                    if (
$d) {
                        if (isset(
$d['required'])) {
                            if (!
class_exists('PEAR_PackageFile_v2')) {
                                require_once 
'PEAR/PackageFile/v2.php';
                            }

                            if (!isset(
$pf)) {
                                
$pf = new PEAR_PackageFile_v2;
                            }

                            
$pf->setDeps($d);
                            
$tdeps $pf->getDeps();
                        } else {
                            
$tdeps $d;
                        }

                        foreach (
$tdeps as $dep) {
                            if (
$dep['type'] !== 'pkg') {
                                continue;
                            }

                            
$deps[] = $dep;
                        }
                    }
                }

                
$info = array(
                    
'stable'      => $latest,
                    
'summary'     => $info['s'],
                    
'description' => $info['d'],
                    
'deps'        => $deps,
                    
'category'    => $info['ca']['_content'],
                    
'unstable'    => $unstable,
                    
'state'       => $state
                
);
                
$ret[$package] = $info;
            }
        }

        
PEAR::popErrorHandling();
        return 
$ret;
    }

    
/**
     * List all categories of a REST server
     *
     * @param string $base base URL of the server
     * @return array of categorynames
     */
    
function listCategories($base$channel false)
    {
        
$categorylist $this->_rest->retrieveData($base 'c/categories.xml'falsefalse$channel);
        if (
PEAR::isError($categorylist)) {
            return 
$categorylist;
        }

        if (!
is_array($categorylist) || !isset($categorylist['c'])) {
            return array();
        }

        if (isset(
$categorylist['c']['_content'])) {
            
// only 1 category
            
$categorylist['c'] = array($categorylist['c']);
        }

        return 
$categorylist['c'];
    }

    
/**
     * List packages in a category of a REST server
     *
     * @param string $base base URL of the server
     * @param string $category name of the category
     * @param boolean $info also download full package info
     * @return array of packagenames
     */
    
function listCategory($base$category$info false$channel false)
    {
        if (
$info == false) {
            
$url '%s'.'c/%s/packages.xml';
        } else {
            
$url '%s'.'c/%s/packagesinfo.xml';
        }
        
$url sprintf($url,
                    
$base,
                    
urlencode($category));

        
// gives '404 Not Found' error when category doesn't exist
        
$packagelist $this->_rest->retrieveData($urlfalsefalse$channel);
        if (
PEAR::isError($packagelist)) {
            return 
$packagelist;
        }
        if (!
is_array($packagelist)) {
            return array();
        }

        if (
$info == false) {
            if (!isset(
$packagelist['p'])) {
                return array();
            }
            if (!
is_array($packagelist['p']) ||
                !isset(
$packagelist['p'][0])) { // only 1 pkg
                
$packagelist = array($packagelist['p']);
            } else {
                
$packagelist $packagelist['p'];
            }
            return 
$packagelist;
        }

        
// info == true
        
if (!isset($packagelist['pi'])) {
            return array();
        }

        if (!
is_array($packagelist['pi']) ||
            !isset(
$packagelist['pi'][0])) { // only 1 pkg
            
$packagelist_pre = array($packagelist['pi']);
        } else {
            
$packagelist_pre $packagelist['pi'];
        }

        
$packagelist = array();
        foreach (
$packagelist_pre as $i => $item) {
            
// compatibility with r/<latest.txt>.xml
            
if (isset($item['a']['r'][0])) {
                
// multiple releases
                
$item['p']['v'] = $item['a']['r'][0]['v'];
                
$item['p']['st'] = $item['a']['r'][0]['s'];
            } elseif (isset(
$item['a'])) {
                
// first and only release
                
$item['p']['v'] = $item['a']['r']['v'];
                
$item['p']['st'] = $item['a']['r']['s'];
            }

            
$packagelist[$i] = array('attribs' => $item['p']['r'],
                                     
'_content' => $item['p']['n'],
                                     
'info' => $item['p']);
        }

        return 
$packagelist;
    }

    
/**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    
function betterStates($state$include false)
    {
        static 
$states = array('snapshot''devel''alpha''beta''stable');
        
$i array_search($state$states);
        if (
$i === false) {
            return 
false;
        }
        if (
$include) {
            
$i--;
        }
        return 
array_slice($states$i 1);
    }
}
?>
Онлайн: 0
Реклама