1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28:
29: PHPWord_Shared_ZipStreamWrapper::register();
30:
31: 32: 33:
34: class PHPWord_Shared_ZipStreamWrapper
35: {
36: 37: 38: 39: 40:
41: private $_archive;
42:
43: 44: 45: 46: 47:
48: private $_fileNameInArchive = '';
49:
50: 51: 52: 53: 54:
55: private $_position = 0;
56:
57: 58: 59: 60: 61:
62: private $_data = '';
63:
64: 65: 66:
67: public static function register()
68: {
69: @stream_wrapper_unregister("zip");
70: @stream_wrapper_register("zip", __CLASS__);
71: }
72:
73: 74: 75:
76: public function stream_open($path, $mode, $options, &$opened_path)
77: {
78:
79: if ($mode{0} != 'r') {
80: throw new Exception('Mode ' . $mode . ' is not supported. Only read mode is supported.');
81: }
82:
83:
84: $url = @parse_url($path);
85:
86:
87: if (!is_array($url)) {
88: $url['host'] = substr($path, strlen('zip://'));
89: $url['path'] = '';
90: }
91: if (strpos($url['host'], '#') !== false) {
92: if (!isset($url['fragment'])) {
93: $url['fragment'] = substr($url['host'], strpos($url['host'], '#') + 1) . $url['path'];
94: $url['host'] = substr($url['host'], 0, strpos($url['host'], '#'));
95: unset($url['path']);
96: }
97: } else {
98: $url['host'] = $url['host'] . $url['path'];
99: unset($url['path']);
100: }
101:
102:
103: $this->_archive = new ZipArchive();
104: $this->_archive->open($url['host']);
105:
106: $this->_fileNameInArchive = $url['fragment'];
107: $this->_position = 0;
108: $this->_data = $this->_archive->getFromName($this->_fileNameInArchive);
109:
110: return true;
111: }
112:
113: 114: 115:
116: public function stream_stat()
117: {
118: return $this->_archive->statName($this->_fileNameInArchive);
119: }
120:
121: 122: 123:
124: function stream_read($count)
125: {
126: $ret = substr($this->_data, $this->_position, $count);
127: $this->_position += strlen($ret);
128: return $ret;
129: }
130:
131: 132: 133:
134: public function stream_tell()
135: {
136: return $this->_position;
137: }
138:
139: 140: 141:
142: public function stream_eof()
143: {
144: return $this->_position >= strlen($this->_data);
145: }
146:
147: 148: 149:
150: public function stream_seek($offset, $whence)
151: {
152: switch ($whence) {
153: case SEEK_SET:
154: if ($offset < strlen($this->_data) && $offset >= 0) {
155: $this->_position = $offset;
156: return true;
157: } else {
158: return false;
159: }
160: break;
161:
162: case SEEK_CUR:
163: if ($offset >= 0) {
164: $this->_position += $offset;
165: return true;
166: } else {
167: return false;
168: }
169: break;
170:
171: case SEEK_END:
172: if (strlen($this->_data) + $offset >= 0) {
173: $this->_position = strlen($this->_data) + $offset;
174: return true;
175: } else {
176: return false;
177: }
178: break;
179:
180: default:
181: return false;
182: }
183: }
184: }
185: