2013-07-02 20:22:49 +04:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
|
|
|
|
* This file is licensed under the Affero General Public License version 3 or
|
|
|
|
* later.
|
|
|
|
* See the COPYING-README file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace OC\Files\Storage\Wrapper;
|
|
|
|
|
|
|
|
class Quota extends Wrapper {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var int $quota
|
|
|
|
*/
|
|
|
|
protected $quota;
|
|
|
|
|
2014-01-27 18:41:56 +04:00
|
|
|
/**
|
|
|
|
* @var string $freeSpaceRoot
|
|
|
|
*/
|
|
|
|
protected $sizeRoot;
|
|
|
|
|
2013-07-02 20:22:49 +04:00
|
|
|
/**
|
|
|
|
* @param array $parameters
|
|
|
|
*/
|
|
|
|
public function __construct($parameters) {
|
|
|
|
$this->storage = $parameters['storage'];
|
|
|
|
$this->quota = $parameters['quota'];
|
2014-01-27 18:41:56 +04:00
|
|
|
$this->freeSpaceRoot = isset($parameters['root']) ? $parameters['root'] : '';
|
2013-07-02 20:22:49 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function getSize($path) {
|
|
|
|
$cache = $this->getCache();
|
|
|
|
$data = $cache->get($path);
|
|
|
|
if (is_array($data) and isset($data['size'])) {
|
|
|
|
return $data['size'];
|
|
|
|
} else {
|
|
|
|
return \OC\Files\SPACE_NOT_COMPUTED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get free space as limited by the quota
|
|
|
|
*
|
|
|
|
* @param string $path
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
public function free_space($path) {
|
|
|
|
if ($this->quota < 0) {
|
|
|
|
return $this->storage->free_space($path);
|
|
|
|
} else {
|
2014-01-27 18:41:56 +04:00
|
|
|
$used = $this->getSize($this->freeSpaceRoot);
|
2013-07-02 20:22:49 +04:00
|
|
|
if ($used < 0) {
|
|
|
|
return \OC\Files\SPACE_NOT_COMPUTED;
|
|
|
|
} else {
|
|
|
|
$free = $this->storage->free_space($path);
|
2013-08-16 17:48:45 +04:00
|
|
|
return min($free, (max($this->quota - $used, 0)));
|
2013-07-02 20:22:49 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* see http://php.net/manual/en/function.file_put_contents.php
|
|
|
|
*
|
|
|
|
* @param string $path
|
|
|
|
* @param string $data
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function file_put_contents($path, $data) {
|
|
|
|
$free = $this->free_space('');
|
|
|
|
if ($free < 0 or strlen($data) < $free) {
|
|
|
|
return $this->storage->file_put_contents($path, $data);
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* see http://php.net/manual/en/function.copy.php
|
|
|
|
*
|
|
|
|
* @param string $source
|
|
|
|
* @param string $target
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function copy($source, $target) {
|
|
|
|
$free = $this->free_space('');
|
|
|
|
if ($free < 0 or $this->getSize($source) < $free) {
|
|
|
|
return $this->storage->copy($source, $target);
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* see http://php.net/manual/en/function.fopen.php
|
|
|
|
*
|
|
|
|
* @param string $path
|
|
|
|
* @param string $mode
|
|
|
|
* @return resource
|
|
|
|
*/
|
|
|
|
public function fopen($path, $mode) {
|
|
|
|
$source = $this->storage->fopen($path, $mode);
|
|
|
|
$free = $this->free_space('');
|
2014-01-19 21:49:51 +04:00
|
|
|
if ($source && $free >= 0 && $mode !== 'r' && $mode !== 'rb') {
|
2013-07-02 20:22:49 +04:00
|
|
|
return \OC\Files\Stream\Quota::wrap($source, $free);
|
|
|
|
} else {
|
|
|
|
return $source;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|