Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
guesser.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\mimetype;
015
016 class guesser
017 {
018 /**
019 * @const Default priority for mimetype guessers
020 */
021 const PRIORITY_DEFAULT = 0;
022
023 /**
024 * @var array guessers
025 */
026 protected $guessers;
027
028 /**
029 * Construct a mimetype guesser object
030 *
031 * @param array $mimetype_guessers Mimetype guesser service collection
032 */
033 public function __construct($mimetype_guessers)
034 {
035 $this->register_guessers($mimetype_guessers);
036 }
037
038 /**
039 * Register MimeTypeGuessers and sort them by priority
040 *
041 * @param array $mimetype_guessers Mimetype guesser service collection
042 *
043 * @throws \LogicException If incorrect or not mimetype guessers have
044 * been supplied to class
045 */
046 protected function register_guessers($mimetype_guessers)
047 {
048 foreach ($mimetype_guessers as $guesser)
049 {
050 $is_supported = (method_exists($guesser, 'is_supported')) ? 'is_supported' : '';
051 $is_supported = (method_exists($guesser, 'isSupported')) ? 'isSupported' : $is_supported;
052
053 if (empty($is_supported))
054 {
055 throw new \LogicException('Incorrect mimetype guesser supplied.');
056 }
057
058 if ($guesser->$is_supported())
059 {
060 $this->guessers[] = $guesser;
061 }
062 }
063
064 if (empty($this->guessers))
065 {
066 throw new \LogicException('No mimetype guesser supplied.');
067 }
068
069 // Sort guessers by priority
070 usort($this->guessers, array($this, 'sort_priority'));
071 }
072
073 /**
074 * Sort the priority of supplied guessers
075 * This is a compare function for usort. A guesser with higher priority
076 * should be used first and vice versa. usort() orders the array values
077 * from low to high depending on what the comparison function returns
078 * to it. Return value should be smaller than 0 if value a is smaller
079 * than value b. This has been reversed in the comparision function in
080 * order to sort the guessers from high to low.
081 * Method has been set to public in order to allow proper testing.
082 *
083 * @param object $guesser_a Mimetype guesser a
084 * @param object $guesser_b Mimetype guesser b
085 *
086 * @return int If both guessers have the same priority 0, bigger
087 * than 0 if first guesser has lower priority, and lower
088 * than 0 if first guesser has higher priority
089 */
090 public function sort_priority($guesser_a, $guesser_b)
091 {
092 $priority_a = (int) (method_exists($guesser_a, 'get_priority')) ? $guesser_a->get_priority() : self::PRIORITY_DEFAULT;
093 $priority_b = (int) (method_exists($guesser_b, 'get_priority')) ? $guesser_b->get_priority() : self::PRIORITY_DEFAULT;
094
095 return $priority_b - $priority_a;
096 }
097
098 /**
099 * Guess mimetype of supplied file
100 *
101 * @param string $file Path to file
102 * @param string $file_name The real file name
103 *
104 * @return string Guess for mimetype of file
105 */
106 public function guess($file, $file_name = '')
107 {
108 if (!is_file($file))
109 {
110 return false;
111 }
112
113 if (!is_readable($file))
114 {
115 return false;
116 }
117
118 $mimetype = 'application/octet-stream';
119
120 foreach ($this->guessers as $guesser)
121 {
122 $mimetype_guess = $guesser->guess($file, $file_name);
123
124 $mimetype = $this->choose_mime_type($mimetype, $mimetype_guess);
125 }
126 // Return any mimetype if we got a result or the fallback value
127 return $mimetype;
128 }
129
130 /**
131 * Choose the best mime type based on the current mime type and the guess
132 * If a guesser returns nulls or application/octet-stream, we will keep
133 * the current guess. Guesses with a slash inside them will be favored over
134 * already existing ones. However, any guess that will pass the first check
135 * will always overwrite the default application/octet-stream.
136 *
137 * @param string $mime_type The current mime type
138 * @param string $guess The current mime type guess
139 *
140 * @return string The best mime type based on current mime type and guess
141 */
142 public function choose_mime_type($mime_type, $guess)
143 {
144 if ($guess === null || $guess == 'application/octet-stream')
145 {
146 return $mime_type;
147 }
148
149 if ($mime_type == 'application/octet-stream' || strpos($guess, '/') !== false)
150 {
151 $mime_type = $guess;
152 }
153
154 return $mime_type;
155 }
156 }
157