Passed
Push — master ( 59d8a6...6c91d3 )
by Robin
01:25
created

HashWrapper::updateHash()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * @copyright Copyright (c) 2019, Roeland Jago Douma <[email protected]>
4
 *
5
 * @author Roeland Jago Douma <[email protected]>
6
 *
7
 * @license GNU AGPL version 3 or any later version
8
 *
9
 * This program is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU Affero General Public License as
11
 * published by the Free Software Foundation, either version 3 of the
12
 * License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU Affero General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Affero General Public License
20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 */
23
24
namespace Icewind\Streams;
25
26
27
abstract class HashWrapper extends Wrapper {
28
29
	/**
30
	 * @var callable
31
	 */
32
	private $callback;
33
34
	/**
35
	 * @var resource
36
	 */
37
	private $hashContext;
38
39
	/**
40
	 * Wraps a stream to make it seekable
41
	 *
42
	 * @param resource $source
43
	 * @param string $hash
44
	 * @param callable $callback
45
	 * @return resource|bool
46
	 *
47
	 * @throws \BadMethodCallException
48
	 */
49
	public static function wrap($source, $hash, $callback) {
50
		$context = [
51
			'hash' => $hash,
52
			'callback' => $callback,
53
		];
54
		return self::wrapSource($source, $context);
55
	}
56
57
	public function dir_opendir($path, $options) {
58
		return false;
59
	}
60
61
	public function stream_open($path, $mode, $options, &$opened_path) {
62
		$context = $this->loadContext();
63
		$this->callback = $context['callback'];
64
		$this->hashContext = hash_init($context['hash']);
65
		return true;
66
	}
67
68
	protected function updateHash($data) {
69
		hash_update($this->hashContext, $data);
70
	}
71
72
	public function stream_close() {
73
		$hash = hash_final($this->hashContext);
74
		if ($this->hashContext !== false && is_callable($this->callback)) {
75
			call_user_func($this->callback, $hash);
76
		}
77
		return parent::stream_close();
78
	}
79
80
}