]> source.dussan.org Git - nextcloud-server.git/commitdiff
add stream wrapper for in-memory files and dont use global variables for the fakedir...
authorRobin Appelman <icewind@owncloud.com>
Wed, 15 Feb 2012 19:19:48 +0000 (20:19 +0100)
committerRobin Appelman <icewind@owncloud.com>
Tue, 21 Feb 2012 19:48:48 +0000 (20:48 +0100)
apps/files_sharing/sharedstorage.php
lib/base.php
lib/fakedirstream.php [deleted file]
lib/streamwrappers.php [new file with mode: 0644]

index cb641e68a84e38e015b9c2de0d6f897b052756b7..07653fc11b5f2e666cf329266997bbd8c786ba1c 100644 (file)
@@ -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);
index 5b6ed9bcb1f0761acef0aafe1a64b4fd9ee2c86b..94e4907fed29f3c830106229db58c4e57061f64f 100644 (file)
@@ -279,7 +279,7 @@ if(!function_exists('get_temp_dir')) {
 
 OC::init();
 
-require_once('fakedirstream.php');
+require_once('streamwrappers.php');
 
 
 
diff --git a/lib/fakedirstream.php b/lib/fakedirstream.php
deleted file mode 100644 (file)
index fa3e64d..0000000
+++ /dev/null
@@ -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");
-
diff --git a/lib/streamwrappers.php b/lib/streamwrappers.php
new file mode 100644 (file)
index 0000000..1454a99
--- /dev/null
@@ -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');