]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/filerepo/file/UnregisteredLocalFile.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / includes / filerepo / file / UnregisteredLocalFile.php
1 <?php
2 /**
3  * File without associated database record.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  * http://www.gnu.org/copyleft/gpl.html
19  *
20  * @file
21  * @ingroup FileAbstraction
22  */
23
24 /**
25  * A file object referring to either a standalone local file, or a file in a
26  * local repository with no database, for example an FileRepo repository.
27  *
28  * Read-only.
29  *
30  * @todo Currently it doesn't really work in the repository role, there are
31  * lots of functions missing. It is used by the WebStore extension in the
32  * standalone role.
33  *
34  * @ingroup FileAbstraction
35  */
36 class UnregisteredLocalFile extends File {
37         /** @var Title */
38         protected $title;
39
40         /** @var string */
41         protected $path;
42
43         /** @var bool|string */
44         protected $mime;
45
46         /** @var array Dimension data */
47         protected $dims;
48
49         /** @var bool|string Handler-specific metadata which will be saved in the img_metadata field */
50         protected $metadata;
51
52         /** @var MediaHandler */
53         public $handler;
54
55         /**
56          * @param string $path Storage path
57          * @param string $mime
58          * @return UnregisteredLocalFile
59          */
60         static function newFromPath( $path, $mime ) {
61                 return new self( false, false, $path, $mime );
62         }
63
64         /**
65          * @param Title $title
66          * @param FileRepo $repo
67          * @return UnregisteredLocalFile
68          */
69         static function newFromTitle( $title, $repo ) {
70                 return new self( $title, $repo, false, false );
71         }
72
73         /**
74          * Create an UnregisteredLocalFile based on a path or a (title,repo) pair.
75          * A FileRepo object is not required here, unlike most other File classes.
76          *
77          * @throws MWException
78          * @param Title|bool $title
79          * @param FileRepo|bool $repo
80          * @param string|bool $path
81          * @param string|bool $mime
82          */
83         function __construct( $title = false, $repo = false, $path = false, $mime = false ) {
84                 if ( !( $title && $repo ) && !$path ) {
85                         throw new MWException( __METHOD__ .
86                                 ': not enough parameters, must specify title and repo, or a full path' );
87                 }
88                 if ( $title instanceof Title ) {
89                         $this->title = File::normalizeTitle( $title, 'exception' );
90                         $this->name = $repo->getNameFromTitle( $title );
91                 } else {
92                         $this->name = basename( $path );
93                         $this->title = File::normalizeTitle( $this->name, 'exception' );
94                 }
95                 $this->repo = $repo;
96                 if ( $path ) {
97                         $this->path = $path;
98                 } else {
99                         $this->assertRepoDefined();
100                         $this->path = $repo->getRootDirectory() . '/' .
101                                 $repo->getHashPath( $this->name ) . $this->name;
102                 }
103                 if ( $mime ) {
104                         $this->mime = $mime;
105                 }
106                 $this->dims = [];
107         }
108
109         /**
110          * @param int $page
111          * @return bool
112          */
113         private function cachePageDimensions( $page = 1 ) {
114                 $page = (int)$page;
115                 if ( $page < 1 ) {
116                         $page = 1;
117                 }
118
119                 if ( !isset( $this->dims[$page] ) ) {
120                         if ( !$this->getHandler() ) {
121                                 return false;
122                         }
123                         $this->dims[$page] = $this->handler->getPageDimensions( $this, $page );
124                 }
125
126                 return $this->dims[$page];
127         }
128
129         /**
130          * @param int $page
131          * @return int
132          */
133         function getWidth( $page = 1 ) {
134                 $dim = $this->cachePageDimensions( $page );
135
136                 return $dim['width'];
137         }
138
139         /**
140          * @param int $page
141          * @return int
142          */
143         function getHeight( $page = 1 ) {
144                 $dim = $this->cachePageDimensions( $page );
145
146                 return $dim['height'];
147         }
148
149         /**
150          * @return bool|string
151          */
152         function getMimeType() {
153                 if ( !isset( $this->mime ) ) {
154                         $magic = MimeMagic::singleton();
155                         $this->mime = $magic->guessMimeType( $this->getLocalRefPath() );
156                 }
157
158                 return $this->mime;
159         }
160
161         /**
162          * @param string $filename
163          * @return array|bool
164          */
165         function getImageSize( $filename ) {
166                 if ( !$this->getHandler() ) {
167                         return false;
168                 }
169
170                 return $this->handler->getImageSize( $this, $this->getLocalRefPath() );
171         }
172
173         /**
174          * @return int
175          */
176         function getBitDepth() {
177                 $gis = $this->getImageSize( $this->getLocalRefPath() );
178
179                 if ( !$gis || !isset( $gis['bits'] ) ) {
180                         return 0;
181                 }
182                 return $gis['bits'];
183         }
184
185         /**
186          * @return bool
187          */
188         function getMetadata() {
189                 if ( !isset( $this->metadata ) ) {
190                         if ( !$this->getHandler() ) {
191                                 $this->metadata = false;
192                         } else {
193                                 $this->metadata = $this->handler->getMetadata( $this, $this->getLocalRefPath() );
194                         }
195                 }
196
197                 return $this->metadata;
198         }
199
200         /**
201          * @return bool|string
202          */
203         function getURL() {
204                 if ( $this->repo ) {
205                         return $this->repo->getZoneUrl( 'public' ) . '/' .
206                                 $this->repo->getHashPath( $this->name ) . rawurlencode( $this->name );
207                 } else {
208                         return false;
209                 }
210         }
211
212         /**
213          * @return bool|int
214          */
215         function getSize() {
216                 $this->assertRepoDefined();
217
218                 return $this->repo->getFileSize( $this->path );
219         }
220
221         /**
222          * Optimize getLocalRefPath() by using an existing local reference.
223          * The file at the path of $fsFile should not be deleted (or at least
224          * not until the end of the request). This is mostly a performance hack.
225          *
226          * @param FSFile $fsFile
227          * @return void
228          */
229         public function setLocalReference( FSFile $fsFile ) {
230                 $this->fsFile = $fsFile;
231         }
232 }