From cef230c141897f587dd732860cca6568fd6edc2c Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
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 @@
+<?php
+
+/**
+* ownCloud
+*
+* @author Michael Gapczynski
+* @copyright 2012 Michael Gapczynski GapczynskiM@gmail.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+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 @@
+<?php
+
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * 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 @@
-<?php
-
-/**
-* ownCloud
-*
-* @author Michael Gapczynski
-* @copyright 2012 Michael Gapczynski GapczynskiM@gmail.com
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-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 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+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
-- 
GitLab