Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 48 |
|
0.00% |
0 / 9 |
CRAP | |
0.00% |
0 / 1 |
UploadSourceAdapter | |
0.00% |
0 / 48 |
|
0.00% |
0 / 9 |
342 | |
0.00% |
0 / 1 |
registerSource | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
2 | |||
isSeekableSource | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
6 | |||
seekSource | |
0.00% |
0 / 3 |
|
0.00% |
0 / 1 |
6 | |||
stream_open | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
12 | |||
stream_read | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
42 | |||
stream_write | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
stream_tell | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
stream_eof | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
url_stat | |
0.00% |
0 / 15 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | /** |
3 | * MediaWiki page data importer. |
4 | * |
5 | * Copyright © 2003,2005 Brooke Vibber <bvibber@wikimedia.org> |
6 | * https://www.mediawiki.org/ |
7 | * |
8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. |
12 | * |
13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU General Public License along |
19 | * with this program; if not, write to the Free Software Foundation, Inc., |
20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
21 | * http://www.gnu.org/copyleft/gpl.html |
22 | * |
23 | * @file |
24 | * @ingroup SpecialPage |
25 | */ |
26 | |
27 | /** |
28 | * This is a horrible hack used to keep source compatibility. |
29 | * @ingroup SpecialPage |
30 | */ |
31 | class UploadSourceAdapter { |
32 | /** @var ImportSource[] */ |
33 | public static $sourceRegistrations = []; |
34 | |
35 | /** @var resource|null Must exists on stream wrapper class */ |
36 | public $context; |
37 | |
38 | /** @var ImportSource */ |
39 | private $mSource; |
40 | |
41 | /** @var string */ |
42 | private $mBuffer = ''; |
43 | |
44 | /** @var int */ |
45 | private $mPosition; |
46 | |
47 | /** |
48 | * @param ImportSource $source |
49 | * @return string |
50 | */ |
51 | public static function registerSource( ImportSource $source ) { |
52 | $id = wfRandomString(); |
53 | |
54 | self::$sourceRegistrations[$id] = $source; |
55 | |
56 | return $id; |
57 | } |
58 | |
59 | /** |
60 | * @param string $id |
61 | * @return bool |
62 | */ |
63 | public static function isSeekableSource( string $id ) { |
64 | if ( !isset( self::$sourceRegistrations[$id] ) ) { |
65 | return false; |
66 | } |
67 | return self::$sourceRegistrations[$id]->isSeekable(); |
68 | } |
69 | |
70 | /** |
71 | * @param string $id |
72 | * @param int $offset |
73 | * @return int|false |
74 | */ |
75 | public static function seekSource( string $id, int $offset ) { |
76 | if ( !isset( self::$sourceRegistrations[$id] ) ) { |
77 | return false; |
78 | } |
79 | return self::$sourceRegistrations[$id]->seek( $offset ); |
80 | } |
81 | |
82 | /** |
83 | * @param string $path |
84 | * @param string $mode |
85 | * @param int $options |
86 | * @param string &$opened_path |
87 | * @return bool |
88 | */ |
89 | public function stream_open( $path, $mode, $options, &$opened_path ) { |
90 | $url = parse_url( $path ); |
91 | if ( !isset( $url['host'] ) ) { |
92 | return false; |
93 | } |
94 | $id = $url['host']; |
95 | |
96 | if ( !isset( self::$sourceRegistrations[$id] ) ) { |
97 | return false; |
98 | } |
99 | |
100 | $this->mSource = self::$sourceRegistrations[$id]; |
101 | |
102 | return true; |
103 | } |
104 | |
105 | /** |
106 | * @param int $count |
107 | * @return string |
108 | */ |
109 | public function stream_read( $count ) { |
110 | $return = ''; |
111 | $leave = false; |
112 | |
113 | while ( !$leave && !$this->mSource->atEnd() && |
114 | strlen( $this->mBuffer ) < $count |
115 | ) { |
116 | $read = $this->mSource->readChunk(); |
117 | |
118 | if ( !strlen( $read ) ) { |
119 | $leave = true; |
120 | } |
121 | |
122 | $this->mBuffer .= $read; |
123 | } |
124 | |
125 | if ( strlen( $this->mBuffer ) ) { |
126 | $return = substr( $this->mBuffer, 0, $count ); |
127 | $this->mBuffer = substr( $this->mBuffer, $count ); |
128 | } |
129 | |
130 | $this->mPosition += strlen( $return ); |
131 | |
132 | return $return; |
133 | } |
134 | |
135 | /** |
136 | * @param string $data |
137 | * @return false |
138 | */ |
139 | public function stream_write( $data ) { |
140 | return false; |
141 | } |
142 | |
143 | /** |
144 | * @return int |
145 | */ |
146 | public function stream_tell() { |
147 | return $this->mPosition; |
148 | } |
149 | |
150 | /** |
151 | * @return bool |
152 | */ |
153 | public function stream_eof() { |
154 | return $this->mSource->atEnd(); |
155 | } |
156 | |
157 | /** |
158 | * @return int[] |
159 | */ |
160 | public function url_stat() { |
161 | $result = []; |
162 | |
163 | $result['dev'] = $result[0] = 0; |
164 | $result['ino'] = $result[1] = 0; |
165 | $result['mode'] = $result[2] = 0; |
166 | $result['nlink'] = $result[3] = 0; |
167 | $result['uid'] = $result[4] = 0; |
168 | $result['gid'] = $result[5] = 0; |
169 | $result['rdev'] = $result[6] = 0; |
170 | $result['size'] = $result[7] = 0; |
171 | $result['atime'] = $result[8] = 0; |
172 | $result['mtime'] = $result[9] = 0; |
173 | $result['ctime'] = $result[10] = 0; |
174 | $result['blksize'] = $result[11] = 0; |
175 | $result['blocks'] = $result[12] = 0; |
176 | |
177 | return $result; |
178 | } |
179 | } |