mirror of
https://github.com/friendica/friendica
synced 2025-12-06 05:57:09 +01:00
Add Text_Highlighter to Composer
- Fixes critical mistake in boot.php regarding set_include_path - Fixes minor mistake in text.php regarding strpos order of arguments Note: This change significantly increases Composer running time because Text_Highlither is a PEAR package. I'm already planning to replace it with scrivo/highlight.php.
This commit is contained in:
parent
6494d05dde
commit
1ab28bbe03
176 changed files with 52674 additions and 489 deletions
4
boot.php
4
boot.php
|
|
@ -646,12 +646,12 @@ class App {
|
|||
startup();
|
||||
|
||||
set_include_path(
|
||||
'include' . PATH_SEPARATOR
|
||||
get_include_path() . PATH_SEPARATOR
|
||||
. 'include' . PATH_SEPARATOR
|
||||
. 'library' . PATH_SEPARATOR
|
||||
. 'library/langdet' . PATH_SEPARATOR
|
||||
. '.' );
|
||||
|
||||
|
||||
$this->scheme = 'http';
|
||||
|
||||
if ((x($_SERVER, 'HTTPS') && $_SERVER['HTTPS']) ||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,15 @@
|
|||
},
|
||||
"require": {
|
||||
"ezyang/htmlpurifier": "~4.7.0",
|
||||
"mobiledetect/mobiledetectlib": "2.8.*"
|
||||
"mobiledetect/mobiledetectlib": "2.8.*",
|
||||
"pear-pear.php.net/Text_Highlighter": "*"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "pear",
|
||||
"url": "https://pear.php.net"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Friendica\\": "src/"
|
||||
|
|
|
|||
220
composer.lock
generated
220
composer.lock
generated
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "49b00f1ed3192e5173bd5577a3b91ba2",
|
||||
"content-hash": "4d3a9e742e7ad746fb7206f3b5aff5af",
|
||||
"packages": [
|
||||
{
|
||||
"name": "ezyang/htmlpurifier",
|
||||
|
|
@ -101,6 +101,224 @@
|
|||
"php mobile detect"
|
||||
],
|
||||
"time": "2017-03-29T13:59:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Archive_Tar",
|
||||
"version": "1.4.2",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Archive_Tar-1.4.2.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/archive_tar": "== 1.4.2.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"New BSD License"
|
||||
],
|
||||
"description": "This class provides handling of tar files in PHP.\nIt supports creating, listing, extracting and adding to tar files.\nGzip support is available if PHP has the zlib extension built-in or\nloaded. Bz2 compression is also supported with the bz2 extension loaded."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Console_Getopt",
|
||||
"version": "1.4.1",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Console_Getopt-1.4.1.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/console_getopt": "== 1.4.1.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD-2-Clause"
|
||||
],
|
||||
"description": "This is a PHP implementation of \"getopt\" supporting both\nshort and long options."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/PEAR",
|
||||
"version": "1.10.3",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/PEAR-1.10.3.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"ext-pcre": "*",
|
||||
"ext-xml": "*",
|
||||
"pear-pear.php.net/archive_tar": ">=1.4.0.0",
|
||||
"pear-pear.php.net/console_getopt": ">=1.4.1.0",
|
||||
"pear-pear.php.net/structures_graph": ">=1.1.0.0",
|
||||
"pear-pear.php.net/xml_util": ">=1.3.0.0",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"conflict": {
|
||||
"pear-pear.php.net/pear_frontend_gtk": "<0.4.0.0",
|
||||
"pear-pear.php.net/pear_frontend_web": "<=0.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/pear": "== 1.10.3.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"New BSD License"
|
||||
],
|
||||
"description": "The PEAR package contains:\n * the PEAR installer, for creating, distributing\n and installing packages\n * the PEAR_Exception PHP5 error handling mechanism\n * the PEAR_ErrorStack advanced error handling mechanism\n * the PEAR_Error error handling mechanism\n * the OS_Guess class for retrieving info about the OS\n where PHP is running on\n * the System class for quick handling of common operations\n with files and directories\n * the PEAR base class\n Features in a nutshell:\n * full support for channels\n * pre-download dependency validation\n * new package.xml 2.0 format allows tremendous flexibility while maintaining BC\n * support for optional dependency groups and limited support for sub-packaging\n * robust dependency support\n * full dependency validation on uninstall\n * remote install for hosts with only ftp access - no more problems with\n restricted host installation\n * full support for mirroring\n * support for bundling several packages into a single tarball\n * support for static dependencies on a url-based package\n * support for custom file roles and installation tasks"
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Structures_Graph",
|
||||
"version": "1.1.1",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Structures_Graph-1.1.1.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/structures_graph": "== 1.1.1.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"LGPL-3.0+"
|
||||
],
|
||||
"description": "Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed\nand undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing\nas well as for characteristic extraction from the graph topology."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Text_Highlighter",
|
||||
"version": "0.8.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Text_Highlighter-0.8.0.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"pear-pear.php.net/console_getopt": ">=1.4.1.0",
|
||||
"pear-pear.php.net/pear": ">=1.10.3.0",
|
||||
"pear-pear.php.net/xml_parser": ">=1.3.7.0",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/text_highlighter": "== 0.8.0.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"PHP License"
|
||||
],
|
||||
"description": "Text_Highlighter is a package for syntax highlighting.\n\nIt provides a base class provining all the functionality,\nand a descendent classes geneator class.\n\nThe main idea is to simplify creation of subclasses\nimplementing syntax highlighting for particular language.\nSubclasses do not implement any new functioanality,\nthey just provide syntax highlighting rules.\nThe rules sources are in XML format.\n\nTo create a highlighter for a language, there is no need\nto code a new class manually. Simply describe the rules\nin XML file and use Text_Highlighter_Generator to create\na new class."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/XML_Parser",
|
||||
"version": "1.3.7",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/XML_Parser-1.3.7.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"pear-pear.php.net/pear": "*",
|
||||
"php": ">=4.2.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/xml_parser": "== 1.3.7.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD License"
|
||||
],
|
||||
"description": "This is an XML parser based on PHPs built-in xml extension.\nIt supports two basic modes of operation: \"func\" and \"event\". In \"func\" mode, it will look for a function named after each element (xmltag_ELEMENT for start tags and xmltag_ELEMENT_ for end tags), and in \"event\" mode it uses a set of generic callbacks.\n\nSince version 1.2.0 there's a new XML_Parser_Simple class that makes parsing of most XML documents easier, by automatically providing a stack for the elements.\nFurthermore its now possible to split the parser from the handler object, so you do not have to extend XML_Parser anymore in order to parse a document with it."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/XML_Util",
|
||||
"version": "1.4.2",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/XML_Util-1.4.2.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"ext-pcre": "*",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/xml_util": "== 1.4.2.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD License"
|
||||
],
|
||||
"description": "Selection of methods that are often needed when working with XML documents. Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more."
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
|
|
|||
|
|
@ -2125,47 +2125,48 @@ function format_network_name($network, $url = 0) {
|
|||
* @param string $lang Programming language
|
||||
* @return string Formated html
|
||||
*/
|
||||
function text_highlight($s,$lang) {
|
||||
if($lang === 'js')
|
||||
function text_highlight($s, $lang) {
|
||||
if ($lang === 'js') {
|
||||
$lang = 'javascript';
|
||||
|
||||
if(! strpos('Text_Highlighter',get_include_path())) {
|
||||
set_include_path(get_include_path() . PATH_SEPARATOR . 'library/Text_Highlighter');
|
||||
}
|
||||
|
||||
require_once('library/Text_Highlighter/Text/Highlighter.php');
|
||||
require_once('library/Text_Highlighter/Text/Highlighter/Renderer/Html.php');
|
||||
// @TODO: Replace Text_Highlighter_Renderer_Html by scrivo/highlight.php
|
||||
|
||||
// Autoload the library to make constants available
|
||||
class_exists('Text_Highlighter_Renderer_Html');
|
||||
|
||||
$options = array(
|
||||
'numbers' => HL_NUMBERS_LI,
|
||||
'tabsize' => 4,
|
||||
);
|
||||
);
|
||||
|
||||
$tag_added = false;
|
||||
$s = trim(html_entity_decode($s,ENT_COMPAT));
|
||||
$s = str_replace(" ","\t",$s);
|
||||
$s = trim(html_entity_decode($s, ENT_COMPAT));
|
||||
$s = str_replace(' ', "\t", $s);
|
||||
|
||||
// The highlighter library insists on an opening php tag for php code blocks. If
|
||||
// it isn't present, nothing is highlighted. So we're going to see if it's present.
|
||||
// If not, we'll add it, and then quietly remove it after we get the processed output back.
|
||||
|
||||
if($lang === 'php') {
|
||||
if(strpos('<?php',$s) !== 0) {
|
||||
if ($lang === 'php') {
|
||||
if (strpos($s, '<?php') !== 0) {
|
||||
$s = '<?php' . "\n" . $s;
|
||||
$tag_added = true;
|
||||
}
|
||||
}
|
||||
|
||||
$renderer = new Text_Highlighter_Renderer_HTML($options);
|
||||
$renderer = new Text_Highlighter_Renderer_Html($options);
|
||||
$hl = Text_Highlighter::factory($lang);
|
||||
$hl->setRenderer($renderer);
|
||||
$o = $hl->highlight($s);
|
||||
$o = str_replace([" ","\n"],[" ",''],$o);
|
||||
$o = str_replace("\n", '', $o);
|
||||
|
||||
if($tag_added) {
|
||||
$b = substr($o,0,strpos($o,'<li>'));
|
||||
$e = substr($o,strpos($o,'</li>'));
|
||||
|
||||
if ($tag_added) {
|
||||
$b = substr($o, 0, strpos($o, '<li>'));
|
||||
$e = substr($o, strpos($o, '</li>'));
|
||||
$o = $b . $e;
|
||||
}
|
||||
|
||||
return('<code>' . $o . '</code>');
|
||||
return '<code>' . $o . '</code>';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,455 +0,0 @@
|
|||
# $Id$
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
Text_Highlighter is a class for syntax highlighting. The main idea is to
|
||||
simplify creation of subclasses implementing syntax highlighting for
|
||||
particular language. Subclasses do not implement any new functioanality, they
|
||||
just provide syntax highlighting rules. The rules sources are in XML format.
|
||||
To create a highlighter for a language, there is no need to code a new class
|
||||
manually. Simply describe the rules in XML file and use Text_Highlighter_Generator
|
||||
to create a new class.
|
||||
|
||||
|
||||
This document does not contain a formal description of API - it is very
|
||||
simple, and I believe providing some examples of code is sufficient.
|
||||
|
||||
|
||||
Highlighter XML source
|
||||
======================
|
||||
|
||||
Basics
|
||||
------
|
||||
|
||||
Creating a new syntax highlighter begins with describing the highlighting
|
||||
rules. There are two basic elements: block and region. A block is just a
|
||||
portion of text matching a regular expression and highlighted with a single
|
||||
color. Keyword is an example of a block. A region is defined by two regular
|
||||
expressions: one for start of region, and another for the end. The main
|
||||
difference from a block is that a region can contain blocks and regions
|
||||
(including same-named regions). An example of a region is a group of
|
||||
statements enclosed in curly brackets (this is used in many languages, for
|
||||
example PHP and C). Also, characters matching start and end of a region may be
|
||||
highlighted with their own color, and region contents with another.
|
||||
|
||||
Blocks and regions may be declared as contained. Contained blocks and regions
|
||||
can only appear inside regions. If a region or a block is not declared as
|
||||
contained, it can appear both on top level and inside regions. Block or region
|
||||
declared as not-contained can only appear on top level.
|
||||
|
||||
For any region, a list of blocks and regions that can appear inside this
|
||||
region can be specified.
|
||||
|
||||
In this document, the term "color group" is used. Chunks of text assigned to
|
||||
same color group will be highlighted with same color. Note that in versions
|
||||
prior 0.5.0 color goups were refered as CSS classes, but since 0.5.0 not only
|
||||
HTML output is supported, so "color group" is more appropriate term.
|
||||
|
||||
Elements
|
||||
--------
|
||||
|
||||
The toplevel element is <highlight>. Attribute lang is required and denotes
|
||||
the name of the language. Its value is used as a part of generated class name,
|
||||
and must only contain letters, digits and underscores. Optional attribute
|
||||
case, when given value yes, makes the language case sensitive (default is case
|
||||
insensitive). Allowed subelements are:
|
||||
|
||||
* <authors>: Information about the authors of the file.
|
||||
<author>: Information about a single author of the file. (May be used
|
||||
multiple times, one per author.)
|
||||
- name="...": Author's name. Required.
|
||||
- email="...": Author's email address. Optional.
|
||||
|
||||
* <default>: Default color group.
|
||||
- innerGroup="...": color group name. Required.
|
||||
|
||||
* <region>: Region definition
|
||||
- name="...": Region name. Required.
|
||||
- innerGroup="...": Default color group of region contents. Required.
|
||||
- delimGroup="...": color group of start and end of region. Optional,
|
||||
defaults to value of innerGroup attribute.
|
||||
- start="...", end="...": Regular expression matching start and end
|
||||
of region. Required. Regular expression delimiters are optional, but
|
||||
if you need to specify delimiter, use /. The only case when the
|
||||
delimiters are needed, is specifying regular expression modifiers,
|
||||
such as m or U. Examples: \/\* or /$/m.
|
||||
- contained="yes": Marks region as contained.
|
||||
- never-contained="yes": Marks region as not-contained.
|
||||
- <contains>: Elements allowed inside this region.
|
||||
- all="yes" Region can contain any other region or block
|
||||
(except not-contained). May be used multiple times.
|
||||
- <but> Do not allow certain regions or blocks.
|
||||
- region="..." Name of region not allowed within
|
||||
current region.
|
||||
- block="..." Name of block not allowed within
|
||||
current region.
|
||||
- region="..." Name of region allowed within current region.
|
||||
- block="..." Name of block allowed within current region.
|
||||
- <onlyin> Only allow this region within certain regions. May be
|
||||
used multiple times.
|
||||
- block="..." Name of parent region
|
||||
|
||||
* <block>: Block definition
|
||||
- name="...": Block name. Required.
|
||||
- innerGroup="...": color group of block contents. Optional. If not
|
||||
specified, color group of parent region or default color group will be
|
||||
used. One would only want to omit this attribute if there are
|
||||
keyword groups (see below) inherited from this block, and no special
|
||||
highlighting should apply when the block does not match the keyword.
|
||||
- match="..." Regular expression matching the block. Required.
|
||||
Regular expression delimiters are optional, but if you need to
|
||||
specify delimiter, use /. The only case when the delimiters are
|
||||
needed, is specifying regular expression modifiers, such as m or U.
|
||||
Examples: #|\/\/ or /$/m.
|
||||
- contained="yes": Marks block as contained.
|
||||
- never-contained="yes": Marks block as not-contained.
|
||||
- <onlyin> Only allow this block within certain regions. May be used
|
||||
multiple times.
|
||||
- block="..." Name of parent region
|
||||
- multiline="yes": Marks block as multi-line. By default, whole
|
||||
blocks are assumed to reside in a single line. This make the things
|
||||
faster. If you need to declare a multi-line block, use this
|
||||
attribute.
|
||||
- <partgroup>: Assigns another color group to a part of the block that
|
||||
matched a subpattern.
|
||||
- index="n": Subpattern index. Required.
|
||||
- innerGroup="...": color group name. Required.
|
||||
|
||||
This is an example from CSS highlighter: the measure is matched as
|
||||
a whole, but the measurement units are highlighted with different
|
||||
color.
|
||||
|
||||
<block name="measure" match="\d*\.?\d+(\%|em|ex|pc|pt|px|in|mm|cm)"
|
||||
innerGroup="number" contained="yes">
|
||||
<onlyin region="property"/>
|
||||
<partGroup index="1" innerGroup="string" />
|
||||
</block>
|
||||
|
||||
* <keywords>: Keyword group definition. Keyword groups are useful when you
|
||||
want to highlight some words that match a condition for a block with a
|
||||
different color. Keywords are defined with literal match, not regular
|
||||
expressions. For example, you have a block named identifier matching a
|
||||
general identifier, and want to highlight reserved words (which match
|
||||
this block as well) with different color. You inherit a keyword group
|
||||
"reserved" from "identifier" block.
|
||||
- name="...": Keyword group. Required.
|
||||
- ifdef="...", ifndef="..." : Conditional declaration. See
|
||||
"Conditions" below.
|
||||
- inherits="...": Inherited block name. Required.
|
||||
- innerGroup="...": color group of keyword group. Required.
|
||||
- case="yes|no": Overrides case-sensitivity of the language.
|
||||
Optional, defaults to global value.
|
||||
- <keyword>: Single keyword definition.
|
||||
- match="..." The keyword. Note: this is not a regular
|
||||
expression, but literal match (possibly case insensitive).
|
||||
|
||||
Note that for BC reasons element partClass is alias for partGroup, and
|
||||
attributes innerClass and delimClass are aliases of innerGroup and
|
||||
delimGroup, respectively.
|
||||
|
||||
|
||||
Conditions
|
||||
----------
|
||||
|
||||
Conditional declarations allow enabling or disabling certain highlighting
|
||||
rules at runtime. For example, Java highlighter has a very big list of
|
||||
keywords matching Java standard classes. Finding a match in this list can take
|
||||
much time. For that reason, corresponding keyword group is declared with
|
||||
"ifdef" attribute :
|
||||
|
||||
<keywords name="builtin" inherits="identifier" innerClass="builtin"
|
||||
case="yes" ifdef="java.builtins">
|
||||
<keyword match="AbstractAction" />
|
||||
<keyword match="AbstractBorder" />
|
||||
<keyword match="AbstractButton" />
|
||||
...
|
||||
...
|
||||
<keyword match="_Remote_Stub" />
|
||||
<keyword match="_ServantActivatorStub" />
|
||||
<keyword match="_ServantLocatorStub" />
|
||||
</keywords>
|
||||
|
||||
This keyword group will be only enabled when "java.builtins" is passed as an
|
||||
element of "defines" option:
|
||||
|
||||
$options = array(
|
||||
'defines' => array(
|
||||
'java.builtins',
|
||||
),
|
||||
'numbers' => HL_NUMBERS_TABLE,
|
||||
);
|
||||
$highlighter = Text_Highlighter::factory('java', $options);
|
||||
|
||||
"ifndef" attribute has reverse meaning.
|
||||
|
||||
Currently, "ifdef" and "ifndef" attributes are only supported for <keywords>
|
||||
tag.
|
||||
|
||||
|
||||
|
||||
Class generation
|
||||
================
|
||||
|
||||
Creating XML description of highlighting rules is the most complicated part of
|
||||
the process. To generate the class, you need just few lines of code:
|
||||
|
||||
<?php
|
||||
require_once 'Text/Highlighter/Generator.php';
|
||||
$generator = new Text_Highlighter_Generator('php.xml');
|
||||
$generator->generate();
|
||||
$generator->saveCode('PHP.php');
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Command-line class generation tool
|
||||
==================================
|
||||
|
||||
Example from previous section looks pretty simple, but it does not handle any
|
||||
errors which may occur during parsing of XML source. The package provides a
|
||||
command-line script to make generation of classes even more simple, and takes
|
||||
care of possible errors. It is called generate (on Unix/Linux) or generate.bat
|
||||
(on Windows). This script is able to process multiple files in one run, and
|
||||
also to process XML from standard input and write generated code to standard
|
||||
output.
|
||||
|
||||
Usage:
|
||||
generate options
|
||||
|
||||
Options:
|
||||
-x filename, --xml=filename
|
||||
source XML file. Multiple input files can be specified, in which
|
||||
case each -x option must be followed by -p unless -d is specified
|
||||
Defaults to stdin
|
||||
-p filename, --php=filename
|
||||
destination PHP file. Defaults to stdout. If specied multiple times,
|
||||
each -p must follow -x
|
||||
-d dirname, --dir=dirname
|
||||
Default destination directory. File names will be taken from XML input
|
||||
("lang" attribute of <highlight> tag)
|
||||
-h, --help
|
||||
This help
|
||||
|
||||
Examples
|
||||
|
||||
Read from php.xml, write to PHP.php
|
||||
|
||||
generate -x php.xml -p PHP.php
|
||||
|
||||
Read from php.xml, write to standard output
|
||||
|
||||
generate -x php.xml
|
||||
|
||||
Read from php.xml, write to PHP.php, read from xml.xml, write to XML.php
|
||||
|
||||
generate -x php.xml -p PHP.php -x xml.xml -p XML.php
|
||||
|
||||
Read from php.xml, write to /some/dir/PHP.php, read from xml.xml, write to
|
||||
/some/dir/XML.php (assuming that xml.xml contains <highlight lang="xml">, and
|
||||
php.xml contains <highlight lang="php">)
|
||||
|
||||
generate -x php.xml -x xml.xml -d /some/dir/
|
||||
|
||||
|
||||
|
||||
Renderers
|
||||
=========
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
Text_Highlighter supports renderes. Using renderers, you can get output in
|
||||
different formats. Two renderers are included in the package:
|
||||
|
||||
- HTML renderer. Generates HTML output. A style sheet should be linked to
|
||||
the document to display colored text
|
||||
|
||||
- Console renderer. Can be used to output highlighted text to
|
||||
color-capable terminals, either directly or trough less -r
|
||||
|
||||
|
||||
Renderers API
|
||||
-------------
|
||||
|
||||
Renderers are subclasses of Text_Highlighter_Renderer. Renderer should
|
||||
override at least two methods - acceptToken and getOutput. Overriding other
|
||||
methods is optional, depending on the nature of renderer's output and details
|
||||
of implementation.
|
||||
|
||||
string reset()
|
||||
resets renderer state. This method is called every time before a new
|
||||
source file is highlighted.
|
||||
|
||||
string preprocess(string $code)
|
||||
preprocesses code. Can be used, for example, to normalize whitespace
|
||||
before highlighting. Returns preprocessed string.
|
||||
|
||||
void acceptToken(string $group, string $content)
|
||||
the core method of the renderer. Highlighter passes chunks of text to
|
||||
this method in $content, and color group in $group
|
||||
|
||||
void finalize()
|
||||
signals the renderer that no more tokens are available.
|
||||
|
||||
mixed getOutput()
|
||||
returns generated output.
|
||||
|
||||
|
||||
Setting renderer options
|
||||
--------------------------------
|
||||
|
||||
Renderers accept an optional argument to their constructor - options array.
|
||||
Elements of this array are renderer-specific.
|
||||
|
||||
HTML renderer
|
||||
-------------
|
||||
|
||||
HTML renderer produces HTML output with optional line numbering. The renderer
|
||||
itself does not provide information about actual colors of highlighted text.
|
||||
Instead, <span class="hl-XXX"> is used, where XXX is replaced with color group
|
||||
name (hl-var, hl-string, etc.). It is up to you to create a CSS stylesheet.
|
||||
If 'use_language' option with value evaluating to true was passed, class names
|
||||
will be formatted as "LANG-hl-XXX", where LANG is language name as defined in
|
||||
highlighter XML source ("lang" attribute of <highlight> tag) in lower case.
|
||||
|
||||
There are 3 special CSS classes:
|
||||
|
||||
hl-main - this class applies to whole output or right table column,
|
||||
depending on 'numbers' option
|
||||
hl-gutter - applies to left column in table
|
||||
hl-table - applies to whole table
|
||||
|
||||
HTML renderer accepts following options (each being optional):
|
||||
|
||||
* numbers - line numbering style.
|
||||
0 - no numbering (default)
|
||||
HL_NUMBERS_LI - use <ol></ol> for line numbering
|
||||
HL_NUMBERS_TABLE - create a 2-column table, with line numbers in left
|
||||
column and highlighted text in right column
|
||||
|
||||
* tabsize - tabulation size. Defaults to 4
|
||||
|
||||
Example:
|
||||
|
||||
require_once 'Text/Highlighter/Renderer/Html.php';
|
||||
$options = array(
|
||||
'numbers' => HL_NUMBERS_LI,
|
||||
'tabsize' => 8,
|
||||
);
|
||||
$renderer = new Text_Highlighter_Renderer_HTML($options);
|
||||
|
||||
Console renderer
|
||||
----------------
|
||||
|
||||
Console renderer produces output for displaying on a color-capable terminal,
|
||||
either directly or through less -r, using ANSI escape sequences. By default,
|
||||
this renderer only highlights most common color groups. Additional colors
|
||||
can be specified using 'colors' option. This renderer also accepts 'numbers'
|
||||
option - a boolean value, and 'tabsize' option.
|
||||
|
||||
Example :
|
||||
|
||||
require_once 'Text/Highlighter/Renderer/Console.php';
|
||||
$colors = array(
|
||||
'prepro' => "\033[35m",
|
||||
'types' => "\033[32m",
|
||||
);
|
||||
$options = array(
|
||||
'numbers' => true,
|
||||
'tabsize' => 8,
|
||||
'colors' => $colors,
|
||||
);
|
||||
$renderer = new Text_Highlighter_Renderer_Console($options);
|
||||
|
||||
|
||||
ANSI color escape sequences have the following format:
|
||||
|
||||
ESC[#;#;....;#m
|
||||
|
||||
where ESC is character with ASCII code 27 (033 octal, 0x1B hexadecimal). # is
|
||||
one of the following:
|
||||
|
||||
0 for normal display
|
||||
1 for bold on
|
||||
4 underline (mono only)
|
||||
5 blink on
|
||||
7 reverse video on
|
||||
8 nondisplayed (invisible)
|
||||
30 black foreground
|
||||
31 red foreground
|
||||
32 green foreground
|
||||
33 yellow foreground
|
||||
34 blue foreground
|
||||
35 magenta foreground
|
||||
36 cyan foreground
|
||||
37 white foreground
|
||||
40 black background
|
||||
41 red background
|
||||
42 green background
|
||||
43 yellow background
|
||||
44 blue background
|
||||
45 magenta background
|
||||
46 cyan background
|
||||
47 white background
|
||||
|
||||
|
||||
How to use Text_Highlighter class
|
||||
=================================
|
||||
|
||||
Creating a highlighter object
|
||||
-----------------------------
|
||||
|
||||
To create a highlighter for a certain language, use Text_Highlighter::factory()
|
||||
static method:
|
||||
|
||||
require_once 'Text/Highlighter.php';
|
||||
$hl = Text_Highlighter::factory('php');
|
||||
|
||||
|
||||
Setting a renderer
|
||||
------------------
|
||||
|
||||
Actual output is produced by a renderer.
|
||||
|
||||
require_once 'Text/Highlighter.php';
|
||||
require_once 'Text/Highlighter/Renderer/Html.php';
|
||||
$options = array(
|
||||
'numbers' => HL_NUMBERS_LI,
|
||||
'tabsize' => 8,
|
||||
);
|
||||
$renderer = new Text_Highlighter_Renderer_HTML($options);
|
||||
$hl = Text_Highlighter::factory('php');
|
||||
$hl->setRenderer($renderer);
|
||||
|
||||
Note that for BC reasons, it is possible to use highlighter without setting a
|
||||
renderer. If no renderer is set, HTML renderer will be used by default. In
|
||||
this case, you should pass options as second parameter to factory method. The
|
||||
following example works exactly as previous one:
|
||||
|
||||
require_once 'Text/Highlighter.php';
|
||||
$options = array(
|
||||
'numbers' => HL_NUMBERS_LI,
|
||||
'tabsize' => 8,
|
||||
);
|
||||
$hl = Text_Highlighter::factory('php', $options);
|
||||
|
||||
|
||||
Getting output
|
||||
--------------
|
||||
|
||||
And finally, do the highlighting and get the output:
|
||||
|
||||
require_once 'Text/Highlighter.php';
|
||||
require_once 'Text/Highlighter/Renderer/Html.php';
|
||||
$options = array(
|
||||
'numbers' => HL_NUMBERS_LI,
|
||||
'tabsize' => 8,
|
||||
);
|
||||
$renderer = new Text_Highlighter_Renderer_HTML($options);
|
||||
$hl = Text_Highlighter::factory('php');
|
||||
$hl->setRenderer($renderer);
|
||||
$html = $hl->highlight(file_get_contents('example.php'));
|
||||
|
||||
# vim: set autoindent tabstop=4 shiftwidth=4 softtabstop=4 tw=78: */
|
||||
|
||||
15
vendor/bin/composer-php
vendored
Normal file
15
vendor/bin/composer-php
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env sh
|
||||
SRC_DIR=`pwd`
|
||||
BIN_DIR=`dirname $0`
|
||||
VENDOR_DIR=$BIN_DIR/"../"
|
||||
DIRS=""
|
||||
for vendor in $VENDOR_DIR/*; do
|
||||
if [ -d "$vendor" ]; then
|
||||
for package in $vendor/*; do
|
||||
if [ -d "$package" ]; then
|
||||
DIRS="${DIRS}:${package}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
php -d include_path=".$DIRS" $@
|
||||
11
vendor/bin/composer-php.bat
vendored
Normal file
11
vendor/bin/composer-php.bat
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
set BIN_DIR=%~dp0
|
||||
set VENDOR_DIR=%BIN_DIR%\../
|
||||
set DIRS=.
|
||||
FOR /D %%V IN (%VENDOR_DIR%\*) DO (
|
||||
FOR /D %%P IN (%%V\*) DO (
|
||||
set DIRS=!DIRS!;%%~fP
|
||||
)
|
||||
)
|
||||
php.exe -d include_path=!DIRS! %*
|
||||
17
vendor/bin/generate
vendored
Normal file
17
vendor/bin/generate
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
dir=$(d=${0%[/\\]*}; cd "$d"; cd "../pear-pear.php.net/Text_Highlighter/bin" && pwd)
|
||||
|
||||
# See if we are running in Cygwin by checking for cygpath program
|
||||
if command -v 'cygpath' >/dev/null 2>&1; then
|
||||
# Cygwin paths start with /cygdrive/ which will break windows PHP,
|
||||
# so we need to translate the dir path to windows format. However
|
||||
# we could be using cygwin PHP which does not require this, so we
|
||||
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin
|
||||
if [[ $(which php) == /cygdrive/* ]]; then
|
||||
dir=$(cygpath -m "$dir");
|
||||
fi
|
||||
fi
|
||||
|
||||
dir=$(echo $dir | sed 's/ /\ /g')
|
||||
"${dir}/generate" "$@"
|
||||
7
vendor/bin/generate.bat
vendored
Normal file
7
vendor/bin/generate.bat
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
@echo off
|
||||
pushd .
|
||||
cd %~dp0
|
||||
cd "../pear-pear.php.net/Text_Highlighter/bin"
|
||||
set BIN_TARGET=%CD%\generate
|
||||
popd
|
||||
composer-php "%BIN_TARGET%" %*
|
||||
7
vendor/bin/pear.bat
vendored
Normal file
7
vendor/bin/pear.bat
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
@echo off
|
||||
pushd .
|
||||
cd %~dp0
|
||||
cd "../pear-pear.php.net/PEAR/bin"
|
||||
set BIN_TARGET=%CD%\pear.bat
|
||||
popd
|
||||
call "%BIN_TARGET%" %*
|
||||
7
vendor/bin/peardev.bat
vendored
Normal file
7
vendor/bin/peardev.bat
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
@echo off
|
||||
pushd .
|
||||
cd %~dp0
|
||||
cd "../pear-pear.php.net/PEAR/bin"
|
||||
set BIN_TARGET=%CD%\peardev.bat
|
||||
popd
|
||||
call "%BIN_TARGET%" %*
|
||||
7
vendor/bin/pecl.bat
vendored
Normal file
7
vendor/bin/pecl.bat
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
@echo off
|
||||
pushd .
|
||||
cd %~dp0
|
||||
cd "../pear-pear.php.net/PEAR/bin"
|
||||
set BIN_TARGET=%CD%\pecl.bat
|
||||
popd
|
||||
call "%BIN_TARGET%" %*
|
||||
110
vendor/composer/autoload_classmap.php
vendored
110
vendor/composer/autoload_classmap.php
vendored
|
|
@ -6,6 +6,8 @@ $vendorDir = dirname(dirname(__FILE__));
|
|||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Archive_Tar' => $vendorDir . '/pear-pear.php.net/Archive_Tar/Archive/Tar.php',
|
||||
'Console_Getopt' => $vendorDir . '/pear-pear.php.net/Console_Getopt/Console/Getopt.php',
|
||||
'Detection\\MobileDetect' => $vendorDir . '/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php',
|
||||
'Friendica\\Core\\Config' => $baseDir . '/src/Core/Config.php',
|
||||
'Friendica\\Core\\PConfig' => $baseDir . '/src/Core/PConfig.php',
|
||||
|
|
@ -240,4 +242,112 @@ return array(
|
|||
'HTMLPurifier_VarParser_Native' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
|
||||
'HTMLPurifier_Zipper' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
|
||||
'Mobile_Detect' => $vendorDir . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
|
||||
'OS_Guess' => $vendorDir . '/pear-pear.php.net/PEAR/OS/Guess.php',
|
||||
'PEAR' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR.php',
|
||||
'PEAR_Builder' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Builder.php',
|
||||
'PEAR_ChannelFile' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/ChannelFile.php',
|
||||
'PEAR_ChannelFile_Parser' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/ChannelFile/Parser.php',
|
||||
'PEAR_Command' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command.php',
|
||||
'PEAR_Command_Auth' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Auth.php',
|
||||
'PEAR_Command_Build' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Build.php',
|
||||
'PEAR_Command_Channels' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Channels.php',
|
||||
'PEAR_Command_Common' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Common.php',
|
||||
'PEAR_Command_Config' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Config.php',
|
||||
'PEAR_Command_Install' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Install.php',
|
||||
'PEAR_Command_Mirror' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Mirror.php',
|
||||
'PEAR_Command_Package' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Package.php',
|
||||
'PEAR_Command_Pickle' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Pickle.php',
|
||||
'PEAR_Command_Registry' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Registry.php',
|
||||
'PEAR_Command_Remote' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Remote.php',
|
||||
'PEAR_Command_Test' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Command/Test.php',
|
||||
'PEAR_Common' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Common.php',
|
||||
'PEAR_Config' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Config.php',
|
||||
'PEAR_Dependency2' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Dependency2.php',
|
||||
'PEAR_DependencyDB' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/DependencyDB.php',
|
||||
'PEAR_Downloader' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Downloader.php',
|
||||
'PEAR_Downloader_Package' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Downloader/Package.php',
|
||||
'PEAR_Error' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR.php',
|
||||
'PEAR_ErrorStack' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/ErrorStack.php',
|
||||
'PEAR_Exception' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Exception.php',
|
||||
'PEAR_Frontend' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Frontend.php',
|
||||
'PEAR_Frontend_CLI' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Frontend/CLI.php',
|
||||
'PEAR_Installer' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer.php',
|
||||
'PEAR_Installer_Role' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role.php',
|
||||
'PEAR_Installer_Role_Cfg' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Cfg.php',
|
||||
'PEAR_Installer_Role_Common' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Common.php',
|
||||
'PEAR_Installer_Role_Data' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Data.php',
|
||||
'PEAR_Installer_Role_Doc' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Doc.php',
|
||||
'PEAR_Installer_Role_Ext' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Ext.php',
|
||||
'PEAR_Installer_Role_Man' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Man.php',
|
||||
'PEAR_Installer_Role_Php' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Php.php',
|
||||
'PEAR_Installer_Role_Script' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Script.php',
|
||||
'PEAR_Installer_Role_Src' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Src.php',
|
||||
'PEAR_Installer_Role_Test' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Test.php',
|
||||
'PEAR_Installer_Role_Www' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Www.php',
|
||||
'PEAR_PackageFile' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile.php',
|
||||
'PEAR_PackageFile_Generator_v1' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Generator/v1.php',
|
||||
'PEAR_PackageFile_Generator_v2' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Generator/v2.php',
|
||||
'PEAR_PackageFile_Parser_v1' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Parser/v1.php',
|
||||
'PEAR_PackageFile_Parser_v2' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Parser/v2.php',
|
||||
'PEAR_PackageFile_v1' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v1.php',
|
||||
'PEAR_PackageFile_v2' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2.php',
|
||||
'PEAR_PackageFile_v2_Validator' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2/Validator.php',
|
||||
'PEAR_PackageFile_v2_rw' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2/rw.php',
|
||||
'PEAR_Packager' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Packager.php',
|
||||
'PEAR_Proxy' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Proxy.php',
|
||||
'PEAR_REST' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/REST.php',
|
||||
'PEAR_REST_10' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/REST/10.php',
|
||||
'PEAR_REST_11' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/REST/11.php',
|
||||
'PEAR_REST_13' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/REST/13.php',
|
||||
'PEAR_Registry' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Registry.php',
|
||||
'PEAR_RunTest' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/RunTest.php',
|
||||
'PEAR_Task_Common' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Common.php',
|
||||
'PEAR_Task_Postinstallscript' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Postinstallscript.php',
|
||||
'PEAR_Task_Postinstallscript_rw' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Postinstallscript/rw.php',
|
||||
'PEAR_Task_Replace' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Replace.php',
|
||||
'PEAR_Task_Replace_rw' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Replace/rw.php',
|
||||
'PEAR_Task_Unixeol' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Unixeol.php',
|
||||
'PEAR_Task_Unixeol_rw' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Unixeol/rw.php',
|
||||
'PEAR_Task_Windowseol' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Windowseol.php',
|
||||
'PEAR_Task_Windowseol_rw' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Task/Windowseol/rw.php',
|
||||
'PEAR_Validate' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Validate.php',
|
||||
'PEAR_Validator_PECL' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/Validator/PECL.php',
|
||||
'PEAR_XMLParser' => $vendorDir . '/pear-pear.php.net/PEAR/PEAR/XMLParser.php',
|
||||
'Structures_Graph' => $vendorDir . '/pear-pear.php.net/Structures_Graph/Structures/Graph.php',
|
||||
'Structures_Graph_Manipulator_AcyclicTest' => $vendorDir . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Manipulator/AcyclicTest.php',
|
||||
'Structures_Graph_Manipulator_TopologicalSorter' => $vendorDir . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Manipulator/TopologicalSorter.php',
|
||||
'Structures_Graph_Node' => $vendorDir . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Node.php',
|
||||
'System' => $vendorDir . '/pear-pear.php.net/PEAR/System.php',
|
||||
'Text_Highlighter' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter.php',
|
||||
'Text_Highlighter_ABAP' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/ABAP.php',
|
||||
'Text_Highlighter_AVRC' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/AVRC.php',
|
||||
'Text_Highlighter_CPP' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/CPP.php',
|
||||
'Text_Highlighter_CSS' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/CSS.php',
|
||||
'Text_Highlighter_DIFF' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/DIFF.php',
|
||||
'Text_Highlighter_DTD' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/DTD.php',
|
||||
'Text_Highlighter_Generator' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Generator.php',
|
||||
'Text_Highlighter_HTML' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/HTML.php',
|
||||
'Text_Highlighter_JAVA' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/JAVA.php',
|
||||
'Text_Highlighter_JAVASCRIPT' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php',
|
||||
'Text_Highlighter_MYSQL' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/MYSQL.php',
|
||||
'Text_Highlighter_PERL' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PERL.php',
|
||||
'Text_Highlighter_PHP' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PHP.php',
|
||||
'Text_Highlighter_PYTHON' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PYTHON.php',
|
||||
'Text_Highlighter_RUBY' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/RUBY.php',
|
||||
'Text_Highlighter_Renderer' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer.php',
|
||||
'Text_Highlighter_Renderer_Array' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Array.php',
|
||||
'Text_Highlighter_Renderer_BB' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/BB.php',
|
||||
'Text_Highlighter_Renderer_Console' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Console.php',
|
||||
'Text_Highlighter_Renderer_Html' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Html.php',
|
||||
'Text_Highlighter_Renderer_HtmlTags' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php',
|
||||
'Text_Highlighter_Renderer_JSON' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/JSON.php',
|
||||
'Text_Highlighter_Renderer_XML' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/XML.php',
|
||||
'Text_Highlighter_SH' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/SH.php',
|
||||
'Text_Highlighter_SQL' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/SQL.php',
|
||||
'Text_Highlighter_VBSCRIPT' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/VBSCRIPT.php',
|
||||
'Text_Highlighter_XML' => $vendorDir . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/XML.php',
|
||||
'XML_Parser' => $vendorDir . '/pear-pear.php.net/XML_Parser/XML/Parser.php',
|
||||
'XML_Parser_Error' => $vendorDir . '/pear-pear.php.net/XML_Parser/XML/Parser.php',
|
||||
'XML_Parser_Simple' => $vendorDir . '/pear-pear.php.net/XML_Parser/XML/Parser/Simple.php',
|
||||
'XML_Util' => $vendorDir . '/pear-pear.php.net/XML_Util/XML/Util.php',
|
||||
);
|
||||
|
|
|
|||
4
vendor/composer/autoload_real.php
vendored
4
vendor/composer/autoload_real.php
vendored
|
|
@ -23,6 +23,10 @@ class ComposerAutoloaderInitFriendica
|
|||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInitFriendica', 'loadClassLoader'));
|
||||
|
||||
$includePaths = require __DIR__ . '/include_paths.php';
|
||||
array_push($includePaths, get_include_path());
|
||||
set_include_path(implode(PATH_SEPARATOR, $includePaths));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require_once __DIR__ . '/autoload_static.php';
|
||||
|
|
|
|||
110
vendor/composer/autoload_static.php
vendored
110
vendor/composer/autoload_static.php
vendored
|
|
@ -42,6 +42,8 @@ class ComposerStaticInitFriendica
|
|||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Archive_Tar' => __DIR__ . '/..' . '/pear-pear.php.net/Archive_Tar/Archive/Tar.php',
|
||||
'Console_Getopt' => __DIR__ . '/..' . '/pear-pear.php.net/Console_Getopt/Console/Getopt.php',
|
||||
'Detection\\MobileDetect' => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php',
|
||||
'Friendica\\Core\\Config' => __DIR__ . '/../..' . '/src/Core/Config.php',
|
||||
'Friendica\\Core\\PConfig' => __DIR__ . '/../..' . '/src/Core/PConfig.php',
|
||||
|
|
@ -276,6 +278,114 @@ class ComposerStaticInitFriendica
|
|||
'HTMLPurifier_VarParser_Native' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
|
||||
'HTMLPurifier_Zipper' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
|
||||
'Mobile_Detect' => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/Mobile_Detect.php',
|
||||
'OS_Guess' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/OS/Guess.php',
|
||||
'PEAR' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR.php',
|
||||
'PEAR_Builder' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Builder.php',
|
||||
'PEAR_ChannelFile' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/ChannelFile.php',
|
||||
'PEAR_ChannelFile_Parser' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/ChannelFile/Parser.php',
|
||||
'PEAR_Command' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command.php',
|
||||
'PEAR_Command_Auth' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Auth.php',
|
||||
'PEAR_Command_Build' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Build.php',
|
||||
'PEAR_Command_Channels' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Channels.php',
|
||||
'PEAR_Command_Common' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Common.php',
|
||||
'PEAR_Command_Config' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Config.php',
|
||||
'PEAR_Command_Install' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Install.php',
|
||||
'PEAR_Command_Mirror' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Mirror.php',
|
||||
'PEAR_Command_Package' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Package.php',
|
||||
'PEAR_Command_Pickle' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Pickle.php',
|
||||
'PEAR_Command_Registry' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Registry.php',
|
||||
'PEAR_Command_Remote' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Remote.php',
|
||||
'PEAR_Command_Test' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Command/Test.php',
|
||||
'PEAR_Common' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Common.php',
|
||||
'PEAR_Config' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Config.php',
|
||||
'PEAR_Dependency2' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Dependency2.php',
|
||||
'PEAR_DependencyDB' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/DependencyDB.php',
|
||||
'PEAR_Downloader' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Downloader.php',
|
||||
'PEAR_Downloader_Package' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Downloader/Package.php',
|
||||
'PEAR_Error' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR.php',
|
||||
'PEAR_ErrorStack' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/ErrorStack.php',
|
||||
'PEAR_Exception' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Exception.php',
|
||||
'PEAR_Frontend' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Frontend.php',
|
||||
'PEAR_Frontend_CLI' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Frontend/CLI.php',
|
||||
'PEAR_Installer' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer.php',
|
||||
'PEAR_Installer_Role' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role.php',
|
||||
'PEAR_Installer_Role_Cfg' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Cfg.php',
|
||||
'PEAR_Installer_Role_Common' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Common.php',
|
||||
'PEAR_Installer_Role_Data' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Data.php',
|
||||
'PEAR_Installer_Role_Doc' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Doc.php',
|
||||
'PEAR_Installer_Role_Ext' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Ext.php',
|
||||
'PEAR_Installer_Role_Man' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Man.php',
|
||||
'PEAR_Installer_Role_Php' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Php.php',
|
||||
'PEAR_Installer_Role_Script' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Script.php',
|
||||
'PEAR_Installer_Role_Src' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Src.php',
|
||||
'PEAR_Installer_Role_Test' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Test.php',
|
||||
'PEAR_Installer_Role_Www' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Installer/Role/Www.php',
|
||||
'PEAR_PackageFile' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile.php',
|
||||
'PEAR_PackageFile_Generator_v1' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Generator/v1.php',
|
||||
'PEAR_PackageFile_Generator_v2' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Generator/v2.php',
|
||||
'PEAR_PackageFile_Parser_v1' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Parser/v1.php',
|
||||
'PEAR_PackageFile_Parser_v2' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/Parser/v2.php',
|
||||
'PEAR_PackageFile_v1' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v1.php',
|
||||
'PEAR_PackageFile_v2' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2.php',
|
||||
'PEAR_PackageFile_v2_Validator' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2/Validator.php',
|
||||
'PEAR_PackageFile_v2_rw' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/PackageFile/v2/rw.php',
|
||||
'PEAR_Packager' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Packager.php',
|
||||
'PEAR_Proxy' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Proxy.php',
|
||||
'PEAR_REST' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/REST.php',
|
||||
'PEAR_REST_10' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/REST/10.php',
|
||||
'PEAR_REST_11' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/REST/11.php',
|
||||
'PEAR_REST_13' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/REST/13.php',
|
||||
'PEAR_Registry' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Registry.php',
|
||||
'PEAR_RunTest' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/RunTest.php',
|
||||
'PEAR_Task_Common' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Common.php',
|
||||
'PEAR_Task_Postinstallscript' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Postinstallscript.php',
|
||||
'PEAR_Task_Postinstallscript_rw' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Postinstallscript/rw.php',
|
||||
'PEAR_Task_Replace' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Replace.php',
|
||||
'PEAR_Task_Replace_rw' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Replace/rw.php',
|
||||
'PEAR_Task_Unixeol' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Unixeol.php',
|
||||
'PEAR_Task_Unixeol_rw' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Unixeol/rw.php',
|
||||
'PEAR_Task_Windowseol' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Windowseol.php',
|
||||
'PEAR_Task_Windowseol_rw' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Task/Windowseol/rw.php',
|
||||
'PEAR_Validate' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Validate.php',
|
||||
'PEAR_Validator_PECL' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/Validator/PECL.php',
|
||||
'PEAR_XMLParser' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/PEAR/XMLParser.php',
|
||||
'Structures_Graph' => __DIR__ . '/..' . '/pear-pear.php.net/Structures_Graph/Structures/Graph.php',
|
||||
'Structures_Graph_Manipulator_AcyclicTest' => __DIR__ . '/..' . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Manipulator/AcyclicTest.php',
|
||||
'Structures_Graph_Manipulator_TopologicalSorter' => __DIR__ . '/..' . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Manipulator/TopologicalSorter.php',
|
||||
'Structures_Graph_Node' => __DIR__ . '/..' . '/pear-pear.php.net/Structures_Graph/Structures/Graph/Node.php',
|
||||
'System' => __DIR__ . '/..' . '/pear-pear.php.net/PEAR/System.php',
|
||||
'Text_Highlighter' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter.php',
|
||||
'Text_Highlighter_ABAP' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/ABAP.php',
|
||||
'Text_Highlighter_AVRC' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/AVRC.php',
|
||||
'Text_Highlighter_CPP' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/CPP.php',
|
||||
'Text_Highlighter_CSS' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/CSS.php',
|
||||
'Text_Highlighter_DIFF' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/DIFF.php',
|
||||
'Text_Highlighter_DTD' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/DTD.php',
|
||||
'Text_Highlighter_Generator' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Generator.php',
|
||||
'Text_Highlighter_HTML' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/HTML.php',
|
||||
'Text_Highlighter_JAVA' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/JAVA.php',
|
||||
'Text_Highlighter_JAVASCRIPT' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php',
|
||||
'Text_Highlighter_MYSQL' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/MYSQL.php',
|
||||
'Text_Highlighter_PERL' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PERL.php',
|
||||
'Text_Highlighter_PHP' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PHP.php',
|
||||
'Text_Highlighter_PYTHON' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/PYTHON.php',
|
||||
'Text_Highlighter_RUBY' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/RUBY.php',
|
||||
'Text_Highlighter_Renderer' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer.php',
|
||||
'Text_Highlighter_Renderer_Array' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Array.php',
|
||||
'Text_Highlighter_Renderer_BB' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/BB.php',
|
||||
'Text_Highlighter_Renderer_Console' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Console.php',
|
||||
'Text_Highlighter_Renderer_Html' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/Html.php',
|
||||
'Text_Highlighter_Renderer_HtmlTags' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php',
|
||||
'Text_Highlighter_Renderer_JSON' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/JSON.php',
|
||||
'Text_Highlighter_Renderer_XML' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/Renderer/XML.php',
|
||||
'Text_Highlighter_SH' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/SH.php',
|
||||
'Text_Highlighter_SQL' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/SQL.php',
|
||||
'Text_Highlighter_VBSCRIPT' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/VBSCRIPT.php',
|
||||
'Text_Highlighter_XML' => __DIR__ . '/..' . '/pear-pear.php.net/Text_Highlighter/Text/Highlighter/XML.php',
|
||||
'XML_Parser' => __DIR__ . '/..' . '/pear-pear.php.net/XML_Parser/XML/Parser.php',
|
||||
'XML_Parser_Error' => __DIR__ . '/..' . '/pear-pear.php.net/XML_Parser/XML/Parser.php',
|
||||
'XML_Parser_Simple' => __DIR__ . '/..' . '/pear-pear.php.net/XML_Parser/XML/Parser/Simple.php',
|
||||
'XML_Util' => __DIR__ . '/..' . '/pear-pear.php.net/XML_Util/XML/Util.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
|
|
|
|||
16
vendor/composer/include_paths.php
vendored
Normal file
16
vendor/composer/include_paths.php
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
// include_paths.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
$vendorDir . '/pear-pear.php.net/Console_Getopt',
|
||||
$vendorDir . '/pear-pear.php.net/Archive_Tar',
|
||||
$vendorDir . '/pear-pear.php.net/Structures_Graph',
|
||||
$vendorDir . '/pear-pear.php.net/XML_Util',
|
||||
$vendorDir . '/pear-pear.php.net/XML_Parser',
|
||||
$vendorDir . '/pear-pear.php.net/PEAR',
|
||||
$vendorDir . '/pear-pear.php.net/Text_Highlighter',
|
||||
);
|
||||
232
vendor/composer/installed.json
vendored
232
vendor/composer/installed.json
vendored
|
|
@ -98,5 +98,237 @@
|
|||
"mobile detector",
|
||||
"php mobile detect"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Console_Getopt",
|
||||
"version": "1.4.1",
|
||||
"version_normalized": "1.4.1.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Console_Getopt-1.4.1.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/console_getopt": "== 1.4.1.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD-2-Clause"
|
||||
],
|
||||
"description": "This is a PHP implementation of \"getopt\" supporting both\nshort and long options."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Archive_Tar",
|
||||
"version": "1.4.2",
|
||||
"version_normalized": "1.4.2.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Archive_Tar-1.4.2.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/archive_tar": "== 1.4.2.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"New BSD License"
|
||||
],
|
||||
"description": "This class provides handling of tar files in PHP.\nIt supports creating, listing, extracting and adding to tar files.\nGzip support is available if PHP has the zlib extension built-in or\nloaded. Bz2 compression is also supported with the bz2 extension loaded."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Structures_Graph",
|
||||
"version": "1.1.1",
|
||||
"version_normalized": "1.1.1.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Structures_Graph-1.1.1.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/structures_graph": "== 1.1.1.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"LGPL-3.0+"
|
||||
],
|
||||
"description": "Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed\nand undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing\nas well as for characteristic extraction from the graph topology."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/XML_Util",
|
||||
"version": "1.4.2",
|
||||
"version_normalized": "1.4.2.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/XML_Util-1.4.2.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"ext-pcre": "*",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/xml_util": "== 1.4.2.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD License"
|
||||
],
|
||||
"description": "Selection of methods that are often needed when working with XML documents. Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/XML_Parser",
|
||||
"version": "1.3.7",
|
||||
"version_normalized": "1.3.7.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/XML_Parser-1.3.7.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"pear-pear.php.net/pear": "*",
|
||||
"php": ">=4.2.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/xml_parser": "== 1.3.7.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"BSD License"
|
||||
],
|
||||
"description": "This is an XML parser based on PHPs built-in xml extension.\nIt supports two basic modes of operation: \"func\" and \"event\". In \"func\" mode, it will look for a function named after each element (xmltag_ELEMENT for start tags and xmltag_ELEMENT_ for end tags), and in \"event\" mode it uses a set of generic callbacks.\n\nSince version 1.2.0 there's a new XML_Parser_Simple class that makes parsing of most XML documents easier, by automatically providing a stack for the elements.\nFurthermore its now possible to split the parser from the handler object, so you do not have to extend XML_Parser anymore in order to parse a document with it."
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/PEAR",
|
||||
"version": "1.10.3",
|
||||
"version_normalized": "1.10.3.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/PEAR-1.10.3.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"ext-pcre": "*",
|
||||
"ext-xml": "*",
|
||||
"pear-pear.php.net/archive_tar": ">=1.4.0.0",
|
||||
"pear-pear.php.net/console_getopt": ">=1.4.1.0",
|
||||
"pear-pear.php.net/structures_graph": ">=1.1.0.0",
|
||||
"pear-pear.php.net/xml_util": ">=1.3.0.0",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"conflict": {
|
||||
"pear-pear.php.net/pear_frontend_gtk": "<0.4.0.0",
|
||||
"pear-pear.php.net/pear_frontend_web": "<=0.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/pear": "== 1.10.3.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"New BSD License"
|
||||
],
|
||||
"description": "The PEAR package contains:\n * the PEAR installer, for creating, distributing\n and installing packages\n * the PEAR_Exception PHP5 error handling mechanism\n * the PEAR_ErrorStack advanced error handling mechanism\n * the PEAR_Error error handling mechanism\n * the OS_Guess class for retrieving info about the OS\n where PHP is running on\n * the System class for quick handling of common operations\n with files and directories\n * the PEAR base class\n Features in a nutshell:\n * full support for channels\n * pre-download dependency validation\n * new package.xml 2.0 format allows tremendous flexibility while maintaining BC\n * support for optional dependency groups and limited support for sub-packaging\n * robust dependency support\n * full dependency validation on uninstall\n * remote install for hosts with only ftp access - no more problems with\n restricted host installation\n * full support for mirroring\n * support for bundling several packages into a single tarball\n * support for static dependencies on a url-based package\n * support for custom file roles and installation tasks"
|
||||
},
|
||||
{
|
||||
"name": "pear-pear.php.net/Text_Highlighter",
|
||||
"version": "0.8.0",
|
||||
"version_normalized": "0.8.0.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://pear.php.net/get/Text_Highlighter-0.8.0.tgz",
|
||||
"reference": null,
|
||||
"shasum": null
|
||||
},
|
||||
"require": {
|
||||
"pear-pear.php.net/console_getopt": ">=1.4.1.0",
|
||||
"pear-pear.php.net/pear": ">=1.10.3.0",
|
||||
"pear-pear.php.net/xml_parser": ">=1.3.7.0",
|
||||
"php": ">=5.4.0.0"
|
||||
},
|
||||
"replace": {
|
||||
"pear-pear/text_highlighter": "== 0.8.0.0"
|
||||
},
|
||||
"type": "pear-library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
""
|
||||
]
|
||||
},
|
||||
"include-path": [
|
||||
"/"
|
||||
],
|
||||
"license": [
|
||||
"PHP License"
|
||||
],
|
||||
"description": "Text_Highlighter is a package for syntax highlighting.\n\nIt provides a base class provining all the functionality,\nand a descendent classes geneator class.\n\nThe main idea is to simplify creation of subclasses\nimplementing syntax highlighting for particular language.\nSubclasses do not implement any new functioanality,\nthey just provide syntax highlighting rules.\nThe rules sources are in XML format.\n\nTo create a highlighter for a language, there is no need\nto code a new class manually. Simply describe the rules\nin XML file and use Text_Highlighter_Generator to create\na new class."
|
||||
}
|
||||
]
|
||||
|
|
|
|||
2421
vendor/pear-pear.php.net/Archive_Tar/Archive/Tar.php
generated
vendored
Normal file
2421
vendor/pear-pear.php.net/Archive_Tar/Archive/Tar.php
generated
vendored
Normal file
|
|
@ -0,0 +1,2421 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* File::CSV
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* Copyright (c) 1997-2008,
|
||||
* Vincent Blavet <vincent@phpconcept.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @category File_Formats
|
||||
* @package Archive_Tar
|
||||
* @author Vincent Blavet <vincent@phpconcept.net>
|
||||
* @copyright 1997-2010 The Authors
|
||||
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version CVS: $Id$
|
||||
* @link http://pear.php.net/package/Archive_Tar
|
||||
*/
|
||||
|
||||
// If the PEAR class cannot be loaded via the autoloader,
|
||||
// then try to require_once it from the PHP include path.
|
||||
if (!class_exists('PEAR')) {
|
||||
require_once 'PEAR.php';
|
||||
}
|
||||
|
||||
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
|
||||
define('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
|
||||
|
||||
if (!function_exists('gzopen') && function_exists('gzopen64')) {
|
||||
function gzopen($filename, $mode, $use_include_path = 0)
|
||||
{
|
||||
return gzopen64($filename, $mode, $use_include_path);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('gztell') && function_exists('gztell64')) {
|
||||
function gztell($zp)
|
||||
{
|
||||
return gztell64($zp);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('gzseek') && function_exists('gzseek64')) {
|
||||
function gzseek($zp, $offset, $whence = SEEK_SET)
|
||||
{
|
||||
return gzseek64($zp, $offset, $whence);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a (compressed) Tar archive
|
||||
*
|
||||
* @package Archive_Tar
|
||||
* @author Vincent Blavet <vincent@phpconcept.net>
|
||||
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version $Revision$
|
||||
*/
|
||||
class Archive_Tar extends PEAR
|
||||
{
|
||||
/**
|
||||
* @var string Name of the Tar
|
||||
*/
|
||||
public $_tarname = '';
|
||||
|
||||
/**
|
||||
* @var boolean if true, the Tar file will be gzipped
|
||||
*/
|
||||
public $_compress = false;
|
||||
|
||||
/**
|
||||
* @var string Type of compression : 'none', 'gz', 'bz2' or 'lzma2'
|
||||
*/
|
||||
public $_compress_type = 'none';
|
||||
|
||||
/**
|
||||
* @var string Explode separator
|
||||
*/
|
||||
public $_separator = ' ';
|
||||
|
||||
/**
|
||||
* @var file descriptor
|
||||
*/
|
||||
public $_file = 0;
|
||||
|
||||
/**
|
||||
* @var string Local Tar name of a remote Tar (http:// or ftp://)
|
||||
*/
|
||||
public $_temp_tarname = '';
|
||||
|
||||
/**
|
||||
* @var string regular expression for ignoring files or directories
|
||||
*/
|
||||
public $_ignore_regexp = '';
|
||||
|
||||
/**
|
||||
* @var object PEAR_Error object
|
||||
*/
|
||||
public $error_object = null;
|
||||
|
||||
/**
|
||||
* Format for data extraction
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $_fmt ='';
|
||||
/**
|
||||
* Archive_Tar Class constructor. This flavour of the constructor only
|
||||
* declare a new Archive_Tar object, identifying it by the name of the
|
||||
* tar file.
|
||||
* If the compress argument is set the tar will be read or created as a
|
||||
* gzip or bz2 compressed TAR file.
|
||||
*
|
||||
* @param string $p_tarname The name of the tar archive to create
|
||||
* @param string $p_compress can be null, 'gz', 'bz2' or 'lzma2'. This
|
||||
* parameter indicates if gzip, bz2 or lzma2 compression
|
||||
* is required. For compatibility reason the
|
||||
* boolean value 'true' means 'gz'.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function __construct($p_tarname, $p_compress = null)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->_compress = false;
|
||||
$this->_compress_type = 'none';
|
||||
if (($p_compress === null) || ($p_compress == '')) {
|
||||
if (@file_exists($p_tarname)) {
|
||||
if ($fp = @fopen($p_tarname, "rb")) {
|
||||
// look for gzip magic cookie
|
||||
$data = fread($fp, 2);
|
||||
fclose($fp);
|
||||
if ($data == "\37\213") {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'gz';
|
||||
// No sure it's enought for a magic code ....
|
||||
} elseif ($data == "BZ") {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'bz2';
|
||||
} elseif (file_get_contents($p_tarname, false, null, 1, 4) == '7zXZ') {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'lzma2';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// probably a remote file or some file accessible
|
||||
// through a stream interface
|
||||
if (substr($p_tarname, -2) == 'gz') {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'gz';
|
||||
} elseif ((substr($p_tarname, -3) == 'bz2') ||
|
||||
(substr($p_tarname, -2) == 'bz')
|
||||
) {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'bz2';
|
||||
} else {
|
||||
if (substr($p_tarname, -2) == 'xz') {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'lzma2';
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (($p_compress === true) || ($p_compress == 'gz')) {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'gz';
|
||||
} else {
|
||||
if ($p_compress == 'bz2') {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'bz2';
|
||||
} else {
|
||||
if ($p_compress == 'lzma2') {
|
||||
$this->_compress = true;
|
||||
$this->_compress_type = 'lzma2';
|
||||
} else {
|
||||
$this->_error(
|
||||
"Unsupported compression type '$p_compress'\n" .
|
||||
"Supported types are 'gz', 'bz2' and 'lzma2'.\n"
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->_tarname = $p_tarname;
|
||||
if ($this->_compress) { // assert zlib or bz2 or xz extension support
|
||||
if ($this->_compress_type == 'gz') {
|
||||
$extname = 'zlib';
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
$extname = 'bz2';
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
$extname = 'xz';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!extension_loaded($extname)) {
|
||||
PEAR::loadExtension($extname);
|
||||
}
|
||||
if (!extension_loaded($extname)) {
|
||||
$this->_error(
|
||||
"The extension '$extname' couldn't be found.\n" .
|
||||
"Please make sure your version of PHP was built " .
|
||||
"with '$extname' support.\n"
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
|
||||
$this->_fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
|
||||
"a8checksum/a1typeflag/a100link/a6magic/a2version/" .
|
||||
"a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
|
||||
} else {
|
||||
$this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
|
||||
"Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
|
||||
"Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
$this->_close();
|
||||
// ----- Look for a local copy to delete
|
||||
if ($this->_temp_tarname != '') {
|
||||
@unlink($this->_temp_tarname);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method creates the archive file and add the files / directories
|
||||
* that are listed in $p_filelist.
|
||||
* If a file with the same name exist and is writable, it is replaced
|
||||
* by the new tar.
|
||||
* The method return false and a PEAR error text.
|
||||
* The $p_filelist parameter can be an array of string, each string
|
||||
* representing a filename or a directory name with their path if
|
||||
* needed. It can also be a single string with names separated by a
|
||||
* single blank.
|
||||
* For each directory added in the archive, the files and
|
||||
* sub-directories are also added.
|
||||
* See also createModify() method for more details.
|
||||
*
|
||||
* @param array $p_filelist An array of filenames and directory names, or a
|
||||
* single string with names separated by a single
|
||||
* blank space.
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
* @see createModify()
|
||||
*/
|
||||
public function create($p_filelist)
|
||||
{
|
||||
return $this->createModify($p_filelist, '', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* This method add the files / directories that are listed in $p_filelist in
|
||||
* the archive. If the archive does not exist it is created.
|
||||
* The method return false and a PEAR error text.
|
||||
* The files and directories listed are only added at the end of the archive,
|
||||
* even if a file with the same name is already archived.
|
||||
* See also createModify() method for more details.
|
||||
*
|
||||
* @param array $p_filelist An array of filenames and directory names, or a
|
||||
* single string with names separated by a single
|
||||
* blank space.
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
* @see createModify()
|
||||
* @access public
|
||||
*/
|
||||
public function add($p_filelist)
|
||||
{
|
||||
return $this->addModify($p_filelist, '', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_path
|
||||
* @param bool $p_preserve
|
||||
* @return bool
|
||||
*/
|
||||
public function extract($p_path = '', $p_preserve = false)
|
||||
{
|
||||
return $this->extractModify($p_path, '', $p_preserve);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array|int
|
||||
*/
|
||||
public function listContent()
|
||||
{
|
||||
$v_list_detail = array();
|
||||
|
||||
if ($this->_openRead()) {
|
||||
if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
|
||||
unset($v_list_detail);
|
||||
$v_list_detail = 0;
|
||||
}
|
||||
$this->_close();
|
||||
}
|
||||
|
||||
return $v_list_detail;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method creates the archive file and add the files / directories
|
||||
* that are listed in $p_filelist.
|
||||
* If the file already exists and is writable, it is replaced by the
|
||||
* new tar. It is a create and not an add. If the file exists and is
|
||||
* read-only or is a directory it is not replaced. The method return
|
||||
* false and a PEAR error text.
|
||||
* The $p_filelist parameter can be an array of string, each string
|
||||
* representing a filename or a directory name with their path if
|
||||
* needed. It can also be a single string with names separated by a
|
||||
* single blank.
|
||||
* The path indicated in $p_remove_dir will be removed from the
|
||||
* memorized path of each file / directory listed when this path
|
||||
* exists. By default nothing is removed (empty path '')
|
||||
* The path indicated in $p_add_dir will be added at the beginning of
|
||||
* the memorized path of each file / directory listed. However it can
|
||||
* be set to empty ''. The adding of a path is done after the removing
|
||||
* of path.
|
||||
* The path add/remove ability enables the user to prepare an archive
|
||||
* for extraction in a different path than the origin files are.
|
||||
* See also addModify() method for file adding properties.
|
||||
*
|
||||
* @param array $p_filelist An array of filenames and directory names,
|
||||
* or a single string with names separated by
|
||||
* a single blank space.
|
||||
* @param string $p_add_dir A string which contains a path to be added
|
||||
* to the memorized path of each element in
|
||||
* the list.
|
||||
* @param string $p_remove_dir A string which contains a path to be
|
||||
* removed from the memorized path of each
|
||||
* element in the list, when relevant.
|
||||
*
|
||||
* @return boolean true on success, false on error.
|
||||
* @see addModify()
|
||||
*/
|
||||
public function createModify($p_filelist, $p_add_dir, $p_remove_dir = '')
|
||||
{
|
||||
$v_result = true;
|
||||
|
||||
if (!$this->_openWrite()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($p_filelist != '') {
|
||||
if (is_array($p_filelist)) {
|
||||
$v_list = $p_filelist;
|
||||
} elseif (is_string($p_filelist)) {
|
||||
$v_list = explode($this->_separator, $p_filelist);
|
||||
} else {
|
||||
$this->_cleanFile();
|
||||
$this->_error('Invalid file list');
|
||||
return false;
|
||||
}
|
||||
|
||||
$v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
|
||||
}
|
||||
|
||||
if ($v_result) {
|
||||
$this->_writeFooter();
|
||||
$this->_close();
|
||||
} else {
|
||||
$this->_cleanFile();
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method add the files / directories listed in $p_filelist at the
|
||||
* end of the existing archive. If the archive does not yet exists it
|
||||
* is created.
|
||||
* The $p_filelist parameter can be an array of string, each string
|
||||
* representing a filename or a directory name with their path if
|
||||
* needed. It can also be a single string with names separated by a
|
||||
* single blank.
|
||||
* The path indicated in $p_remove_dir will be removed from the
|
||||
* memorized path of each file / directory listed when this path
|
||||
* exists. By default nothing is removed (empty path '')
|
||||
* The path indicated in $p_add_dir will be added at the beginning of
|
||||
* the memorized path of each file / directory listed. However it can
|
||||
* be set to empty ''. The adding of a path is done after the removing
|
||||
* of path.
|
||||
* The path add/remove ability enables the user to prepare an archive
|
||||
* for extraction in a different path than the origin files are.
|
||||
* If a file/dir is already in the archive it will only be added at the
|
||||
* end of the archive. There is no update of the existing archived
|
||||
* file/dir. However while extracting the archive, the last file will
|
||||
* replace the first one. This results in a none optimization of the
|
||||
* archive size.
|
||||
* If a file/dir does not exist the file/dir is ignored. However an
|
||||
* error text is send to PEAR error.
|
||||
* If a file/dir is not readable the file/dir is ignored. However an
|
||||
* error text is send to PEAR error.
|
||||
*
|
||||
* @param array $p_filelist An array of filenames and directory
|
||||
* names, or a single string with names
|
||||
* separated by a single blank space.
|
||||
* @param string $p_add_dir A string which contains a path to be
|
||||
* added to the memorized path of each
|
||||
* element in the list.
|
||||
* @param string $p_remove_dir A string which contains a path to be
|
||||
* removed from the memorized path of
|
||||
* each element in the list, when
|
||||
* relevant.
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
*/
|
||||
public function addModify($p_filelist, $p_add_dir, $p_remove_dir = '')
|
||||
{
|
||||
$v_result = true;
|
||||
|
||||
if (!$this->_isArchive()) {
|
||||
$v_result = $this->createModify(
|
||||
$p_filelist,
|
||||
$p_add_dir,
|
||||
$p_remove_dir
|
||||
);
|
||||
} else {
|
||||
if (is_array($p_filelist)) {
|
||||
$v_list = $p_filelist;
|
||||
} elseif (is_string($p_filelist)) {
|
||||
$v_list = explode($this->_separator, $p_filelist);
|
||||
} else {
|
||||
$this->_error('Invalid file list');
|
||||
return false;
|
||||
}
|
||||
|
||||
$v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method add a single string as a file at the
|
||||
* end of the existing archive. If the archive does not yet exists it
|
||||
* is created.
|
||||
*
|
||||
* @param string $p_filename A string which contains the full
|
||||
* filename path that will be associated
|
||||
* with the string.
|
||||
* @param string $p_string The content of the file added in
|
||||
* the archive.
|
||||
* @param bool|int $p_datetime A custom date/time (unix timestamp)
|
||||
* for the file (optional).
|
||||
* @param array $p_params An array of optional params:
|
||||
* stamp => the datetime (replaces
|
||||
* datetime above if it exists)
|
||||
* mode => the permissions on the
|
||||
* file (600 by default)
|
||||
* type => is this a link? See the
|
||||
* tar specification for details.
|
||||
* (default = regular file)
|
||||
* uid => the user ID of the file
|
||||
* (default = 0 = root)
|
||||
* gid => the group ID of the file
|
||||
* (default = 0 = root)
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
*/
|
||||
public function addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
|
||||
{
|
||||
$p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
|
||||
$p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
|
||||
$p_type = @$p_params["type"] ? $p_params["type"] : "";
|
||||
$p_uid = @$p_params["uid"] ? $p_params["uid"] : "";
|
||||
$p_gid = @$p_params["gid"] ? $p_params["gid"] : "";
|
||||
$v_result = true;
|
||||
|
||||
if (!$this->_isArchive()) {
|
||||
if (!$this->_openWrite()) {
|
||||
return false;
|
||||
}
|
||||
$this->_close();
|
||||
}
|
||||
|
||||
if (!$this->_openAppend()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Need to check the get back to the temporary file ? ....
|
||||
$v_result = $this->_addString($p_filename, $p_string, $p_datetime, $p_params);
|
||||
|
||||
$this->_writeFooter();
|
||||
|
||||
$this->_close();
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method extract all the content of the archive in the directory
|
||||
* indicated by $p_path. When relevant the memorized path of the
|
||||
* files/dir can be modified by removing the $p_remove_path path at the
|
||||
* beginning of the file/dir path.
|
||||
* While extracting a file, if the directory path does not exists it is
|
||||
* created.
|
||||
* While extracting a file, if the file already exists it is replaced
|
||||
* without looking for last modification date.
|
||||
* While extracting a file, if the file already exists and is write
|
||||
* protected, the extraction is aborted.
|
||||
* While extracting a file, if a directory with the same name already
|
||||
* exists, the extraction is aborted.
|
||||
* While extracting a directory, if a file with the same name already
|
||||
* exists, the extraction is aborted.
|
||||
* While extracting a file/directory if the destination directory exist
|
||||
* and is write protected, or does not exist but can not be created,
|
||||
* the extraction is aborted.
|
||||
* If after extraction an extracted file does not show the correct
|
||||
* stored file size, the extraction is aborted.
|
||||
* When the extraction is aborted, a PEAR error text is set and false
|
||||
* is returned. However the result can be a partial extraction that may
|
||||
* need to be manually cleaned.
|
||||
*
|
||||
* @param string $p_path The path of the directory where the
|
||||
* files/dir need to by extracted.
|
||||
* @param string $p_remove_path Part of the memorized path that can be
|
||||
* removed if present at the beginning of
|
||||
* the file/dir path.
|
||||
* @param boolean $p_preserve Preserve user/group ownership of files
|
||||
*
|
||||
* @return boolean true on success, false on error.
|
||||
* @see extractList()
|
||||
*/
|
||||
public function extractModify($p_path, $p_remove_path, $p_preserve = false)
|
||||
{
|
||||
$v_result = true;
|
||||
$v_list_detail = array();
|
||||
|
||||
if ($v_result = $this->_openRead()) {
|
||||
$v_result = $this->_extractList(
|
||||
$p_path,
|
||||
$v_list_detail,
|
||||
"complete",
|
||||
0,
|
||||
$p_remove_path,
|
||||
$p_preserve
|
||||
);
|
||||
$this->_close();
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method extract from the archive one file identified by $p_filename.
|
||||
* The return value is a string with the file content, or NULL on error.
|
||||
*
|
||||
* @param string $p_filename The path of the file to extract in a string.
|
||||
*
|
||||
* @return a string with the file content or NULL.
|
||||
*/
|
||||
public function extractInString($p_filename)
|
||||
{
|
||||
if ($this->_openRead()) {
|
||||
$v_result = $this->_extractInString($p_filename);
|
||||
$this->_close();
|
||||
} else {
|
||||
$v_result = null;
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method extract from the archive only the files indicated in the
|
||||
* $p_filelist. These files are extracted in the current directory or
|
||||
* in the directory indicated by the optional $p_path parameter.
|
||||
* If indicated the $p_remove_path can be used in the same way as it is
|
||||
* used in extractModify() method.
|
||||
*
|
||||
* @param array $p_filelist An array of filenames and directory names,
|
||||
* or a single string with names separated
|
||||
* by a single blank space.
|
||||
* @param string $p_path The path of the directory where the
|
||||
* files/dir need to by extracted.
|
||||
* @param string $p_remove_path Part of the memorized path that can be
|
||||
* removed if present at the beginning of
|
||||
* the file/dir path.
|
||||
* @param boolean $p_preserve Preserve user/group ownership of files
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
* @see extractModify()
|
||||
*/
|
||||
public function extractList($p_filelist, $p_path = '', $p_remove_path = '', $p_preserve = false)
|
||||
{
|
||||
$v_result = true;
|
||||
$v_list_detail = array();
|
||||
|
||||
if (is_array($p_filelist)) {
|
||||
$v_list = $p_filelist;
|
||||
} elseif (is_string($p_filelist)) {
|
||||
$v_list = explode($this->_separator, $p_filelist);
|
||||
} else {
|
||||
$this->_error('Invalid string list');
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($v_result = $this->_openRead()) {
|
||||
$v_result = $this->_extractList(
|
||||
$p_path,
|
||||
$v_list_detail,
|
||||
"partial",
|
||||
$v_list,
|
||||
$p_remove_path,
|
||||
$p_preserve
|
||||
);
|
||||
$this->_close();
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method set specific attributes of the archive. It uses a variable
|
||||
* list of parameters, in the format attribute code + attribute values :
|
||||
* $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
|
||||
*
|
||||
* @return true on success, false on error.
|
||||
*/
|
||||
public function setAttribute()
|
||||
{
|
||||
$v_result = true;
|
||||
|
||||
// ----- Get the number of variable list of arguments
|
||||
if (($v_size = func_num_args()) == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// ----- Get the arguments
|
||||
$v_att_list = & func_get_args();
|
||||
|
||||
// ----- Read the attributes
|
||||
$i = 0;
|
||||
while ($i < $v_size) {
|
||||
|
||||
// ----- Look for next option
|
||||
switch ($v_att_list[$i]) {
|
||||
// ----- Look for options that request a string value
|
||||
case ARCHIVE_TAR_ATT_SEPARATOR :
|
||||
// ----- Check the number of parameters
|
||||
if (($i + 1) >= $v_size) {
|
||||
$this->_error(
|
||||
'Invalid number of parameters for '
|
||||
. 'attribute ARCHIVE_TAR_ATT_SEPARATOR'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----- Get the value
|
||||
$this->_separator = $v_att_list[$i + 1];
|
||||
$i++;
|
||||
break;
|
||||
|
||||
default :
|
||||
$this->_error('Unknown attribute code ' . $v_att_list[$i] . '');
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----- Next attribute
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method sets the regular expression for ignoring files and directories
|
||||
* at import, for example:
|
||||
* $arch->setIgnoreRegexp("#CVS|\.svn#");
|
||||
*
|
||||
* @param string $regexp regular expression defining which files or directories to ignore
|
||||
*/
|
||||
public function setIgnoreRegexp($regexp)
|
||||
{
|
||||
$this->_ignore_regexp = $regexp;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method sets the regular expression for ignoring all files and directories
|
||||
* matching the filenames in the array list at import, for example:
|
||||
* $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool'));
|
||||
*
|
||||
* @param array $list a list of file or directory names to ignore
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function setIgnoreList($list)
|
||||
{
|
||||
$regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
|
||||
$regexp = '#/' . join('$|/', $list) . '#';
|
||||
$this->setIgnoreRegexp($regexp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_message
|
||||
*/
|
||||
public function _error($p_message)
|
||||
{
|
||||
$this->error_object = $this->raiseError($p_message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_message
|
||||
*/
|
||||
public function _warning($p_message)
|
||||
{
|
||||
$this->error_object = $this->raiseError($p_message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @return bool
|
||||
*/
|
||||
public function _isArchive($p_filename = null)
|
||||
{
|
||||
if ($p_filename == null) {
|
||||
$p_filename = $this->_tarname;
|
||||
}
|
||||
clearstatcache();
|
||||
return @is_file($p_filename) && !@is_link($p_filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _openWrite()
|
||||
{
|
||||
if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
|
||||
$this->_file = @gzopen($this->_tarname, "wb9");
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
|
||||
$this->_file = @bzopen($this->_tarname, "w");
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
|
||||
$this->_file = @xzopen($this->_tarname, 'w');
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
$this->_file = @fopen($this->_tarname, "wb");
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->_file == 0) {
|
||||
$this->_error(
|
||||
'Unable to open in write mode \''
|
||||
. $this->_tarname . '\''
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _openRead()
|
||||
{
|
||||
if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {
|
||||
|
||||
// ----- Look if a local copy need to be done
|
||||
if ($this->_temp_tarname == '') {
|
||||
$this->_temp_tarname = uniqid('tar') . '.tmp';
|
||||
if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
|
||||
$this->_error(
|
||||
'Unable to open in read mode \''
|
||||
. $this->_tarname . '\''
|
||||
);
|
||||
$this->_temp_tarname = '';
|
||||
return false;
|
||||
}
|
||||
if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
|
||||
$this->_error(
|
||||
'Unable to open in write mode \''
|
||||
. $this->_temp_tarname . '\''
|
||||
);
|
||||
$this->_temp_tarname = '';
|
||||
return false;
|
||||
}
|
||||
while ($v_data = @fread($v_file_from, 1024)) {
|
||||
@fwrite($v_file_to, $v_data);
|
||||
}
|
||||
@fclose($v_file_from);
|
||||
@fclose($v_file_to);
|
||||
}
|
||||
|
||||
// ----- File to open if the local copy
|
||||
$v_filename = $this->_temp_tarname;
|
||||
} else {
|
||||
// ----- File to open if the normal Tar file
|
||||
|
||||
$v_filename = $this->_tarname;
|
||||
}
|
||||
|
||||
if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
|
||||
$this->_file = @gzopen($v_filename, "rb");
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
|
||||
$this->_file = @bzopen($v_filename, "r");
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
|
||||
$this->_file = @xzopen($v_filename, "r");
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
$this->_file = @fopen($v_filename, "rb");
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->_file == 0) {
|
||||
$this->_error('Unable to open in read mode \'' . $v_filename . '\'');
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _openReadWrite()
|
||||
{
|
||||
if ($this->_compress_type == 'gz') {
|
||||
$this->_file = @gzopen($this->_tarname, "r+b");
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
$this->_error(
|
||||
'Unable to open bz2 in read/write mode \''
|
||||
. $this->_tarname . '\' (limitation of bz2 extension)'
|
||||
);
|
||||
return false;
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
$this->_error(
|
||||
'Unable to open lzma2 in read/write mode \''
|
||||
. $this->_tarname . '\' (limitation of lzma2 extension)'
|
||||
);
|
||||
return false;
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
$this->_file = @fopen($this->_tarname, "r+b");
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->_file == 0) {
|
||||
$this->_error(
|
||||
'Unable to open in read/write mode \''
|
||||
. $this->_tarname . '\''
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _close()
|
||||
{
|
||||
//if (isset($this->_file)) {
|
||||
if (is_resource($this->_file)) {
|
||||
if ($this->_compress_type == 'gz') {
|
||||
@gzclose($this->_file);
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
@bzclose($this->_file);
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
@xzclose($this->_file);
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
@fclose($this->_file);
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->_file = 0;
|
||||
}
|
||||
|
||||
// ----- Look if a local copy need to be erase
|
||||
// Note that it might be interesting to keep the url for a time : ToDo
|
||||
if ($this->_temp_tarname != '') {
|
||||
@unlink($this->_temp_tarname);
|
||||
$this->_temp_tarname = '';
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _cleanFile()
|
||||
{
|
||||
$this->_close();
|
||||
|
||||
// ----- Look for a local copy
|
||||
if ($this->_temp_tarname != '') {
|
||||
// ----- Remove the local copy but not the remote tarname
|
||||
@unlink($this->_temp_tarname);
|
||||
$this->_temp_tarname = '';
|
||||
} else {
|
||||
// ----- Remove the local tarname file
|
||||
@unlink($this->_tarname);
|
||||
}
|
||||
$this->_tarname = '';
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $p_binary_data
|
||||
* @param integer $p_len
|
||||
* @return bool
|
||||
*/
|
||||
public function _writeBlock($p_binary_data, $p_len = null)
|
||||
{
|
||||
if (is_resource($this->_file)) {
|
||||
if ($p_len === null) {
|
||||
if ($this->_compress_type == 'gz') {
|
||||
@gzputs($this->_file, $p_binary_data);
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
@bzwrite($this->_file, $p_binary_data);
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
@xzwrite($this->_file, $p_binary_data);
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
@fputs($this->_file, $p_binary_data);
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($this->_compress_type == 'gz') {
|
||||
@gzputs($this->_file, $p_binary_data, $p_len);
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
@bzwrite($this->_file, $p_binary_data, $p_len);
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
@xzwrite($this->_file, $p_binary_data, $p_len);
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
@fputs($this->_file, $p_binary_data, $p_len);
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return null|string
|
||||
*/
|
||||
public function _readBlock()
|
||||
{
|
||||
$v_block = null;
|
||||
if (is_resource($this->_file)) {
|
||||
if ($this->_compress_type == 'gz') {
|
||||
$v_block = @gzread($this->_file, 512);
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
$v_block = @bzread($this->_file, 512);
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
$v_block = @xzread($this->_file, 512);
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
$v_block = @fread($this->_file, 512);
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $v_block;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null $p_len
|
||||
* @return bool
|
||||
*/
|
||||
public function _jumpBlock($p_len = null)
|
||||
{
|
||||
if (is_resource($this->_file)) {
|
||||
if ($p_len === null) {
|
||||
$p_len = 1;
|
||||
}
|
||||
|
||||
if ($this->_compress_type == 'gz') {
|
||||
@gzseek($this->_file, gztell($this->_file) + ($p_len * 512));
|
||||
} else {
|
||||
if ($this->_compress_type == 'bz2') {
|
||||
// ----- Replace missing bztell() and bzseek()
|
||||
for ($i = 0; $i < $p_len; $i++) {
|
||||
$this->_readBlock();
|
||||
}
|
||||
} else {
|
||||
if ($this->_compress_type == 'lzma2') {
|
||||
// ----- Replace missing xztell() and xzseek()
|
||||
for ($i = 0; $i < $p_len; $i++) {
|
||||
$this->_readBlock();
|
||||
}
|
||||
} else {
|
||||
if ($this->_compress_type == 'none') {
|
||||
@fseek($this->_file, $p_len * 512, SEEK_CUR);
|
||||
} else {
|
||||
$this->_error(
|
||||
'Unknown or missing compression type ('
|
||||
. $this->_compress_type . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _writeFooter()
|
||||
{
|
||||
if (is_resource($this->_file)) {
|
||||
// ----- Write the last 0 filled block for end of archive
|
||||
$v_binary_data = pack('a1024', '');
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $p_list
|
||||
* @param string $p_add_dir
|
||||
* @param string $p_remove_dir
|
||||
* @return bool
|
||||
*/
|
||||
public function _addList($p_list, $p_add_dir, $p_remove_dir)
|
||||
{
|
||||
$v_result = true;
|
||||
$v_header = array();
|
||||
|
||||
// ----- Remove potential windows directory separator
|
||||
$p_add_dir = $this->_translateWinPath($p_add_dir);
|
||||
$p_remove_dir = $this->_translateWinPath($p_remove_dir, false);
|
||||
|
||||
if (!$this->_file) {
|
||||
$this->_error('Invalid file descriptor');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sizeof($p_list) == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ($p_list as $v_filename) {
|
||||
if (!$v_result) {
|
||||
break;
|
||||
}
|
||||
|
||||
// ----- Skip the current tar name
|
||||
if ($v_filename == $this->_tarname) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($v_filename == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// ----- ignore files and directories matching the ignore regular expression
|
||||
if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/' . $v_filename)) {
|
||||
$this->_warning("File '$v_filename' ignored");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!file_exists($v_filename) && !is_link($v_filename)) {
|
||||
$this->_warning("File '$v_filename' does not exist");
|
||||
continue;
|
||||
}
|
||||
|
||||
// ----- Add the file or directory header
|
||||
if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (@is_dir($v_filename) && !@is_link($v_filename)) {
|
||||
if (!($p_hdir = opendir($v_filename))) {
|
||||
$this->_warning("Directory '$v_filename' can not be read");
|
||||
continue;
|
||||
}
|
||||
while (false !== ($p_hitem = readdir($p_hdir))) {
|
||||
if (($p_hitem != '.') && ($p_hitem != '..')) {
|
||||
if ($v_filename != ".") {
|
||||
$p_temp_list[0] = $v_filename . '/' . $p_hitem;
|
||||
} else {
|
||||
$p_temp_list[0] = $p_hitem;
|
||||
}
|
||||
|
||||
$v_result = $this->_addList(
|
||||
$p_temp_list,
|
||||
$p_add_dir,
|
||||
$p_remove_dir
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
unset($p_temp_list);
|
||||
unset($p_hdir);
|
||||
unset($p_hitem);
|
||||
}
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @param mixed $p_header
|
||||
* @param string $p_add_dir
|
||||
* @param string $p_remove_dir
|
||||
* @param null $v_stored_filename
|
||||
* @return bool
|
||||
*/
|
||||
public function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename = null)
|
||||
{
|
||||
if (!$this->_file) {
|
||||
$this->_error('Invalid file descriptor');
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($p_filename == '') {
|
||||
$this->_error('Invalid file name');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_null($v_stored_filename)) {
|
||||
// ----- Calculate the stored filename
|
||||
$p_filename = $this->_translateWinPath($p_filename, false);
|
||||
$v_stored_filename = $p_filename;
|
||||
|
||||
if (strcmp($p_filename, $p_remove_dir) == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($p_remove_dir != '') {
|
||||
if (substr($p_remove_dir, -1) != '/') {
|
||||
$p_remove_dir .= '/';
|
||||
}
|
||||
|
||||
if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) {
|
||||
$v_stored_filename = substr($p_filename, strlen($p_remove_dir));
|
||||
}
|
||||
}
|
||||
|
||||
$v_stored_filename = $this->_translateWinPath($v_stored_filename);
|
||||
if ($p_add_dir != '') {
|
||||
if (substr($p_add_dir, -1) == '/') {
|
||||
$v_stored_filename = $p_add_dir . $v_stored_filename;
|
||||
} else {
|
||||
$v_stored_filename = $p_add_dir . '/' . $v_stored_filename;
|
||||
}
|
||||
}
|
||||
|
||||
$v_stored_filename = $this->_pathReduction($v_stored_filename);
|
||||
}
|
||||
|
||||
if ($this->_isArchive($p_filename)) {
|
||||
if (($v_file = @fopen($p_filename, "rb")) == 0) {
|
||||
$this->_warning(
|
||||
"Unable to open file '" . $p_filename
|
||||
. "' in binary read mode"
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (($v_buffer = fread($v_file, 512)) != '') {
|
||||
$v_binary_data = pack("a512", "$v_buffer");
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
fclose($v_file);
|
||||
} else {
|
||||
// ----- Only header for dir
|
||||
if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @param string $p_string
|
||||
* @param bool $p_datetime
|
||||
* @param array $p_params
|
||||
* @return bool
|
||||
*/
|
||||
public function _addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
|
||||
{
|
||||
$p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
|
||||
$p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
|
||||
$p_type = @$p_params["type"] ? $p_params["type"] : "";
|
||||
$p_uid = @$p_params["uid"] ? $p_params["uid"] : 0;
|
||||
$p_gid = @$p_params["gid"] ? $p_params["gid"] : 0;
|
||||
if (!$this->_file) {
|
||||
$this->_error('Invalid file descriptor');
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($p_filename == '') {
|
||||
$this->_error('Invalid file name');
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----- Calculate the stored filename
|
||||
$p_filename = $this->_translateWinPath($p_filename, false);
|
||||
|
||||
// ----- If datetime is not specified, set current time
|
||||
if ($p_datetime === false) {
|
||||
$p_datetime = time();
|
||||
}
|
||||
|
||||
if (!$this->_writeHeaderBlock(
|
||||
$p_filename,
|
||||
strlen($p_string),
|
||||
$p_stamp,
|
||||
$p_mode,
|
||||
$p_type,
|
||||
$p_uid,
|
||||
$p_gid
|
||||
)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$i = 0;
|
||||
while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') {
|
||||
$v_binary_data = pack("a512", $v_buffer);
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @param string $p_stored_filename
|
||||
* @return bool
|
||||
*/
|
||||
public function _writeHeader($p_filename, $p_stored_filename)
|
||||
{
|
||||
if ($p_stored_filename == '') {
|
||||
$p_stored_filename = $p_filename;
|
||||
}
|
||||
$v_reduce_filename = $this->_pathReduction($p_stored_filename);
|
||||
|
||||
if (strlen($v_reduce_filename) > 99) {
|
||||
if (!$this->_writeLongHeader($v_reduce_filename)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$v_info = lstat($p_filename);
|
||||
$v_uid = sprintf("%07s", DecOct($v_info[4]));
|
||||
$v_gid = sprintf("%07s", DecOct($v_info[5]));
|
||||
$v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));
|
||||
|
||||
$v_mtime = sprintf("%011s", DecOct($v_info['mtime']));
|
||||
|
||||
$v_linkname = '';
|
||||
|
||||
if (@is_link($p_filename)) {
|
||||
$v_typeflag = '2';
|
||||
$v_linkname = readlink($p_filename);
|
||||
$v_size = sprintf("%011s", DecOct(0));
|
||||
} elseif (@is_dir($p_filename)) {
|
||||
$v_typeflag = "5";
|
||||
$v_size = sprintf("%011s", DecOct(0));
|
||||
} else {
|
||||
$v_typeflag = '0';
|
||||
clearstatcache();
|
||||
$v_size = sprintf("%011s", DecOct($v_info['size']));
|
||||
}
|
||||
|
||||
$v_magic = 'ustar ';
|
||||
|
||||
$v_version = ' ';
|
||||
|
||||
if (function_exists('posix_getpwuid')) {
|
||||
$userinfo = posix_getpwuid($v_info[4]);
|
||||
$groupinfo = posix_getgrgid($v_info[5]);
|
||||
|
||||
$v_uname = $userinfo['name'];
|
||||
$v_gname = $groupinfo['name'];
|
||||
} else {
|
||||
$v_uname = '';
|
||||
$v_gname = '';
|
||||
}
|
||||
|
||||
$v_devmajor = '';
|
||||
|
||||
$v_devminor = '';
|
||||
|
||||
$v_prefix = '';
|
||||
|
||||
$v_binary_data_first = pack(
|
||||
"a100a8a8a8a12a12",
|
||||
$v_reduce_filename,
|
||||
$v_perms,
|
||||
$v_uid,
|
||||
$v_gid,
|
||||
$v_size,
|
||||
$v_mtime
|
||||
);
|
||||
$v_binary_data_last = pack(
|
||||
"a1a100a6a2a32a32a8a8a155a12",
|
||||
$v_typeflag,
|
||||
$v_linkname,
|
||||
$v_magic,
|
||||
$v_version,
|
||||
$v_uname,
|
||||
$v_gname,
|
||||
$v_devmajor,
|
||||
$v_devminor,
|
||||
$v_prefix,
|
||||
''
|
||||
);
|
||||
|
||||
// ----- Calculate the checksum
|
||||
$v_checksum = 0;
|
||||
// ..... First part of the header
|
||||
for ($i = 0; $i < 148; $i++) {
|
||||
$v_checksum += ord(substr($v_binary_data_first, $i, 1));
|
||||
}
|
||||
// ..... Ignore the checksum value and replace it by ' ' (space)
|
||||
for ($i = 148; $i < 156; $i++) {
|
||||
$v_checksum += ord(' ');
|
||||
}
|
||||
// ..... Last part of the header
|
||||
for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
|
||||
$v_checksum += ord(substr($v_binary_data_last, $j, 1));
|
||||
}
|
||||
|
||||
// ----- Write the first 148 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_first, 148);
|
||||
|
||||
// ----- Write the calculated checksum
|
||||
$v_checksum = sprintf("%06s ", DecOct($v_checksum));
|
||||
$v_binary_data = pack("a8", $v_checksum);
|
||||
$this->_writeBlock($v_binary_data, 8);
|
||||
|
||||
// ----- Write the last 356 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_last, 356);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @param int $p_size
|
||||
* @param int $p_mtime
|
||||
* @param int $p_perms
|
||||
* @param string $p_type
|
||||
* @param int $p_uid
|
||||
* @param int $p_gid
|
||||
* @return bool
|
||||
*/
|
||||
public function _writeHeaderBlock(
|
||||
$p_filename,
|
||||
$p_size,
|
||||
$p_mtime = 0,
|
||||
$p_perms = 0,
|
||||
$p_type = '',
|
||||
$p_uid = 0,
|
||||
$p_gid = 0
|
||||
) {
|
||||
$p_filename = $this->_pathReduction($p_filename);
|
||||
|
||||
if (strlen($p_filename) > 99) {
|
||||
if (!$this->_writeLongHeader($p_filename)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($p_type == "5") {
|
||||
$v_size = sprintf("%011s", DecOct(0));
|
||||
} else {
|
||||
$v_size = sprintf("%011s", DecOct($p_size));
|
||||
}
|
||||
|
||||
$v_uid = sprintf("%07s", DecOct($p_uid));
|
||||
$v_gid = sprintf("%07s", DecOct($p_gid));
|
||||
$v_perms = sprintf("%07s", DecOct($p_perms & 000777));
|
||||
|
||||
$v_mtime = sprintf("%11s", DecOct($p_mtime));
|
||||
|
||||
$v_linkname = '';
|
||||
|
||||
$v_magic = 'ustar ';
|
||||
|
||||
$v_version = ' ';
|
||||
|
||||
if (function_exists('posix_getpwuid')) {
|
||||
$userinfo = posix_getpwuid($p_uid);
|
||||
$groupinfo = posix_getgrgid($p_gid);
|
||||
|
||||
$v_uname = $userinfo['name'];
|
||||
$v_gname = $groupinfo['name'];
|
||||
} else {
|
||||
$v_uname = '';
|
||||
$v_gname = '';
|
||||
}
|
||||
|
||||
$v_devmajor = '';
|
||||
|
||||
$v_devminor = '';
|
||||
|
||||
$v_prefix = '';
|
||||
|
||||
$v_binary_data_first = pack(
|
||||
"a100a8a8a8a12A12",
|
||||
$p_filename,
|
||||
$v_perms,
|
||||
$v_uid,
|
||||
$v_gid,
|
||||
$v_size,
|
||||
$v_mtime
|
||||
);
|
||||
$v_binary_data_last = pack(
|
||||
"a1a100a6a2a32a32a8a8a155a12",
|
||||
$p_type,
|
||||
$v_linkname,
|
||||
$v_magic,
|
||||
$v_version,
|
||||
$v_uname,
|
||||
$v_gname,
|
||||
$v_devmajor,
|
||||
$v_devminor,
|
||||
$v_prefix,
|
||||
''
|
||||
);
|
||||
|
||||
// ----- Calculate the checksum
|
||||
$v_checksum = 0;
|
||||
// ..... First part of the header
|
||||
for ($i = 0; $i < 148; $i++) {
|
||||
$v_checksum += ord(substr($v_binary_data_first, $i, 1));
|
||||
}
|
||||
// ..... Ignore the checksum value and replace it by ' ' (space)
|
||||
for ($i = 148; $i < 156; $i++) {
|
||||
$v_checksum += ord(' ');
|
||||
}
|
||||
// ..... Last part of the header
|
||||
for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
|
||||
$v_checksum += ord(substr($v_binary_data_last, $j, 1));
|
||||
}
|
||||
|
||||
// ----- Write the first 148 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_first, 148);
|
||||
|
||||
// ----- Write the calculated checksum
|
||||
$v_checksum = sprintf("%06s ", DecOct($v_checksum));
|
||||
$v_binary_data = pack("a8", $v_checksum);
|
||||
$this->_writeBlock($v_binary_data, 8);
|
||||
|
||||
// ----- Write the last 356 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_last, 356);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_filename
|
||||
* @return bool
|
||||
*/
|
||||
public function _writeLongHeader($p_filename)
|
||||
{
|
||||
$v_size = sprintf("%11s ", DecOct(strlen($p_filename)));
|
||||
|
||||
$v_typeflag = 'L';
|
||||
|
||||
$v_linkname = '';
|
||||
|
||||
$v_magic = '';
|
||||
|
||||
$v_version = '';
|
||||
|
||||
$v_uname = '';
|
||||
|
||||
$v_gname = '';
|
||||
|
||||
$v_devmajor = '';
|
||||
|
||||
$v_devminor = '';
|
||||
|
||||
$v_prefix = '';
|
||||
|
||||
$v_binary_data_first = pack(
|
||||
"a100a8a8a8a12a12",
|
||||
'././@LongLink',
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
$v_size,
|
||||
0
|
||||
);
|
||||
$v_binary_data_last = pack(
|
||||
"a1a100a6a2a32a32a8a8a155a12",
|
||||
$v_typeflag,
|
||||
$v_linkname,
|
||||
$v_magic,
|
||||
$v_version,
|
||||
$v_uname,
|
||||
$v_gname,
|
||||
$v_devmajor,
|
||||
$v_devminor,
|
||||
$v_prefix,
|
||||
''
|
||||
);
|
||||
|
||||
// ----- Calculate the checksum
|
||||
$v_checksum = 0;
|
||||
// ..... First part of the header
|
||||
for ($i = 0; $i < 148; $i++) {
|
||||
$v_checksum += ord(substr($v_binary_data_first, $i, 1));
|
||||
}
|
||||
// ..... Ignore the checksum value and replace it by ' ' (space)
|
||||
for ($i = 148; $i < 156; $i++) {
|
||||
$v_checksum += ord(' ');
|
||||
}
|
||||
// ..... Last part of the header
|
||||
for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
|
||||
$v_checksum += ord(substr($v_binary_data_last, $j, 1));
|
||||
}
|
||||
|
||||
// ----- Write the first 148 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_first, 148);
|
||||
|
||||
// ----- Write the calculated checksum
|
||||
$v_checksum = sprintf("%06s ", DecOct($v_checksum));
|
||||
$v_binary_data = pack("a8", $v_checksum);
|
||||
$this->_writeBlock($v_binary_data, 8);
|
||||
|
||||
// ----- Write the last 356 bytes of the header in the archive
|
||||
$this->_writeBlock($v_binary_data_last, 356);
|
||||
|
||||
// ----- Write the filename as content of the block
|
||||
$i = 0;
|
||||
while (($v_buffer = substr($p_filename, (($i++) * 512), 512)) != '') {
|
||||
$v_binary_data = pack("a512", "$v_buffer");
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $v_binary_data
|
||||
* @param mixed $v_header
|
||||
* @return bool
|
||||
*/
|
||||
public function _readHeader($v_binary_data, &$v_header)
|
||||
{
|
||||
if (strlen($v_binary_data) == 0) {
|
||||
$v_header['filename'] = '';
|
||||
return true;
|
||||
}
|
||||
|
||||
if (strlen($v_binary_data) != 512) {
|
||||
$v_header['filename'] = '';
|
||||
$this->_error('Invalid block size : ' . strlen($v_binary_data));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!is_array($v_header)) {
|
||||
$v_header = array();
|
||||
}
|
||||
// ----- Calculate the checksum
|
||||
$v_checksum = 0;
|
||||
// ..... First part of the header
|
||||
$v_binary_split = str_split($v_binary_data);
|
||||
$v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 0, 148)));
|
||||
$v_checksum += array_sum(array_map('ord', array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',)));
|
||||
$v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 156, 512)));
|
||||
|
||||
|
||||
$v_data = unpack($this->_fmt, $v_binary_data);
|
||||
|
||||
if (strlen($v_data["prefix"]) > 0) {
|
||||
$v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
|
||||
}
|
||||
|
||||
// ----- Extract the checksum
|
||||
$v_header['checksum'] = OctDec(trim($v_data['checksum']));
|
||||
if ($v_header['checksum'] != $v_checksum) {
|
||||
$v_header['filename'] = '';
|
||||
|
||||
// ----- Look for last block (empty block)
|
||||
if (($v_checksum == 256) && ($v_header['checksum'] == 0)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->_error(
|
||||
'Invalid checksum for file "' . $v_data['filename']
|
||||
. '" : ' . $v_checksum . ' calculated, '
|
||||
. $v_header['checksum'] . ' expected'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----- Extract the properties
|
||||
$v_header['filename'] = rtrim($v_data['filename'], "\0");
|
||||
if ($this->_maliciousFilename($v_header['filename'])) {
|
||||
$this->_error(
|
||||
'Malicious .tar detected, file "' . $v_header['filename'] .
|
||||
'" will not install in desired directory tree'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$v_header['mode'] = OctDec(trim($v_data['mode']));
|
||||
$v_header['uid'] = OctDec(trim($v_data['uid']));
|
||||
$v_header['gid'] = OctDec(trim($v_data['gid']));
|
||||
$v_header['size'] = $this->_tarRecToSize($v_data['size']);
|
||||
$v_header['mtime'] = OctDec(trim($v_data['mtime']));
|
||||
if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
|
||||
$v_header['size'] = 0;
|
||||
}
|
||||
$v_header['link'] = trim($v_data['link']);
|
||||
/* ----- All these fields are removed form the header because
|
||||
they do not carry interesting info
|
||||
$v_header[magic] = trim($v_data[magic]);
|
||||
$v_header[version] = trim($v_data[version]);
|
||||
$v_header[uname] = trim($v_data[uname]);
|
||||
$v_header[gname] = trim($v_data[gname]);
|
||||
$v_header[devmajor] = trim($v_data[devmajor]);
|
||||
$v_header[devminor] = trim($v_data[devminor]);
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert Tar record size to actual size
|
||||
*
|
||||
* @param string $tar_size
|
||||
* @return size of tar record in bytes
|
||||
*/
|
||||
private function _tarRecToSize($tar_size)
|
||||
{
|
||||
/*
|
||||
* First byte of size has a special meaning if bit 7 is set.
|
||||
*
|
||||
* Bit 7 indicates base-256 encoding if set.
|
||||
* Bit 6 is the sign bit.
|
||||
* Bits 5:0 are most significant value bits.
|
||||
*/
|
||||
$ch = ord($tar_size[0]);
|
||||
if ($ch & 0x80) {
|
||||
// Full 12-bytes record is required.
|
||||
$rec_str = $tar_size . "\x00";
|
||||
|
||||
$size = ($ch & 0x40) ? -1 : 0;
|
||||
$size = ($size << 6) | ($ch & 0x3f);
|
||||
|
||||
for ($num_ch = 1; $num_ch < 12; ++$num_ch) {
|
||||
$size = ($size * 256) + ord($rec_str[$num_ch]);
|
||||
}
|
||||
|
||||
return $size;
|
||||
|
||||
} else {
|
||||
return OctDec(trim($tar_size));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect and report a malicious file name
|
||||
*
|
||||
* @param string $file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function _maliciousFilename($file)
|
||||
{
|
||||
if (strpos($file, '/../') !== false) {
|
||||
return true;
|
||||
}
|
||||
if (strpos($file, '../') === 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $v_header
|
||||
* @return bool
|
||||
*/
|
||||
public function _readLongHeader(&$v_header)
|
||||
{
|
||||
$v_filename = '';
|
||||
$v_filesize = $v_header['size'];
|
||||
$n = floor($v_header['size'] / 512);
|
||||
for ($i = 0; $i < $n; $i++) {
|
||||
$v_content = $this->_readBlock();
|
||||
$v_filename .= $v_content;
|
||||
}
|
||||
if (($v_header['size'] % 512) != 0) {
|
||||
$v_content = $this->_readBlock();
|
||||
$v_filename .= $v_content;
|
||||
}
|
||||
|
||||
// ----- Read the next header
|
||||
$v_binary_data = $this->_readBlock();
|
||||
|
||||
if (!$this->_readHeader($v_binary_data, $v_header)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0");
|
||||
$v_header['filename'] = $v_filename;
|
||||
if ($this->_maliciousFilename($v_filename)) {
|
||||
$this->_error(
|
||||
'Malicious .tar detected, file "' . $v_filename .
|
||||
'" will not install in desired directory tree'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method extract from the archive one file identified by $p_filename.
|
||||
* The return value is a string with the file content, or null on error.
|
||||
*
|
||||
* @param string $p_filename The path of the file to extract in a string.
|
||||
*
|
||||
* @return a string with the file content or null.
|
||||
*/
|
||||
private function _extractInString($p_filename)
|
||||
{
|
||||
$v_result_str = "";
|
||||
|
||||
while (strlen($v_binary_data = $this->_readBlock()) != 0) {
|
||||
if (!$this->_readHeader($v_binary_data, $v_header)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($v_header['filename'] == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// ----- Look for long filename
|
||||
if ($v_header['typeflag'] == 'L') {
|
||||
if (!$this->_readLongHeader($v_header)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if ($v_header['filename'] == $p_filename) {
|
||||
if ($v_header['typeflag'] == "5") {
|
||||
$this->_error(
|
||||
'Unable to extract in string a directory '
|
||||
. 'entry {' . $v_header['filename'] . '}'
|
||||
);
|
||||
return null;
|
||||
} else {
|
||||
$n = floor($v_header['size'] / 512);
|
||||
for ($i = 0; $i < $n; $i++) {
|
||||
$v_result_str .= $this->_readBlock();
|
||||
}
|
||||
if (($v_header['size'] % 512) != 0) {
|
||||
$v_content = $this->_readBlock();
|
||||
$v_result_str .= substr(
|
||||
$v_content,
|
||||
0,
|
||||
($v_header['size'] % 512)
|
||||
);
|
||||
}
|
||||
return $v_result_str;
|
||||
}
|
||||
} else {
|
||||
$this->_jumpBlock(ceil(($v_header['size'] / 512)));
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_path
|
||||
* @param string $p_list_detail
|
||||
* @param string $p_mode
|
||||
* @param string $p_file_list
|
||||
* @param string $p_remove_path
|
||||
* @param bool $p_preserve
|
||||
* @return bool
|
||||
*/
|
||||
public function _extractList(
|
||||
$p_path,
|
||||
&$p_list_detail,
|
||||
$p_mode,
|
||||
$p_file_list,
|
||||
$p_remove_path,
|
||||
$p_preserve = false
|
||||
) {
|
||||
$v_result = true;
|
||||
$v_nb = 0;
|
||||
$v_extract_all = true;
|
||||
$v_listing = false;
|
||||
|
||||
$p_path = $this->_translateWinPath($p_path, false);
|
||||
if ($p_path == '' || (substr($p_path, 0, 1) != '/'
|
||||
&& substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))
|
||||
) {
|
||||
$p_path = "./" . $p_path;
|
||||
}
|
||||
$p_remove_path = $this->_translateWinPath($p_remove_path);
|
||||
|
||||
// ----- Look for path to remove format (should end by /)
|
||||
if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) {
|
||||
$p_remove_path .= '/';
|
||||
}
|
||||
$p_remove_path_size = strlen($p_remove_path);
|
||||
|
||||
switch ($p_mode) {
|
||||
case "complete" :
|
||||
$v_extract_all = true;
|
||||
$v_listing = false;
|
||||
break;
|
||||
case "partial" :
|
||||
$v_extract_all = false;
|
||||
$v_listing = false;
|
||||
break;
|
||||
case "list" :
|
||||
$v_extract_all = false;
|
||||
$v_listing = true;
|
||||
break;
|
||||
default :
|
||||
$this->_error('Invalid extract mode (' . $p_mode . ')');
|
||||
return false;
|
||||
}
|
||||
|
||||
clearstatcache();
|
||||
|
||||
while (strlen($v_binary_data = $this->_readBlock()) != 0) {
|
||||
$v_extract_file = false;
|
||||
$v_extraction_stopped = 0;
|
||||
|
||||
if (!$this->_readHeader($v_binary_data, $v_header)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($v_header['filename'] == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// ----- Look for long filename
|
||||
if ($v_header['typeflag'] == 'L') {
|
||||
if (!$this->_readLongHeader($v_header)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ignore extended / pax headers
|
||||
if ($v_header['typeflag'] == 'x' || $v_header['typeflag'] == 'g') {
|
||||
$this->_jumpBlock(ceil(($v_header['size'] / 512)));
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((!$v_extract_all) && (is_array($p_file_list))) {
|
||||
// ----- By default no unzip if the file is not found
|
||||
$v_extract_file = false;
|
||||
|
||||
for ($i = 0; $i < sizeof($p_file_list); $i++) {
|
||||
// ----- Look if it is a directory
|
||||
if (substr($p_file_list[$i], -1) == '/') {
|
||||
// ----- Look if the directory is in the filename path
|
||||
if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
|
||||
&& (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
|
||||
== $p_file_list[$i])
|
||||
) {
|
||||
$v_extract_file = true;
|
||||
break;
|
||||
}
|
||||
} // ----- It is a file, so compare the file names
|
||||
elseif ($p_file_list[$i] == $v_header['filename']) {
|
||||
$v_extract_file = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$v_extract_file = true;
|
||||
}
|
||||
|
||||
// ----- Look if this file need to be extracted
|
||||
if (($v_extract_file) && (!$v_listing)) {
|
||||
if (($p_remove_path != '')
|
||||
&& (substr($v_header['filename'] . '/', 0, $p_remove_path_size)
|
||||
== $p_remove_path)
|
||||
) {
|
||||
$v_header['filename'] = substr(
|
||||
$v_header['filename'],
|
||||
$p_remove_path_size
|
||||
);
|
||||
if ($v_header['filename'] == '') {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (($p_path != './') && ($p_path != '/')) {
|
||||
while (substr($p_path, -1) == '/') {
|
||||
$p_path = substr($p_path, 0, strlen($p_path) - 1);
|
||||
}
|
||||
|
||||
if (substr($v_header['filename'], 0, 1) == '/') {
|
||||
$v_header['filename'] = $p_path . $v_header['filename'];
|
||||
} else {
|
||||
$v_header['filename'] = $p_path . '/' . $v_header['filename'];
|
||||
}
|
||||
}
|
||||
if (file_exists($v_header['filename'])) {
|
||||
if ((@is_dir($v_header['filename']))
|
||||
&& ($v_header['typeflag'] == '')
|
||||
) {
|
||||
$this->_error(
|
||||
'File ' . $v_header['filename']
|
||||
. ' already exists as a directory'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (($this->_isArchive($v_header['filename']))
|
||||
&& ($v_header['typeflag'] == "5")
|
||||
) {
|
||||
$this->_error(
|
||||
'Directory ' . $v_header['filename']
|
||||
. ' already exists as a file'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (!is_writeable($v_header['filename'])) {
|
||||
$this->_error(
|
||||
'File ' . $v_header['filename']
|
||||
. ' already exists and is write protected'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
if (filemtime($v_header['filename']) > $v_header['mtime']) {
|
||||
// To be completed : An error or silent no replace ?
|
||||
}
|
||||
} // ----- Check the directory availability and create it if necessary
|
||||
elseif (($v_result
|
||||
= $this->_dirCheck(
|
||||
($v_header['typeflag'] == "5"
|
||||
? $v_header['filename']
|
||||
: dirname($v_header['filename']))
|
||||
)) != 1
|
||||
) {
|
||||
$this->_error('Unable to create path for ' . $v_header['filename']);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($v_extract_file) {
|
||||
if ($v_header['typeflag'] == "5") {
|
||||
if (!@file_exists($v_header['filename'])) {
|
||||
if (!@mkdir($v_header['filename'], 0777)) {
|
||||
$this->_error(
|
||||
'Unable to create directory {'
|
||||
. $v_header['filename'] . '}'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} elseif ($v_header['typeflag'] == "2") {
|
||||
if (@file_exists($v_header['filename'])) {
|
||||
@unlink($v_header['filename']);
|
||||
}
|
||||
if (!@symlink($v_header['link'], $v_header['filename'])) {
|
||||
$this->_error(
|
||||
'Unable to extract symbolic link {'
|
||||
. $v_header['filename'] . '}'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
|
||||
$this->_error(
|
||||
'Error while opening {' . $v_header['filename']
|
||||
. '} in write binary mode'
|
||||
);
|
||||
return false;
|
||||
} else {
|
||||
$n = floor($v_header['size'] / 512);
|
||||
for ($i = 0; $i < $n; $i++) {
|
||||
$v_content = $this->_readBlock();
|
||||
fwrite($v_dest_file, $v_content, 512);
|
||||
}
|
||||
if (($v_header['size'] % 512) != 0) {
|
||||
$v_content = $this->_readBlock();
|
||||
fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
|
||||
}
|
||||
|
||||
@fclose($v_dest_file);
|
||||
|
||||
if ($p_preserve) {
|
||||
@chown($v_header['filename'], $v_header['uid']);
|
||||
@chgrp($v_header['filename'], $v_header['gid']);
|
||||
}
|
||||
|
||||
// ----- Change the file mode, mtime
|
||||
@touch($v_header['filename'], $v_header['mtime']);
|
||||
if ($v_header['mode'] & 0111) {
|
||||
// make file executable, obey umask
|
||||
$mode = fileperms($v_header['filename']) | (~umask() & 0111);
|
||||
@chmod($v_header['filename'], $mode);
|
||||
}
|
||||
}
|
||||
|
||||
// ----- Check the file size
|
||||
clearstatcache();
|
||||
if (!is_file($v_header['filename'])) {
|
||||
$this->_error(
|
||||
'Extracted file ' . $v_header['filename']
|
||||
. 'does not exist. Archive may be corrupted.'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
$filesize = filesize($v_header['filename']);
|
||||
if ($filesize != $v_header['size']) {
|
||||
$this->_error(
|
||||
'Extracted file ' . $v_header['filename']
|
||||
. ' does not have the correct file size \''
|
||||
. $filesize
|
||||
. '\' (' . $v_header['size']
|
||||
. ' expected). Archive may be corrupted.'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->_jumpBlock(ceil(($v_header['size'] / 512)));
|
||||
}
|
||||
} else {
|
||||
$this->_jumpBlock(ceil(($v_header['size'] / 512)));
|
||||
}
|
||||
|
||||
/* TBC : Seems to be unused ...
|
||||
if ($this->_compress)
|
||||
$v_end_of_file = @gzeof($this->_file);
|
||||
else
|
||||
$v_end_of_file = @feof($this->_file);
|
||||
*/
|
||||
|
||||
if ($v_listing || $v_extract_file || $v_extraction_stopped) {
|
||||
// ----- Log extracted files
|
||||
if (($v_file_dir = dirname($v_header['filename']))
|
||||
== $v_header['filename']
|
||||
) {
|
||||
$v_file_dir = '';
|
||||
}
|
||||
if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) {
|
||||
$v_file_dir = '/';
|
||||
}
|
||||
|
||||
$p_list_detail[$v_nb++] = $v_header;
|
||||
if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function _openAppend()
|
||||
{
|
||||
if (filesize($this->_tarname) == 0) {
|
||||
return $this->_openWrite();
|
||||
}
|
||||
|
||||
if ($this->_compress) {
|
||||
$this->_close();
|
||||
|
||||
if (!@rename($this->_tarname, $this->_tarname . ".tmp")) {
|
||||
$this->_error(
|
||||
'Error while renaming \'' . $this->_tarname
|
||||
. '\' to temporary file \'' . $this->_tarname
|
||||
. '.tmp\''
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->_compress_type == 'gz') {
|
||||
$v_temp_tar = @gzopen($this->_tarname . ".tmp", "rb");
|
||||
} elseif ($this->_compress_type == 'bz2') {
|
||||
$v_temp_tar = @bzopen($this->_tarname . ".tmp", "r");
|
||||
} elseif ($this->_compress_type == 'lzma2') {
|
||||
$v_temp_tar = @xzopen($this->_tarname . ".tmp", "r");
|
||||
}
|
||||
|
||||
|
||||
if ($v_temp_tar == 0) {
|
||||
$this->_error(
|
||||
'Unable to open file \'' . $this->_tarname
|
||||
. '.tmp\' in binary read mode'
|
||||
);
|
||||
@rename($this->_tarname . ".tmp", $this->_tarname);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$this->_openWrite()) {
|
||||
@rename($this->_tarname . ".tmp", $this->_tarname);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->_compress_type == 'gz') {
|
||||
$end_blocks = 0;
|
||||
|
||||
while (!@gzeof($v_temp_tar)) {
|
||||
$v_buffer = @gzread($v_temp_tar, 512);
|
||||
if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
|
||||
$end_blocks++;
|
||||
// do not copy end blocks, we will re-make them
|
||||
// after appending
|
||||
continue;
|
||||
} elseif ($end_blocks > 0) {
|
||||
for ($i = 0; $i < $end_blocks; $i++) {
|
||||
$this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
|
||||
}
|
||||
$end_blocks = 0;
|
||||
}
|
||||
$v_binary_data = pack("a512", $v_buffer);
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
@gzclose($v_temp_tar);
|
||||
} elseif ($this->_compress_type == 'bz2') {
|
||||
$end_blocks = 0;
|
||||
|
||||
while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
|
||||
if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
|
||||
$end_blocks++;
|
||||
// do not copy end blocks, we will re-make them
|
||||
// after appending
|
||||
continue;
|
||||
} elseif ($end_blocks > 0) {
|
||||
for ($i = 0; $i < $end_blocks; $i++) {
|
||||
$this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
|
||||
}
|
||||
$end_blocks = 0;
|
||||
}
|
||||
$v_binary_data = pack("a512", $v_buffer);
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
@bzclose($v_temp_tar);
|
||||
} elseif ($this->_compress_type == 'lzma2') {
|
||||
$end_blocks = 0;
|
||||
|
||||
while (strlen($v_buffer = @xzread($v_temp_tar, 512)) > 0) {
|
||||
if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
|
||||
$end_blocks++;
|
||||
// do not copy end blocks, we will re-make them
|
||||
// after appending
|
||||
continue;
|
||||
} elseif ($end_blocks > 0) {
|
||||
for ($i = 0; $i < $end_blocks; $i++) {
|
||||
$this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
|
||||
}
|
||||
$end_blocks = 0;
|
||||
}
|
||||
$v_binary_data = pack("a512", $v_buffer);
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
@xzclose($v_temp_tar);
|
||||
}
|
||||
|
||||
if (!@unlink($this->_tarname . ".tmp")) {
|
||||
$this->_error(
|
||||
'Error while deleting temporary file \''
|
||||
. $this->_tarname . '.tmp\''
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// ----- For not compressed tar, just add files before the last
|
||||
// one or two 512 bytes block
|
||||
if (!$this->_openReadWrite()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
clearstatcache();
|
||||
$v_size = filesize($this->_tarname);
|
||||
|
||||
// We might have zero, one or two end blocks.
|
||||
// The standard is two, but we should try to handle
|
||||
// other cases.
|
||||
fseek($this->_file, $v_size - 1024);
|
||||
if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
|
||||
fseek($this->_file, $v_size - 1024);
|
||||
} elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
|
||||
fseek($this->_file, $v_size - 512);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $p_filelist
|
||||
* @param string $p_add_dir
|
||||
* @param string $p_remove_dir
|
||||
* @return bool
|
||||
*/
|
||||
public function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '')
|
||||
{
|
||||
if (!$this->_openAppend()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) {
|
||||
$this->_writeFooter();
|
||||
}
|
||||
|
||||
$this->_close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a directory exists and create it (including parent
|
||||
* dirs) if not.
|
||||
*
|
||||
* @param string $p_dir directory to check
|
||||
*
|
||||
* @return bool true if the directory exists or was created
|
||||
*/
|
||||
public function _dirCheck($p_dir)
|
||||
{
|
||||
clearstatcache();
|
||||
if ((@is_dir($p_dir)) || ($p_dir == '')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$p_parent_dir = dirname($p_dir);
|
||||
|
||||
if (($p_parent_dir != $p_dir) &&
|
||||
($p_parent_dir != '') &&
|
||||
(!$this->_dirCheck($p_parent_dir))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!@mkdir($p_dir, 0777)) {
|
||||
$this->_error("Unable to create directory '$p_dir'");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
|
||||
* rand emove double slashes.
|
||||
*
|
||||
* @param string $p_dir path to reduce
|
||||
*
|
||||
* @return string reduced path
|
||||
*/
|
||||
private function _pathReduction($p_dir)
|
||||
{
|
||||
$v_result = '';
|
||||
|
||||
// ----- Look for not empty path
|
||||
if ($p_dir != '') {
|
||||
// ----- Explode path by directory names
|
||||
$v_list = explode('/', $p_dir);
|
||||
|
||||
// ----- Study directories from last to first
|
||||
for ($i = sizeof($v_list) - 1; $i >= 0; $i--) {
|
||||
// ----- Look for current path
|
||||
if ($v_list[$i] == ".") {
|
||||
// ----- Ignore this directory
|
||||
// Should be the first $i=0, but no check is done
|
||||
} else {
|
||||
if ($v_list[$i] == "..") {
|
||||
// ----- Ignore it and ignore the $i-1
|
||||
$i--;
|
||||
} else {
|
||||
if (($v_list[$i] == '')
|
||||
&& ($i != (sizeof($v_list) - 1))
|
||||
&& ($i != 0)
|
||||
) {
|
||||
// ----- Ignore only the double '//' in path,
|
||||
// but not the first and last /
|
||||
} else {
|
||||
$v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? '/'
|
||||
. $v_result : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (defined('OS_WINDOWS') && OS_WINDOWS) {
|
||||
$v_result = strtr($v_result, '\\', '/');
|
||||
}
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $p_path
|
||||
* @param bool $p_remove_disk_letter
|
||||
* @return string
|
||||
*/
|
||||
public function _translateWinPath($p_path, $p_remove_disk_letter = true)
|
||||
{
|
||||
if (defined('OS_WINDOWS') && OS_WINDOWS) {
|
||||
// ----- Look for potential disk letter
|
||||
if (($p_remove_disk_letter)
|
||||
&& (($v_position = strpos($p_path, ':')) != false)
|
||||
) {
|
||||
$p_path = substr($p_path, $v_position + 1);
|
||||
}
|
||||
// ----- Change potential windows directory separator
|
||||
if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) {
|
||||
$p_path = strtr($p_path, '\\', '/');
|
||||
}
|
||||
}
|
||||
return $p_path;
|
||||
}
|
||||
}
|
||||
360
vendor/pear-pear.php.net/Console_Getopt/Console/Getopt.php
generated
vendored
Normal file
360
vendor/pear-pear.php.net/Console_Getopt/Console/Getopt.php
generated
vendored
Normal file
|
|
@ -0,0 +1,360 @@
|
|||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
||||
/**
|
||||
* PHP Version 5
|
||||
*
|
||||
* Copyright (c) 1997-2004 The PHP Group
|
||||
*
|
||||
* This source file is subject to version 3.0 of the PHP license,
|
||||
* that is bundled with this package in the file LICENSE, and is
|
||||
* available through the world-wide-web at the following url:
|
||||
* http://www.php.net/license/3_0.txt.
|
||||
* If you did not receive a copy of the PHP license and are unable to
|
||||
* obtain it through the world-wide-web, please send a note to
|
||||
* license@php.net so we can mail you a copy immediately.
|
||||
*
|
||||
* @category Console
|
||||
* @package Console_Getopt
|
||||
* @author Andrei Zmievski <andrei@php.net>
|
||||
* @license http://www.php.net/license/3_0.txt PHP 3.0
|
||||
* @version CVS: $Id$
|
||||
* @link http://pear.php.net/package/Console_Getopt
|
||||
*/
|
||||
|
||||
require_once 'PEAR.php';
|
||||
|
||||
/**
|
||||
* Command-line options parsing class.
|
||||
*
|
||||
* @category Console
|
||||
* @package Console_Getopt
|
||||
* @author Andrei Zmievski <andrei@php.net>
|
||||
* @license http://www.php.net/license/3_0.txt PHP 3.0
|
||||
* @link http://pear.php.net/package/Console_Getopt
|
||||
*/
|
||||
class Console_Getopt
|
||||
{
|
||||
|
||||
/**
|
||||
* Parses the command-line options.
|
||||
*
|
||||
* The first parameter to this function should be the list of command-line
|
||||
* arguments without the leading reference to the running program.
|
||||
*
|
||||
* The second parameter is a string of allowed short options. Each of the
|
||||
* option letters can be followed by a colon ':' to specify that the option
|
||||
* requires an argument, or a double colon '::' to specify that the option
|
||||
* takes an optional argument.
|
||||
*
|
||||
* The third argument is an optional array of allowed long options. The
|
||||
* leading '--' should not be included in the option name. Options that
|
||||
* require an argument should be followed by '=', and options that take an
|
||||
* option argument should be followed by '=='.
|
||||
*
|
||||
* The return value is an array of two elements: the list of parsed
|
||||
* options and the list of non-option command-line arguments. Each entry in
|
||||
* the list of parsed options is a pair of elements - the first one
|
||||
* specifies the option, and the second one specifies the option argument,
|
||||
* if there was one.
|
||||
*
|
||||
* Long and short options can be mixed.
|
||||
*
|
||||
* Most of the semantics of this function are based on GNU getopt_long().
|
||||
*
|
||||
* @param array $args an array of command-line arguments
|
||||
* @param string $short_options specifies the list of allowed short options
|
||||
* @param array $long_options specifies the list of allowed long options
|
||||
* @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
|
||||
*
|
||||
* @return array two-element array containing the list of parsed options and
|
||||
* the non-option arguments
|
||||
*/
|
||||
public static function getopt2($args, $short_options, $long_options = null, $skip_unknown = false)
|
||||
{
|
||||
return Console_Getopt::doGetopt(2, $args, $short_options, $long_options, $skip_unknown);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function expects $args to start with the script name (POSIX-style).
|
||||
* Preserved for backwards compatibility.
|
||||
*
|
||||
* @param array $args an array of command-line arguments
|
||||
* @param string $short_options specifies the list of allowed short options
|
||||
* @param array $long_options specifies the list of allowed long options
|
||||
*
|
||||
* @see getopt2()
|
||||
* @return array two-element array containing the list of parsed options and
|
||||
* the non-option arguments
|
||||
*/
|
||||
public static function getopt($args, $short_options, $long_options = null, $skip_unknown = false)
|
||||
{
|
||||
return Console_Getopt::doGetopt(1, $args, $short_options, $long_options, $skip_unknown);
|
||||
}
|
||||
|
||||
/**
|
||||
* The actual implementation of the argument parsing code.
|
||||
*
|
||||
* @param int $version Version to use
|
||||
* @param array $args an array of command-line arguments
|
||||
* @param string $short_options specifies the list of allowed short options
|
||||
* @param array $long_options specifies the list of allowed long options
|
||||
* @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function doGetopt($version, $args, $short_options, $long_options = null, $skip_unknown = false)
|
||||
{
|
||||
// in case you pass directly readPHPArgv() as the first arg
|
||||
if (PEAR::isError($args)) {
|
||||
return $args;
|
||||
}
|
||||
|
||||
if (empty($args)) {
|
||||
return array(array(), array());
|
||||
}
|
||||
|
||||
$non_opts = $opts = array();
|
||||
|
||||
settype($args, 'array');
|
||||
|
||||
if ($long_options) {
|
||||
sort($long_options);
|
||||
}
|
||||
|
||||
/*
|
||||
* Preserve backwards compatibility with callers that relied on
|
||||
* erroneous POSIX fix.
|
||||
*/
|
||||
if ($version < 2) {
|
||||
if (isset($args[0]{0}) && $args[0]{0} != '-') {
|
||||
array_shift($args);
|
||||
}
|
||||
}
|
||||
|
||||
reset($args);
|
||||
while (list($i, $arg) = each($args)) {
|
||||
/* The special element '--' means explicit end of
|
||||
options. Treat the rest of the arguments as non-options
|
||||
and end the loop. */
|
||||
if ($arg == '--') {
|
||||
$non_opts = array_merge($non_opts, array_slice($args, $i + 1));
|
||||
break;
|
||||
}
|
||||
|
||||
if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) {
|
||||
$non_opts = array_merge($non_opts, array_slice($args, $i));
|
||||
break;
|
||||
} elseif (strlen($arg) > 1 && $arg{1} == '-') {
|
||||
$error = Console_Getopt::_parseLongOption(substr($arg, 2),
|
||||
$long_options,
|
||||
$opts,
|
||||
$args,
|
||||
$skip_unknown);
|
||||
if (PEAR::isError($error)) {
|
||||
return $error;
|
||||
}
|
||||
} elseif ($arg == '-') {
|
||||
// - is stdin
|
||||
$non_opts = array_merge($non_opts, array_slice($args, $i));
|
||||
break;
|
||||
} else {
|
||||
$error = Console_Getopt::_parseShortOption(substr($arg, 1),
|
||||
$short_options,
|
||||
$opts,
|
||||
$args,
|
||||
$skip_unknown);
|
||||
if (PEAR::isError($error)) {
|
||||
return $error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array($opts, $non_opts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse short option
|
||||
*
|
||||
* @param string $arg Argument
|
||||
* @param string[] $short_options Available short options
|
||||
* @param string[][] &$opts
|
||||
* @param string[] &$args
|
||||
* @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected static function _parseShortOption($arg, $short_options, &$opts, &$args, $skip_unknown)
|
||||
{
|
||||
for ($i = 0; $i < strlen($arg); $i++) {
|
||||
$opt = $arg{$i};
|
||||
$opt_arg = null;
|
||||
|
||||
/* Try to find the short option in the specifier string. */
|
||||
if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':') {
|
||||
if ($skip_unknown === true) {
|
||||
break;
|
||||
}
|
||||
|
||||
$msg = "Console_Getopt: unrecognized option -- $opt";
|
||||
return PEAR::raiseError($msg);
|
||||
}
|
||||
|
||||
if (strlen($spec) > 1 && $spec{1} == ':') {
|
||||
if (strlen($spec) > 2 && $spec{2} == ':') {
|
||||
if ($i + 1 < strlen($arg)) {
|
||||
/* Option takes an optional argument. Use the remainder of
|
||||
the arg string if there is anything left. */
|
||||
$opts[] = array($opt, substr($arg, $i + 1));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* Option requires an argument. Use the remainder of the arg
|
||||
string if there is anything left. */
|
||||
if ($i + 1 < strlen($arg)) {
|
||||
$opts[] = array($opt, substr($arg, $i + 1));
|
||||
break;
|
||||
} else if (list(, $opt_arg) = each($args)) {
|
||||
/* Else use the next argument. */;
|
||||
if (Console_Getopt::_isShortOpt($opt_arg)
|
||||
|| Console_Getopt::_isLongOpt($opt_arg)) {
|
||||
$msg = "option requires an argument --$opt";
|
||||
return PEAR::raiseError("Console_Getopt: " . $msg);
|
||||
}
|
||||
} else {
|
||||
$msg = "option requires an argument --$opt";
|
||||
return PEAR::raiseError("Console_Getopt: " . $msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$opts[] = array($opt, $opt_arg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an argument is a short option
|
||||
*
|
||||
* @param string $arg Argument to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function _isShortOpt($arg)
|
||||
{
|
||||
return strlen($arg) == 2 && $arg[0] == '-'
|
||||
&& preg_match('/[a-zA-Z]/', $arg[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an argument is a long option
|
||||
*
|
||||
* @param string $arg Argument to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function _isLongOpt($arg)
|
||||
{
|
||||
return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
|
||||
preg_match('/[a-zA-Z]+$/', substr($arg, 2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse long option
|
||||
*
|
||||
* @param string $arg Argument
|
||||
* @param string[] $long_options Available long options
|
||||
* @param string[][] &$opts
|
||||
* @param string[] &$args
|
||||
*
|
||||
* @return void|PEAR_Error
|
||||
*/
|
||||
protected static function _parseLongOption($arg, $long_options, &$opts, &$args, $skip_unknown)
|
||||
{
|
||||
@list($opt, $opt_arg) = explode('=', $arg, 2);
|
||||
|
||||
$opt_len = strlen($opt);
|
||||
|
||||
for ($i = 0; $i < count($long_options); $i++) {
|
||||
$long_opt = $long_options[$i];
|
||||
$opt_start = substr($long_opt, 0, $opt_len);
|
||||
|
||||
$long_opt_name = str_replace('=', '', $long_opt);
|
||||
|
||||
/* Option doesn't match. Go on to the next one. */
|
||||
if ($long_opt_name != $opt) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$opt_rest = substr($long_opt, $opt_len);
|
||||
|
||||
/* Check that the options uniquely matches one of the allowed
|
||||
options. */
|
||||
if ($i + 1 < count($long_options)) {
|
||||
$next_option_rest = substr($long_options[$i + 1], $opt_len);
|
||||
} else {
|
||||
$next_option_rest = '';
|
||||
}
|
||||
|
||||
if ($opt_rest != '' && $opt{0} != '=' &&
|
||||
$i + 1 < count($long_options) &&
|
||||
$opt == substr($long_options[$i+1], 0, $opt_len) &&
|
||||
$next_option_rest != '' &&
|
||||
$next_option_rest{0} != '=') {
|
||||
|
||||
$msg = "Console_Getopt: option --$opt is ambiguous";
|
||||
return PEAR::raiseError($msg);
|
||||
}
|
||||
|
||||
if (substr($long_opt, -1) == '=') {
|
||||
if (substr($long_opt, -2) != '==') {
|
||||
/* Long option requires an argument.
|
||||
Take the next argument if one wasn't specified. */;
|
||||
if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) {
|
||||
$msg = "Console_Getopt: option requires an argument --$opt";
|
||||
return PEAR::raiseError($msg);
|
||||
}
|
||||
|
||||
if (Console_Getopt::_isShortOpt($opt_arg)
|
||||
|| Console_Getopt::_isLongOpt($opt_arg)) {
|
||||
$msg = "Console_Getopt: option requires an argument --$opt";
|
||||
return PEAR::raiseError($msg);
|
||||
}
|
||||
}
|
||||
} else if ($opt_arg) {
|
||||
$msg = "Console_Getopt: option --$opt doesn't allow an argument";
|
||||
return PEAR::raiseError($msg);
|
||||
}
|
||||
|
||||
$opts[] = array('--' . $opt, $opt_arg);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($skip_unknown === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
return PEAR::raiseError("Console_Getopt: unrecognized option --$opt");
|
||||
}
|
||||
|
||||
/**
|
||||
* Safely read the $argv PHP array across different PHP configurations.
|
||||
* Will take care on register_globals and register_argc_argv ini directives
|
||||
*
|
||||
* @return mixed the $argv PHP array or PEAR error if not registered
|
||||
*/
|
||||
public static function readPHPArgv()
|
||||
{
|
||||
global $argv;
|
||||
if (!is_array($argv)) {
|
||||
if (!@is_array($_SERVER['argv'])) {
|
||||
if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
|
||||
$msg = "Could not read cmd args (register_argc_argv=Off?)";
|
||||
return PEAR::raiseError("Console_Getopt: " . $msg);
|
||||
}
|
||||
return $GLOBALS['HTTP_SERVER_VARS']['argv'];
|
||||
}
|
||||
return $_SERVER['argv'];
|
||||
}
|
||||
return $argv;
|
||||
}
|
||||
|
||||
}
|
||||
337
vendor/pear-pear.php.net/PEAR/OS/Guess.php
generated
vendored
Normal file
337
vendor/pear-pear.php.net/PEAR/OS/Guess.php
generated
vendored
Normal file
|
|
@ -0,0 +1,337 @@
|
|||
<?php
|
||||
/**
|
||||
* The OS_Guess class
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Gregory Beaver <cellog@php.net>
|
||||
* @copyright 1997-2009 The Authors
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since File available since PEAR 0.1
|
||||
*/
|
||||
|
||||
// {{{ uname examples
|
||||
|
||||
// php_uname() without args returns the same as 'uname -a', or a PHP-custom
|
||||
// string for Windows.
|
||||
// PHP versions prior to 4.3 return the uname of the host where PHP was built,
|
||||
// as of 4.3 it returns the uname of the host running the PHP code.
|
||||
//
|
||||
// PC RedHat Linux 7.1:
|
||||
// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
|
||||
//
|
||||
// PC Debian Potato:
|
||||
// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
|
||||
//
|
||||
// PC FreeBSD 3.3:
|
||||
// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386
|
||||
//
|
||||
// PC FreeBSD 4.3:
|
||||
// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386
|
||||
//
|
||||
// PC FreeBSD 4.5:
|
||||
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386
|
||||
//
|
||||
// PC FreeBSD 4.5 w/uname from GNU shellutils:
|
||||
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown
|
||||
//
|
||||
// HP 9000/712 HP-UX 10:
|
||||
// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
|
||||
//
|
||||
// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
|
||||
// HP-UX host B.10.10 A 9000/712 unknown
|
||||
//
|
||||
// IBM RS6000/550 AIX 4.3:
|
||||
// AIX host 3 4 000003531C00
|
||||
//
|
||||
// AIX 4.3 w/uname from GNU shellutils:
|
||||
// AIX host 3 4 000003531C00 unknown
|
||||
//
|
||||
// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
|
||||
// IRIX64 host 6.5 01091820 IP19 mips
|
||||
//
|
||||
// SGI Onyx IRIX 6.5:
|
||||
// IRIX64 host 6.5 01091820 IP19
|
||||
//
|
||||
// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
|
||||
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
|
||||
//
|
||||
// SparcStation 20 Solaris 8:
|
||||
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
|
||||
//
|
||||
// Mac OS X (Darwin)
|
||||
// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh
|
||||
//
|
||||
// Mac OS X early versions
|
||||
//
|
||||
|
||||
// }}}
|
||||
|
||||
/* TODO:
|
||||
* - define endianness, to allow matchSignature("bigend") etc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Retrieves information about the current operating system
|
||||
*
|
||||
* This class uses php_uname() to grok information about the current OS
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Gregory Beaver <cellog@php.net>
|
||||
* @copyright 1997-2009 The Authors
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version Release: 1.10.3
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since Class available since Release 0.1
|
||||
*/
|
||||
class OS_Guess
|
||||
{
|
||||
var $sysname;
|
||||
var $nodename;
|
||||
var $cpu;
|
||||
var $release;
|
||||
var $extra;
|
||||
|
||||
function __construct($uname = null)
|
||||
{
|
||||
list($this->sysname,
|
||||
$this->release,
|
||||
$this->cpu,
|
||||
$this->extra,
|
||||
$this->nodename) = $this->parseSignature($uname);
|
||||
}
|
||||
|
||||
function parseSignature($uname = null)
|
||||
{
|
||||
static $sysmap = array(
|
||||
'HP-UX' => 'hpux',
|
||||
'IRIX64' => 'irix',
|
||||
);
|
||||
static $cpumap = array(
|
||||
'i586' => 'i386',
|
||||
'i686' => 'i386',
|
||||
'ppc' => 'powerpc',
|
||||
);
|
||||
if ($uname === null) {
|
||||
$uname = php_uname();
|
||||
}
|
||||
$parts = preg_split('/\s+/', trim($uname));
|
||||
$n = count($parts);
|
||||
|
||||
$release = $machine = $cpu = '';
|
||||
$sysname = $parts[0];
|
||||
$nodename = $parts[1];
|
||||
$cpu = $parts[$n-1];
|
||||
$extra = '';
|
||||
if ($cpu == 'unknown') {
|
||||
$cpu = $parts[$n - 2];
|
||||
}
|
||||
|
||||
switch ($sysname) {
|
||||
case 'AIX' :
|
||||
$release = "$parts[3].$parts[2]";
|
||||
break;
|
||||
case 'Windows' :
|
||||
switch ($parts[1]) {
|
||||
case '95/98':
|
||||
$release = '9x';
|
||||
break;
|
||||
default:
|
||||
$release = $parts[1];
|
||||
break;
|
||||
}
|
||||
$cpu = 'i386';
|
||||
break;
|
||||
case 'Linux' :
|
||||
$extra = $this->_detectGlibcVersion();
|
||||
// use only the first two digits from the kernel version
|
||||
$release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
|
||||
break;
|
||||
case 'Mac' :
|
||||
$sysname = 'darwin';
|
||||
$nodename = $parts[2];
|
||||
$release = $parts[3];
|
||||
if ($cpu == 'Macintosh') {
|
||||
if ($parts[$n - 2] == 'Power') {
|
||||
$cpu = 'powerpc';
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'Darwin' :
|
||||
if ($cpu == 'Macintosh') {
|
||||
if ($parts[$n - 2] == 'Power') {
|
||||
$cpu = 'powerpc';
|
||||
}
|
||||
}
|
||||
$release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
|
||||
break;
|
||||
default:
|
||||
$release = preg_replace('/-.*/', '', $parts[2]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (isset($sysmap[$sysname])) {
|
||||
$sysname = $sysmap[$sysname];
|
||||
} else {
|
||||
$sysname = strtolower($sysname);
|
||||
}
|
||||
if (isset($cpumap[$cpu])) {
|
||||
$cpu = $cpumap[$cpu];
|
||||
}
|
||||
return array($sysname, $release, $cpu, $extra, $nodename);
|
||||
}
|
||||
|
||||
function _detectGlibcVersion()
|
||||
{
|
||||
static $glibc = false;
|
||||
if ($glibc !== false) {
|
||||
return $glibc; // no need to run this multiple times
|
||||
}
|
||||
$major = $minor = 0;
|
||||
include_once "System.php";
|
||||
// Use glibc's <features.h> header file to
|
||||
// get major and minor version number:
|
||||
if (@file_exists('/usr/include/features.h') &&
|
||||
@is_readable('/usr/include/features.h')) {
|
||||
if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
|
||||
$features_file = fopen('/usr/include/features.h', 'rb');
|
||||
while (!feof($features_file)) {
|
||||
$line = fgets($features_file, 8192);
|
||||
if (!$line || (strpos($line, '#define') === false)) {
|
||||
continue;
|
||||
}
|
||||
if (strpos($line, '__GLIBC__')) {
|
||||
// major version number #define __GLIBC__ version
|
||||
$line = preg_split('/\s+/', $line);
|
||||
$glibc_major = trim($line[2]);
|
||||
if (isset($glibc_minor)) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strpos($line, '__GLIBC_MINOR__')) {
|
||||
// got the minor version number
|
||||
// #define __GLIBC_MINOR__ version
|
||||
$line = preg_split('/\s+/', $line);
|
||||
$glibc_minor = trim($line[2]);
|
||||
if (isset($glibc_major)) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
fclose($features_file);
|
||||
if (!isset($glibc_major) || !isset($glibc_minor)) {
|
||||
return $glibc = '';
|
||||
}
|
||||
return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
|
||||
} // no cpp
|
||||
|
||||
$tmpfile = System::mktemp("glibctest");
|
||||
$fp = fopen($tmpfile, "w");
|
||||
fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
|
||||
fclose($fp);
|
||||
$cpp = popen("/usr/bin/cpp $tmpfile", "r");
|
||||
while ($line = fgets($cpp, 1024)) {
|
||||
if ($line{0} == '#' || trim($line) == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (list($major, $minor) = explode(' ', trim($line))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
pclose($cpp);
|
||||
unlink($tmpfile);
|
||||
} // features.h
|
||||
|
||||
if (!($major && $minor) && @is_link('/lib/libc.so.6')) {
|
||||
// Let's try reading the libc.so.6 symlink
|
||||
if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) {
|
||||
list($major, $minor) = explode('.', $matches[1]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!($major && $minor)) {
|
||||
return $glibc = '';
|
||||
}
|
||||
|
||||
return $glibc = "glibc{$major}.{$minor}";
|
||||
}
|
||||
|
||||
function getSignature()
|
||||
{
|
||||
if (empty($this->extra)) {
|
||||
return "{$this->sysname}-{$this->release}-{$this->cpu}";
|
||||
}
|
||||
return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
|
||||
}
|
||||
|
||||
function getSysname()
|
||||
{
|
||||
return $this->sysname;
|
||||
}
|
||||
|
||||
function getNodename()
|
||||
{
|
||||
return $this->nodename;
|
||||
}
|
||||
|
||||
function getCpu()
|
||||
{
|
||||
return $this->cpu;
|
||||
}
|
||||
|
||||
function getRelease()
|
||||
{
|
||||
return $this->release;
|
||||
}
|
||||
|
||||
function getExtra()
|
||||
{
|
||||
return $this->extra;
|
||||
}
|
||||
|
||||
function matchSignature($match)
|
||||
{
|
||||
$fragments = is_array($match) ? $match : explode('-', $match);
|
||||
$n = count($fragments);
|
||||
$matches = 0;
|
||||
if ($n > 0) {
|
||||
$matches += $this->_matchFragment($fragments[0], $this->sysname);
|
||||
}
|
||||
if ($n > 1) {
|
||||
$matches += $this->_matchFragment($fragments[1], $this->release);
|
||||
}
|
||||
if ($n > 2) {
|
||||
$matches += $this->_matchFragment($fragments[2], $this->cpu);
|
||||
}
|
||||
if ($n > 3) {
|
||||
$matches += $this->_matchFragment($fragments[3], $this->extra);
|
||||
}
|
||||
return ($matches == $n);
|
||||
}
|
||||
|
||||
function _matchFragment($fragment, $value)
|
||||
{
|
||||
if (strcspn($fragment, '*?') < strlen($fragment)) {
|
||||
$reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/';
|
||||
return preg_match($reg, $value);
|
||||
}
|
||||
return ($fragment == '*' || !strcasecmp($fragment, $value));
|
||||
}
|
||||
|
||||
}
|
||||
/*
|
||||
* Local Variables:
|
||||
* indent-tabs-mode: nil
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
*/
|
||||
1113
vendor/pear-pear.php.net/PEAR/PEAR.php
generated
vendored
Normal file
1113
vendor/pear-pear.php.net/PEAR/PEAR.php
generated
vendored
Normal file
|
|
@ -0,0 +1,1113 @@
|
|||
<?php
|
||||
/**
|
||||
* PEAR, the PHP Extension and Application Repository
|
||||
*
|
||||
* PEAR class and PEAR_Error class
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Sterling Hughes <sterling@php.net>
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Tomas V.V.Cox <cox@idecnet.com>
|
||||
* @author Greg Beaver <cellog@php.net>
|
||||
* @copyright 1997-2010 The Authors
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since File available since Release 0.1
|
||||
*/
|
||||
|
||||
/**#@+
|
||||
* ERROR constants
|
||||
*/
|
||||
define('PEAR_ERROR_RETURN', 1);
|
||||
define('PEAR_ERROR_PRINT', 2);
|
||||
define('PEAR_ERROR_TRIGGER', 4);
|
||||
define('PEAR_ERROR_DIE', 8);
|
||||
define('PEAR_ERROR_CALLBACK', 16);
|
||||
/**
|
||||
* WARNING: obsolete
|
||||
* @deprecated
|
||||
*/
|
||||
define('PEAR_ERROR_EXCEPTION', 32);
|
||||
/**#@-*/
|
||||
|
||||
if (substr(PHP_OS, 0, 3) == 'WIN') {
|
||||
define('OS_WINDOWS', true);
|
||||
define('OS_UNIX', false);
|
||||
define('PEAR_OS', 'Windows');
|
||||
} else {
|
||||
define('OS_WINDOWS', false);
|
||||
define('OS_UNIX', true);
|
||||
define('PEAR_OS', 'Unix'); // blatant assumption
|
||||
}
|
||||
|
||||
$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
|
||||
$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
|
||||
$GLOBALS['_PEAR_destructor_object_list'] = array();
|
||||
$GLOBALS['_PEAR_shutdown_funcs'] = array();
|
||||
$GLOBALS['_PEAR_error_handler_stack'] = array();
|
||||
|
||||
@ini_set('track_errors', true);
|
||||
|
||||
/**
|
||||
* Base class for other PEAR classes. Provides rudimentary
|
||||
* emulation of destructors.
|
||||
*
|
||||
* If you want a destructor in your class, inherit PEAR and make a
|
||||
* destructor method called _yourclassname (same name as the
|
||||
* constructor, but with a "_" prefix). Also, in your constructor you
|
||||
* have to call the PEAR constructor: $this->PEAR();.
|
||||
* The destructor method will be called without parameters. Note that
|
||||
* at in some SAPI implementations (such as Apache), any output during
|
||||
* the request shutdown (in which destructors are called) seems to be
|
||||
* discarded. If you need to get any debug information from your
|
||||
* destructor, use error_log(), syslog() or something similar.
|
||||
*
|
||||
* IMPORTANT! To use the emulated destructors you need to create the
|
||||
* objects by reference: $obj =& new PEAR_child;
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Tomas V.V. Cox <cox@idecnet.com>
|
||||
* @author Greg Beaver <cellog@php.net>
|
||||
* @copyright 1997-2006 The PHP Group
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version Release: 1.10.3
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @see PEAR_Error
|
||||
* @since Class available since PHP 4.0.2
|
||||
* @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear
|
||||
*/
|
||||
class PEAR
|
||||
{
|
||||
/**
|
||||
* Whether to enable internal debug messages.
|
||||
*
|
||||
* @var bool
|
||||
* @access private
|
||||
*/
|
||||
var $_debug = false;
|
||||
|
||||
/**
|
||||
* Default error mode for this object.
|
||||
*
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $_default_error_mode = null;
|
||||
|
||||
/**
|
||||
* Default error options used for this object when error mode
|
||||
* is PEAR_ERROR_TRIGGER.
|
||||
*
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $_default_error_options = null;
|
||||
|
||||
/**
|
||||
* Default error handler (callback) for this object, if error mode is
|
||||
* PEAR_ERROR_CALLBACK.
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $_default_error_handler = '';
|
||||
|
||||
/**
|
||||
* Which class to use for error objects.
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $_error_class = 'PEAR_Error';
|
||||
|
||||
/**
|
||||
* An array of expected errors.
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_expected_errors = array();
|
||||
|
||||
/**
|
||||
* List of methods that can be called both statically and non-statically.
|
||||
* @var array
|
||||
*/
|
||||
protected static $bivalentMethods = array(
|
||||
'setErrorHandling' => true,
|
||||
'raiseError' => true,
|
||||
'throwError' => true,
|
||||
'pushErrorHandling' => true,
|
||||
'popErrorHandling' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* Constructor. Registers this object in
|
||||
* $_PEAR_destructor_object_list for destructor emulation if a
|
||||
* destructor object exists.
|
||||
*
|
||||
* @param string $error_class (optional) which class to use for
|
||||
* error objects, defaults to PEAR_Error.
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function __construct($error_class = null)
|
||||
{
|
||||
$classname = strtolower(get_class($this));
|
||||
if ($this->_debug) {
|
||||
print "PEAR constructor called, class=$classname\n";
|
||||
}
|
||||
|
||||
if ($error_class !== null) {
|
||||
$this->_error_class = $error_class;
|
||||
}
|
||||
|
||||
while ($classname && strcasecmp($classname, "pear")) {
|
||||
$destructor = "_$classname";
|
||||
if (method_exists($this, $destructor)) {
|
||||
global $_PEAR_destructor_object_list;
|
||||
$_PEAR_destructor_object_list[] = &$this;
|
||||
if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
|
||||
register_shutdown_function("_PEAR_call_destructors");
|
||||
$GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
$classname = get_parent_class($classname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Only here for backwards compatibility.
|
||||
* E.g. Archive_Tar calls $this->PEAR() in its constructor.
|
||||
*
|
||||
* @param string $error_class Which class to use for error objects,
|
||||
* defaults to PEAR_Error.
|
||||
*/
|
||||
public function PEAR($error_class = null)
|
||||
{
|
||||
self::__construct($error_class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destructor (the emulated type of...). Does nothing right now,
|
||||
* but is included for forward compatibility, so subclass
|
||||
* destructors should always call it.
|
||||
*
|
||||
* See the note in the class desciption about output from
|
||||
* destructors.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function _PEAR() {
|
||||
if ($this->_debug) {
|
||||
printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
|
||||
}
|
||||
}
|
||||
|
||||
public function __call($method, $arguments)
|
||||
{
|
||||
if (!isset(self::$bivalentMethods[$method])) {
|
||||
trigger_error(
|
||||
'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
|
||||
);
|
||||
}
|
||||
return call_user_func_array(
|
||||
array(get_class(), '_' . $method),
|
||||
array_merge(array($this), $arguments)
|
||||
);
|
||||
}
|
||||
|
||||
public static function __callStatic($method, $arguments)
|
||||
{
|
||||
if (!isset(self::$bivalentMethods[$method])) {
|
||||
trigger_error(
|
||||
'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
|
||||
);
|
||||
}
|
||||
return call_user_func_array(
|
||||
array(get_class(), '_' . $method),
|
||||
array_merge(array(null), $arguments)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* If you have a class that's mostly/entirely static, and you need static
|
||||
* properties, you can use this method to simulate them. Eg. in your method(s)
|
||||
* do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
|
||||
* You MUST use a reference, or they will not persist!
|
||||
*
|
||||
* @param string $class The calling classname, to prevent clashes
|
||||
* @param string $var The variable to retrieve.
|
||||
* @return mixed A reference to the variable. If not set it will be
|
||||
* auto initialised to NULL.
|
||||
*/
|
||||
public static function &getStaticProperty($class, $var)
|
||||
{
|
||||
static $properties;
|
||||
if (!isset($properties[$class])) {
|
||||
$properties[$class] = array();
|
||||
}
|
||||
|
||||
if (!array_key_exists($var, $properties[$class])) {
|
||||
$properties[$class][$var] = null;
|
||||
}
|
||||
|
||||
return $properties[$class][$var];
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this function to register a shutdown method for static
|
||||
* classes.
|
||||
*
|
||||
* @param mixed $func The function name (or array of class/method) to call
|
||||
* @param mixed $args The arguments to pass to the function
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function registerShutdownFunc($func, $args = array())
|
||||
{
|
||||
// if we are called statically, there is a potential
|
||||
// that no shutdown func is registered. Bug #6445
|
||||
if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
|
||||
register_shutdown_function("_PEAR_call_destructors");
|
||||
$GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
|
||||
}
|
||||
$GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell whether a value is a PEAR error.
|
||||
*
|
||||
* @param mixed $data the value to test
|
||||
* @param int $code if $data is an error object, return true
|
||||
* only if $code is a string and
|
||||
* $obj->getMessage() == $code or
|
||||
* $code is an integer and $obj->getCode() == $code
|
||||
*
|
||||
* @return bool true if parameter is an error
|
||||
*/
|
||||
public static function isError($data, $code = null)
|
||||
{
|
||||
if (!is_a($data, 'PEAR_Error')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_null($code)) {
|
||||
return true;
|
||||
} elseif (is_string($code)) {
|
||||
return $data->getMessage() == $code;
|
||||
}
|
||||
|
||||
return $data->getCode() == $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets how errors generated by this object should be handled.
|
||||
* Can be invoked both in objects and statically. If called
|
||||
* statically, setErrorHandling sets the default behaviour for all
|
||||
* PEAR objects. If called in an object, setErrorHandling sets
|
||||
* the default behaviour for that object.
|
||||
*
|
||||
* @param object $object
|
||||
* Object the method was called on (non-static mode)
|
||||
*
|
||||
* @param int $mode
|
||||
* One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
|
||||
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
|
||||
* PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
|
||||
*
|
||||
* @param mixed $options
|
||||
* When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
|
||||
* of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
|
||||
*
|
||||
* When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
|
||||
* to be the callback function or method. A callback
|
||||
* function is a string with the name of the function, a
|
||||
* callback method is an array of two elements: the element
|
||||
* at index 0 is the object, and the element at index 1 is
|
||||
* the name of the method to call in the object.
|
||||
*
|
||||
* When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
|
||||
* a printf format string used when printing the error
|
||||
* message.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
* @see PEAR_ERROR_RETURN
|
||||
* @see PEAR_ERROR_PRINT
|
||||
* @see PEAR_ERROR_TRIGGER
|
||||
* @see PEAR_ERROR_DIE
|
||||
* @see PEAR_ERROR_CALLBACK
|
||||
* @see PEAR_ERROR_EXCEPTION
|
||||
*
|
||||
* @since PHP 4.0.5
|
||||
*/
|
||||
protected static function _setErrorHandling(
|
||||
$object, $mode = null, $options = null
|
||||
) {
|
||||
if ($object !== null) {
|
||||
$setmode = &$object->_default_error_mode;
|
||||
$setoptions = &$object->_default_error_options;
|
||||
} else {
|
||||
$setmode = &$GLOBALS['_PEAR_default_error_mode'];
|
||||
$setoptions = &$GLOBALS['_PEAR_default_error_options'];
|
||||
}
|
||||
|
||||
switch ($mode) {
|
||||
case PEAR_ERROR_EXCEPTION:
|
||||
case PEAR_ERROR_RETURN:
|
||||
case PEAR_ERROR_PRINT:
|
||||
case PEAR_ERROR_TRIGGER:
|
||||
case PEAR_ERROR_DIE:
|
||||
case null:
|
||||
$setmode = $mode;
|
||||
$setoptions = $options;
|
||||
break;
|
||||
|
||||
case PEAR_ERROR_CALLBACK:
|
||||
$setmode = $mode;
|
||||
// class/object method callback
|
||||
if (is_callable($options)) {
|
||||
$setoptions = $options;
|
||||
} else {
|
||||
trigger_error("invalid error callback", E_USER_WARNING);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
trigger_error("invalid error mode", E_USER_WARNING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to tell which errors you expect to get.
|
||||
* Expected errors are always returned with error mode
|
||||
* PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
|
||||
* and this method pushes a new element onto it. The list of
|
||||
* expected errors are in effect until they are popped off the
|
||||
* stack with the popExpect() method.
|
||||
*
|
||||
* Note that this method can not be called statically
|
||||
*
|
||||
* @param mixed $code a single error code or an array of error codes to expect
|
||||
*
|
||||
* @return int the new depth of the "expected errors" stack
|
||||
* @access public
|
||||
*/
|
||||
function expectError($code = '*')
|
||||
{
|
||||
if (is_array($code)) {
|
||||
array_push($this->_expected_errors, $code);
|
||||
} else {
|
||||
array_push($this->_expected_errors, array($code));
|
||||
}
|
||||
return count($this->_expected_errors);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method pops one element off the expected error codes
|
||||
* stack.
|
||||
*
|
||||
* @return array the list of error codes that were popped
|
||||
*/
|
||||
function popExpect()
|
||||
{
|
||||
return array_pop($this->_expected_errors);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method checks unsets an error code if available
|
||||
*
|
||||
* @param mixed error code
|
||||
* @return bool true if the error code was unset, false otherwise
|
||||
* @access private
|
||||
* @since PHP 4.3.0
|
||||
*/
|
||||
function _checkDelExpect($error_code)
|
||||
{
|
||||
$deleted = false;
|
||||
foreach ($this->_expected_errors as $key => $error_array) {
|
||||
if (in_array($error_code, $error_array)) {
|
||||
unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
|
||||
$deleted = true;
|
||||
}
|
||||
|
||||
// clean up empty arrays
|
||||
if (0 == count($this->_expected_errors[$key])) {
|
||||
unset($this->_expected_errors[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
return $deleted;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method deletes all occurrences of the specified element from
|
||||
* the expected error codes stack.
|
||||
*
|
||||
* @param mixed $error_code error code that should be deleted
|
||||
* @return mixed list of error codes that were deleted or error
|
||||
* @access public
|
||||
* @since PHP 4.3.0
|
||||
*/
|
||||
function delExpect($error_code)
|
||||
{
|
||||
$deleted = false;
|
||||
if ((is_array($error_code) && (0 != count($error_code)))) {
|
||||
// $error_code is a non-empty array here; we walk through it trying
|
||||
// to unset all values
|
||||
foreach ($error_code as $key => $error) {
|
||||
$deleted = $this->_checkDelExpect($error) ? true : false;
|
||||
}
|
||||
|
||||
return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
|
||||
} elseif (!empty($error_code)) {
|
||||
// $error_code comes alone, trying to unset it
|
||||
if ($this->_checkDelExpect($error_code)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
|
||||
}
|
||||
|
||||
// $error_code is empty
|
||||
return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is a wrapper that returns an instance of the
|
||||
* configured error class with this object's default error
|
||||
* handling applied. If the $mode and $options parameters are not
|
||||
* specified, the object's defaults are used.
|
||||
*
|
||||
* @param mixed $message a text error message or a PEAR error object
|
||||
*
|
||||
* @param int $code a numeric error code (it is up to your class
|
||||
* to define these if you want to use codes)
|
||||
*
|
||||
* @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
|
||||
* PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
|
||||
* PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
|
||||
*
|
||||
* @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
|
||||
* specifies the PHP-internal error level (one of
|
||||
* E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
|
||||
* If $mode is PEAR_ERROR_CALLBACK, this
|
||||
* parameter specifies the callback function or
|
||||
* method. In other error modes this parameter
|
||||
* is ignored.
|
||||
*
|
||||
* @param string $userinfo If you need to pass along for example debug
|
||||
* information, this parameter is meant for that.
|
||||
*
|
||||
* @param string $error_class The returned error object will be
|
||||
* instantiated from this class, if specified.
|
||||
*
|
||||
* @param bool $skipmsg If true, raiseError will only pass error codes,
|
||||
* the error message parameter will be dropped.
|
||||
*
|
||||
* @return object a PEAR error object
|
||||
* @see PEAR::setErrorHandling
|
||||
* @since PHP 4.0.5
|
||||
*/
|
||||
protected static function _raiseError($object,
|
||||
$message = null,
|
||||
$code = null,
|
||||
$mode = null,
|
||||
$options = null,
|
||||
$userinfo = null,
|
||||
$error_class = null,
|
||||
$skipmsg = false)
|
||||
{
|
||||
// The error is yet a PEAR error object
|
||||
if (is_object($message)) {
|
||||
$code = $message->getCode();
|
||||
$userinfo = $message->getUserInfo();
|
||||
$error_class = $message->getType();
|
||||
$message->error_message_prefix = '';
|
||||
$message = $message->getMessage();
|
||||
}
|
||||
|
||||
if (
|
||||
$object !== null &&
|
||||
isset($object->_expected_errors) &&
|
||||
count($object->_expected_errors) > 0 &&
|
||||
count($exp = end($object->_expected_errors))
|
||||
) {
|
||||
if ($exp[0] == "*" ||
|
||||
(is_int(reset($exp)) && in_array($code, $exp)) ||
|
||||
(is_string(reset($exp)) && in_array($message, $exp))
|
||||
) {
|
||||
$mode = PEAR_ERROR_RETURN;
|
||||
}
|
||||
}
|
||||
|
||||
// No mode given, try global ones
|
||||
if ($mode === null) {
|
||||
// Class error handler
|
||||
if ($object !== null && isset($object->_default_error_mode)) {
|
||||
$mode = $object->_default_error_mode;
|
||||
$options = $object->_default_error_options;
|
||||
// Global error handler
|
||||
} elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
|
||||
$mode = $GLOBALS['_PEAR_default_error_mode'];
|
||||
$options = $GLOBALS['_PEAR_default_error_options'];
|
||||
}
|
||||
}
|
||||
|
||||
if ($error_class !== null) {
|
||||
$ec = $error_class;
|
||||
} elseif ($object !== null && isset($object->_error_class)) {
|
||||
$ec = $object->_error_class;
|
||||
} else {
|
||||
$ec = 'PEAR_Error';
|
||||
}
|
||||
|
||||
if ($skipmsg) {
|
||||
$a = new $ec($code, $mode, $options, $userinfo);
|
||||
} else {
|
||||
$a = new $ec($message, $code, $mode, $options, $userinfo);
|
||||
}
|
||||
|
||||
return $a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simpler form of raiseError with fewer options. In most cases
|
||||
* message, code and userinfo are enough.
|
||||
*
|
||||
* @param mixed $message a text error message or a PEAR error object
|
||||
*
|
||||
* @param int $code a numeric error code (it is up to your class
|
||||
* to define these if you want to use codes)
|
||||
*
|
||||
* @param string $userinfo If you need to pass along for example debug
|
||||
* information, this parameter is meant for that.
|
||||
*
|
||||
* @return object a PEAR error object
|
||||
* @see PEAR::raiseError
|
||||
*/
|
||||
protected static function _throwError($object, $message = null, $code = null, $userinfo = null)
|
||||
{
|
||||
if ($object !== null) {
|
||||
$a = &$object->raiseError($message, $code, null, null, $userinfo);
|
||||
return $a;
|
||||
}
|
||||
|
||||
$a = &PEAR::raiseError($message, $code, null, null, $userinfo);
|
||||
return $a;
|
||||
}
|
||||
|
||||
public static function staticPushErrorHandling($mode, $options = null)
|
||||
{
|
||||
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
|
||||
$def_mode = &$GLOBALS['_PEAR_default_error_mode'];
|
||||
$def_options = &$GLOBALS['_PEAR_default_error_options'];
|
||||
$stack[] = array($def_mode, $def_options);
|
||||
switch ($mode) {
|
||||
case PEAR_ERROR_EXCEPTION:
|
||||
case PEAR_ERROR_RETURN:
|
||||
case PEAR_ERROR_PRINT:
|
||||
case PEAR_ERROR_TRIGGER:
|
||||
case PEAR_ERROR_DIE:
|
||||
case null:
|
||||
$def_mode = $mode;
|
||||
$def_options = $options;
|
||||
break;
|
||||
|
||||
case PEAR_ERROR_CALLBACK:
|
||||
$def_mode = $mode;
|
||||
// class/object method callback
|
||||
if (is_callable($options)) {
|
||||
$def_options = $options;
|
||||
} else {
|
||||
trigger_error("invalid error callback", E_USER_WARNING);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
trigger_error("invalid error mode", E_USER_WARNING);
|
||||
break;
|
||||
}
|
||||
$stack[] = array($mode, $options);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function staticPopErrorHandling()
|
||||
{
|
||||
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
|
||||
$setmode = &$GLOBALS['_PEAR_default_error_mode'];
|
||||
$setoptions = &$GLOBALS['_PEAR_default_error_options'];
|
||||
array_pop($stack);
|
||||
list($mode, $options) = $stack[sizeof($stack) - 1];
|
||||
array_pop($stack);
|
||||
switch ($mode) {
|
||||
case PEAR_ERROR_EXCEPTION:
|
||||
case PEAR_ERROR_RETURN:
|
||||
case PEAR_ERROR_PRINT:
|
||||
case PEAR_ERROR_TRIGGER:
|
||||
case PEAR_ERROR_DIE:
|
||||
case null:
|
||||
$setmode = $mode;
|
||||
$setoptions = $options;
|
||||
break;
|
||||
|
||||
case PEAR_ERROR_CALLBACK:
|
||||
$setmode = $mode;
|
||||
// class/object method callback
|
||||
if (is_callable($options)) {
|
||||
$setoptions = $options;
|
||||
} else {
|
||||
trigger_error("invalid error callback", E_USER_WARNING);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
trigger_error("invalid error mode", E_USER_WARNING);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a new error handler on top of the error handler options stack. With this
|
||||
* you can easily override the actual error handler for some code and restore
|
||||
* it later with popErrorHandling.
|
||||
*
|
||||
* @param mixed $mode (same as setErrorHandling)
|
||||
* @param mixed $options (same as setErrorHandling)
|
||||
*
|
||||
* @return bool Always true
|
||||
*
|
||||
* @see PEAR::setErrorHandling
|
||||
*/
|
||||
protected static function _pushErrorHandling($object, $mode, $options = null)
|
||||
{
|
||||
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
|
||||
if ($object !== null) {
|
||||
$def_mode = &$object->_default_error_mode;
|
||||
$def_options = &$object->_default_error_options;
|
||||
} else {
|
||||
$def_mode = &$GLOBALS['_PEAR_default_error_mode'];
|
||||
$def_options = &$GLOBALS['_PEAR_default_error_options'];
|
||||
}
|
||||
$stack[] = array($def_mode, $def_options);
|
||||
|
||||
if ($object !== null) {
|
||||
$object->setErrorHandling($mode, $options);
|
||||
} else {
|
||||
PEAR::setErrorHandling($mode, $options);
|
||||
}
|
||||
$stack[] = array($mode, $options);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pop the last error handler used
|
||||
*
|
||||
* @return bool Always true
|
||||
*
|
||||
* @see PEAR::pushErrorHandling
|
||||
*/
|
||||
protected static function _popErrorHandling($object)
|
||||
{
|
||||
$stack = &$GLOBALS['_PEAR_error_handler_stack'];
|
||||
array_pop($stack);
|
||||
list($mode, $options) = $stack[sizeof($stack) - 1];
|
||||
array_pop($stack);
|
||||
if ($object !== null) {
|
||||
$object->setErrorHandling($mode, $options);
|
||||
} else {
|
||||
PEAR::setErrorHandling($mode, $options);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* OS independent PHP extension load. Remember to take care
|
||||
* on the correct extension name for case sensitive OSes.
|
||||
*
|
||||
* @param string $ext The extension name
|
||||
* @return bool Success or not on the dl() call
|
||||
*/
|
||||
public static function loadExtension($ext)
|
||||
{
|
||||
if (extension_loaded($ext)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// if either returns true dl() will produce a FATAL error, stop that
|
||||
if (
|
||||
function_exists('dl') === false ||
|
||||
ini_get('enable_dl') != 1
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (OS_WINDOWS) {
|
||||
$suffix = '.dll';
|
||||
} elseif (PHP_OS == 'HP-UX') {
|
||||
$suffix = '.sl';
|
||||
} elseif (PHP_OS == 'AIX') {
|
||||
$suffix = '.a';
|
||||
} elseif (PHP_OS == 'OSX') {
|
||||
$suffix = '.bundle';
|
||||
} else {
|
||||
$suffix = '.so';
|
||||
}
|
||||
|
||||
return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
|
||||
}
|
||||
}
|
||||
|
||||
function _PEAR_call_destructors()
|
||||
{
|
||||
global $_PEAR_destructor_object_list;
|
||||
if (is_array($_PEAR_destructor_object_list) &&
|
||||
sizeof($_PEAR_destructor_object_list))
|
||||
{
|
||||
reset($_PEAR_destructor_object_list);
|
||||
|
||||
$destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');
|
||||
|
||||
if ($destructLifoExists) {
|
||||
$_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
|
||||
}
|
||||
|
||||
while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
|
||||
$classname = get_class($objref);
|
||||
while ($classname) {
|
||||
$destructor = "_$classname";
|
||||
if (method_exists($objref, $destructor)) {
|
||||
$objref->$destructor();
|
||||
break;
|
||||
} else {
|
||||
$classname = get_parent_class($classname);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Empty the object list to ensure that destructors are
|
||||
// not called more than once.
|
||||
$_PEAR_destructor_object_list = array();
|
||||
}
|
||||
|
||||
// Now call the shutdown functions
|
||||
if (
|
||||
isset($GLOBALS['_PEAR_shutdown_funcs']) &&
|
||||
is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
|
||||
!empty($GLOBALS['_PEAR_shutdown_funcs'])
|
||||
) {
|
||||
foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
|
||||
call_user_func_array($value[0], $value[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard PEAR error class for PHP 4
|
||||
*
|
||||
* This class is supserseded by {@link PEAR_Exception} in PHP 5
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Tomas V.V. Cox <cox@idecnet.com>
|
||||
* @author Gregory Beaver <cellog@php.net>
|
||||
* @copyright 1997-2006 The PHP Group
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version Release: 1.10.3
|
||||
* @link http://pear.php.net/manual/en/core.pear.pear-error.php
|
||||
* @see PEAR::raiseError(), PEAR::throwError()
|
||||
* @since Class available since PHP 4.0.2
|
||||
*/
|
||||
class PEAR_Error
|
||||
{
|
||||
var $error_message_prefix = '';
|
||||
var $mode = PEAR_ERROR_RETURN;
|
||||
var $level = E_USER_NOTICE;
|
||||
var $code = -1;
|
||||
var $message = '';
|
||||
var $userinfo = '';
|
||||
var $backtrace = null;
|
||||
|
||||
/**
|
||||
* PEAR_Error constructor
|
||||
*
|
||||
* @param string $message message
|
||||
*
|
||||
* @param int $code (optional) error code
|
||||
*
|
||||
* @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
|
||||
* PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
|
||||
* PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
|
||||
*
|
||||
* @param mixed $options (optional) error level, _OR_ in the case of
|
||||
* PEAR_ERROR_CALLBACK, the callback function or object/method
|
||||
* tuple.
|
||||
*
|
||||
* @param string $userinfo (optional) additional user/debug info
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
*/
|
||||
function __construct($message = 'unknown error', $code = null,
|
||||
$mode = null, $options = null, $userinfo = null)
|
||||
{
|
||||
if ($mode === null) {
|
||||
$mode = PEAR_ERROR_RETURN;
|
||||
}
|
||||
$this->message = $message;
|
||||
$this->code = $code;
|
||||
$this->mode = $mode;
|
||||
$this->userinfo = $userinfo;
|
||||
|
||||
$skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
|
||||
|
||||
if (!$skiptrace) {
|
||||
$this->backtrace = debug_backtrace();
|
||||
if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
|
||||
unset($this->backtrace[0]['object']);
|
||||
}
|
||||
}
|
||||
|
||||
if ($mode & PEAR_ERROR_CALLBACK) {
|
||||
$this->level = E_USER_NOTICE;
|
||||
$this->callback = $options;
|
||||
} else {
|
||||
if ($options === null) {
|
||||
$options = E_USER_NOTICE;
|
||||
}
|
||||
|
||||
$this->level = $options;
|
||||
$this->callback = null;
|
||||
}
|
||||
|
||||
if ($this->mode & PEAR_ERROR_PRINT) {
|
||||
if (is_null($options) || is_int($options)) {
|
||||
$format = "%s";
|
||||
} else {
|
||||
$format = $options;
|
||||
}
|
||||
|
||||
printf($format, $this->getMessage());
|
||||
}
|
||||
|
||||
if ($this->mode & PEAR_ERROR_TRIGGER) {
|
||||
trigger_error($this->getMessage(), $this->level);
|
||||
}
|
||||
|
||||
if ($this->mode & PEAR_ERROR_DIE) {
|
||||
$msg = $this->getMessage();
|
||||
if (is_null($options) || is_int($options)) {
|
||||
$format = "%s";
|
||||
if (substr($msg, -1) != "\n") {
|
||||
$msg .= "\n";
|
||||
}
|
||||
} else {
|
||||
$format = $options;
|
||||
}
|
||||
printf($format, $msg);
|
||||
exit($code);
|
||||
}
|
||||
|
||||
if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
|
||||
call_user_func($this->callback, $this);
|
||||
}
|
||||
|
||||
if ($this->mode & PEAR_ERROR_EXCEPTION) {
|
||||
trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
|
||||
eval('$e = new Exception($this->message, $this->code);throw($e);');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Only here for backwards compatibility.
|
||||
*
|
||||
* Class "Cache_Error" still uses it, among others.
|
||||
*
|
||||
* @param string $message Message
|
||||
* @param int $code Error code
|
||||
* @param int $mode Error mode
|
||||
* @param mixed $options See __construct()
|
||||
* @param string $userinfo Additional user/debug info
|
||||
*/
|
||||
public function PEAR_Error(
|
||||
$message = 'unknown error', $code = null, $mode = null,
|
||||
$options = null, $userinfo = null
|
||||
) {
|
||||
self::__construct($message, $code, $mode, $options, $userinfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the error mode from an error object.
|
||||
*
|
||||
* @return int error mode
|
||||
* @access public
|
||||
*/
|
||||
function getMode()
|
||||
{
|
||||
return $this->mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the callback function/method from an error object.
|
||||
*
|
||||
* @return mixed callback function or object/method array
|
||||
* @access public
|
||||
*/
|
||||
function getCallback()
|
||||
{
|
||||
return $this->callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the error message from an error object.
|
||||
*
|
||||
* @return string full error message
|
||||
* @access public
|
||||
*/
|
||||
function getMessage()
|
||||
{
|
||||
return ($this->error_message_prefix . $this->message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get error code from an error object
|
||||
*
|
||||
* @return int error code
|
||||
* @access public
|
||||
*/
|
||||
function getCode()
|
||||
{
|
||||
return $this->code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of this error/exception.
|
||||
*
|
||||
* @return string error/exception name (type)
|
||||
* @access public
|
||||
*/
|
||||
function getType()
|
||||
{
|
||||
return get_class($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get additional user-supplied information.
|
||||
*
|
||||
* @return string user-supplied information
|
||||
* @access public
|
||||
*/
|
||||
function getUserInfo()
|
||||
{
|
||||
return $this->userinfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get additional debug information supplied by the application.
|
||||
*
|
||||
* @return string debug information
|
||||
* @access public
|
||||
*/
|
||||
function getDebugInfo()
|
||||
{
|
||||
return $this->getUserInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the call backtrace from where the error was generated.
|
||||
* Supported with PHP 4.3.0 or newer.
|
||||
*
|
||||
* @param int $frame (optional) what frame to fetch
|
||||
* @return array Backtrace, or NULL if not available.
|
||||
* @access public
|
||||
*/
|
||||
function getBacktrace($frame = null)
|
||||
{
|
||||
if (defined('PEAR_IGNORE_BACKTRACE')) {
|
||||
return null;
|
||||
}
|
||||
if ($frame === null) {
|
||||
return $this->backtrace;
|
||||
}
|
||||
return $this->backtrace[$frame];
|
||||
}
|
||||
|
||||
function addUserInfo($info)
|
||||
{
|
||||
if (empty($this->userinfo)) {
|
||||
$this->userinfo = $info;
|
||||
} else {
|
||||
$this->userinfo .= " ** $info";
|
||||
}
|
||||
}
|
||||
|
||||
function __toString()
|
||||
{
|
||||
return $this->getMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a string representation of this object.
|
||||
*
|
||||
* @return string a string with an object summary
|
||||
* @access public
|
||||
*/
|
||||
function toString()
|
||||
{
|
||||
$modes = array();
|
||||
$levels = array(E_USER_NOTICE => 'notice',
|
||||
E_USER_WARNING => 'warning',
|
||||
E_USER_ERROR => 'error');
|
||||
if ($this->mode & PEAR_ERROR_CALLBACK) {
|
||||
if (is_array($this->callback)) {
|
||||
$callback = (is_object($this->callback[0]) ?
|
||||
strtolower(get_class($this->callback[0])) :
|
||||
$this->callback[0]) . '::' .
|
||||
$this->callback[1];
|
||||
} else {
|
||||
$callback = $this->callback;
|
||||
}
|
||||
return sprintf('[%s: message="%s" code=%d mode=callback '.
|
||||
'callback=%s prefix="%s" info="%s"]',
|
||||
strtolower(get_class($this)), $this->message, $this->code,
|
||||
$callback, $this->error_message_prefix,
|
||||
$this->userinfo);
|
||||
}
|
||||
if ($this->mode & PEAR_ERROR_PRINT) {
|
||||
$modes[] = 'print';
|
||||
}
|
||||
if ($this->mode & PEAR_ERROR_TRIGGER) {
|
||||
$modes[] = 'trigger';
|
||||
}
|
||||
if ($this->mode & PEAR_ERROR_DIE) {
|
||||
$modes[] = 'die';
|
||||
}
|
||||
if ($this->mode & PEAR_ERROR_RETURN) {
|
||||
$modes[] = 'return';
|
||||
}
|
||||
return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
|
||||
'prefix="%s" info="%s"]',
|
||||
strtolower(get_class($this)), $this->message, $this->code,
|
||||
implode("|", $modes), $levels[$this->level],
|
||||
$this->error_message_prefix,
|
||||
$this->userinfo);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: php
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
*/
|
||||
499
vendor/pear-pear.php.net/PEAR/PEAR/Builder.php
generated
vendored
Normal file
499
vendor/pear-pear.php.net/PEAR/PEAR/Builder.php
generated
vendored
Normal file
|
|
@ -0,0 +1,499 @@
|
|||
<?php
|
||||
/**
|
||||
* PEAR_Builder for building PHP extensions (PECL packages)
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @author Greg Beaver <cellog@php.net>
|
||||
* @copyright 1997-2009 The Authors
|
||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since File available since Release 0.1
|
||||
*
|
||||
* TODO: log output parameters in PECL command line
|
||||
* TODO: msdev path in configuration
|
||||
*/
|
||||
|
||||
/**
|
||||
* Needed for extending PEAR_Builder
|
||||
*/
|
||||
require_once 'PEAR/Common.php';
|
||||
require_once 'PEAR/PackageFile.php';
|
||||
require_once 'System.php';
|
||||
|
||||
/**
|
||||
* Class to handle building (compiling) extensions.
|
||||
*
|
||||
* @category pear
|
||||
* @package PEAR
|
||||
* @author Stig Bakken <ssb@php.net>
|
||||
* @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.10.3
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since Class available since PHP 4.0.2
|
||||
* @see http://pear.php.net/manual/en/core.ppm.pear-builder.php
|
||||
*/
|
||||
class PEAR_Builder extends PEAR_Common
|
||||
{
|
||||
var $php_api_version = 0;
|
||||
var $zend_module_api_no = 0;
|
||||
var $zend_extension_api_no = 0;
|
||||
|
||||
var $extensions_built = array();
|
||||
|
||||
/**
|
||||
* @var string Used for reporting when it is not possible to pass function
|
||||
* via extra parameter, e.g. log, msdevCallback
|
||||
*/
|
||||
var $current_callback = null;
|
||||
|
||||
// used for msdev builds
|
||||
var $_lastline = null;
|
||||
var $_firstline = null;
|
||||
|
||||
/**
|
||||
* PEAR_Builder constructor.
|
||||
*
|
||||
* @param object $ui user interface object (instance of PEAR_Frontend_*)
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function __construct(&$ui)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setFrontendObject($ui);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an extension from source on windows.
|
||||
* requires msdev
|
||||
*/
|
||||
function _build_win32($descfile, $callback = null)
|
||||
{
|
||||
if (is_object($descfile)) {
|
||||
$pkg = $descfile;
|
||||
$descfile = $pkg->getPackageFile();
|
||||
} else {
|
||||
$pf = new PEAR_PackageFile($this->config, $this->debug);
|
||||
$pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
|
||||
if (PEAR::isError($pkg)) {
|
||||
return $pkg;
|
||||
}
|
||||
}
|
||||
$dir = dirname($descfile);
|
||||
$old_cwd = getcwd();
|
||||
|
||||
if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
|
||||
return $this->raiseError("could not chdir to $dir");
|
||||
}
|
||||
|
||||
// packages that were in a .tar have the packagefile in this directory
|
||||
$vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
|
||||
if (file_exists($dir) && is_dir($vdir)) {
|
||||
if (!chdir($vdir)) {
|
||||
return $this->raiseError("could not chdir to " . realpath($vdir));
|
||||
}
|
||||
|
||||
$dir = getcwd();
|
||||
}
|
||||
|
||||
$this->log(2, "building in $dir");
|
||||
|
||||
$dsp = $pkg->getPackage().'.dsp';
|
||||
if (!file_exists("$dir/$dsp")) {
|
||||
return $this->raiseError("The DSP $dsp does not exist.");
|
||||
}
|
||||
// XXX TODO: make release build type configurable
|
||||
$command = 'msdev '.$dsp.' /MAKE "'.$pkg->getPackage(). ' - Release"';
|
||||
|
||||
$err = $this->_runCommand($command, array(&$this, 'msdevCallback'));
|
||||
if (PEAR::isError($err)) {
|
||||
return $err;
|
||||
}
|
||||
|
||||
// figure out the build platform and type
|
||||
$platform = 'Win32';
|
||||
$buildtype = 'Release';
|
||||
if (preg_match('/.*?'.$pkg->getPackage().'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) {
|
||||
$platform = $matches[1];
|
||||
$buildtype = $matches[2];
|
||||
}
|
||||
|
||||
if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/', $this->_lastline, $matches)) {
|
||||
if ($matches[2]) {
|
||||
// there were errors in the build
|
||||
return $this->raiseError("There were errors during compilation.");
|
||||
}
|
||||
$out = $matches[1];
|
||||
} else {
|
||||
return $this->raiseError("Did not understand the completion status returned from msdev.exe.");
|
||||
}
|
||||
|
||||
// msdev doesn't tell us the output directory :/
|
||||
// open the dsp, find /out and use that directory
|
||||
$dsptext = join(file($dsp),'');
|
||||
|
||||
// this regex depends on the build platform and type having been
|
||||
// correctly identified above.
|
||||
$regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'.
|
||||
$pkg->getPackage().'\s-\s'.
|
||||
$platform.'\s'.
|
||||
$buildtype.'").*?'.
|
||||
'\/out:"(.*?)"/is';
|
||||
|
||||
if ($dsptext && preg_match($regex, $dsptext, $matches)) {
|
||||
// what we get back is a relative path to the output file itself.
|
||||
$outfile = realpath($matches[2]);
|
||||
} else {
|
||||
return $this->raiseError("Could not retrieve output information from $dsp.");
|
||||
}
|
||||
// realpath returns false if the file doesn't exist
|
||||
if ($outfile && copy($outfile, "$dir/$out")) {
|
||||
$outfile = "$dir/$out";
|
||||
}
|
||||
|
||||
$built_files[] = array(
|
||||
'file' => "$outfile",
|
||||
'php_api' => $this->php_api_version,
|
||||
'zend_mod_api' => $this->zend_module_api_no,
|
||||
'zend_ext_api' => $this->zend_extension_api_no,
|
||||
);
|
||||
|
||||
return $built_files;
|
||||
}
|
||||
// }}}
|
||||
|
||||
// {{{ msdevCallback()
|
||||
function msdevCallback($what, $data)
|
||||
{
|
||||
if (!$this->_firstline)
|
||||
$this->_firstline = $data;
|
||||
$this->_lastline = $data;
|
||||
call_user_func($this->current_callback, $what, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @param string
|
||||
* @param array
|
||||
* @access private
|
||||
*/
|
||||
function _harvestInstDir($dest_prefix, $dirname, &$built_files)
|
||||
{
|
||||
$d = opendir($dirname);
|
||||
if (!$d)
|
||||
return false;
|
||||
|
||||
$ret = true;
|
||||
while (($ent = readdir($d)) !== false) {
|
||||
if ($ent{0} == '.')
|
||||
continue;
|
||||
|
||||
$full = $dirname . DIRECTORY_SEPARATOR . $ent;
|
||||
if (is_dir($full)) {
|
||||
if (!$this->_harvestInstDir(
|
||||
$dest_prefix . DIRECTORY_SEPARATOR . $ent,
|
||||
$full, $built_files)) {
|
||||
$ret = false;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
$dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent;
|
||||
$built_files[] = array(
|
||||
'file' => $full,
|
||||
'dest' => $dest,
|
||||
'php_api' => $this->php_api_version,
|
||||
'zend_mod_api' => $this->zend_module_api_no,
|
||||
'zend_ext_api' => $this->zend_extension_api_no,
|
||||
);
|
||||
}
|
||||
}
|
||||
closedir($d);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an extension from source. Runs "phpize" in the source
|
||||
* directory, but compiles in a temporary directory
|
||||
* (TMPDIR/pear-build-USER/PACKAGE-VERSION).
|
||||
*
|
||||
* @param string|PEAR_PackageFile_v* $descfile path to XML package description file, or
|
||||
* a PEAR_PackageFile object
|
||||
*
|
||||
* @param mixed $callback callback function used to report output,
|
||||
* see PEAR_Builder::_runCommand for details
|
||||
*
|
||||
* @return array an array of associative arrays with built files,
|
||||
* format:
|
||||
* array( array( 'file' => '/path/to/ext.so',
|
||||
* 'php_api' => YYYYMMDD,
|
||||
* 'zend_mod_api' => YYYYMMDD,
|
||||
* 'zend_ext_api' => YYYYMMDD ),
|
||||
* ... )
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @see PEAR_Builder::_runCommand
|
||||
*/
|
||||
function build($descfile, $callback = null)
|
||||
{
|
||||
if (preg_match('/(\\/|\\\\|^)([^\\/\\\\]+)?php([^\\/\\\\]+)?$/',
|
||||
$this->config->get('php_bin'), $matches)) {
|
||||
if (isset($matches[2]) && strlen($matches[2]) &&
|
||||
trim($matches[2]) != trim($this->config->get('php_prefix'))) {
|
||||
$this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
|
||||
' appears to have a prefix ' . $matches[2] . ', but' .
|
||||
' config variable php_prefix does not match');
|
||||
}
|
||||
|
||||
if (isset($matches[3]) && strlen($matches[3]) &&
|
||||
trim($matches[3]) != trim($this->config->get('php_suffix'))) {
|
||||
$this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
|
||||
' appears to have a suffix ' . $matches[3] . ', but' .
|
||||
' config variable php_suffix does not match');
|
||||
}
|
||||
}
|
||||
|
||||
$this->current_callback = $callback;
|
||||
if (PEAR_OS == "Windows") {
|
||||
return $this->_build_win32($descfile, $callback);
|
||||
}
|
||||
|
||||
if (PEAR_OS != 'Unix') {
|
||||
return $this->raiseError("building extensions not supported on this platform");
|
||||
}
|
||||
|
||||
if (is_object($descfile)) {
|
||||
$pkg = $descfile;
|
||||
$descfile = $pkg->getPackageFile();
|
||||
if (is_a($pkg, 'PEAR_PackageFile_v1')) {
|
||||
$dir = dirname($descfile);
|
||||
} else {
|
||||
$dir = $pkg->_config->get('temp_dir') . '/' . $pkg->getName();
|
||||
// automatically delete at session end
|
||||
$this->addTempFile($dir);
|
||||
}
|
||||
} else {
|
||||
$pf = new PEAR_PackageFile($this->config);
|
||||
$pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
|
||||
if (PEAR::isError($pkg)) {
|
||||
return $pkg;
|
||||
}
|
||||
$dir = dirname($descfile);
|
||||
}
|
||||
|
||||
// Find config. outside of normal path - e.g. config.m4
|
||||
foreach (array_keys($pkg->getInstallationFileList()) as $item) {
|
||||
if (stristr(basename($item), 'config.m4') && dirname($item) != '.') {
|
||||
$dir .= DIRECTORY_SEPARATOR . dirname($item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$old_cwd = getcwd();
|
||||
if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
|
||||
return $this->raiseError("could not chdir to $dir");
|
||||
}
|
||||
|
||||
$vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
|
||||
if (is_dir($vdir)) {
|
||||
chdir($vdir);
|
||||
}
|
||||
|
||||
$dir = getcwd();
|
||||
$this->log(2, "building in $dir");
|
||||
putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH'));
|
||||
$err = $this->_runCommand($this->config->get('php_prefix')
|
||||
. "phpize" .
|
||||
$this->config->get('php_suffix'),
|
||||
array(&$this, 'phpizeCallback'));
|
||||
if (PEAR::isError($err)) {
|
||||
return $err;
|
||||
}
|
||||
|
||||
if (!$err) {
|
||||
return $this->raiseError("`phpize' failed");
|
||||
}
|
||||
|
||||
// {{{ start of interactive part
|
||||
$configure_command = "$dir/configure";
|
||||
|
||||
$phpConfigName = $this->config->get('php_prefix')
|
||||
. 'php-config'
|
||||
. $this->config->get('php_suffix');
|
||||
$phpConfigPath = System::which($phpConfigName);
|
||||
if ($phpConfigPath !== false) {
|
||||
$configure_command .= ' --with-php-config='
|
||||
. $phpConfigPath;
|
||||
}
|
||||
|
||||
$configure_options = $pkg->getConfigureOptions();
|
||||
if ($configure_options) {
|
||||
foreach ($configure_options as $o) {
|
||||
$default = array_key_exists('default', $o) ? $o['default'] : null;
|
||||
list($r) = $this->ui->userDialog('build',
|
||||
array($o['prompt']),
|
||||
array('text'),
|
||||
array($default));
|
||||
if (substr($o['name'], 0, 5) == 'with-' &&
|
||||
($r == 'yes' || $r == 'autodetect')) {
|
||||
$configure_command .= " --$o[name]";
|
||||
} else {
|
||||
$configure_command .= " --$o[name]=".trim($r);
|
||||
}
|
||||
}
|
||||
}
|
||||
// }}} end of interactive part
|
||||
|
||||
// FIXME make configurable
|
||||
if (!$user=getenv('USER')) {
|
||||
$user='defaultuser';
|
||||
}
|
||||
|
||||
$tmpdir = $this->config->get('temp_dir');
|
||||
$build_basedir = System::mktemp(' -t "' . $tmpdir . '" -d "pear-build-' . $user . '"');
|
||||
$build_dir = "$build_basedir/$vdir";
|
||||
$inst_dir = "$build_basedir/install-$vdir";
|
||||
$this->log(1, "building in $build_dir");
|
||||
if (is_dir($build_dir)) {
|
||||
System::rm(array('-rf', $build_dir));
|
||||
}
|
||||
|
||||
if (!System::mkDir(array('-p', $build_dir))) {
|
||||
return $this->raiseError("could not create build dir: $build_dir");
|
||||
}
|
||||
|
||||
$this->addTempFile($build_dir);
|
||||
if (!System::mkDir(array('-p', $inst_dir))) {
|
||||
return $this->raiseError("could not create temporary install dir: $inst_dir");
|
||||
}
|
||||
$this->addTempFile($inst_dir);
|
||||
|
||||
$make_command = getenv('MAKE') ? getenv('MAKE') : 'make';
|
||||
|
||||
$to_run = array(
|
||||
$configure_command,
|
||||
$make_command,
|
||||
"$make_command INSTALL_ROOT=\"$inst_dir\" install",
|
||||
"find \"$inst_dir\" | xargs ls -dils"
|
||||
);
|
||||
if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) {
|
||||
return $this->raiseError("could not chdir to $build_dir");
|
||||
}
|
||||
putenv('PHP_PEAR_VERSION=1.10.3');
|
||||
foreach ($to_run as $cmd) {
|
||||
$err = $this->_runCommand($cmd, $callback);
|
||||
if (PEAR::isError($err)) {
|
||||
chdir($old_cwd);
|
||||
return $err;
|
||||
}
|
||||
if (!$err) {
|
||||
chdir($old_cwd);
|
||||
return $this->raiseError("`$cmd' failed");
|
||||
}
|
||||
}
|
||||
if (!($dp = opendir("modules"))) {
|
||||
chdir($old_cwd);
|
||||
return $this->raiseError("no `modules' directory found");
|
||||
}
|
||||
$built_files = array();
|
||||
$prefix = exec($this->config->get('php_prefix')
|
||||
. "php-config" .
|
||||
$this->config->get('php_suffix') . " --prefix");
|
||||
$this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files);
|
||||
chdir($old_cwd);
|
||||
return $built_files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Message callback function used when running the "phpize"
|
||||
* program. Extracts the API numbers used. Ignores other message
|
||||
* types than "cmdoutput".
|
||||
*
|
||||
* @param string $what the type of message
|
||||
* @param mixed $data the message
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function phpizeCallback($what, $data)
|
||||
{
|
||||
if ($what != 'cmdoutput') {
|
||||
return;
|
||||
}
|
||||
$this->log(1, rtrim($data));
|
||||
if (preg_match('/You should update your .aclocal.m4/', $data)) {
|
||||
return;
|
||||
}
|
||||
$matches = array();
|
||||
if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) {
|
||||
$member = preg_replace('/[^a-z]/', '_', strtolower($matches[1]));
|
||||
$apino = (int)$matches[2];
|
||||
if (isset($this->$member)) {
|
||||
$this->$member = $apino;
|
||||
//$msg = sprintf("%-22s : %d", $matches[1], $apino);
|
||||
//$this->log(1, $msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run an external command, using a message callback to report
|
||||
* output. The command will be run through popen and output is
|
||||
* reported for every line with a "cmdoutput" message with the
|
||||
* line string, including newlines, as payload.
|
||||
*
|
||||
* @param string $command the command to run
|
||||
*
|
||||
* @param mixed $callback (optional) function to use as message
|
||||
* callback
|
||||
*
|
||||
* @return bool whether the command was successful (exit code 0
|
||||
* means success, any other means failure)
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
function _runCommand($command, $callback = null)
|
||||
{
|
||||
$this->log(1, "running: $command");
|
||||
$pp = popen("$command 2>&1", "r");
|
||||
if (!$pp) {
|
||||
return $this->raiseError("failed to run `$command'");
|
||||
}
|
||||
if ($callback && $callback[0]->debug == 1) {
|
||||
$olddbg = $callback[0]->debug;
|
||||
$callback[0]->debug = 2;
|
||||
}
|
||||
|
||||
while ($line = fgets($pp, 1024)) {
|
||||
if ($callback) {
|
||||
call_user_func($callback, 'cmdoutput', $line);
|
||||
} else {
|
||||
$this->log(2, rtrim($line));
|
||||
}
|
||||
}
|
||||
if ($callback && isset($olddbg)) {
|
||||
$callback[0]->debug = $olddbg;
|
||||
}
|
||||
|
||||
$exitcode = is_resource($pp) ? pclose($pp) : -1;
|
||||
return ($exitcode == 0);
|
||||
}
|
||||
|
||||
function log($level, $msg, $append_crlf = true)
|
||||
{
|
||||
if ($this->current_callback) {
|
||||
if ($this->debug >= $level) {
|
||||
call_user_func($this->current_callback, 'output', $msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return parent::log($level, $msg, $append_crlf);
|
||||
}
|
||||
}
|
||||
1560
vendor/pear-pear.php.net/PEAR/PEAR/ChannelFile.php
generated
vendored
Normal file
1560
vendor/pear-pear.php.net/PEAR/PEAR/ChannelFile.php
generated
vendored
Normal file
|
|
@ -0,0 +1,1560 @@
|
|||
<?php
|
||||
/**
|
||||
* PEAR_ChannelFile, the channel handling class
|
||||
*
|
||||
* 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
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since File available since Release 1.4.0a1
|
||||
*/
|
||||
|
||||
/**
|
||||
* Needed for error handling
|
||||
*/
|
||||
require_once 'PEAR/ErrorStack.php';
|
||||
require_once 'PEAR/XMLParser.php';
|
||||
require_once 'PEAR/Common.php';
|
||||
|
||||
/**
|
||||
* Error code if the channel.xml <channel> tag does not contain a valid version
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_VERSION', 1);
|
||||
/**
|
||||
* Error code if the channel.xml <channel> tag version is not supported (version 1.0 is the only supported version,
|
||||
* currently
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_VERSION', 2);
|
||||
|
||||
/**
|
||||
* Error code if parsing is attempted with no xml extension
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_XML_EXT', 3);
|
||||
|
||||
/**
|
||||
* Error code if creating the xml parser resource fails
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER', 4);
|
||||
|
||||
/**
|
||||
* Error code used for all sax xml parsing errors
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_PARSER_ERROR', 5);
|
||||
|
||||
/**#@+
|
||||
* Validation errors
|
||||
*/
|
||||
/**
|
||||
* Error code when channel name is missing
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_NAME', 6);
|
||||
/**
|
||||
* Error code when channel name is invalid
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_NAME', 7);
|
||||
/**
|
||||
* Error code when channel summary is missing
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_SUMMARY', 8);
|
||||
/**
|
||||
* Error code when channel summary is multi-line
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY', 9);
|
||||
/**
|
||||
* Error code when channel server is missing for protocol
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_HOST', 10);
|
||||
/**
|
||||
* Error code when channel server is invalid for protocol
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_HOST', 11);
|
||||
/**
|
||||
* Error code when a mirror name is invalid
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRROR', 21);
|
||||
/**
|
||||
* Error code when a mirror type is invalid
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE', 22);
|
||||
/**
|
||||
* Error code when an attempt is made to generate xml, but the parsed content is invalid
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID', 23);
|
||||
/**
|
||||
* Error code when an empty package name validate regex is passed in
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_EMPTY_REGEX', 24);
|
||||
/**
|
||||
* Error code when a <function> tag has no version
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION', 25);
|
||||
/**
|
||||
* Error code when a <function> tag has no name
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME', 26);
|
||||
/**
|
||||
* Error code when a <validatepackage> tag has no name
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME', 27);
|
||||
/**
|
||||
* Error code when a <validatepackage> tag has no version attribute
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION', 28);
|
||||
/**
|
||||
* Error code when a mirror does not exist but is called for in one of the set*
|
||||
* methods.
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND', 32);
|
||||
/**
|
||||
* Error code when a server port is not numeric
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_PORT', 33);
|
||||
/**
|
||||
* Error code when <static> contains no version attribute
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NO_STATICVERSION', 34);
|
||||
/**
|
||||
* Error code when <baseurl> contains no type attribute in a <rest> protocol definition
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE', 35);
|
||||
/**
|
||||
* Error code when a mirror is defined and the channel.xml represents the __uri pseudo-channel
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_URI_CANT_MIRROR', 36);
|
||||
/**
|
||||
* Error code when ssl attribute is present and is not "yes"
|
||||
*/
|
||||
define('PEAR_CHANNELFILE_ERROR_INVALID_SSL', 37);
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Mirror types allowed. Currently only internet servers are recognized.
|
||||
*/
|
||||
$GLOBALS['_PEAR_CHANNELS_MIRROR_TYPES'] = array('server');
|
||||
|
||||
|
||||
/**
|
||||
* The Channel handling class
|
||||
*
|
||||
* @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.10.3
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since Class available since Release 1.4.0a1
|
||||
*/
|
||||
class PEAR_ChannelFile
|
||||
{
|
||||
/**
|
||||
* @access private
|
||||
* @var PEAR_ErrorStack
|
||||
* @access private
|
||||
*/
|
||||
var $_stack;
|
||||
|
||||
/**
|
||||
* Supported channel.xml versions, for parsing
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_supportedVersions = array('1.0');
|
||||
|
||||
/**
|
||||
* Parsed channel information
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_channelInfo;
|
||||
|
||||
/**
|
||||
* index into the subchannels array, used for parsing xml
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $_subchannelIndex;
|
||||
|
||||
/**
|
||||
* index into the mirrors array, used for parsing xml
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $_mirrorIndex;
|
||||
|
||||
/**
|
||||
* Flag used to determine the validity of parsed content
|
||||
* @var boolean
|
||||
* @access private
|
||||
*/
|
||||
var $_isValid = false;
|
||||
|
||||
function __construct()
|
||||
{
|
||||
$this->_stack = new PEAR_ErrorStack('PEAR_ChannelFile');
|
||||
$this->_stack->setErrorMessageTemplate($this->_getErrorMessage());
|
||||
$this->_isValid = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @access protected
|
||||
*/
|
||||
function _getErrorMessage()
|
||||
{
|
||||
return
|
||||
array(
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_VERSION =>
|
||||
'While parsing channel.xml, an invalid version number "%version% was passed in, expecting one of %versions%',
|
||||
PEAR_CHANNELFILE_ERROR_NO_VERSION =>
|
||||
'No version number found in <channel> tag',
|
||||
PEAR_CHANNELFILE_ERROR_NO_XML_EXT =>
|
||||
'%error%',
|
||||
PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER =>
|
||||
'Unable to create XML parser',
|
||||
PEAR_CHANNELFILE_ERROR_PARSER_ERROR =>
|
||||
'%error%',
|
||||
PEAR_CHANNELFILE_ERROR_NO_NAME =>
|
||||
'Missing channel name',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_NAME =>
|
||||
'Invalid channel %tag% "%name%"',
|
||||
PEAR_CHANNELFILE_ERROR_NO_SUMMARY =>
|
||||
'Missing channel summary',
|
||||
PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY =>
|
||||
'Channel summary should be on one line, but is multi-line',
|
||||
PEAR_CHANNELFILE_ERROR_NO_HOST =>
|
||||
'Missing channel server for %type% server',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_HOST =>
|
||||
'Server name "%server%" is invalid for %type% server',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_MIRROR =>
|
||||
'Invalid mirror name "%name%", mirror type %type%',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE =>
|
||||
'Invalid mirror type "%type%"',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID =>
|
||||
'Cannot generate xml, contents are invalid',
|
||||
PEAR_CHANNELFILE_ERROR_EMPTY_REGEX =>
|
||||
'packagenameregex cannot be empty',
|
||||
PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION =>
|
||||
'%parent% %protocol% function has no version',
|
||||
PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME =>
|
||||
'%parent% %protocol% function has no name',
|
||||
PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE =>
|
||||
'%parent% rest baseurl has no type',
|
||||
PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME =>
|
||||
'Validation package has no name in <validatepackage> tag',
|
||||
PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION =>
|
||||
'Validation package "%package%" has no version',
|
||||
PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND =>
|
||||
'Mirror "%mirror%" does not exist',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_PORT =>
|
||||
'Port "%port%" must be numeric',
|
||||
PEAR_CHANNELFILE_ERROR_NO_STATICVERSION =>
|
||||
'<static> tag must contain version attribute',
|
||||
PEAR_CHANNELFILE_URI_CANT_MIRROR =>
|
||||
'The __uri pseudo-channel cannot have mirrors',
|
||||
PEAR_CHANNELFILE_ERROR_INVALID_SSL =>
|
||||
'%server% has invalid ssl attribute "%ssl%" can only be yes or not present',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string contents of package.xml file
|
||||
* @return bool success of parsing
|
||||
*/
|
||||
function fromXmlString($data)
|
||||
{
|
||||
if (preg_match('/<channel\s+version="([0-9]+\.[0-9]+)"/', $data, $channelversion)) {
|
||||
if (!in_array($channelversion[1], $this->_supportedVersions)) {
|
||||
$this->_stack->push(PEAR_CHANNELFILE_ERROR_INVALID_VERSION, 'error',
|
||||
array('version' => $channelversion[1]));
|
||||
return false;
|
||||
}
|
||||
$parser = new PEAR_XMLParser;
|
||||
$result = $parser->parse($data);
|
||||
if ($result !== true) {
|
||||
if ($result->getCode() == 1) {
|
||||
$this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_XML_EXT, 'error',
|
||||
array('error' => $result->getMessage()));
|
||||
} else {
|
||||
$this->_stack->push(PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER, 'error');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
$this->_channelInfo = $parser->getData();
|
||||
return true;
|
||||
} else {
|
||||
$this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_VERSION, 'error', array('xml' => $data));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
function toArray()
|
||||
{
|
||||
if (!$this->_isValid && !$this->validate()) {
|
||||
return false;
|
||||
}
|
||||
return $this->_channelInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array
|
||||
*
|
||||
* @return PEAR_ChannelFile|false false if invalid
|
||||
*/
|
||||
public static function &fromArray(
|
||||
$data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
|
||||
) {
|
||||
$a = new PEAR_ChannelFile($compatibility, $stackClass);
|
||||
$a->_fromArray($data);
|
||||
if (!$a->validate()) {
|
||||
$a = false;
|
||||
return $a;
|
||||
}
|
||||
return $a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlike {@link fromArray()} this does not do any validation
|
||||
*
|
||||
* @param array
|
||||
*
|
||||
* @return PEAR_ChannelFile
|
||||
*/
|
||||
public static function &fromArrayWithErrors(
|
||||
$data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
|
||||
) {
|
||||
$a = new PEAR_ChannelFile($compatibility, $stackClass);
|
||||
$a->_fromArray($data);
|
||||
return $a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array
|
||||
* @access private
|
||||
*/
|
||||
function _fromArray($data)
|
||||
{
|
||||
$this->_channelInfo = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper to {@link PEAR_ErrorStack::getErrors()}
|
||||
* @param boolean determines whether to purge the error stack after retrieving
|
||||
* @return array
|
||||
*/
|
||||
function getErrors($purge = false)
|
||||
{
|
||||
return $this->_stack->getErrors($purge);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unindent given string (?)
|
||||
*
|
||||
* @param string $str The string that has to be unindented.
|
||||
* @return string
|
||||
* @access private
|
||||
*/
|
||||
function _unIndent($str)
|
||||
{
|
||||
// remove leading newlines
|
||||
$str = preg_replace('/^[\r\n]+/', '', $str);
|
||||
// find whitespace at the beginning of the first line
|
||||
$indent_len = strspn($str, " \t");
|
||||
$indent = substr($str, 0, $indent_len);
|
||||
$data = '';
|
||||
// remove the same amount of whitespace from following lines
|
||||
foreach (explode("\n", $str) as $line) {
|
||||
if (substr($line, 0, $indent_len) == $indent) {
|
||||
$data .= substr($line, $indent_len) . "\n";
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a channel.xml file. Expects the name of
|
||||
* a channel xml file as input.
|
||||
*
|
||||
* @param string $descfile name of channel xml file
|
||||
* @return bool success of parsing
|
||||
*/
|
||||
function fromXmlFile($descfile)
|
||||
{
|
||||
if (!file_exists($descfile) || !is_file($descfile) || !is_readable($descfile) ||
|
||||
(!$fp = fopen($descfile, 'r'))) {
|
||||
require_once 'PEAR.php';
|
||||
return PEAR::raiseError("Unable to open $descfile");
|
||||
}
|
||||
|
||||
// read the whole thing so we only get one cdata callback
|
||||
// for each block of cdata
|
||||
fclose($fp);
|
||||
$data = file_get_contents($descfile);
|
||||
return $this->fromXmlString($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse channel information from different sources
|
||||
*
|
||||
* This method is able to extract information about a channel
|
||||
* from an .xml file or a string
|
||||
*
|
||||
* @access public
|
||||
* @param string Filename of the source or the source itself
|
||||
* @return bool
|
||||
*/
|
||||
function fromAny($info)
|
||||
{
|
||||
if (is_string($info) && file_exists($info) && strlen($info) < 255) {
|
||||
$tmp = substr($info, -4);
|
||||
if ($tmp == '.xml') {
|
||||
$info = $this->fromXmlFile($info);
|
||||
} else {
|
||||
$fp = fopen($info, "r");
|
||||
$test = fread($fp, 5);
|
||||
fclose($fp);
|
||||
if ($test == "<?xml") {
|
||||
$info = $this->fromXmlFile($info);
|
||||
}
|
||||
}
|
||||
if (PEAR::isError($info)) {
|
||||
require_once 'PEAR.php';
|
||||
return PEAR::raiseError($info);
|
||||
}
|
||||
}
|
||||
if (is_string($info)) {
|
||||
$info = $this->fromXmlString($info);
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an XML document based on previous parsing and modifications
|
||||
*
|
||||
* @return string XML data
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function toXml()
|
||||
{
|
||||
if (!$this->_isValid && !$this->validate()) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID);
|
||||
return false;
|
||||
}
|
||||
if (!isset($this->_channelInfo['attribs']['version'])) {
|
||||
$this->_channelInfo['attribs']['version'] = '1.0';
|
||||
}
|
||||
$channelInfo = $this->_channelInfo;
|
||||
$ret = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
|
||||
$ret .= "<channel version=\"" .
|
||||
$channelInfo['attribs']['version'] . "\" xmlns=\"http://pear.php.net/channel-1.0\"
|
||||
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
|
||||
xsi:schemaLocation=\"http://pear.php.net/dtd/channel-"
|
||||
. $channelInfo['attribs']['version'] . " http://pear.php.net/dtd/channel-" .
|
||||
$channelInfo['attribs']['version'] . ".xsd\">
|
||||
<name>$channelInfo[name]</name>
|
||||
<summary>" . htmlspecialchars($channelInfo['summary'])."</summary>
|
||||
";
|
||||
if (isset($channelInfo['suggestedalias'])) {
|
||||
$ret .= ' <suggestedalias>' . $channelInfo['suggestedalias'] . "</suggestedalias>\n";
|
||||
}
|
||||
if (isset($channelInfo['validatepackage'])) {
|
||||
$ret .= ' <validatepackage version="' .
|
||||
$channelInfo['validatepackage']['attribs']['version']. '">' .
|
||||
htmlspecialchars($channelInfo['validatepackage']['_content']) .
|
||||
"</validatepackage>\n";
|
||||
}
|
||||
$ret .= " <servers>\n";
|
||||
$ret .= ' <primary';
|
||||
if (isset($channelInfo['servers']['primary']['attribs']['ssl'])) {
|
||||
$ret .= ' ssl="' . $channelInfo['servers']['primary']['attribs']['ssl'] . '"';
|
||||
}
|
||||
if (isset($channelInfo['servers']['primary']['attribs']['port'])) {
|
||||
$ret .= ' port="' . $channelInfo['servers']['primary']['attribs']['port'] . '"';
|
||||
}
|
||||
$ret .= ">\n";
|
||||
if (isset($channelInfo['servers']['primary']['rest'])) {
|
||||
$ret .= $this->_makeRestXml($channelInfo['servers']['primary']['rest'], ' ');
|
||||
}
|
||||
$ret .= " </primary>\n";
|
||||
if (isset($channelInfo['servers']['mirror'])) {
|
||||
$ret .= $this->_makeMirrorsXml($channelInfo);
|
||||
}
|
||||
$ret .= " </servers>\n";
|
||||
$ret .= "</channel>";
|
||||
return str_replace("\r", "\n", str_replace("\r\n", "\n", $ret));
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the <rest> tag
|
||||
* @access private
|
||||
*/
|
||||
function _makeRestXml($info, $indent)
|
||||
{
|
||||
$ret = $indent . "<rest>\n";
|
||||
if (isset($info['baseurl']) && !isset($info['baseurl'][0])) {
|
||||
$info['baseurl'] = array($info['baseurl']);
|
||||
}
|
||||
|
||||
if (isset($info['baseurl'])) {
|
||||
foreach ($info['baseurl'] as $url) {
|
||||
$ret .= "$indent <baseurl type=\"" . $url['attribs']['type'] . "\"";
|
||||
$ret .= ">" . $url['_content'] . "</baseurl>\n";
|
||||
}
|
||||
}
|
||||
$ret .= $indent . "</rest>\n";
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the <mirrors> tag
|
||||
* @access private
|
||||
*/
|
||||
function _makeMirrorsXml($channelInfo)
|
||||
{
|
||||
$ret = "";
|
||||
if (!isset($channelInfo['servers']['mirror'][0])) {
|
||||
$channelInfo['servers']['mirror'] = array($channelInfo['servers']['mirror']);
|
||||
}
|
||||
foreach ($channelInfo['servers']['mirror'] as $mirror) {
|
||||
$ret .= ' <mirror host="' . $mirror['attribs']['host'] . '"';
|
||||
if (isset($mirror['attribs']['port'])) {
|
||||
$ret .= ' port="' . $mirror['attribs']['port'] . '"';
|
||||
}
|
||||
if (isset($mirror['attribs']['ssl'])) {
|
||||
$ret .= ' ssl="' . $mirror['attribs']['ssl'] . '"';
|
||||
}
|
||||
$ret .= ">\n";
|
||||
if (isset($mirror['rest'])) {
|
||||
if (isset($mirror['rest'])) {
|
||||
$ret .= $this->_makeRestXml($mirror['rest'], ' ');
|
||||
}
|
||||
$ret .= " </mirror>\n";
|
||||
} else {
|
||||
$ret .= "/>\n";
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the <functions> tag
|
||||
* @access private
|
||||
*/
|
||||
function _makeFunctionsXml($functions, $indent, $rest = false)
|
||||
{
|
||||
$ret = '';
|
||||
if (!isset($functions[0])) {
|
||||
$functions = array($functions);
|
||||
}
|
||||
foreach ($functions as $function) {
|
||||
$ret .= "$indent<function version=\"" . $function['attribs']['version'] . "\"";
|
||||
if ($rest) {
|
||||
$ret .= ' uri="' . $function['attribs']['uri'] . '"';
|
||||
}
|
||||
$ret .= ">" . $function['_content'] . "</function>\n";
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation error. Also marks the object contents as invalid
|
||||
* @param error code
|
||||
* @param array error information
|
||||
* @access private
|
||||
*/
|
||||
function _validateError($code, $params = array())
|
||||
{
|
||||
$this->_stack->push($code, 'error', $params);
|
||||
$this->_isValid = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation warning. Does not mark the object contents invalid.
|
||||
* @param error code
|
||||
* @param array error information
|
||||
* @access private
|
||||
*/
|
||||
function _validateWarning($code, $params = array())
|
||||
{
|
||||
$this->_stack->push($code, 'warning', $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate parsed file.
|
||||
*
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
function validate()
|
||||
{
|
||||
$this->_isValid = true;
|
||||
$info = $this->_channelInfo;
|
||||
if (empty($info['name'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_NAME);
|
||||
} elseif (!$this->validChannelServer($info['name'])) {
|
||||
if ($info['name'] != '__uri') {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, array('tag' => 'name',
|
||||
'name' => $info['name']));
|
||||
}
|
||||
}
|
||||
if (empty($info['summary'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
|
||||
} elseif (strpos(trim($info['summary']), "\n") !== false) {
|
||||
$this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
|
||||
array('summary' => $info['summary']));
|
||||
}
|
||||
if (isset($info['suggestedalias'])) {
|
||||
if (!$this->validChannelServer($info['suggestedalias'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
|
||||
array('tag' => 'suggestedalias', 'name' =>$info['suggestedalias']));
|
||||
}
|
||||
}
|
||||
if (isset($info['localalias'])) {
|
||||
if (!$this->validChannelServer($info['localalias'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
|
||||
array('tag' => 'localalias', 'name' =>$info['localalias']));
|
||||
}
|
||||
}
|
||||
if (isset($info['validatepackage'])) {
|
||||
if (!isset($info['validatepackage']['_content'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME);
|
||||
}
|
||||
if (!isset($info['validatepackage']['attribs']['version'])) {
|
||||
$content = isset($info['validatepackage']['_content']) ?
|
||||
$info['validatepackage']['_content'] :
|
||||
null;
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION,
|
||||
array('package' => $content));
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['port']) &&
|
||||
!is_numeric($info['servers']['primary']['attribs']['port'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_PORT,
|
||||
array('port' => $info['servers']['primary']['attribs']['port']));
|
||||
}
|
||||
|
||||
if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['ssl']) &&
|
||||
$info['servers']['primary']['attribs']['ssl'] != 'yes') {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
|
||||
array('ssl' => $info['servers']['primary']['attribs']['ssl'],
|
||||
'server' => $info['name']));
|
||||
}
|
||||
|
||||
if (isset($info['servers']['primary']['rest']) &&
|
||||
isset($info['servers']['primary']['rest']['baseurl'])) {
|
||||
$this->_validateFunctions('rest', $info['servers']['primary']['rest']['baseurl']);
|
||||
}
|
||||
if (isset($info['servers']['mirror'])) {
|
||||
if ($this->_channelInfo['name'] == '__uri') {
|
||||
$this->_validateError(PEAR_CHANNELFILE_URI_CANT_MIRROR);
|
||||
}
|
||||
if (!isset($info['servers']['mirror'][0])) {
|
||||
$info['servers']['mirror'] = array($info['servers']['mirror']);
|
||||
}
|
||||
foreach ($info['servers']['mirror'] as $mirror) {
|
||||
if (!isset($mirror['attribs']['host'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_HOST,
|
||||
array('type' => 'mirror'));
|
||||
} elseif (!$this->validChannelServer($mirror['attribs']['host'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_HOST,
|
||||
array('server' => $mirror['attribs']['host'], 'type' => 'mirror'));
|
||||
}
|
||||
if (isset($mirror['attribs']['ssl']) && $mirror['attribs']['ssl'] != 'yes') {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
|
||||
array('ssl' => $info['ssl'], 'server' => $mirror['attribs']['host']));
|
||||
}
|
||||
if (isset($mirror['rest'])) {
|
||||
$this->_validateFunctions('rest', $mirror['rest']['baseurl'],
|
||||
$mirror['attribs']['host']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $this->_isValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string rest - protocol name this function applies to
|
||||
* @param array the functions
|
||||
* @param string the name of the parent element (mirror name, for instance)
|
||||
*/
|
||||
function _validateFunctions($protocol, $functions, $parent = '')
|
||||
{
|
||||
if (!isset($functions[0])) {
|
||||
$functions = array($functions);
|
||||
}
|
||||
|
||||
foreach ($functions as $function) {
|
||||
if (!isset($function['_content']) || empty($function['_content'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME,
|
||||
array('parent' => $parent, 'protocol' => $protocol));
|
||||
}
|
||||
|
||||
if ($protocol == 'rest') {
|
||||
if (!isset($function['attribs']['type']) ||
|
||||
empty($function['attribs']['type'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE,
|
||||
array('parent' => $parent, 'protocol' => $protocol));
|
||||
}
|
||||
} else {
|
||||
if (!isset($function['attribs']['version']) ||
|
||||
empty($function['attribs']['version'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION,
|
||||
array('parent' => $parent, 'protocol' => $protocol));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether a string contains a valid channel server.
|
||||
* @param string $ver the package version to test
|
||||
* @return bool
|
||||
*/
|
||||
function validChannelServer($server)
|
||||
{
|
||||
if ($server == '__uri') {
|
||||
return true;
|
||||
}
|
||||
return (bool) preg_match(PEAR_CHANNELS_SERVER_PREG, $server);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|false
|
||||
*/
|
||||
function getName()
|
||||
{
|
||||
if (isset($this->_channelInfo['name'])) {
|
||||
return $this->_channelInfo['name'];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|false
|
||||
*/
|
||||
function getServer()
|
||||
{
|
||||
if (isset($this->_channelInfo['name'])) {
|
||||
return $this->_channelInfo['name'];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int|80 port number to connect to
|
||||
*/
|
||||
function getPort($mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if ($mir = $this->getMirror($mirror)) {
|
||||
if (isset($mir['attribs']['port'])) {
|
||||
return $mir['attribs']['port'];
|
||||
}
|
||||
|
||||
if ($this->getSSL($mirror)) {
|
||||
return 443;
|
||||
}
|
||||
|
||||
return 80;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['primary']['attribs']['port'])) {
|
||||
return $this->_channelInfo['servers']['primary']['attribs']['port'];
|
||||
}
|
||||
|
||||
if ($this->getSSL()) {
|
||||
return 443;
|
||||
}
|
||||
|
||||
return 80;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool Determines whether secure sockets layer (SSL) is used to connect to this channel
|
||||
*/
|
||||
function getSSL($mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if ($mir = $this->getMirror($mirror)) {
|
||||
if (isset($mir['attribs']['ssl'])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|false
|
||||
*/
|
||||
function getSummary()
|
||||
{
|
||||
if (isset($this->_channelInfo['summary'])) {
|
||||
return $this->_channelInfo['summary'];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string protocol type
|
||||
* @param string Mirror name
|
||||
* @return array|false
|
||||
*/
|
||||
function getFunctions($protocol, $mirror = false)
|
||||
{
|
||||
if ($this->getName() == '__uri') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$function = $protocol == 'rest' ? 'baseurl' : 'function';
|
||||
if ($mirror) {
|
||||
if ($mir = $this->getMirror($mirror)) {
|
||||
if (isset($mir[$protocol][$function])) {
|
||||
return $mir[$protocol][$function];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['primary'][$protocol][$function])) {
|
||||
return $this->_channelInfo['servers']['primary'][$protocol][$function];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string Protocol type
|
||||
* @param string Function name (null to return the
|
||||
* first protocol of the type requested)
|
||||
* @param string Mirror name, if any
|
||||
* @return array
|
||||
*/
|
||||
function getFunction($type, $name = null, $mirror = false)
|
||||
{
|
||||
$protocols = $this->getFunctions($type, $mirror);
|
||||
if (!$protocols) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($protocols as $protocol) {
|
||||
if ($name === null) {
|
||||
return $protocol;
|
||||
}
|
||||
|
||||
if ($protocol['_content'] != $name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $protocol;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string protocol type
|
||||
* @param string protocol name
|
||||
* @param string version
|
||||
* @param string mirror name
|
||||
* @return boolean
|
||||
*/
|
||||
function supports($type, $name = null, $mirror = false, $version = '1.0')
|
||||
{
|
||||
$protocols = $this->getFunctions($type, $mirror);
|
||||
if (!$protocols) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($protocols as $protocol) {
|
||||
if ($protocol['attribs']['version'] != $version) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($name === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($protocol['_content'] != $name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a channel supports Representational State Transfer (REST) protocols
|
||||
* for retrieving channel information
|
||||
* @param string
|
||||
* @return bool
|
||||
*/
|
||||
function supportsREST($mirror = false)
|
||||
{
|
||||
if ($mirror == $this->_channelInfo['name']) {
|
||||
$mirror = false;
|
||||
}
|
||||
|
||||
if ($mirror) {
|
||||
if ($mir = $this->getMirror($mirror)) {
|
||||
return isset($mir['rest']);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return isset($this->_channelInfo['servers']['primary']['rest']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL to access a base resource.
|
||||
*
|
||||
* Hyperlinks in the returned xml will be used to retrieve the proper information
|
||||
* needed. This allows extreme extensibility and flexibility in implementation
|
||||
* @param string Resource Type to retrieve
|
||||
*/
|
||||
function getBaseURL($resourceType, $mirror = false)
|
||||
{
|
||||
if ($mirror == $this->_channelInfo['name']) {
|
||||
$mirror = false;
|
||||
}
|
||||
|
||||
if ($mirror) {
|
||||
$mir = $this->getMirror($mirror);
|
||||
if (!$mir) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$rest = $mir['rest'];
|
||||
} else {
|
||||
$rest = $this->_channelInfo['servers']['primary']['rest'];
|
||||
}
|
||||
|
||||
if (!isset($rest['baseurl'][0])) {
|
||||
$rest['baseurl'] = array($rest['baseurl']);
|
||||
}
|
||||
|
||||
foreach ($rest['baseurl'] as $baseurl) {
|
||||
if (strtolower($baseurl['attribs']['type']) == strtolower($resourceType)) {
|
||||
return $baseurl['_content'];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Since REST does not implement RPC, provide this as a logical wrapper around
|
||||
* resetFunctions for REST
|
||||
* @param string|false mirror name, if any
|
||||
*/
|
||||
function resetREST($mirror = false)
|
||||
{
|
||||
return $this->resetFunctions('rest', $mirror);
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty all protocol definitions
|
||||
* @param string protocol type
|
||||
* @param string|false mirror name, if any
|
||||
*/
|
||||
function resetFunctions($type, $mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if (isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$mirrors = $this->_channelInfo['servers']['mirror'];
|
||||
if (!isset($mirrors[0])) {
|
||||
$mirrors = array($mirrors);
|
||||
}
|
||||
|
||||
foreach ($mirrors as $i => $mir) {
|
||||
if ($mir['attribs']['host'] == $mirror) {
|
||||
if (isset($this->_channelInfo['servers']['mirror'][$i][$type])) {
|
||||
unset($this->_channelInfo['servers']['mirror'][$i][$type]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['primary'][$type])) {
|
||||
unset($this->_channelInfo['servers']['primary'][$type]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a channel's protocols to the protocols supported by pearweb
|
||||
*/
|
||||
function setDefaultPEARProtocols($version = '1.0', $mirror = false)
|
||||
{
|
||||
switch ($version) {
|
||||
case '1.0' :
|
||||
$this->resetREST($mirror);
|
||||
|
||||
if (!isset($this->_channelInfo['servers'])) {
|
||||
$this->_channelInfo['servers'] = array('primary' =>
|
||||
array('rest' => array()));
|
||||
} elseif (!isset($this->_channelInfo['servers']['primary'])) {
|
||||
$this->_channelInfo['servers']['primary'] = array('rest' => array());
|
||||
}
|
||||
|
||||
return true;
|
||||
break;
|
||||
default :
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
function getMirrors()
|
||||
{
|
||||
if (isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$mirrors = $this->_channelInfo['servers']['mirror'];
|
||||
if (!isset($mirrors[0])) {
|
||||
$mirrors = array($mirrors);
|
||||
}
|
||||
|
||||
return $mirrors;
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the unserialized XML representing a mirror
|
||||
* @return array|false
|
||||
*/
|
||||
function getMirror($server)
|
||||
{
|
||||
foreach ($this->getMirrors() as $mirror) {
|
||||
if ($mirror['attribs']['host'] == $server) {
|
||||
return $mirror;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string|false
|
||||
* @error PEAR_CHANNELFILE_ERROR_NO_NAME
|
||||
* @error PEAR_CHANNELFILE_ERROR_INVALID_NAME
|
||||
*/
|
||||
function setName($name)
|
||||
{
|
||||
return $this->setServer($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the socket number (port) that is used to connect to this channel
|
||||
* @param integer
|
||||
* @param string|false name of the mirror server, or false for the primary
|
||||
*/
|
||||
function setPort($port, $mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if (!isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['mirror'][0])) {
|
||||
foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
|
||||
if ($mirror == $mir['attribs']['host']) {
|
||||
$this->_channelInfo['servers']['mirror'][$i]['attribs']['port'] = $port;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
|
||||
$this->_channelInfo['servers']['mirror']['attribs']['port'] = $port;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$this->_channelInfo['servers']['primary']['attribs']['port'] = $port;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the socket number (port) that is used to connect to this channel
|
||||
* @param bool Determines whether to turn on SSL support or turn it off
|
||||
* @param string|false name of the mirror server, or false for the primary
|
||||
*/
|
||||
function setSSL($ssl = true, $mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if (!isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['servers']['mirror'][0])) {
|
||||
foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
|
||||
if ($mirror == $mir['attribs']['host']) {
|
||||
if (!$ssl) {
|
||||
if (isset($this->_channelInfo['servers']['mirror'][$i]
|
||||
['attribs']['ssl'])) {
|
||||
unset($this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl']);
|
||||
}
|
||||
} else {
|
||||
$this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl'] = 'yes';
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
|
||||
if (!$ssl) {
|
||||
if (isset($this->_channelInfo['servers']['mirror']['attribs']['ssl'])) {
|
||||
unset($this->_channelInfo['servers']['mirror']['attribs']['ssl']);
|
||||
}
|
||||
} else {
|
||||
$this->_channelInfo['servers']['mirror']['attribs']['ssl'] = 'yes';
|
||||
}
|
||||
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($ssl) {
|
||||
$this->_channelInfo['servers']['primary']['attribs']['ssl'] = 'yes';
|
||||
} else {
|
||||
if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
|
||||
unset($this->_channelInfo['servers']['primary']['attribs']['ssl']);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return string|false
|
||||
* @error PEAR_CHANNELFILE_ERROR_NO_SERVER
|
||||
* @error PEAR_CHANNELFILE_ERROR_INVALID_SERVER
|
||||
*/
|
||||
function setServer($server, $mirror = false)
|
||||
{
|
||||
if (empty($server)) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SERVER);
|
||||
return false;
|
||||
} elseif (!$this->validChannelServer($server)) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
|
||||
array('tag' => 'name', 'name' => $server));
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($mirror) {
|
||||
$found = false;
|
||||
foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
|
||||
if ($mirror == $mir['attribs']['host']) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->_channelInfo['mirror'][$i]['attribs']['host'] = $server;
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->_channelInfo['name'] = $server;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @return boolean success
|
||||
* @error PEAR_CHANNELFILE_ERROR_NO_SUMMARY
|
||||
* @warning PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY
|
||||
*/
|
||||
function setSummary($summary)
|
||||
{
|
||||
if (empty($summary)) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
|
||||
return false;
|
||||
} elseif (strpos(trim($summary), "\n") !== false) {
|
||||
$this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
|
||||
array('summary' => $summary));
|
||||
}
|
||||
|
||||
$this->_channelInfo['summary'] = $summary;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @param boolean determines whether the alias is in channel.xml or local
|
||||
* @return boolean success
|
||||
*/
|
||||
function setAlias($alias, $local = false)
|
||||
{
|
||||
if (!$this->validChannelServer($alias)) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
|
||||
array('tag' => 'suggestedalias', 'name' => $alias));
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($local) {
|
||||
$this->_channelInfo['localalias'] = $alias;
|
||||
} else {
|
||||
$this->_channelInfo['suggestedalias'] = $alias;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getAlias()
|
||||
{
|
||||
if (isset($this->_channelInfo['localalias'])) {
|
||||
return $this->_channelInfo['localalias'];
|
||||
}
|
||||
if (isset($this->_channelInfo['suggestedalias'])) {
|
||||
return $this->_channelInfo['suggestedalias'];
|
||||
}
|
||||
if (isset($this->_channelInfo['name'])) {
|
||||
return $this->_channelInfo['name'];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the package validation object if it differs from PEAR's default
|
||||
* The class must be includeable via changing _ in the classname to path separator,
|
||||
* but no checking of this is made.
|
||||
* @param string|false pass in false to reset to the default packagename regex
|
||||
* @return boolean success
|
||||
*/
|
||||
function setValidationPackage($validateclass, $version)
|
||||
{
|
||||
if (empty($validateclass)) {
|
||||
unset($this->_channelInfo['validatepackage']);
|
||||
}
|
||||
$this->_channelInfo['validatepackage'] = array('_content' => $validateclass);
|
||||
$this->_channelInfo['validatepackage']['attribs'] = array('version' => $version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a protocol to the provides section
|
||||
* @param string protocol type
|
||||
* @param string protocol version
|
||||
* @param string protocol name, if any
|
||||
* @param string mirror name, if this is a mirror's protocol
|
||||
* @return bool
|
||||
*/
|
||||
function addFunction($type, $version, $name = '', $mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
return $this->addMirrorFunction($mirror, $type, $version, $name);
|
||||
}
|
||||
|
||||
$set = array('attribs' => array('version' => $version), '_content' => $name);
|
||||
if (!isset($this->_channelInfo['servers']['primary'][$type]['function'])) {
|
||||
if (!isset($this->_channelInfo['servers'])) {
|
||||
$this->_channelInfo['servers'] = array('primary' =>
|
||||
array($type => array()));
|
||||
} elseif (!isset($this->_channelInfo['servers']['primary'])) {
|
||||
$this->_channelInfo['servers']['primary'] = array($type => array());
|
||||
}
|
||||
|
||||
$this->_channelInfo['servers']['primary'][$type]['function'] = $set;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
} elseif (!isset($this->_channelInfo['servers']['primary'][$type]['function'][0])) {
|
||||
$this->_channelInfo['servers']['primary'][$type]['function'] = array(
|
||||
$this->_channelInfo['servers']['primary'][$type]['function']);
|
||||
}
|
||||
|
||||
$this->_channelInfo['servers']['primary'][$type]['function'][] = $set;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Add a protocol to a mirror's provides section
|
||||
* @param string mirror name (server)
|
||||
* @param string protocol type
|
||||
* @param string protocol version
|
||||
* @param string protocol name, if any
|
||||
*/
|
||||
function addMirrorFunction($mirror, $type, $version, $name = '')
|
||||
{
|
||||
if (!isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
$setmirror = false;
|
||||
if (isset($this->_channelInfo['servers']['mirror'][0])) {
|
||||
foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
|
||||
if ($mirror == $mir['attribs']['host']) {
|
||||
$setmirror = &$this->_channelInfo['servers']['mirror'][$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
|
||||
$setmirror = &$this->_channelInfo['servers']['mirror'];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$setmirror) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
$set = array('attribs' => array('version' => $version), '_content' => $name);
|
||||
if (!isset($setmirror[$type]['function'])) {
|
||||
$setmirror[$type]['function'] = $set;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
} elseif (!isset($setmirror[$type]['function'][0])) {
|
||||
$setmirror[$type]['function'] = array($setmirror[$type]['function']);
|
||||
}
|
||||
|
||||
$setmirror[$type]['function'][] = $set;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string Resource Type this url links to
|
||||
* @param string URL
|
||||
* @param string|false mirror name, if this is not a primary server REST base URL
|
||||
*/
|
||||
function setBaseURL($resourceType, $url, $mirror = false)
|
||||
{
|
||||
if ($mirror) {
|
||||
if (!isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
|
||||
array('mirror' => $mirror));
|
||||
return false;
|
||||
}
|
||||
|
||||
$setmirror = false;
|
||||
if (isset($this->_channelInfo['servers']['mirror'][0])) {
|
||||
foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
|
||||
if ($mirror == $mir['attribs']['host']) {
|
||||
$setmirror = &$this->_channelInfo['servers']['mirror'][$i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
|
||||
$setmirror = &$this->_channelInfo['servers']['mirror'];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$setmirror = &$this->_channelInfo['servers']['primary'];
|
||||
}
|
||||
|
||||
$set = array('attribs' => array('type' => $resourceType), '_content' => $url);
|
||||
if (!isset($setmirror['rest'])) {
|
||||
$setmirror['rest'] = array();
|
||||
}
|
||||
|
||||
if (!isset($setmirror['rest']['baseurl'])) {
|
||||
$setmirror['rest']['baseurl'] = $set;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
} elseif (!isset($setmirror['rest']['baseurl'][0])) {
|
||||
$setmirror['rest']['baseurl'] = array($setmirror['rest']['baseurl']);
|
||||
}
|
||||
|
||||
foreach ($setmirror['rest']['baseurl'] as $i => $url) {
|
||||
if ($url['attribs']['type'] == $resourceType) {
|
||||
$this->_isValid = false;
|
||||
$setmirror['rest']['baseurl'][$i] = $set;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$setmirror['rest']['baseurl'][] = $set;
|
||||
$this->_isValid = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string mirror server
|
||||
* @param int mirror http port
|
||||
* @return boolean
|
||||
*/
|
||||
function addMirror($server, $port = null)
|
||||
{
|
||||
if ($this->_channelInfo['name'] == '__uri') {
|
||||
return false; // the __uri channel cannot have mirrors by definition
|
||||
}
|
||||
|
||||
$set = array('attribs' => array('host' => $server));
|
||||
if (is_numeric($port)) {
|
||||
$set['attribs']['port'] = $port;
|
||||
}
|
||||
|
||||
if (!isset($this->_channelInfo['servers']['mirror'])) {
|
||||
$this->_channelInfo['servers']['mirror'] = $set;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!isset($this->_channelInfo['servers']['mirror'][0])) {
|
||||
$this->_channelInfo['servers']['mirror'] =
|
||||
array($this->_channelInfo['servers']['mirror']);
|
||||
}
|
||||
|
||||
$this->_channelInfo['servers']['mirror'][] = $set;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the name of the validation package for this channel
|
||||
* @return string|false
|
||||
*/
|
||||
function getValidationPackage()
|
||||
{
|
||||
if (!$this->_isValid && !$this->validate()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($this->_channelInfo['validatepackage'])) {
|
||||
return array('attribs' => array('version' => 'default'),
|
||||
'_content' => 'PEAR_Validate');
|
||||
}
|
||||
|
||||
return $this->_channelInfo['validatepackage'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the object that can be used for custom validation
|
||||
* @param string|false the name of the package to validate. If the package is
|
||||
* the channel validation package, PEAR_Validate is returned
|
||||
* @return PEAR_Validate|false false is returned if the validation package
|
||||
* cannot be located
|
||||
*/
|
||||
function &getValidationObject($package = false)
|
||||
{
|
||||
if (!class_exists('PEAR_Validate')) {
|
||||
require_once 'PEAR/Validate.php';
|
||||
}
|
||||
|
||||
if (!$this->_isValid) {
|
||||
if (!$this->validate()) {
|
||||
$a = false;
|
||||
return $a;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($this->_channelInfo['validatepackage'])) {
|
||||
if ($package == $this->_channelInfo['validatepackage']) {
|
||||
// channel validation packages are always validated by PEAR_Validate
|
||||
$val = new PEAR_Validate;
|
||||
return $val;
|
||||
}
|
||||
|
||||
if (!class_exists(str_replace('.', '_',
|
||||
$this->_channelInfo['validatepackage']['_content']))) {
|
||||
if ($this->isIncludeable(str_replace('_', '/',
|
||||
$this->_channelInfo['validatepackage']['_content']) . '.php')) {
|
||||
include_once str_replace('_', '/',
|
||||
$this->_channelInfo['validatepackage']['_content']) . '.php';
|
||||
$vclass = str_replace('.', '_',
|
||||
$this->_channelInfo['validatepackage']['_content']);
|
||||
$val = new $vclass;
|
||||
} else {
|
||||
$a = false;
|
||||
return $a;
|
||||
}
|
||||
} else {
|
||||
$vclass = str_replace('.', '_',
|
||||
$this->_channelInfo['validatepackage']['_content']);
|
||||
$val = new $vclass;
|
||||
}
|
||||
} else {
|
||||
$val = new PEAR_Validate;
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
function isIncludeable($path)
|
||||
{
|
||||
$possibilities = explode(PATH_SEPARATOR, ini_get('include_path'));
|
||||
foreach ($possibilities as $dir) {
|
||||
if (file_exists($dir . DIRECTORY_SEPARATOR . $path)
|
||||
&& is_readable($dir . DIRECTORY_SEPARATOR . $path)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is used by the channel updater and retrieves a value set by
|
||||
* the registry, or the current time if it has not been set
|
||||
* @return string
|
||||
*/
|
||||
function lastModified()
|
||||
{
|
||||
if (isset($this->_channelInfo['_lastmodified'])) {
|
||||
return $this->_channelInfo['_lastmodified'];
|
||||
}
|
||||
|
||||
return time();
|
||||
}
|
||||
}
|
||||
67
vendor/pear-pear.php.net/PEAR/PEAR/ChannelFile/Parser.php
generated
vendored
Normal file
67
vendor/pear-pear.php.net/PEAR/PEAR/ChannelFile/Parser.php
generated
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
/**
|
||||
* PEAR_ChannelFile_Parser for parsing channel.xml
|
||||
*
|
||||
* 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
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since File available since Release 1.4.0a1
|
||||
*/
|
||||
|
||||
/**
|
||||
* base xml parser class
|
||||
*/
|
||||
require_once 'PEAR/XMLParser.php';
|
||||
require_once 'PEAR/ChannelFile.php';
|
||||
/**
|
||||
* Parser for channel.xml
|
||||
* @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.10.3
|
||||
* @link http://pear.php.net/package/PEAR
|
||||
* @since Class available since Release 1.4.0a1
|
||||
*/
|
||||
class PEAR_ChannelFile_Parser extends PEAR_XMLParser
|
||||
{
|
||||
var $_config;
|
||||
var $_logger;
|
||||
var $_registry;
|
||||
|
||||
function setConfig(&$c)
|
||||
{
|
||||
$this->_config = &$c;
|
||||
$this->_registry = &$c->getRegistry();
|
||||
}
|
||||