source: pro-violet-viettel/www/deploy/20150304/application/libraries/PHPExcel/Shared/ZipStreamWrapper.php @ 803

Last change on this file since 803 was 780, checked in by dungnv, 10 years ago
File size: 5.1 KB
Line 
1<?php
2/**
3 * PHPExcel
4 *
5 * Copyright (c) 2006 - 2014 PHPExcel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20 *
21 * @category   PHPExcel
22 * @package    PHPExcel_Shared
23 * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
25 * @version    1.8.0, 2014-03-02
26 */
27
28
29/**
30 * PHPExcel_Shared_ZipStreamWrapper
31 *
32 * @category   PHPExcel
33 * @package    PHPExcel_Shared
34 * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35 */
36class PHPExcel_Shared_ZipStreamWrapper {
37        /**
38         * Internal ZipAcrhive
39         *
40         * @var ZipAcrhive
41         */
42    private $_archive;
43
44    /**
45     * Filename in ZipAcrhive
46     *
47     * @var string
48     */
49    private $_fileNameInArchive = '';
50
51    /**
52     * Position in file
53     *
54     * @var int
55     */
56    private $_position = 0;
57
58    /**
59     * Data
60     *
61     * @var mixed
62     */
63    private $_data = '';
64
65    /**
66     * Register wrapper
67     */
68    public static function register() {
69                @stream_wrapper_unregister("zip");
70                @stream_wrapper_register("zip", __CLASS__);
71    }
72
73    /**
74         * Implements support for fopen().
75         *
76         * @param       string  $path                   resource name including scheme, e.g.
77         * @param       string  $mode                   only "r" is supported
78         * @param       int             $options                mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH
79         * @param       string  &$openedPath    absolute path of the opened stream (out parameter)
80         * @return      bool    true on success
81     */
82    public function stream_open($path, $mode, $options, &$opened_path) {
83        // Check for mode
84        if ($mode{0} != 'r') {
85            throw new PHPExcel_Reader_Exception('Mode ' . $mode . ' is not supported. Only read mode is supported.');
86        }
87
88                $pos = strrpos($path, '#');
89                $url['host'] = substr($path, 6, $pos - 6); // 6: strlen('zip://')
90                $url['fragment'] = substr($path, $pos + 1);
91
92        // Open archive
93        $this->_archive = new ZipArchive();
94        $this->_archive->open($url['host']);
95
96        $this->_fileNameInArchive = $url['fragment'];
97        $this->_position = 0;
98        $this->_data = $this->_archive->getFromName( $this->_fileNameInArchive );
99
100        return true;
101    }
102
103    /**
104         * Implements support for fstat().
105         *
106         * @return  boolean
107     */
108    public function statName() {
109        return $this->_fileNameInArchive;
110    }
111
112    /**
113         * Implements support for fstat().
114         *
115         * @return  boolean
116     */
117    public function url_stat() {
118        return $this->statName( $this->_fileNameInArchive );
119    }
120
121    /**
122         * Implements support for fstat().
123         *
124         * @return  boolean
125     */
126    public function stream_stat() {
127        return $this->_archive->statName( $this->_fileNameInArchive );
128    }
129
130    /**
131         * Implements support for fread(), fgets() etc.
132         *
133         * @param   int         $count  maximum number of bytes to read
134         * @return  string
135     */
136    function stream_read($count) {
137        $ret = substr($this->_data, $this->_position, $count);
138        $this->_position += strlen($ret);
139        return $ret;
140    }
141
142    /**
143         * Returns the position of the file pointer, i.e. its offset into the file
144         * stream. Implements support for ftell().
145         *
146         * @return  int
147     */
148    public function stream_tell() {
149        return $this->_position;
150    }
151
152    /**
153     * EOF stream
154         *
155         * @return      bool
156     */
157    public function stream_eof() {
158        return $this->_position >= strlen($this->_data);
159    }
160
161    /**
162     * Seek stream
163         *
164         * @param       int             $offset byte offset
165         * @param       int             $whence SEEK_SET, SEEK_CUR or SEEK_END
166         * @return      bool
167     */
168    public function stream_seek($offset, $whence) {
169        switch ($whence) {
170            case SEEK_SET:
171                if ($offset < strlen($this->_data) && $offset >= 0) {
172                     $this->_position = $offset;
173                     return true;
174                } else {
175                     return false;
176                }
177                break;
178
179            case SEEK_CUR:
180                if ($offset >= 0) {
181                     $this->_position += $offset;
182                     return true;
183                } else {
184                     return false;
185                }
186                break;
187
188            case SEEK_END:
189                if (strlen($this->_data) + $offset >= 0) {
190                     $this->_position = strlen($this->_data) + $offset;
191                     return true;
192                } else {
193                     return false;
194                }
195                break;
196
197            default:
198                return false;
199        }
200    }
201}
Note: See TracBrowser for help on using the repository browser.