Subversion Repositories Applications.gtt

Rev

Rev 94 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
94 jpm 1
<?php
2
//
3
// +------------------------------------------------------------------------+
4
// | PEAR :: Package File Manager                                           |
5
// +------------------------------------------------------------------------+
6
// | Copyright (c) 2004 Gregory Beaver                                      |
7
// | Email         cellog@phpdoc.org                                        |
8
// +------------------------------------------------------------------------+
9
// | This source file is subject to version 3.00 of the PHP License,        |
10
// | that is available at http://www.php.net/license/3_0.txt.               |
11
// | If you did not receive a copy of the PHP license and are unable to     |
12
// | obtain it through the world-wide-web, please send a note to            |
13
// | license@php.net so we can mail you a copy immediately.                 |
14
// +------------------------------------------------------------------------+
15
// | Portions of this code based on phpDocumentor                           |
16
// | Web           http://www.phpdoc.org                                    |
17
// | Mirror        http://phpdocu.sourceforge.net/                          |
18
// +------------------------------------------------------------------------+
19
// $Id: SimpleGenerator.php,v 1.4 2005/05/20 22:42:59 cellog Exp $
20
//
21
 
22
require_once 'PEAR/PackageFile/Generator/v1.php';
23
/**
24
 * Class for XML output
25
 *
26
 * @author Greg Beaver <cellog@php.net>
27
 * @since 1.2.0
28
 * @copyright 2003
29
 * @package PEAR_PackageFileManager
30
 */
31
class PEAR_PackageFileManager_SimpleGenerator extends PEAR_PackageFile_Generator_v1
32
{
33
    var $_options;
34
 
35
    /**
36
     * remove a warning about missing parameters - don't delete this
37
     */
38
    function PEAR_PackageFileManager_SimpleGenerator()
39
    {
40
    }
41
 
42
    /**
43
     * @param array
44
     */
45
    function setPackageFileManagerOptions($opts)
46
    {
47
        $this->_options = $opts;
48
    }
49
 
50
    /**
51
     * Return an XML document based on the package info (as returned
52
     * by the PEAR_Common::infoFrom* methods).
53
     *
54
     * @param array  $pkginfo  package info
55
     *
56
     * @return string XML data
57
     *
58
     * @access public
59
     * @deprecated use a PEAR_PackageFile_v* object's generator instead
60
     */
61
    function xmlFromInfo($pkginfo)
62
    {
63
        include_once 'PEAR/PackageFile.php';
64
        include_once 'PEAR/Config.php';
65
        $config = &PEAR_Config::singleton();
66
        $packagefile = &new PEAR_PackageFile($config);
67
        $pf = &$packagefile->fromArray($pkginfo);
68
        parent::PEAR_PackageFile_Generator_v1($pf);
69
        return $this->toXml();
70
    }
71
 
72
    function getFileRoles()
73
    {
74
        return PEAR_Common::getFileRoles();
75
    }
76
 
77
    function getReplacementTypes()
78
    {
79
        return PEAR_Common::getReplacementTypes();
80
    }
81
 
82
    /**
83
     * Validate XML package definition file.
84
     *
85
     * @param  string $info Filename of the package archive or of the
86
     *                package definition file
87
     * @param  array $errors Array that will contain the errors
88
     * @param  array $warnings Array that will contain the warnings
89
     * @param  string $dir_prefix (optional) directory where source files
90
     *                may be found, or empty if they are not available
91
     * @access public
92
     * @return boolean
93
     * @deprecated use the validation of PEAR_PackageFile objects
94
     */
95
    function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '')
96
    {
97
        include_once 'PEAR/PackageFile.php';
98
        include_once 'PEAR/Config.php';
99
        $config = &PEAR_Config::singleton();
100
        $packagefile = &new PEAR_PackageFile($config);
101
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
102
        if (is_array($info)) {
103
            $pf = &$packagefile->fromArray($info);
104
            if (!$pf->validate(PEAR_VALIDATE_NORMAL)) {
105
                foreach ($pf->getValidationWarnings() as $err) {
106
                    if ($error['level'] == 'error') {
107
                        $errors[] = $error['message'];
108
                    } else {
109
                        $warnings[] = $error['message'];
110
                    }
111
                }
112
                return false;
113
            }
114
        } else {
115
            $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL);
116
        }
117
        PEAR::staticPopErrorHandling();
118
        if (PEAR::isError($pf)) {
119
            $errs = $pf->getUserinfo();
120
            if (is_array($errs)) {
121
                foreach ($errs as $error) {
122
                    if ($error['level'] == 'error') {
123
                        $errors[] = $error['message'];
124
                    } else {
125
                        $warnings[] = $error['message'];
126
                    }
127
                }
128
            }
129
            return false;
130
        }
131
        return true;
132
    }
133
 
134
    /**
135
     * @param array
136
     * @access protected
137
     */
138
    function recursiveXmlFilelist($list)
139
    {
140
        $this->_dirs = array();
141
        foreach ($list as $file => $attributes) {
142
            $this->_addDir($this->_dirs, explode('/', dirname($file)), $file, $attributes);
143
        }
144
        if (!isset($this->_dirs['dirs'])) {
145
            $this->_dirs['dirs'] = array();
146
        }
147
        if (count($this->_dirs['dirs']) != 1 || isset($this->_dirs['files'])) {
148
            $this->_dirs = array('dirs' => array('/' => $this->_dirs));
149
        }
150
        return $this->_formatDir($this->_dirs, '', '', true);
151
    }
152
 
153
    /**
154
     * @param array
155
     * @param array
156
     * @param string|null
157
     * @param array|null
158
     * @access private
159
     */
160
    function _addDir(&$dirs, $dir, $file = null, $attributes = null)
161
    {
162
        if ($dir == array() || $dir == array('.')) {
163
            $dirs['files'][basename($file)] = $attributes;
164
            return;
165
        }
166
        $curdir = array_shift($dir);
167
        if (!isset($dirs['dirs'][$curdir])) {
168
            $dirs['dirs'][$curdir] = array();
169
        }
170
        $this->_addDir($dirs['dirs'][$curdir], $dir, $file, $attributes);
171
    }
172
 
173
    /**
174
     * @param array
175
     * @param string
176
     * @param string
177
     * @access private
178
     */
179
    function _formatDir($dirs, $indent = '', $curdir = '', $toplevel = false)
180
    {
181
        $ret = '';
182
        if (!count($dirs)) {
183
            return '';
184
        }
185
        if (isset($dirs['dirs'])) {
186
            uksort($dirs['dirs'], 'strnatcasecmp');
187
            foreach ($dirs['dirs'] as $dir => $contents) {
188
                if ($dir == '/') {
189
                    $usedir = '/';
190
                } else {
191
                    if ($curdir == '/') {
192
                        $curdir = '';
193
                    }
194
                    $usedir = "$curdir/$dir";
195
                }
196
                $ret .= "$indent   <dir name=\"$dir\"";
197
                if ($toplevel) {
198
                    $ret .= ' baseinstalldir="' . $this->_options['baseinstalldir'] . '"';
199
                } else {
200
                    if (isset($this->_options['installexceptions'][$dir])) {
201
                        $ret .= ' baseinstalldir="' . $this->_options['installexceptions'][$dir] . '"';
202
                    }
203
                }
204
                $ret .= ">\n";
205
                $ret .= $this->_formatDir($contents, "$indent ", $usedir);
206
                $ret .= "$indent   </dir> <!-- $usedir -->\n";
207
            }
208
        }
209
        if (isset($dirs['files'])) {
210
            uksort($dirs['files'], 'strnatcasecmp');
211
            foreach ($dirs['files'] as $file => $attribs) {
212
                $ret .= $this->_formatFile($file, $attribs, $indent);
213
            }
214
        }
215
        return $ret;
216
    }
217
 
218
    /**
219
     * @param string
220
     * @param array
221
     * @param string
222
     * @access private
223
     */
224
    function _formatFile($file, $attributes, $indent)
225
    {
226
        $ret = "$indent   <file role=\"$attributes[role]\"";
227
        if (isset($this->_options['installexceptions'][$file])) {
228
            $ret .= ' baseinstalldir="' . $this->_options['installexceptions'][$file] . '"';
229
        }
230
        if (isset($attributes['md5sum'])) {
231
            $ret .= " md5sum=\"$attributes[md5sum]\"";
232
        }
233
        if (isset($attributes['platform'])) {
234
            $ret .= " platform=\"$attributes[platform]\"";
235
        }
236
        if (!empty($attributes['install-as'])) {
237
            $ret .= ' install-as="' .
238
                htmlspecialchars($attributes['install-as']) . '"';
239
        }
240
        $ret .= ' name="' . htmlspecialchars($file) . '"';
241
        if (empty($attributes['replacements'])) {
242
            $ret .= "/>\n";
243
        } else {
244
            $ret .= ">\n";
245
            foreach ($attributes['replacements'] as $r) {
246
                $ret .= "$indent    <replace";
247
                foreach ($r as $k => $v) {
248
                    $ret .= " $k=\"" . htmlspecialchars($v) .'"';
249
                }
250
                $ret .= "/>\n";
251
            }
252
            $ret .= "$indent   </file>\n";
253
        }
254
        return $ret;
255
    }
256
 
257
    /**
258
     * Generate the <filelist> tag
259
     * @access private
260
     * @return string
261
     */
262
    function _doFileList($indent, $filelist, $curdir)
263
    {
264
        $ret = '';
265
        foreach ($filelist as $file => $fa) {
266
            if (isset($fa['##files'])) {
267
                $ret .= "$indent      <dir";
268
            } else {
269
                $ret .= "$indent      <file";
270
            }
271
 
272
            if (isset($fa['role'])) {
273
                $ret .= " role=\"$fa[role]\"";
274
            }
275
            if (isset($fa['baseinstalldir'])) {
276
                $ret .= ' baseinstalldir="' .
277
                    htmlspecialchars($fa['baseinstalldir']) . '"';
278
            }
279
            if (isset($fa['md5sum'])) {
280
                $ret .= " md5sum=\"$fa[md5sum]\"";
281
            }
282
            if (isset($fa['platform'])) {
283
                $ret .= " platform=\"$fa[platform]\"";
284
            }
285
            if (!empty($fa['install-as'])) {
286
                $ret .= ' install-as="' .
287
                    htmlspecialchars($fa['install-as']) . '"';
288
            }
289
            $ret .= ' name="' . htmlspecialchars($file) . '"';
290
            if (isset($fa['##files'])) {
291
                $ret .= ">\n";
292
                $recurdir = $curdir;
293
                if ($recurdir == '///') {
294
                    $recurdir = '';
295
                }
296
                $ret .= $this->_doFileList("$indent ", $fa['##files'], $recurdir . $file . '/');
297
                $displaydir = $curdir;
298
                if ($displaydir == '///' || $displaydir == '/') {
299
                    $displaydir = '';
300
                }
301
                $ret .= "$indent      </dir> <!-- $displaydir$file -->\n";
302
            } else {
303
                if (empty($fa['replacements'])) {
304
                    $ret .= "/>\n";
305
                } else {
306
                    $ret .= ">\n";
307
                    foreach ($fa['replacements'] as $r) {
308
                        $ret .= "$indent        <replace";
309
                        foreach ($r as $k => $v) {
310
                            $ret .= " $k=\"" . htmlspecialchars($v) .'"';
311
                        }
312
                        $ret .= "/>\n";
313
                    }
314
                    $ret .= "$indent      </file>\n";
315
                }
316
            }
317
        }
318
        return $ret;
319
    }
320
 
321
}
322
 
323
?>