source: branches/1.2/workflow/inc/class.ResourcesRedirector.inc.php @ 1349

Revision 1349, 5.1 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

  • 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 'common.inc.php';
13
14/**
15 * Classe que redireciona requisições de arquivos da área resources dos processos
16 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
17 * @version 1.0
18 * @package Workflow
19 * @license http://www.gnu.org/copyleft/gpl.html GPL
20 */
21class ResourcesRedirector
22{
23        /**
24         * @var mixed $processInfo Informações sobre o processo (ou false se o processo não foi encontrado)
25         * @access private
26         */
27        private $processInfo;
28
29        /**
30         * @var string $file O nome do arquivo requisitado
31         * @access private
32         */
33        private $file;
34
35        /**
36         * @var int $pid O número do processo onde estão os arquivos
37         * @access private
38         */
39        private $pid;
40
41        /**
42         * Construtor da classe
43         * @return object
44         * @access public
45         */
46        public function ResourcesRedirector()
47        {
48                if (!isset($_SESSION['workflow']['ResourcesRedirector']))
49                        $_SESSION['workflow']['ResourcesRedirector'] = array(0 => 'workflow');
50
51                $this->pid = isset($_GET['pid']) ? (int) $_GET['pid'] : 0;
52                $this->file = $_GET['file'];
53                $this->processInfo = false;
54                if (!isset($_SESSION['workflow']['ResourcesRedirector'][$this->pid]))
55                {
56                        $result = $GLOBALS['workflow']['workflowObjects']->getDBGalaxia()->Link_ID->query('SELECT wf_normalized_name FROM egw_wf_processes WHERE wf_p_id = ?', array($this->pid));
57                        if ($result->numRows() != 1)
58                                return;
59                        $fields = $result->fetchRow();
60                        $_SESSION['workflow']['ResourcesRedirector'][$this->pid] = $fields['wf_normalized_name'];
61                }
62                $this->processInfo = $_SESSION['workflow']['ResourcesRedirector'][$this->pid];
63        }
64
65        /**
66         * Redireciona a requisição do arquivo contido no resources do processo para o devido lugar
67         * @return void
68         * @access public
69         */
70        public function redirect()
71        {
72                if ($this->processInfo == false)
73                        return;
74
75                /* encontra o diretório onde os arquivos estão armazenados */
76                $baseDirectory = '';
77                if (isset($_SESSION['workflow']['ResourcesRedirector']['baseDirectory']))
78                {
79                        $baseDirectory = $_SESSION['workflow']['ResourcesRedirector']['baseDirectory'];
80                }
81                else
82                {
83                        if (isset($_SESSION['phpgw_info']['workflow']['vfs_basedir']))
84                        {
85                                $baseDirectory = $_SESSION['phpgw_info']['workflow']['vfs_basedir'];
86                        }
87                        else
88                        {
89                                if (isset($_SESSION['phpgw_info']['expressomail']['server']['files_dir']))
90                                {
91                                        $baseDirectory = $_SESSION['phpgw_info']['expressomail']['server']['files_dir'];
92                                }
93                                else
94                                {
95                                        /* em último caso, tenta buscar a informação em banco de dados */
96                                        $result = $GLOBALS['workflow']['workflowObjects']->getDBExpresso()->Link_ID->query('SELECT config_value FROM phpgw_config WHERE config_app = ? AND config_name = ?', array('phpgwapi', 'files_dir'));
97                                        if (empty($result))
98                                                return;
99                                        $fields = $result->fetchRow();
100                                        $baseDirectory = $fields['config_value'];
101                                }
102                        }
103                        $_SESSION['workflow']['ResourcesRedirector']['baseDirectory'] = $baseDirectory;
104                }
105
106                if ($this->pid != 0)
107                        $filename = str_replace('//', '/', $baseDirectory . '/workflow/' . $this->processInfo . '/resources/' . $this->file);
108                else
109                        $filename = str_replace('//', '/', $baseDirectory . '/workflow/' . $this->processInfo . '/' . $this->file);
110
111                if (strpos($filename, '..') !== false)
112                        return;
113
114                $this->show($filename);
115        }
116
117        /**
118         * Serve o arquivo indicado (para o navegador)
119         * @param string $filename Caminho completo do arquivo
120         * @param string $mimeType O tipo mime do arquivo (se não for fornecido, tenta encontrar o tipo de mime a partir do arquivo)
121         * @return void
122         * @access public
123         */
124        public function show($filename, $mimeType = null)
125        {
126                if (!file_exists($filename))
127                        return;
128
129                /* pega o cabeçalho enviado pelo cliente */
130                $headers = apache_request_headers();
131
132                /* verifica se o cliente está validando seu cache e se ele está atualizado */
133                if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($filename)))
134                {
135                        /* o cache do cliente está atualizado. Apenas envia um 304 (Não modificado) */
136                        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($filename)).' GMT', true, 304);
137                }
138                else
139                {
140                        /* verifica se foi fornecido um tipo mime */
141                        if (is_null($mimeType))
142                                $mimeType = mime_content_type($filename);
143
144                        /* arquivo não está em cache ou o cache já expirou */
145                        header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($filename)).' GMT', true, 200);
146                        header('Content-Length: ' . filesize($filename));
147                        header('Content-Type: ' . $mimeType);
148                        header('Content-Disposition: filename="' . basename($filename) . '"');
149                        echo file_get_contents($filename);
150                }
151        }
152}
153?>
Note: See TracBrowser for help on using the repository browser.