Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
UploadSourceAdapter
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 9
342
0.00% covered (danger)
0.00%
0 / 1
 registerSource
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 isSeekableSource
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 seekSource
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 stream_open
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 stream_read
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
42
 stream_write
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 stream_tell
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 stream_eof
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 url_stat
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
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 */
31class 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}