From cef230c141897f587dd732860cca6568fd6edc2c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 27 Feb 2012 12:04:04 +0100 Subject: [PATCH] extend filestorage common and provide test implementation --- lib/filestorage/common.php | 122 +++++++++++++++++++++++++++ lib/filestorage/commontest.php | 75 ++++++++++++++++ lib/filestoragecommon.php | 75 ---------------- lib/filesystemview.php | 4 +- lib/helper.php | 17 ++++ tests/lib/filestorage/commontest.php | 41 +++++++++ 6 files changed, 257 insertions(+), 77 deletions(-) create mode 100644 lib/filestorage/common.php create mode 100644 lib/filestorage/commontest.php delete mode 100644 lib/filestoragecommon.php create mode 100644 tests/lib/filestorage/commontest.php diff --git a/lib/filestorage/common.php b/lib/filestorage/common.php new file mode 100644 index 0000000000..28c5e70041 --- /dev/null +++ b/lib/filestorage/common.php @@ -0,0 +1,122 @@ +. +*/ + +abstract class OC_Filestorage_Common extends OC_Filestorage { + + public function __construct($parameters){} +// abstract public function mkdir($path); +// abstract public function rmdir($path); +// abstract public function opendir($path); + public function is_dir($path){ + return $this->filetype($path)=='dir'; + } + public function is_file($path){ + return $this->filetype($path)=='file'; + } +// abstract public function stat($path); +// abstract public function filetype($path); + public function filesize($path) { + if($this->is_dir($path)){ + return 0;//by definition + }else{ + $stat = $this->stat($path); + return $stat['size']; + } + } +// abstract public function is_readable($path); +// abstract public function is_writable($path); +// abstract public function file_exists($path); + public function filectime($path) { + $stat = $this->stat($path); + return $stat['ctime']; + } + public function filemtime($path) { + $stat = $this->stat($path); + return $stat['mtime']; + } + public function fileatime($path) { + $stat = $this->stat($path); + return $stat['atime']; + } + public function file_get_contents($path) { + $handle = $this->fopen($path, "r"); + return fread($handle, $this->filesize($path)); + } + public function file_put_contents($path,$data) { + $handle = $this->fopen($path, "w"); + return fwrite($handle, $data); + } +// abstract public function unlink($path); + public function rename($path1,$path2){ + if($this->copy($path1,$path2)){ + return $this->unlink($path1); + }else{ + return false; + } + } + public function copy($path1,$path2) { + $source=$this->fopen($path1,'r'); + $target=$this->fopen($path2,'w'); + $count=OC_Helper::streamCopy($source,$target); + return $count>0; + } +// abstract public function fopen($path,$mode); + public function getMimeType($path){ + if(!$this->file_exists($path)){ + return false; + } + if($this->is_dir($path)){ + return 'httpd/unix-directory'; + } + $source=$this->fopen($path,'r'); + if(!$source){ + return false; + } + $head=fread($source,8192);//8kb should suffice to determine a mimetype + $tmpFile=tempnam(get_temp_dir(),'OC_TMP_').substr($path,strrpos($path,'.')); + file_put_contents($tmpFile,$head); + $mime=OC_Helper::getMimeType($tmpFile); + unlink($tmpFile); + return $mime; + } + public function hash($type,$path,$raw){ + $tmpFile=$this->getLocalFile(); + $hash=hash($type,$tmpFile,$raw); + unlink($tmpFile); + return $hash; + } +// abstract public function free_space($path); +// abstract public function search($query); + public function getLocalFile($path){ + return $this->getLocalFile(); + } + private function toTmpFile($path){//no longer in the storage api, still usefull here + $source=$this->fopen($path,'r'); + if(!$source){ + return false; + } + $tmpFile=tempnam(get_temp_dir(),'OC_TMP_').substr($path,strrpos($path,'.')); + $target=fopen($tmpFile); + $count=OC_Helper::streamCopy($source,$target); + return $tmpFile; + } +} diff --git a/lib/filestorage/commontest.php b/lib/filestorage/commontest.php new file mode 100644 index 0000000000..dd552c6865 --- /dev/null +++ b/lib/filestorage/commontest.php @@ -0,0 +1,75 @@ +. +* +*/ + +/** + * test implementation for OC_FileStorage_Common with OC_FileStorage_Local + */ + +class OC_Filestorage_CommonTest extends OC_Filestorage_Common{ + /** + * underlying local storage used for missing functions + * @var OC_FileStorage_Local + */ + private $storage; + + public function __construct($params){ + $this->storage=new OC_Filestorage_Local($params); + } + + public function mkdir($path){ + return $this->storage->mkdir($path); + } + public function rmdir($path){ + return $this->storage->rmdir($path); + } + public function opendir($path){ + return $this->storage->opendir($path); + } + public function stat($path){ + return $this->storage->stat($path); + } + public function filetype($path){ + return $this->storage->filetype($path); + } + public function is_readable($path){ + return $this->storage->is_readable($path); + } + public function is_writable($path){ + return $this->storage->is_writable($path); + } + public function file_exists($path){ + return $this->storage->file_exists($path); + } + public function unlink($path){ + return $this->storage->unlink($path); + } + public function fopen($path,$mode){ + return $this->storage->fopen($path,$mode); + } + public function free_space($path){ + return $this->storage->free_space($path); + } + public function search($query){ + return $this->storage->search($query); + } +} \ No newline at end of file diff --git a/lib/filestoragecommon.php b/lib/filestoragecommon.php deleted file mode 100644 index 45ad11fcde..0000000000 --- a/lib/filestoragecommon.php +++ /dev/null @@ -1,75 +0,0 @@ -. -*/ - -class OC_Filestorage_Common extends OC_Filestorage { - - public function __construct($parameters){} - public function mkdir($path){} - public function rmdir($path){} - public function opendir($path){} - public function is_dir($path){} - public function is_file($path){} - public function stat($path){} - public function filetype($path){} - public function filesize($path) { - $stat = $this->stat($path); - return $stat['size']; - } - public function is_readable($path){} - public function is_writable($path){} - public function file_exists($path){} - public function filectime($path) { - $stat = $this->stat($path); - return $stat['ctime']; - } - public function filemtime($path) { - $stat = $this->stat($path); - return $stat['mtime']; - } - public function fileatime($path) { - $stat = $this->stat($path); - return $stat['atime']; - } - public function file_get_contents($path) { - $handle = $this->fopen($path, "r"); - return fread($handle, $this->filesize($path)); - } - public function file_put_contents($path,$data) { - $handle = $this->fopen($path, "w"); - return fwrite($handle, $data); - } - public function unlink($path){} - public function rename($path1,$path2){} - public function copy($path1,$path2) { - $data = $this->file_get_contents($path1); - return $this->file_put_contents($path2, $data); - } - public function fopen($path,$mode){} - public function toTmpFile($path){} - public function fromTmpFile($tmpPath,$path){} - public function fromUploadedFile($tmpPath,$path){} - public function getMimeType($path){} - public function hash($type,$path,$raw){} - public function free_space($path){} - public function search($query){} - public function getLocalFile($path){} -} diff --git a/lib/filesystemview.php b/lib/filesystemview.php index 0c530677f5..9f0a88f8ab 100644 --- a/lib/filesystemview.php +++ b/lib/filesystemview.php @@ -329,7 +329,7 @@ class OC_FilesystemView { * @return mixed */ private function basicOperation($operation,$path,$hooks=array(),$extraParam=null){ - if(OC_FileProxy::runPreProxies($operation,$path, $extraParam) and OC_Filesystem::isValidPath($path) and $storage=$this->getStorage($path)){ + if(OC_FileProxy::runPreProxies($operation,$path, $extraParam) and OC_Filesystem::isValidPath($path)){ $interalPath=$this->getInternalPath($path); $run=true; if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()){ @@ -341,7 +341,7 @@ class OC_FilesystemView { } } } - if($run){ + if($run and $storage=$this->getStorage($path)){ if(!is_null($extraParam)){ $result=$storage->$operation($interalPath,$extraParam); }else{ diff --git a/lib/helper.php b/lib/helper.php index 60af4e376b..525a096947 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -398,4 +398,21 @@ class OC_Helper { } return false; } + + /** + * copy the contents of one stream to another + * @param resource source + * @param resource target + * @return int the number of bytes copied + */ + public static function streamCopy($source,$target){ + if(!$source or !$target){ + return false; + } + $count=0; + while(!feof($source)){ + $count+=fwrite($target,fread($source,8192)); + } + return $count; + } } diff --git a/tests/lib/filestorage/commontest.php b/tests/lib/filestorage/commontest.php new file mode 100644 index 0000000000..ab5375ec2b --- /dev/null +++ b/tests/lib/filestorage/commontest.php @@ -0,0 +1,41 @@ +. +* +*/ + +class Test_Filestorage_CommonTest extends Test_FileStorage { + /** + * @var string tmpDir + */ + private $tmpDir; + public function setUp(){ + $this->tmpDir=get_temp_dir().'/filestoragecommon'; + if(!file_exists($this->tmpDir)){ + mkdir($this->tmpDir); + } + $this->instance=new OC_Filestorage_CommonTest(array('datadir'=>$this->tmpDir)); + } + + public function tearDown(){ + OC_Helper::rmdirr($this->tmpDir); + } +} + +?> \ No newline at end of file