summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2012-03-02 18:42:23 +0100
committerRobin Appelman <icewind@owncloud.com>2012-03-02 18:42:57 +0100
commit48fe85d9bd7fc6a82f54d23befe06c2457b590bc (patch)
tree6c11c1433044c985db9f2b6fca347df63344eedf /lib
parente8afe4f1588ad5697b8ef6627417dfeb4a6c0573 (diff)
downloadnextcloud-server-48fe85d9bd7fc6a82f54d23befe06c2457b590bc.tar.gz
nextcloud-server-48fe85d9bd7fc6a82f54d23befe06c2457b590bc.zip
add streamwrapper that provides a callback on stream close
Diffstat (limited to 'lib')
-rw-r--r--lib/base.php1
-rw-r--r--lib/streamwrappers.php86
2 files changed, 87 insertions, 0 deletions
diff --git a/lib/base.php b/lib/base.php
index 336ff9fa231..4e24f9f44ac 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -148,6 +148,7 @@ class OC{
require_once('streamwrappers.php');
stream_wrapper_register("fakedir", "OC_FakeDirStream");
stream_wrapper_register('static', 'OC_StaticStreamWrapper');
+ stream_wrapper_register('close', 'OC_CloseStreamWrapper');
// calculate the documentroot
OC::$DOCUMENTROOT=realpath($_SERVER['DOCUMENT_ROOT']);
diff --git a/lib/streamwrappers.php b/lib/streamwrappers.php
index 05d5598819a..f1e0fa0e1d9 100644
--- a/lib/streamwrappers.php
+++ b/lib/streamwrappers.php
@@ -218,3 +218,89 @@ class OC_StaticStreamWrapper {
return false;
}
}
+
+/**
+ * stream wrapper that provides a callback on stream close
+ */
+class OC_CloseStreamWrapper{
+ public static $callBacks=array();
+ private $path='';
+ private $source;
+ private static $open=array();
+ public function stream_open($path, $mode, $options, &$opened_path){
+ $path=substr($path,strlen('close://'));
+ $this->path=$path;
+ $this->source=fopen($path,$mode);
+ if(is_resource($this->source)){
+ $this->meta=stream_get_meta_data($this->source);
+ }
+ self::$open[]=$path;
+ return is_resource($this->source);
+ }
+
+ public function stream_seek($offset, $whence=SEEK_SET){
+ fseek($this->source,$offset,$whence);
+ }
+
+ 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,$arg2);
+ }
+ }
+
+ public function stream_stat(){
+ return fstat($this->source);
+ }
+
+ public function stream_lock($mode){
+ flock($this->source,$mode);
+ }
+
+ public function stream_flush(){
+ return fflush($this->source);
+ }
+
+ public function stream_eof(){
+ return feof($this->source);
+ }
+
+ public function url_stat($path) {
+ $path=substr($path,strlen('close://'));
+ if(file_exists($path)){
+ return stat($path);
+ }else{
+ return false;
+ }
+ }
+
+ public function stream_close(){
+ fclose($this->source);
+ if(isset(self::$callBacks[$this->path])){
+ call_user_func(self::$callBacks[$this->path],$this->path);
+ }
+ }
+
+ public function unlink($path){
+ $path=substr($path,strlen('close://'));
+ return unlink($path);
+ }
+}