server/lib/files/stream/staticstream.php
2013-06-28 19:54:16 +02:00

156 lines
3.3 KiB
PHP

<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Files\Stream;
class StaticStream {
const MODE_FILE = 0100000;
public $context;
protected static $data = array();
protected $path = '';
protected $pointer = 0;
protected $writable = false;
public function stream_close() {
}
public function stream_eof() {
return $this->pointer >= strlen(self::$data[$this->path]);
}
public function stream_flush() {
}
public static function clear() {
self::$data = array();
}
public function stream_open($path, $mode, $options, &$opened_path) {
switch ($mode[0]) {
case 'r':
if (!isset(self::$data[$path])) return false;
$this->path = $path;
$this->writable = isset($mode[1]) && $mode[1] == '+';
break;
case 'w':
self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
break;
case 'a':
if (!isset(self::$data[$path])) self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
$this->pointer = strlen(self::$data[$path]);
break;
case 'x':
if (isset(self::$data[$path])) return false;
$this->path = $path;
$this->writable = true;
break;
case 'c':
if (!isset(self::$data[$path])) self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
break;
default:
return false;
}
$opened_path = $this->path;
return true;
}
public function stream_read($count) {
$bytes = min(strlen(self::$data[$this->path]) - $this->pointer, $count);
$data = substr(self::$data[$this->path], $this->pointer, $bytes);
$this->pointer += $bytes;
return $data;
}
public function stream_seek($offset, $whence = SEEK_SET) {
$len = strlen(self::$data[$this->path]);
switch ($whence) {
case SEEK_SET:
if ($offset <= $len) {
$this->pointer = $offset;
return true;
}
break;
case SEEK_CUR:
if ($this->pointer + $offset <= $len) {
$this->pointer += $offset;
return true;
}
break;
case SEEK_END:
if ($len + $offset <= $len) {
$this->pointer = $len + $offset;
return true;
}
break;
}
return false;
}
public function stream_stat() {
return $this->url_stat($this->path);
}
public function stream_tell() {
return $this->pointer;
}
public function stream_write($data) {
if (!$this->writable) return 0;
$size = strlen($data);
if ($this->stream_eof()) {
self::$data[$this->path] .= $data;
} else {
self::$data[$this->path] = substr_replace(
self::$data[$this->path],
$data,
$this->pointer
);
}
$this->pointer += $size;
return $size;
}
public function unlink($path) {
if (isset(self::$data[$path])) {
unset(self::$data[$path]);
}
return true;
}
public function url_stat($path) {
if (isset(self::$data[$path])) {
$size = strlen(self::$data[$path]);
$time = time();
$data = array(
'dev' => 0,
'ino' => 0,
'mode' => self::MODE_FILE | 0777,
'nlink' => 1,
'uid' => 0,
'gid' => 0,
'rdev' => '',
'size' => $size,
'atime' => $time,
'mtime' => $time,
'ctime' => $time,
'blksize' => -1,
'blocks' => -1,
);
return array_values($data) + $data;
}
return false;
}
}