downloader.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 1,643 行 · 第 1/5 页

PHP
1,643
字号
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {            $rest = &$this->config->getREST('1.0', $this->_options);            $url = $rest->getDepDownloadURL($base, $xsdversion, $dep, $parr,                    $state, $version);            if (PEAR::isError($url)) {                return $url;            }            if ($parr['channel'] != $curchannel) {                $this->configSet('default_channel', $curchannel);            }            if (!is_array($url)) {                return $url;            }            $url['raw'] = false; // no checking is necessary for REST            if (!is_array($url['info'])) {                return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' .                    'this should never happen');            }            if (isset($url['info']['required'])) {                if (!class_exists('PEAR_PackageFile_v2')) {                    require_once 'PEAR/PackageFile/v2.php';                }                $pf = new PEAR_PackageFile_v2;                $pf->setRawChannel($remotechannel);            } else {                if (!class_exists('PEAR_PackageFile_v1')) {                    require_once 'PEAR/PackageFile/v1.php';                }                $pf = new PEAR_PackageFile_v1;            }            $pf->setRawPackage($url['package']);            $pf->setDeps($url['info']);            if ($url['compatible']) {                $pf->setCompatible($url['compatible']);            }            $pf->setRawState($url['stability']);            $url['info'] = &$pf;            if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {                $ext = '.tar';            } else {                $ext = '.tgz';            }            if (is_array($url)) {                if (isset($url['url'])) {                    $url['url'] .= $ext;                }            }            return $url;        } elseif ($chan->supports('xmlrpc', 'package.getDepDownloadURL', false, '1.1')) {            if ($version) {                $url = $this->_remote->call('package.getDepDownloadURL', $xsdversion, $dep, $parr,                    $state, $version);            } else {                $url = $this->_remote->call('package.getDepDownloadURL', $xsdversion, $dep, $parr,                    $state);            }        } else {            $url = $this->_remote->call('package.getDepDownloadURL', $xsdversion, $dep, $parr, $state);        }        if ($this->config->get('default_channel') != $curchannel) {            $this->configSet('default_channel', $curchannel);        }        if (!is_array($url)) {            return $url;        }        if (isset($url['__PEAR_ERROR_CLASS__'])) {            return PEAR::raiseError($url['message']);        }        $url['raw'] = $url['info'];        $pkg = &$this->getPackagefileObject($this->config, $this->debug);        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);        $pinfo = &$pkg->fromXmlString($url['info'], PEAR_VALIDATE_DOWNLOADING, 'remote');        PEAR::staticPopErrorHandling();        if (PEAR::isError($pinfo)) {            if (!isset($this->_options['soft'])) {                $this->log(0, $pinfo->getMessage());            }            return PEAR::raiseError('Remote package.xml is not valid - this should never happen');        }        $url['info'] = &$pinfo;        if (is_array($url)) {            if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {                $ext = '.tar';            } else {                $ext = '.tgz';            }            if (isset($url['url'])) {                $url['url'] .= $ext;            }        }        return $url;    }    // }}}    // {{{ getPackageDownloadUrl()    /**     * @deprecated in favor of _getPackageDownloadUrl     */    function getPackageDownloadUrl($package, $version = null, $channel = false)    {        if ($version) {            $package .= "-$version";        }        if ($this === null || $this->_registry === null) {            $package = "http://pear.php.net/get/$package";        } else {            $chan = $this->_registry->getChannel($channel);            if (PEAR::isError($chan)) {                return '';            }            $package = "http://" . $chan->getServer() . "/get/$package";        }        if (!extension_loaded("zlib")) {            $package .= '?uncompress=yes';        }        return $package;    }    // }}}    // {{{ getDownloadedPackages()    /**     * Retrieve a list of downloaded packages after a call to {@link download()}.     *     * Also resets the list of downloaded packages.     * @return array     */    function getDownloadedPackages()    {        $ret = $this->_downloadedPackages;        $this->_downloadedPackages = array();        $this->_toDownload = array();        return $ret;    }    // }}}    // {{{ _downloadCallback()    function _downloadCallback($msg, $params = null)    {        switch ($msg) {            case 'saveas':                $this->log(1, "downloading $params ...");                break;            case 'done':                $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes');                break;            case 'bytesread':                static $bytes;                if (empty($bytes)) {                    $bytes = 0;                }                if (!($bytes % 10240)) {                    $this->log(1, '.', false);                }                $bytes += $params;                break;            case 'start':                if($params[1] == -1) {                    $length = "Unknown size";                } else {                    $length = number_format($params[1], 0, '', ',')." bytes";                }                $this->log(1, "Starting to download {$params[0]} ($length)");                break;        }        if (method_exists($this->ui, '_downloadCallback'))            $this->ui->_downloadCallback($msg, $params);    }    // }}}    // {{{ _prependPath($path, $prepend)    function _prependPath($path, $prepend)    {        if (strlen($prepend) > 0) {            if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) {                if (preg_match('/^[a-z]:/i', $prepend)) {                    $prepend = substr($prepend, 2);                } elseif ($prepend{0} != '\\') {                    $prepend = "\\$prepend";                }                $path = substr($path, 0, 2) . $prepend . substr($path, 2);            } else {                $path = $prepend . $path;            }        }        return $path;    }    // }}}    // {{{ pushError($errmsg, $code)    /**     * @param string     * @param integer     */    function pushError($errmsg, $code = -1)    {        array_push($this->_errorStack, array($errmsg, $code));    }    // }}}    // {{{ getErrorMsgs()    function getErrorMsgs()    {        $msgs = array();        $errs = $this->_errorStack;        foreach ($errs as $err) {            $msgs[] = $err[0];        }        $this->_errorStack = array();        return $msgs;    }    // }}}    /**     * for BC     */    function sortPkgDeps(&$packages, $uninstall = false)    {        $uninstall ?             $this->sortPackagesForUninstall($packages) :            $this->sortPackagesForInstall($packages);    }    /**     * Sort a list of arrays of array(downloaded packagefilename) by dependency.     *     * This uses the topological sort method from graph theory, and the     * Structures_Graph package to properly sort dependencies for installation.     * @param array an array of downloaded PEAR_Downloader_Packages     * @return array array of array(packagefilename, package.xml contents)     */    function sortPackagesForInstall(&$packages)    {        require_once 'Structures/Graph.php';        require_once 'Structures/Graph/Node.php';        require_once 'Structures/Graph/Manipulator/TopologicalSorter.php';        $depgraph = new Structures_Graph(true);        $nodes = array();        $reg = &$this->config->getRegistry();        foreach ($packages as $i => $package) {            $pname = $reg->parsedPackageNameToString(                array(                    'channel' => $package->getChannel(),                    'package' => strtolower($package->getPackage()),                ));            $nodes[$pname] = new Structures_Graph_Node;            $nodes[$pname]->setData($packages[$i]);            $depgraph->addNode($nodes[$pname]);        }        $deplinks = array();        foreach ($nodes as $package => $node) {            $pf = &$node->getData();            $pdeps = $pf->getDeps(true);            if (!$pdeps) {                continue;            }            if ($pf->getPackagexmlVersion() == '1.0') {                foreach ($pdeps as $dep) {                    if ($dep['type'] != 'pkg' ||                          (isset($dep['optional']) && $dep['optional'] == 'yes')) {                        continue;                    }                    $dname = $reg->parsedPackageNameToString(                          array(                              'channel' => 'pear.php.net',                              'package' => strtolower($dep['name']),                          ));                    if (isset($nodes[$dname]))                    {                        if (!isset($deplinks[$dname])) {                            $deplinks[$dname] = array();                        }                        $deplinks[$dname][$package] = 1;                        // dependency is in installed packages                        continue;                    }                    $dname = $reg->parsedPackageNameToString(                          array(                              'channel' => 'pecl.php.net',                              'package' => strtolower($dep['name']),                          ));                    if (isset($nodes[$dname]))                    {                        if (!isset($deplinks[$dname])) {                            $deplinks[$dname] = array();                        }                        $deplinks[$dname][$package] = 1;                        // dependency is in installed packages                        continue;                    }                }            } else {                // the only ordering we care about is:                // 1) subpackages must be installed before packages that depend on them                // 2) required deps must be installed before packages that depend on them                if (isset($pdeps['required']['subpackage'])) {                    $t = $pdeps['required']['subpackage'];                    if (!isset($t[0])) {                        $t = array($t);                    }                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);                }                if (isset($pdeps['group'])) {                    if (!isset($pdeps['group'][0])) {                        $pdeps['group'] = array($pdeps['group']);                    }                    foreach ($pdeps['group'] as $group) {                        if (isset($group['subpackage'])) {                            $t = $group['subpackage'];                            if (!isset($t[0])) {                                $t = array($t);                            }                            $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);                        }                    }                }                if (isset($pdeps['optional']['subpackage'])) {                    $t = $pdeps['optional']['subpackage'];                    if (!isset($t[0])) {                        $t = array($t);                    }                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);                }                if (isset($pdeps['required']['package'])) {                    $t = $pdeps['required']['package'];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?