-
Notifications
You must be signed in to change notification settings - Fork 102
/
SeekableFileContent.php
136 lines (123 loc) · 2.97 KB
/
SeekableFileContent.php
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
<?php
/**
* This file is part of vfsStream.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @package org\bovigo\vfs
*/
namespace org\bovigo\vfs\content;
/**
* Default implementation for file contents based on simple strings.
*
* @since 1.3.0
*/
abstract class SeekableFileContent implements FileContent
{
/**
* current position within content
*
* @type int
*/
private $offset = 0;
/**
* reads the given amount of bytes from content
*
* @param int $count
* @return string
*/
public function read(int $count): string
{
$data = $this->doRead($this->offset, $count);
$this->offset += $count;
return $data;
}
/**
* actual reading of given byte count starting at given offset
*
* @param int $offset
* @param int $count
* @return string
*/
protected abstract function doRead(int $offset, int $count): string;
/**
* seeks to the given offset
*
* @param int $offset
* @param int $whence
* @return bool
*/
public function seek(int $offset, int $whence): bool
{
$newOffset = $this->offset;
switch ($whence) {
case SEEK_CUR:
$newOffset += $offset;
break;
case SEEK_END:
$newOffset = $this->size() + $offset;
break;
case SEEK_SET:
$newOffset = $offset;
break;
default:
return false;
}
if ($newOffset < 0) {
return false;
}
$this->offset = $newOffset;
return true;
}
/**
* checks whether pointer is at end of file
*
* @return bool
*/
public function eof(): bool
{
return $this->size() <= $this->offset;
}
/**
* writes an amount of data
*
* @param string $data
* @return amount of written bytes
*/
public function write(string $data): int
{
$dataLength = strlen($data);
$this->doWrite($data, $this->offset, $dataLength);
$this->offset += $dataLength;
return $dataLength;
}
/**
* actual writing of data with specified length at given offset
*
* @param string $data
* @param int $offset
* @param int $length
*/
protected abstract function doWrite(string $data, int $offset, int $length);
/**
* for backwards compatibility with vfsStreamFile::bytesRead()
*
* @return int
* @deprecated
*/
public function bytesRead(): int
{
return $this->offset;
}
/**
* for backwards compatibility with vfsStreamFile::readUntilEnd()
*
* @return string
* @deprecated
*/
public function readUntilEnd(): string
{
return substr($this->content(), $this->offset);
}
}