2013-07-02 16:22:49 +00: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 14:41:56 +00:00
|
|
|
/**
|
2014-01-27 15:00:10 +00:00
|
|
|
* @var string $sizeRoot
|
2014-01-27 14:41:56 +00:00
|
|
|
*/
|
|
|
|
protected $sizeRoot;
|
|
|
|
|
2013-07-02 16:22:49 +00:00
|
|
|
/**
|
|
|
|
* @param array $parameters
|
|
|
|
*/
|
|
|
|
public function __construct($parameters) {
|
|
|
|
$this->storage = $parameters['storage'];
|
|
|
|
$this->quota = $parameters['quota'];
|
2014-01-27 15:26:54 +00:00
|
|
|
$this->sizeRoot = isset($parameters['root']) ? $parameters['root'] : '';
|
2013-07-02 16:22:49 +00:00
|
|
|
}
|
|
|
|
|
2014-03-10 14:19:18 +00:00
|
|
|
/**
|
2014-05-11 20:51:30 +00:00
|
|
|
* @return int quota value
|
2014-03-10 14:19:18 +00:00
|
|
|
*/
|
|
|
|
public function getQuota() {
|
|
|
|
return $this->quota;
|
|
|
|
}
|
|
|
|
|
2014-02-06 15:30:58 +00:00
|
|
|
/**
|
|
|
|
* @param string $path
|
|
|
|
*/
|
2013-07-02 16:22:49 +00:00
|
|
|
protected function getSize($path) {
|
|
|
|
$cache = $this->getCache();
|
|
|
|
$data = $cache->get($path);
|
|
|
|
if (is_array($data) and isset($data['size'])) {
|
2014-03-07 10:25:29 +00:00
|
|
|
if (isset($data['unencrypted_size'])
|
|
|
|
&& $data['unencrypted_size'] > 0
|
|
|
|
) {
|
|
|
|
return $data['unencrypted_size'];
|
|
|
|
}
|
2013-07-02 16:22:49 +00:00
|
|
|
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 15:26:54 +00:00
|
|
|
$used = $this->getSize($this->sizeRoot);
|
2013-07-02 16:22:49 +00:00
|
|
|
if ($used < 0) {
|
|
|
|
return \OC\Files\SPACE_NOT_COMPUTED;
|
|
|
|
} else {
|
|
|
|
$free = $this->storage->free_space($path);
|
2014-03-19 18:07:11 +00:00
|
|
|
$quotaFree = max($this->quota - $used, 0);
|
|
|
|
// if free space is known
|
|
|
|
if ($free >= 0) {
|
|
|
|
$free = min($free, $quotaFree);
|
|
|
|
} else {
|
|
|
|
$free = $quotaFree;
|
|
|
|
}
|
|
|
|
return $free;
|
2013-07-02 16:22:49 +00: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 17:49:51 +00:00
|
|
|
if ($source && $free >= 0 && $mode !== 'r' && $mode !== 'rb') {
|
2013-07-02 16:22:49 +00:00
|
|
|
return \OC\Files\Stream\Quota::wrap($source, $free);
|
|
|
|
} else {
|
|
|
|
return $source;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|