Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Wrapper.php « src « streams « icewind « 3rdparty « files_external « apps - github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: babd2c1a0b3f4d8983042ea7589aaa4a6e05a933 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
/**
 * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
 * This file is licensed under the Licensed under the MIT license:
 * http://opensource.org/licenses/MIT
 */

namespace Icewind\Streams;

/**
 * Base class for stream wrappers, wraps an existing stream
 *
 * This wrapper itself doesn't implement any functionality but is just a base class for other wrappers to extend
 */
abstract class Wrapper implements File, Directory {
	/**
	 * @var resource
	 */
	public $context;

	/**
	 * The wrapped stream
	 *
	 * @var resource
	 */
	protected $source;

	protected static function wrapSource($source, $context, $protocol, $class) {
		if (!is_resource($source)) {
			throw new \BadMethodCallException();
		}
		try {
			stream_wrapper_register($protocol, $class);
			if (self::isDirectoryHandle($source)) {
				$wrapped = opendir($protocol . '://', $context);
			} else {
				$wrapped = fopen($protocol . '://', 'r+', false, $context);
			}
		} catch (\BadMethodCallException $e) {
			stream_wrapper_unregister($protocol);
			throw $e;
		}
		stream_wrapper_unregister($protocol);
		return $wrapped;
	}

	protected static function isDirectoryHandle($resource) {
		$meta = stream_get_meta_data($resource);
		return $meta['stream_type'] == 'dir';
	}

	/**
	 * Load the source from the stream context and return the context options
	 *
	 * @param string $name
	 * @return array
	 * @throws \Exception
	 */
	protected function loadContext($name) {
		$context = stream_context_get_options($this->context);
		if (isset($context[$name])) {
			$context = $context[$name];
		} else {
			throw new \BadMethodCallException('Invalid context, "' . $name . '" options not set');
		}
		if (isset($context['source']) and is_resource($context['source'])) {
			$this->setSourceStream($context['source']);
		} else {
			throw new \BadMethodCallException('Invalid context, source not set');
		}
		return $context;
	}

	/**
	 * @param resource $source
	 */
	protected function setSourceStream($source) {
		$this->source = $source;
	}

	public function stream_seek($offset, $whence = SEEK_SET) {
		$result = fseek($this->source, $offset, $whence);
		return $result == 0 ? true : false;
	}

	public function stream_tell() {
		return ftell($this->source);
	}

	public function stream_read($count) {
		return fread($this->source, $count);
	}

	public function stream_write($data) {
		return fwrite($this->source, $data);
	}

	public function stream_set_option($option, $arg1, $arg2) {
		switch ($option) {
			case STREAM_OPTION_BLOCKING:
				stream_set_blocking($this->source, $arg1);
				break;
			case STREAM_OPTION_READ_TIMEOUT:
				stream_set_timeout($this->source, $arg1, $arg2);
				break;
			case STREAM_OPTION_WRITE_BUFFER:
				stream_set_write_buffer($this->source, $arg1);
		}
	}

	public function stream_truncate($size) {
		return ftruncate($this->source, $size);
	}

	public function stream_stat() {
		return fstat($this->source);
	}

	public function stream_lock($mode) {
		return flock($this->source, $mode);
	}

	public function stream_flush() {
		return fflush($this->source);
	}

	public function stream_eof() {
		return feof($this->source);
	}

	public function stream_close() {
		return fclose($this->source);
	}

	public function dir_readdir() {
		return readdir($this->source);
	}

	public function dir_closedir() {
		closedir($this->source);
		return true;
	}

	public function dir_rewinddir() {
		return rewind($this->source);
	}
}