summaryrefslogtreecommitdiff
path: root/program/lib
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2014-06-24 19:16:18 +0200
committerAleksander Machniak <alec@alec.pl>2014-06-24 19:16:18 +0200
commit6fa1a0da1f0902f10be8fc4eb24180f8e3453c17 (patch)
tree48daf190a25026e5404a406aeb9107710439b9de /program/lib
parent750de3189cd96505747c10b24ab055cf0bdcbdce (diff)
Extend get_quota() so it's possible to specify GETQUOTAROOT folder and return full quota info (including all roots and types, e.g. MESSAGE) - for future use
Diffstat (limited to 'program/lib')
-rw-r--r--program/lib/Roundcube/rcube_imap.php7
-rw-r--r--program/lib/Roundcube/rcube_imap_generic.php91
-rw-r--r--program/lib/Roundcube/rcube_storage.php4
3 files changed, 56 insertions, 46 deletions
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index 109886f8d..858db7b5b 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -3067,14 +3067,15 @@ class rcube_imap extends rcube_storage
/**
* Get mailbox quota information
- * added by Nuny
+ *
+ * @param string $folder Folder name
*
* @return mixed Quota info or False if not supported
*/
- public function get_quota()
+ public function get_quota($folder = null)
{
if ($this->get_capability('QUOTA') && $this->check_connection()) {
- return $this->conn->getQuota();
+ return $this->conn->getQuota($folder);
}
return false;
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php
index 7b9ba2ec8..032506412 100644
--- a/program/lib/Roundcube/rcube_imap_generic.php
+++ b/program/lib/Roundcube/rcube_imap_generic.php
@@ -2873,59 +2873,66 @@ class rcube_imap_generic
/**
* Returns QUOTA information
*
+ * @param string $mailbox Mailbox name
+ *
* @return array Quota information
*/
- function getQuota()
- {
- /*
- * GETQUOTAROOT "INBOX"
- * QUOTAROOT INBOX user/rchijiiwa1
- * QUOTA user/rchijiiwa1 (STORAGE 654 9765)
- * OK Completed
- */
- $result = false;
- $quota_lines = array();
- $key = $this->nextTag();
- $command = $key . ' GETQUOTAROOT INBOX';
-
- // get line(s) containing quota info
- if ($this->putLine($command)) {
- do {
- $line = rtrim($this->readLine(5000));
- if (preg_match('/^\* QUOTA /', $line)) {
- $quota_lines[] = $line;
- }
- } while (!$this->startsWith($line, $key, true, true));
- }
- else {
- $this->setError(self::ERROR_COMMAND, "Unable to send command: $command");
+ function getQuota($mailbox = null)
+ {
+ if ($mailbox === null || $mailbox === '') {
+ $mailbox = 'INBOX';
}
- // return false if not found, parse if found
+ // a0001 GETQUOTAROOT INBOX
+ // * QUOTAROOT INBOX user/sample
+ // * QUOTA user/sample (STORAGE 654 9765)
+ // a0001 OK Completed
+
+ list($code, $response) = $this->execute('GETQUOTAROOT', array($this->escape($mailbox)));
+
+ $result = false;
$min_free = PHP_INT_MAX;
- foreach ($quota_lines as $key => $quota_line) {
- $quota_line = str_replace(array('(', ')'), '', $quota_line);
- $parts = explode(' ', $quota_line);
- $storage_part = array_search('STORAGE', $parts);
+ $all = array();
- if (!$storage_part) {
- continue;
- }
+ if ($code == self::ERROR_OK) {
+ foreach (explode("\n", $response) as $line) {
+ if (preg_match('/^\* QUOTA /', $line)) {
+ list(, , $quota_root) = $this->tokenizeResponse($line, 3);
+
+ while ($line) {
+ list($type, $used, $total) = $this->tokenizeResponse($line, 1);
+ $type = strtolower($type);
+
+ if ($type && $total) {
+ $all[$quota_root][$type]['used'] = intval($used);
+ $all[$quota_root][$type]['total'] = intval($total);
+ }
+ }
+
+ if (empty($all[$quota_root]['storage'])) {
+ continue;
+ }
- $used = intval($parts[$storage_part+1]);
- $total = intval($parts[$storage_part+2]);
- $free = $total - $used;
+ $used = $all[$quota_root]['storage']['used'];
+ $total = $all[$quota_root]['storage']['total'];
+ $free = $total - $used;
- // return lowest available space from all quotas
- if ($free < $min_free) {
- $min_free = $free;
- $result['used'] = $used;
- $result['total'] = $total;
- $result['percent'] = min(100, round(($used/max(1,$total))*100));
- $result['free'] = 100 - $result['percent'];
+ // calculate lowest available space from all storage quotas
+ if ($free < $min_free) {
+ $min_free = $free;
+ $result['used'] = $used;
+ $result['total'] = $total;
+ $result['percent'] = min(100, round(($used/max(1,$total))*100));
+ $result['free'] = 100 - $result['percent'];
+ }
+ }
}
}
+ if (!empty($result)) {
+ $result['all'] = $all;
+ }
+
return $result;
}
diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php
index c1293961c..ccb28c680 100644
--- a/program/lib/Roundcube/rcube_storage.php
+++ b/program/lib/Roundcube/rcube_storage.php
@@ -918,9 +918,11 @@ abstract class rcube_storage
/**
* Get mailbox quota information.
*
+ * @param string $folder Folder name
+ *
* @return mixed Quota info or False if not supported
*/
- abstract function get_quota();
+ abstract function get_quota($folder = null);
/* -----------------------------------------