Aleksander Machniak
2014-06-24 6fa1a0da1f0902f10be8fc4eb24180f8e3453c17
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
4 files modified
103 ■■■■■ changed files
program/include/rcmail.php 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap.php 7 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap_generic.php 91 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_storage.php 4 ●●● patch | view | raw | blame | history
program/include/rcmail.php
@@ -1678,6 +1678,7 @@
        $quota = $this->storage->get_quota();
        $quota = $this->plugins->exec_hook('quota', $quota);
        unset($quota['abort']);
        $quota_result = (array) $quota;
        $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
program/lib/Roundcube/rcube_imap.php
@@ -3067,14 +3067,15 @@
    /**
     * 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;
program/lib/Roundcube/rcube_imap_generic.php
@@ -2873,57 +2873,64 @@
    /**
     * Returns QUOTA information
     *
     * @param string $mailbox Mailbox name
     *
     * @return array Quota information
     */
    function getQuota()
    function getQuota($mailbox = null)
    {
        /*
         * 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");
        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  = $all[$quota_root]['storage']['used'];
                    $total = $all[$quota_root]['storage']['total'];
                    $free  = $total - $used;
                    // 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'];
                    }
                }
            }
        }
            $used  = intval($parts[$storage_part+1]);
            $total = intval($parts[$storage_part+2]);
            $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'];
            }
        if (!empty($result)) {
            $result['all'] = $all;
        }
        return $result;
program/lib/Roundcube/rcube_storage.php
@@ -918,9 +918,11 @@
    /**
     * 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);
    /* -----------------------------------------