source: sandbox/workflow/branches/609/inc/class.bo_adminsource.inc.php @ 2311

Revision 2311, 19.4 KB checked in by pedroerp, 14 years ago (diff)

Ticket #609 - Migrando instanciação das classes da engine para a factory.

  • Property svn:executable set to *
Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                                   *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12require_once('class.bo_ajaxinterface.inc.php');
13
14require_once(GALAXIA_LIBRARY . SEP . 'src' . SEP . 'API' . SEP . 'Process.php');
15
16/**
17 * Invalid file name identifier
18 * @name INVALID_FILE_NAME
19 */
20define( INVALID_FILE_NAME   , 0 );
21/**
22 * Invalid process id identifier
23 * @name INVALID_PROCESS_ID
24 */
25define( INVALID_PROCESS_ID  , 1 );
26/**
27 * File already exists identifier
28 * @name FILE_ALREADY_EXISTS
29 */
30define( FILE_ALREADY_EXISTS , 2 );
31/**
32 * File created indentifier
33 * @name FILE_CREATED
34 */
35define( FILE_CREATED            , 3 );
36/**
37 * File not created identifier
38 * @name FILE_NOT_CREATED
39 */
40define( FILE_NOT_CREATED        , 4 );
41/**
42 * @package Workflow
43 * @license http://www.gnu.org/copyleft/gpl.html GPL
44 * @author Rodrigo Daniel C de Lira - rodrigo.lira@gmail.com
45 * @author Sidnei Augusto Drovetto Junior - drovetto@gmail.com
46 */
47class bo_adminsource extends bo_ajaxinterface
48{
49
50        /**
51        * @var array $public_functions Array of public functions
52        * @access public
53        */
54        var $public_functions = array('export_file' => true
55                                      );
56       
57        /**
58        * Construtor
59        *
60        * @access public
61        */     
62        function bo_adminsource() {
63                parent::bo_ajaxinterface();             
64                }
65       
66        /**
67        * Assign Unit To File Size
68        * @param integer $value value
69        * @return string file size
70        * @access public
71        */
72        function _assignUnitToFileSize($value)
73        {
74                $fileSizeUnit = array();
75                $fileSizeUnit[] = 'bytes';
76                $fileSizeUnit[] = 'Kb';
77                $fileSizeUnit[] = 'Mb';
78                $fileSizeUnit[] = 'Gb';
79
80                $unitSelect = 0;
81                while ($value > 1024.0)
82                {
83                        $value /= 1024.0;
84                        $unitSelect++;
85                }
86
87                $output = round($value, 1);
88                $output .= " " . $fileSizeUnit[$unitSelect];
89
90                return $output;
91        }
92
93        /**
94        * Get process toolbar data
95        * @param  array $p process process data
96        * @return array
97        * @access public
98        */
99        function get_toolbar_data($p)
100        {
101
102                $process_manager = &Factory::newInstance('ProcessManager');
103                $proc_info       = $process_manager->get_process($p['proc_id']);
104
105                $web_server_url  = $_SESSION['phpgw_info']['workflow']['server']['webserver_url'];
106                $img_default_dir = Factory::getInstance('TemplateServer')->generateImageLink('');
107
108                if ($proc_info['wf_is_valid'] == 'y')
109                {
110                        $dot_color = 'green';
111                        $alt_validity = tra('valid');
112                }
113                else
114                {
115                        $dot_color = 'red';
116                        $alt_validity = tra('invalid');
117                }
118
119                // if process is active show stop button. Else show start button, but only if it is valid. If it's not valid, don't show any activation or stop button.
120                if ($proc_info['wf_is_active'] == 'y')
121                {
122                        $start_stop_link = $web_server_url.'/index.php?menuaction=workflow.ui_adminactivities.form&p_id='. $proc_info['wf_p_id'] .'&deactivate_proc='. $proc_info['wf_p_id'];
123                        $start_stop_img  = $img_default_dir.'stop.gif';
124                        $start_stop_desc = 'Parar';
125                }
126                elseif ($proc_info['wf_is_valid'] == 'y')
127                {
128                        $start_stop_link = $web_server_url.'/index.php?menuaction=workflow.ui_adminactivities.form&p_id='. $proc_info['wf_p_id'] .'&activate_proc='. $proc_info['wf_p_id'];
129                        $start_stop_img  = $img_default_dir.'refresh2.gif';
130                        $start_stop_desc = 'Ativar';
131                }
132                else
133                {
134                        $start_stop_link = '';
135                        $start_stop_img  = '';
136                }
137
138                /* load other processes link */
139                $proc_ids = $GLOBALS['ajax']->acl->get_granted_processes($_SESSION['phpgw_info']['workflow']['account_id']);
140                if (count($proc_ids))
141                        $where = ' wf_p_id in ('. implode(',',$proc_ids) .') ';
142                else
143                        $where = ' wf_p_id = -1 ';
144
145                $processesInfo = &$process_manager->list_processes(0, -1, 'wf_name__asc', '', $where);
146                $otherProcesses = array();
147                foreach ($processesInfo['data'] as $pi)
148                        $otherProcesses[] = array("name" => $pi['wf_name'] . " (v" . $pi['wf_version'] . ")", "link" => $web_server_url . "/index.php?menuaction=workflow.ui_adminsource.form&p_id=" . $pi['wf_p_id'], "pid" => $pi['wf_p_id']);
149
150                $toolbar_data = array (
151                        'proc_name'                                     => $proc_info['wf_name'],
152                        'version'                                       => $proc_info['wf_version'],
153                        'img_validity'                          => $img_default_dir.$dot_color.'_dot.gif',
154                        'alt_validity'                          => $alt_validity,
155                        'start_stop_link'                       => $start_stop_link,
156                        'start_stop_img'                        => $start_stop_img,
157                        'start_stop_desc'                       => $start_stop_desc,
158                        'link_admin_activities'         => $web_server_url.'/index.php?menuaction=workflow.ui_adminactivities.form&p_id='. $proc_info['wf_p_id'],
159                        'img_activity'                          => $img_default_dir.'Activity.gif',
160                        'link_admin_jobs'               => $web_server_url.'/index.php?menuaction=workflow.ui_adminjobs.form&p_id='. $proc_info['wf_p_id'],
161                        'img_job'                               => $img_default_dir.'clock.png',
162                        'link_admin_processes'          => $web_server_url.'/index.php?menuaction=workflow.ui_adminprocesses.form&p_id='. $proc_info['wf_p_id'],
163                        'img_change'                            => $img_default_dir.'change.gif',
164                        'link_admin_shared_source'      => $web_server_url.'/index.php?menuaction=workflow.ui_adminsource.form&p_id='. $proc_info['wf_p_id'],
165                        'img_code'                                      => $img_default_dir.'code.gif',
166                        'link_admin_export'                     => $web_server_url.'/index.php?menuaction=workflow.WorkflowUtils.export&p_id='. $proc_info['wf_p_id'],
167                        'link_admin_roles'                      => $web_server_url.'/index.php?menuaction=workflow.ui_adminroles.form&p_id='. $proc_info['wf_p_id'],
168                        'img_roles'                                     => $img_default_dir.'roles.png',
169                        'link_graph'                            => $web_server_url.'/index.php?menuaction=workflow.ui_adminactivities.show_graph&p_id=' . $proc_info['wf_p_id'],
170                        'img_process'                           => $img_default_dir.'Process.gif',
171                        'link_save_process'                     => $web_server_url.'/index.php?menuaction=workflow.ui_adminprocesses.save_process&id='. $proc_info['wf_p_id'],
172                        'img_save'                                      => $img_default_dir.'save.png',
173                        'proc_id'                                       => $p['proc_id'],
174                        'other_processes'                       => $otherProcesses
175                );
176
177                return $toolbar_data;
178                }
179
180
181        /**
182        * Get process model files
183        * @param  array $p process process data
184        * @return array
185        * @access public
186        */
187        function get_model_files($p)
188        {
189                switch($p['type'])
190                {
191                        case 'include'  : $path = PHPGW_SERVER_ROOT . SEP . 'workflow' . SEP . 'js' . SEP . 'adminsource' . SEP . 'inc';
192                                                          break;
193                        case 'template' : $path = PHPGW_SERVER_ROOT . SEP . 'workflow' . SEP . 'js' . SEP . 'adminsource' . SEP . 'templates';
194                                                          break;
195                        case 'js'       : $path = PHPGW_SERVER_ROOT . SEP . 'workflow' . SEP . 'js' . SEP . 'local';
196                                                          break;
197                }
198
199                $col_file_name  = array();
200                $files          = array();
201
202                if ($handle = opendir($path))
203                {
204                        while (false !== ($file_name = readdir($handle)))
205                        {
206                                if (!is_dir($path.SEP.$file_name))
207                                {
208                                        $files[] = array('file_name'     => $file_name);
209                                        $col_file_name[]  = $file_name;
210                                }
211                        }
212                }
213
214                array_multisort($col_file_name,SORT_ASC,$files);
215
216                return $files;
217        }
218
219        /**
220        * Get process php files
221        * @param array $p process data
222        * @return array
223        * @access public
224        */
225        function get_php_files($p)
226        {
227                $process_manager    = &Factory::newInstance('ProcessManager');
228                $proc_info          = $process_manager->get_process($p['proc_id']);
229                $activity_manager   = &Factory::newInstance('ActivityManager');
230                $process_activities = $activity_manager->list_activities($p['proc_id'], 0, -1, 'wf_name__asc', '','',false);
231                $path = GALAXIA_PROCESSES . SEP . $proc_info['wf_normalized_name'] . SEP . 'code' . SEP .'activities' . SEP;
232
233                $files = array();
234
235                $col_file_name  = array();
236                $col_tamanho    = array();
237                $col_modificado = array();
238
239                foreach ($process_activities['data'] as $process_activity)
240                {
241
242                        $file_name   = $process_activity['wf_normalized_name'].'.php';
243                        $activity_id = $process_activity['wf_activity_id'];
244                        $tamanho     = filesize($path.$file_name);
245                        $modificado  = date('d/m/Y H:i:s', filemtime($path.$file_name) );
246
247                        $files[] = array('file_name'     => $file_name,
248                                                         'activity_id'   => $activity_id,
249                                                         'tamanho'           => $this->_assignUnitToFileSize($tamanho),
250                                                         'modificado'    => $modificado,
251                                                         'tipo_atividade'=> $process_activity['wf_type'],
252                                                         'interativa'    => $process_activity['wf_is_interactive'],
253                                                         'proc_name'     => $proc_info['wf_normalized_name'],
254                                                         'proc_id'               => $proc_info['wf_p_id'],
255                                                         'tipo_codigo'   => 'atividade'
256                        );
257
258                        $col_file_name[]  = $file_name;
259                        $col_tamanho[]    = $tamanho;
260                        $col_modificado[] = $modificado;
261                }
262
263                if (isset($p['sort']))
264                {
265                        $order_by = ($p['order_by'] == 1) ? SORT_ASC : SORT_DESC;
266
267                        switch ($p['sort'])
268                        {
269                                case 'file_name' :  array_multisort($col_file_name,$order_by,$files);
270                                                                        break;
271                                case 'tamanho'   :  array_multisort($col_tamanho,SORT_NUMERIC,$order_by,$files);
272                                                                        break;
273                                case 'modificado':  array_multisort($col_modificado,$order_by,$files);
274                                                                        break;
275
276                        }
277                }
278
279                return $files;
280        }
281
282        /**
283        * Delete process file
284        * @param array $p process data
285        * @return array
286        * @access public
287        */
288        function delete_file($p)
289        {
290                if ((strpos($p['file_name'],'/') !== false) || (strpos($p['file_name'],'/') !== false))
291                        return 'Não foi possível executar a operação solicitada';
292                $process_manager = &Factory::newInstance('ProcessManager');
293                $proc_info = $process_manager->get_process($p['proc_id']);
294                $file_name = $p['file_name'];
295                $proc_name = $proc_info['wf_normalized_name'];
296                $type      = $p['type'];
297                if (strpos($file_name,'/')) return 'Nome de arquivo inválido.';
298                if (!strlen($proc_name)) return 'ID de Processo inválido.';
299
300    switch($type)
301    {
302        case 'atividade':
303            $path =  'activities' . SEP . $file_name;
304            break;
305            case 'template':
306            $path =  'templates' . SEP . $file_name;
307            break;
308        case 'include':
309            $path = $file_name;
310            break;
311                case 'resource':
312                                $path = GALAXIA_PROCESSES . '/' . $proc_info['wf_normalized_name'] . '/resources/' . $file_name;
313            break;
314
315    }
316
317                if ($type == 'resource')
318                {
319                        $complete_path = $path;
320                }
321                else
322                {
323                        $complete_path = GALAXIA_PROCESSES . SEP . $proc_name . SEP . 'code' . SEP . $path;
324                }
325
326                if (file_exists($complete_path))
327                {
328                        if (unlink($complete_path))
329                        {
330                                return 'Arquivo '.$file_name.' excluido com sucesso.';
331                        }
332                        else
333                        {
334                                return 'Não foi possivel excluir o arquivo '.$file_name.'.';
335                        }
336    }
337                else
338                {
339                        return 'O arquivo '.$file_name.' não existe.';
340                }
341        }
342        /**
343        * Create process new file
344        * @param array $p process
345        * @return array
346        * @access public
347        */
348        function create_file($p)
349        {
350                $process_manager = &Factory::newInstance('ProcessManager');
351                $proc_info = $process_manager->get_process($p['proc_id']);
352                $file_name = $p['file_name'];
353                $proc_name = $proc_info['wf_normalized_name'];
354                $type      = $p['type'];
355
356                if ((strpos($file_name,'/') !== false) || (strpos($file_name,'/') !== false))
357                {
358                        return INVALID_FILE_NAME;
359                }
360
361                if (!strlen($proc_name))
362                {
363                        return INVALID_PROCESS_ID;
364                }
365
366                switch($type)
367                {
368                        case 'atividade':
369                                $path =  'activities' . SEP . $file_name;
370                                $complete_path = GALAXIA_PROCESSES . SEP . $proc_name . SEP . 'code' . SEP . $path;
371                                break;
372                        case 'template':
373                                $path =  'templates' . SEP . $file_name;
374                                $complete_path = GALAXIA_PROCESSES . SEP . $proc_name . SEP . 'code' . SEP . $path;
375                                break;
376                        case 'include':
377                                $path = $file_name;
378                                $complete_path = GALAXIA_PROCESSES . SEP . $proc_name . SEP . 'code' . SEP . $path;
379                                break;
380                        case 'resource':
381                                $complete_path = GALAXIA_PROCESSES . '/' . $proc_name . '/resources/' . $file_name;
382                                break;
383                }
384
385                if (file_exists($complete_path))
386                {
387                        if (!$p['rewrite'])
388                        {
389                                return FILE_ALREADY_EXISTS;
390                        } else {
391                                unlink($complete_path);
392                        }
393                }
394
395                if ($fp = fopen($complete_path, 'w'))
396                {
397                        $basepath = PHPGW_SERVER_ROOT.SEP.'workflow'.SEP.'js'.SEP.'adminsource';
398                        switch ($type)
399                        {
400                        case 'template':  $basepath = $basepath.SEP.'templates';
401                                break;
402                        case 'include' :  $basepath = $basepath.SEP.'inc';
403                                break;
404                        }
405
406                        if ($type == 'template' || $type == 'include')
407                        {
408                                if (file_exists($basepath.SEP.$p['modelo']))
409                                {
410                                        fwrite($fp,file_get_contents($basepath.SEP.$p['modelo']));
411                                }
412                        }
413
414                        fclose($fp);
415                        return FILE_CREATED;
416                }
417                else
418                {
419                        return FILE_NOT_CREATED;
420                }
421        }
422
423        /**
424        * Get process include files
425        * @param  array $p process
426        * @return array
427        * @access public
428        */
429        function get_include_files($p)
430        {
431                $process_manager    = &Factory::newInstance('ProcessManager');
432                $proc_info          = $process_manager->get_process($p['proc_id']);
433                $path = GALAXIA_PROCESSES . SEP . $proc_info['wf_normalized_name'] . SEP . 'code';
434
435
436                $col_file_name  = array();
437                $col_tamanho    = array();
438                $col_modificado = array();
439                $files          = array();
440
441                if ($handle = opendir($path))
442                {
443                        while (false !== ($file_name = readdir($handle)))
444                        {
445                                if (!is_dir($path.SEP.$file_name))
446                                {
447                                        $tamanho     = filesize($path.SEP.$file_name);
448                                        $modificado  = date('d/m/Y H:i:s', filemtime($path.SEP.$file_name) );
449
450                                        $files[] = array('file_name'     => $file_name,
451                                                         'tamanho'           => $this->_assignUnitToFileSize($tamanho),
452                                                         'modificado'    => $modificado,
453                                                         'proc_name'     => $proc_info['wf_normalized_name'],
454                                                         'proc_id'               => $proc_info['wf_p_id'],
455                                                         'tipo_codigo'   => 'include'
456                                        );
457
458                                        $col_file_name[]  = $file_name;
459                                        $col_tamanho[]    = $tamanho;
460                                        $col_modificado[] = $modificado;
461                                }
462                        }
463                }
464
465
466                if (isset($p['sort']))
467                {
468                        $order_by = ($p['order_by'] == 1) ? SORT_ASC : SORT_DESC;
469
470                        switch ($p['sort'])
471                        {
472                                case 'file_name' :  array_multisort($col_file_name,$order_by,$files);
473                                                                        break;
474                                case 'tamanho'   :  array_multisort($col_tamanho,SORT_NUMERIC,$order_by,$files);
475                                                                        break;
476                                case 'modificado':  array_multisort($col_modificado,$order_by,$files);
477                                                                        break;
478
479                        }
480                }
481
482                return $files;
483        }
484
485        /**
486        * Get process template files
487        * @param array $p process data
488        * @return array
489        * @access public
490        */
491        function get_template_files($p)
492        {
493                $process_manager    = &Factory::newInstance('ProcessManager');
494                $proc_info          = $process_manager->get_process($p['proc_id']);
495                $path = GALAXIA_PROCESSES . SEP . $proc_info['wf_normalized_name'] . SEP . 'code' . SEP .'templates';
496
497                $col_file_name  = array();
498                $col_tamanho    = array();
499                $col_modificado = array();
500
501                if ($handle = opendir($path))
502                {
503                        while (false !== ($file_name = readdir($handle)))
504                        {
505                                if (!is_dir($path.SEP.$file_name))
506                                {
507                                        $tamanho     = filesize($path.SEP.$file_name);
508                                        $modificado  = date('d/m/Y H:i:s', filemtime($path.SEP.$file_name) );
509
510                                        $files[] = array('file_name'     => $file_name,
511                                                         'tamanho'           => $this->_assignUnitToFileSize($tamanho),
512                                                         'modificado'    => $modificado,
513                                                         'proc_name'     => $proc_info['wf_normalized_name'],
514                                                         'proc_id'               => $proc_info['wf_p_id'],
515                                                         'tipo_codigo'   => 'template'
516                                        );
517
518                                        $col_file_name[]  = $file_name;
519                                        $col_tamanho[]    = $tamanho;
520                                        $col_modificado[] = $modificado;
521
522                                }
523                        }
524                }
525
526                if (isset($p['sort']))
527    {
528        $order_by = ($p['order_by'] == 1) ? SORT_ASC : SORT_DESC;
529
530        switch ($p['sort'])
531        {
532            case 'file_name' :  array_multisort($col_file_name,$order_by,$files);
533                                break;
534            case 'tamanho'   :  array_multisort($col_tamanho,SORT_NUMERIC,$order_by,$files);
535                                break;
536            case 'modificado':  array_multisort($col_modificado,$order_by,$files);
537                                break;
538
539        }
540    }
541
542                return $files;
543        }
544
545        /**
546        * Upload process resource
547        *
548        * @param array $p process
549        * @return array
550        * @access public
551        */
552        function upload_resource($p)
553        {
554                $process_manager = &Factory::newInstance('ProcessManager');
555                $proc_info = $process_manager->get_process($p['proc_id']);
556                $file_name = basename($_FILES['resource_file']['name']);
557
558                $base_path = GALAXIA_PROCESSES . '/' . $proc_info['wf_normalized_name'] . '/resources';
559                $path = $base_path . '/' . $file_name;
560
561
562                if (!strlen($file_name))
563                        return 'É necessário selecionar um arquivo.';
564
565                if (!is_dir($base_path))
566                        return 'A pasta de resources ainda não foi criada no servidor.';
567
568                if (file_exists($path))
569                        return 'O arquivo '.$file_name.' já existe no servidor.';
570
571                if (move_uploaded_file($_FILES['resource_file']['tmp_name'],$path))
572                        return 'Upload realizado com sucesso.';
573                else
574                        return 'Não foi possível realizar upload do arquivo '.$file_name.'.';
575        }
576
577        /**
578        * Export process file
579        *
580        * @access public
581        */
582        function export_file()
583        {
584                if (strpos($_REQUEST['file_name'],'/') !== false)
585                        return 'Não foi possível executar a operação solicitada';
586                $process_manager    = &Factory::newInstance('ProcessManager');
587                $proc_info          = $process_manager->get_process($_REQUEST['proc_id']);
588
589                $proc_name = $proc_info['wf_normalized_name'];
590                $file_name = $_REQUEST['file_name'];
591                $type      = $_REQUEST['type'];
592
593                switch($type)
594                {
595                        case 'atividade':
596                                $path =  'activities' . SEP . $file_name;
597                                break;
598                        case 'template':
599                                $path =  'templates' . SEP . $file_name;
600                                break;
601                        case 'resource':
602                                $path = 'resources' . SEP . $file_name;
603                                break;
604                        case 'include':
605                                $path = $file_name;
606                                break;
607                        default:
608                                exit;
609                }
610
611                if ($type == 'resource')
612                        $completePath = GALAXIA_PROCESSES . SEP . $proc_name . SEP . $path;
613                else
614                        $completePath = GALAXIA_PROCESSES . SEP . $proc_name . SEP . 'code' . SEP . $path;
615
616                Factory::getInstance('ResourcesRedirector')->show($completePath, 'application/force-download');
617                exit;
618        }
619
620        /**
621        * Get process resources files
622        *
623        * @param array $p process
624        * @return array
625        * @access public
626        */
627        function get_resource_files($p)
628        {
629                $process_manager    = &Factory::newInstance('ProcessManager');
630                $proc_info          = $process_manager->get_process($p['proc_id']);
631
632                $path       = GALAXIA_PROCESSES . '/' . $proc_info['wf_normalized_name'] . '/resources';
633
634                if (!is_dir($path))
635                        mkdir($path, 0770);
636
637                $col_file_name  = array();
638                $col_tamanho    = array();
639                $col_modificado = array();
640                $col_tipo               = array();
641
642                if ($handle = opendir($path))
643                {
644                        while (false !== ($file_name = readdir($handle)))
645                        {
646                                if (!is_dir($path.SEP.$file_name))
647                                {
648                                        $tipo        = mime_content_type($path.SEP.$file_name);
649                                        $tamanho     = filesize($path.SEP.$file_name);
650                                        $modificado  = date('d/m/Y H:i:s', filemtime($path.SEP.$file_name) );
651
652                                        $files[] = array(
653                                                         'file_name'     => $file_name,
654                                                         'proc_name'     => $proc_info['wf_normalized_name'],
655                                                         'proc_id'               => $proc_info['wf_p_id'],
656                                                         'tamanho'           => $this->_assignUnitToFileSize($tamanho),
657                                                         'tipo'              => $tipo,
658                                                         'modificado'    => $modificado,
659                                                         'tipo_arquivo'  => 'resource'
660                                        );
661
662                                        $col_file_name[]  = $file_name;
663                                        $col_tamanho[]    = $tamanho;
664                                        $col_modificado[] = $modificado;
665                                        $col_tipo[]       = $tipo;
666
667                                }
668                        }
669                }
670
671                if (isset($p['sort']))
672                {
673                        $order_by = ($p['order_by'] == 1) ? SORT_ASC : SORT_DESC;
674
675                        switch ($p['sort'])
676                        {
677                                case 'file_name' :  array_multisort($col_file_name,$order_by,$files);
678                                                                        break;
679                                case 'tamanho'   :  array_multisort($col_tamanho,SORT_NUMERIC,$order_by,$files);
680                                                                        break;
681                                case 'modificado':  array_multisort($col_modificado,$order_by,$files);
682                                                                        break;
683                                case 'tipo'      :  array_multisort($col_tipo,$order_by,$files);
684                                                                        break;
685
686                        }
687                }
688
689                return $files;
690        }
691
692}
693?>
Note: See TracBrowser for help on using the repository browser.