add stream wrapper for in-memory files and dont use global variables for the fakedir stream wrapper
This commit is contained in:
parent
c121a1a1e7
commit
325858e9e2
|
@ -79,7 +79,6 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
if ($path == "" || $path == "/") {
|
||||
$path = $this->datadir.$path;
|
||||
$sharedItems = OC_Share::getItemsInFolder($path);
|
||||
global $FAKEDIRS;
|
||||
$files = array();
|
||||
foreach ($sharedItems as $item) {
|
||||
// If item is in the root of the shared storage provider and the item exists add it to the fakedirs
|
||||
|
@ -87,7 +86,7 @@ class OC_Filestorage_Shared extends OC_Filestorage {
|
|||
$files[] = basename($item['target']);
|
||||
}
|
||||
}
|
||||
$FAKEDIRS['shared'] = $files;
|
||||
OC_FakeDirStream::$dirs['shared']=$files;
|
||||
return opendir('fakedir://shared');
|
||||
} else {
|
||||
$source = $this->getSource($path);
|
||||
|
|
|
@ -279,7 +279,7 @@ if(!function_exists('get_temp_dir')) {
|
|||
|
||||
OC::init();
|
||||
|
||||
require_once('fakedirstream.php');
|
||||
require_once('streamwrappers.php');
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
<?php
|
||||
global $FAKEDIRS;
|
||||
$FAKEDIRS=array();
|
||||
|
||||
class fakeDirStream{
|
||||
private $name;
|
||||
private $data;
|
||||
private $index;
|
||||
|
||||
public function dir_opendir($path,$options){
|
||||
global $FAKEDIRS;
|
||||
$url=parse_url($path);
|
||||
$this->name=substr($path,strlen('fakedir://'));
|
||||
$this->index=0;
|
||||
if(isset($FAKEDIRS[$this->name])){
|
||||
$this->data=$FAKEDIRS[$this->name];
|
||||
}else{
|
||||
$this->data=array();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function dir_readdir(){
|
||||
if($this->index>=count($this->data)){
|
||||
return false;
|
||||
}
|
||||
$filename=$this->data[$this->index];
|
||||
$this->index++;
|
||||
return $filename;
|
||||
}
|
||||
|
||||
public function dir_closedir() {
|
||||
$this->data=false;
|
||||
$this->name='';
|
||||
return true;
|
||||
}
|
||||
|
||||
public function dir_rewinddir() {
|
||||
$this->index=0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
stream_wrapper_register("fakedir", "fakeDirStream");
|
||||
|
|
@ -0,0 +1,223 @@
|
|||
<?php
|
||||
global $FAKEDIRS;
|
||||
$FAKEDIRS=array();
|
||||
|
||||
class OC_FakeDirStream{
|
||||
public static $dirs=array();
|
||||
private $name;
|
||||
private $index;
|
||||
|
||||
public function dir_opendir($path,$options){
|
||||
global $FAKEDIRS;
|
||||
$url=parse_url($path);
|
||||
$this->name=substr($path,strlen('fakedir://'));
|
||||
$this->index=0;
|
||||
if(!isset(self::$dirs[$this->name])){
|
||||
self::$dirs[$this->name]=array();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function dir_readdir(){
|
||||
if($this->index>=count(self::$dirs[$this->name])){
|
||||
return false;
|
||||
}
|
||||
$filename=self::$dirs[$this->name][$this->index];
|
||||
$this->index++;
|
||||
return $filename;
|
||||
}
|
||||
|
||||
public function dir_closedir() {
|
||||
$this->name='';
|
||||
return true;
|
||||
}
|
||||
|
||||
public function dir_rewinddir() {
|
||||
$this->index=0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class OC_StaticStreamWrapper {
|
||||
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 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() {
|
||||
$size = strlen(self::$data[$this->path]);
|
||||
$time = time();
|
||||
return array(
|
||||
0 => 0,
|
||||
'dev' => 0,
|
||||
1 => 0,
|
||||
'ino' => 0,
|
||||
2 => 0777,
|
||||
'mode' => 0777,
|
||||
3 => 1,
|
||||
'nlink' => 1,
|
||||
4 => 0,
|
||||
'uid' => 0,
|
||||
5 => 0,
|
||||
'gid' => 0,
|
||||
6 => '',
|
||||
'rdev' => '',
|
||||
7 => $size,
|
||||
'size' => $size,
|
||||
8 => $time,
|
||||
'atime' => $time,
|
||||
9 => $time,
|
||||
'mtime' => $time,
|
||||
10 => $time,
|
||||
'ctime' => $time,
|
||||
11 => -1,
|
||||
'blksize' => -1,
|
||||
12 => -1,
|
||||
'blocks' => -1,
|
||||
);
|
||||
}
|
||||
|
||||
public function stream_tell() {
|
||||
return $this->pointer;
|
||||
}
|
||||
|
||||
public function stream_write($data) {
|
||||
if (!$this->writable) return 0;
|
||||
$size = strlen($data);
|
||||
$len = strlen(self::$data[$this->path]);
|
||||
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();
|
||||
return array(
|
||||
0 => 0,
|
||||
'dev' => 0,
|
||||
1 => 0,
|
||||
'ino' => 0,
|
||||
2 => 0777,
|
||||
'mode' => 0777,
|
||||
3 => 1,
|
||||
'nlink' => 1,
|
||||
4 => 0,
|
||||
'uid' => 0,
|
||||
5 => 0,
|
||||
'gid' => 0,
|
||||
6 => '',
|
||||
'rdev' => '',
|
||||
7 => $size,
|
||||
'size' => $size,
|
||||
8 => $time,
|
||||
'atime' => $time,
|
||||
9 => $time,
|
||||
'mtime' => $time,
|
||||
10 => $time,
|
||||
'ctime' => $time,
|
||||
11 => -1,
|
||||
'blksize' => -1,
|
||||
12 => -1,
|
||||
'blocks' => -1,
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
stream_wrapper_register("fakedir", "OC_FakeDirStream");
|
||||
stream_wrapper_register('static', 'OC_StaticStreamWrapper');
|
Loading…
Reference in New Issue