parent
581328fbc1
commit
b38aa771d1
@ -0,0 +1,323 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* ownCloud |
||||
* |
||||
* @author Frank Karlitschek |
||||
* @copyright 2010 Frank Karlitschek karlitschek@kde.org |
||||
* |
||||
* 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 Lesser General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
|
||||
class OC_FILESTORAGE_REMOTE extends OC_FILESTORAGE{ |
||||
private $url; |
||||
private $username; |
||||
private $password; |
||||
private $remote; |
||||
private $statCache; |
||||
private $statCacheDir=false; |
||||
private $changed=array(); |
||||
|
||||
private function cacheDir($dir){ |
||||
if($this->statCacheDir!=$dir or $this->statCacheDir===false){ |
||||
$this->statCache=$this->remote->getFiles($dir); |
||||
$keys=array_keys($this->statCache); |
||||
$this->statCacheDir=$dir; |
||||
} |
||||
} |
||||
|
||||
public function __construct($arguments){ |
||||
$this->url=$arguments['url']; |
||||
$this->username=$arguments['username']; |
||||
$this->password=$arguments['password']; |
||||
$this->remote=OC_CONNECT::connect($this->url,$this->username,$this->password); |
||||
} |
||||
public function mkdir($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$return=$this->remote->newFile($parent,$name,'dir'); |
||||
if($return){ |
||||
$this->notifyObservers($path,OC_FILEACTION_CREATE); |
||||
} |
||||
return $return; |
||||
} |
||||
public function rmdir($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$return=$this->remote->delete($parent,$name); |
||||
if($return){ |
||||
$this->notifyObservers($path,OC_FILEACTION_DELETE); |
||||
} |
||||
return $return; |
||||
} |
||||
public function opendir($path){ |
||||
$this->cacheDir($path); |
||||
$dirs=array_keys($this->statCache); |
||||
$id=uniqid(); |
||||
global $FAKEDIRS; |
||||
$FAKEDIRS[$id]=$dirs; |
||||
if($return=opendir("fakedir://$id")){ |
||||
$this->notifyObservers($path,OC_FILEACTION_READ); |
||||
} |
||||
return $return; |
||||
} |
||||
public function is_dir($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($path); |
||||
if($path=='' or $path=='/'){ |
||||
return true; |
||||
} |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return ($this->statCache[$name]['type'=='dir']); |
||||
} |
||||
public function is_file($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return ($this->statCache[$name]['type'!='dir']); |
||||
} |
||||
public function stat($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return $false; |
||||
} |
||||
return $this->statCache[$name]; |
||||
} |
||||
public function filetype($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['type']; |
||||
} |
||||
public function filesize($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return $false; |
||||
} |
||||
return $this->statCache[$name]['size']; |
||||
} |
||||
public function is_readable($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['readable']; |
||||
} |
||||
public function is_writeable($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['writeable']; |
||||
} |
||||
public function file_exists($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
return isset($this->statCache[$name]); |
||||
} |
||||
public function readfile($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$file=$this->remote->getFile($parent,$name); |
||||
readfile($file); |
||||
unlink($file); |
||||
} |
||||
public function filectime($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['ctime']; |
||||
} |
||||
public function filemtime($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['mtime']; |
||||
} |
||||
public function fileatime($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['atime']; |
||||
} |
||||
public function file_get_contents($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$file=$this->remote->getFile($parent,$name); |
||||
file_get_contents($file); |
||||
unlink($file); |
||||
} |
||||
public function file_put_contents($path,$data){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$file=$this->remote->getFile($parent,$name); |
||||
$file=tempnam(sys_get_temp_dir(),'oc_'); |
||||
file_put_contents($file,$data); |
||||
if($return=$this->remote->sendTmpFile($file,$parent,$name)){ |
||||
$this->notifyObservers($path,OC_FILEACTION_WRITE); |
||||
} |
||||
} |
||||
public function unlink($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
if($return=$this->remote->delete($paren,$name)){ |
||||
$this->notifyObservers($path,OC_FILEACTION_DELETE); |
||||
} |
||||
return $return; |
||||
} |
||||
public function rename($path1,$path2){ |
||||
$parent1=dirname($path1); |
||||
$name1=substr($path1,strlen($parent1)+1); |
||||
$parent2=dirname($path2); |
||||
$name2=substr($path2,strlen($parent2)+1); |
||||
if($return=$this->remote->move($parent1,$name1,$parent2,$name2)){ |
||||
$this->notifyObservers($path1.'->'.$path2,OC_FILEACTION_RENAME); |
||||
} |
||||
return $return; |
||||
} |
||||
public function copy($path1,$path2){ |
||||
$parent1=dirname($path1); |
||||
$name1=substr($path1,strlen($parent1)+1); |
||||
$parent2=dirname($path2); |
||||
$name2=substr($path2,strlen($parent2)+1); |
||||
if($return=$this->copy->rename($parent1,$name1,$parent2,$name2)){ |
||||
$this->notifyObservers($path1.'->'.$path2,OC_FILEACTION_RENAME); |
||||
} |
||||
return $return; |
||||
} |
||||
public function fopen($path,$mode){ |
||||
$changed=false; |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
$file=$this->remote->getFile($parent,$name); |
||||
if($return=fopen($file,$mode)){ |
||||
switch($mode){ |
||||
case 'r': |
||||
$this->notifyObservers($path,OC_FILEACTION_READ); |
||||
break; |
||||
case 'r+': |
||||
case 'w+': |
||||
case 'x+': |
||||
case 'a+': |
||||
$this->notifyObservers($path,OC_FILEACTION_READ | OC_FILEACTION_WRITE); |
||||
$this->changed[]=array('dir'=>$parent,'file'=>$name,'tmp'=>$file); |
||||
break; |
||||
case 'w': |
||||
case 'x': |
||||
case 'a': |
||||
$this->notifyObservers($path,OC_FILEACTION_WRITE); |
||||
$this->changed[]=array('dir'=>$parent,'file'=>$name,'tmp'=>$file); |
||||
break; |
||||
} |
||||
} |
||||
return $return; |
||||
} |
||||
|
||||
public function getMimeType($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
if(substr($name,0,1)=='/'){ |
||||
$name=substr($name,1); |
||||
} |
||||
$this->cacheDir($parent); |
||||
if(!isset($this->statCache[$name])){ |
||||
return false; |
||||
} |
||||
return $this->statCache[$name]['mime']; |
||||
} |
||||
|
||||
public function toTmpFile($path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
if(substr($name,0,1)=='/'){ |
||||
$name=substr($name,1); |
||||
} |
||||
$filename=$this->remote->getFile($parent,$name); |
||||
if($filename){ |
||||
$this->notifyObservers($path,OC_FILEACTION_READ); |
||||
return $filename; |
||||
}else{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public function fromTmpFile($tmpFile,$path){ |
||||
$parent=dirname($path); |
||||
$name=substr($path,strlen($parent)+1); |
||||
if($this->remote->sendTmpFile($tmpFile,$parent,$name)){ |
||||
$this->notifyObservers($path,OC_FILEACTION_CREATE); |
||||
return true; |
||||
}else{ |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
public function delTree($dir) { |
||||
$parent=dirname($dir); |
||||
$name=substr($dir,strlen($parent)+1); |
||||
$return=$this->remote->delete($parent,$name); |
||||
if($return=rmdir($dir)){ |
||||
$this->notifyObservers($dir,OC_FILEACTION_DELETE); |
||||
} |
||||
return $return; |
||||
} |
||||
|
||||
public function find($path){ |
||||
return $this->getTree($path); |
||||
} |
||||
|
||||
public function getTree($dir) { |
||||
if($return=$this->remote->getTree($dir)){ |
||||
$this->notifyObservers($dir,OC_FILEACTION_READ); |
||||
} |
||||
return $return; |
||||
} |
||||
|
||||
public function __destruct(){ |
||||
foreach($this->changed as $changed){ |
||||
$this->remote->sendTmpFile($changed['tmp'],$changed['dir'],$changed['file']); |
||||
} |
||||
} |
||||
} |
||||
|
||||
?> |
Loading…
Reference in new issue