From 0b36d151572e050b51d82e7429fee847ebb33e22 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Thu, 20 Nov 2014 06:03:22 -0500
Subject: [PATCH] Add method to display operation (uploading) progress in UI message

---
 program/include/rcmail.php |  119 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 85 insertions(+), 34 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index b105eb8..f0c3631 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -106,21 +106,23 @@
         // reset some session parameters when changing task
         if ($this->task != 'utils') {
             // we reset list page when switching to another task
-            // but only to the main task interface - empty action (#1489076)
+            // but only to the main task interface - empty action (#1489076, #1490116)
             // this will prevent from unintentional page reset on cross-task requests
             if ($this->session && $_SESSION['task'] != $this->task && empty($this->action)) {
                 $this->session->remove('page');
-            }
 
-            // set current task to session
-            $_SESSION['task'] = $this->task;
+                // set current task to session
+                $_SESSION['task'] = $this->task;
+            }
         }
 
-        // init output class
-        if (!empty($_REQUEST['_remote']))
+        // init output class (not in CLI mode)
+        if (!empty($_REQUEST['_remote'])) {
             $GLOBALS['OUTPUT'] = $this->json_init();
-        else
+        }
+        else if ($_SERVER['REMOTE_ADDR']) {
             $GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed']));
+        }
 
         // load plugins
         $this->plugins->init($this, $this->task);
@@ -147,8 +149,13 @@
         $this->task      = $task;
         $this->comm_path = $this->url(array('task' => $this->task));
 
+        if (!empty($_REQUEST['_framed'])) {
+            $this->comm_path .= '&_framed=1';
+        }
+
         if ($this->output) {
             $this->output->set_env('task', $this->task);
+            $this->output->set_env('comm_path', $this->comm_path);
         }
     }
 
@@ -168,7 +175,7 @@
         setlocale(LC_ALL, $lang . '.utf8', $lang . '.UTF-8', 'en_US.utf8', 'en_US.UTF-8');
 
         // workaround for http://bugs.php.net/bug.php?id=18556
-        if (version_compare(PHP_VERSION, '5.5.0', '<') && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) {
+        if (PHP_VERSION_ID < 50500 && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) {
             setlocale(LC_CTYPE, 'en_US.utf8', 'en_US.UTF-8');
         }
     }
@@ -427,9 +434,12 @@
             $this->output->set_env('user_id', $this->user->get_hash());
         }
 
+        // set compose mode for all tasks (message compose step can be triggered from everywhere)
+        $this->output->set_env('compose_extwin', $this->config->get('compose_extwin',false));
+
         // add some basic labels to client
         $this->output->add_label('loading', 'servererror', 'connerror', 'requesttimedout',
-            'refreshing', 'windowopenerror');
+            'refreshing', 'windowopenerror', 'uploadingmany');
 
         return $this->output;
     }
@@ -786,11 +796,13 @@
     /**
      * Build a valid URL to this instance of Roundcube
      *
-     * @param mixed Either a string with the action or url parameters as key-value pairs
+     * @param mixed   Either a string with the action or url parameters as key-value pairs
+     * @param boolean Build an URL absolute to document root
+     * @param boolean Create fully qualified URL including http(s):// and hostname
      *
      * @return string Valid application URL
      */
-    public function url($p)
+    public function url($p, $absolute = false, $full = false)
     {
         if (!is_array($p)) {
             if (strpos($p, 'http') === 0) {
@@ -800,14 +812,15 @@
             $p = array('_action' => @func_get_arg(0));
         }
 
-        $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task);
-        $p['_task'] = $task;
-        unset($p['task']);
+        $pre = array();
+        $task = $p['_task'] ?: ($p['task'] ?: $this->task);
+        $pre['_task'] = $task;
+        unset($p['task'], $p['_task']);
 
-        $url  = './' . $this->filename;
+        $url  = $this->filename;
         $delm = '?';
 
-        foreach (array_reverse($p) as $key => $val) {
+        foreach (array_merge($pre, $p) as $key => $val) {
             if ($val !== '' && $val !== null) {
                 $par  = $key[0] == '_' ? $key : '_'.$key;
                 $url .= $delm.urlencode($par).'='.urlencode($val);
@@ -815,7 +828,24 @@
             }
         }
 
-        return $url;
+        if ($absolute || $full) {
+            // add base path to this Roundcube installation
+            $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME']));
+            if ($base_path == '') $base_path = '/';
+            $prefix = $base_path;
+
+            // prepend protocol://hostname:port
+            if ($full) {
+                $prefix = rcube_utils::resolve_url($prefix);
+            }
+
+            $prefix = rtrim($prefix, '/') . '/';
+        }
+        else {
+            $prefix = './';
+        }
+
+        return $prefix . $url;
     }
 
     /**
@@ -1684,7 +1714,8 @@
         $quota = $this->plugins->exec_hook('quota', $quota);
 
         $quota_result = (array) $quota;
-        $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+        $quota_result['type']   = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+        $quota_result['folder'] = $folder !== null && $folder !== '' ? $folder : 'INBOX';
 
         if ($quota['total'] > 0) {
             if (!isset($quota['percent'])) {
@@ -1748,10 +1779,6 @@
             unset($quota_result['all']);
         }
 
-        if ($folder !== null && $folder !== '') {
-            $quota_result['folder'] = $folder;
-        }
-
         return $quota_result;
     }
 
@@ -1775,7 +1802,7 @@
             $error = 'errorreadonly';
         }
         else if ($res_code == rcube_storage::OVERQUOTA) {
-            $error = 'errorroverquota';
+            $error = 'erroroverquota';
         }
         else if ($err_code && ($err_str = $this->storage->get_error_str())) {
             // try to detect access rights problem and display appropriate message
@@ -1931,13 +1958,32 @@
         }
 
         if (!empty($params['total'])) {
-            $params['percent'] = round($status['current']/$status['total']*100);
+            $total = $this->show_bytes($params['total'], $unit);
+            switch ($unit) {
+            case 'GB':
+                $gb      = $params['current']/1073741824;
+                $current = sprintf($gb >= 10 ? "%d" : "%.1f", $gb);
+                break;
+            case 'MB':
+                $mb      = $params['current']/1048576;
+                $current = sprintf($mb >= 10 ? "%d" : "%.1f", $mb);
+                break;
+            case 'KB':
+                $current = round($params['current']/1024);
+                break;
+            case 'B':
+            default:
+                $current = $params['current'];
+                break;
+            }
+
+            $params['percent'] = round($params['current']/$params['total']*100);
             $params['text']    = $this->gettext(array(
                 'name' => 'uploadprogress',
                 'vars' => array(
                     'percent' => $params['percent'] . '%',
-                    'current' => $this->show_bytes($params['current']),
-                    'total'   => $this->show_bytes($params['total'])
+                    'current' => $current,
+                    'total'   => $total
                 )
             ));
         }
@@ -2123,25 +2169,30 @@
     /**
      * Create a human readable string for a number of bytes
      *
-     * @param int Number of bytes
+     * @param int    Number of bytes
+     * @param string Size unit
      *
      * @return string Byte string
      */
-    public function show_bytes($bytes)
+    public function show_bytes($bytes, &$unit = null)
     {
         if ($bytes >= 1073741824) {
-            $gb  = $bytes/1073741824;
-            $str = sprintf($gb>=10 ? "%d " : "%.1f ", $gb) . $this->gettext('GB');
+            $unit = 'GB';
+            $gb   = $bytes/1073741824;
+            $str  = sprintf($gb >= 10 ? "%d " : "%.1f ", $gb) . $this->gettext($unit);
         }
         else if ($bytes >= 1048576) {
-            $mb  = $bytes/1048576;
-            $str = sprintf($mb>=10 ? "%d " : "%.1f ", $mb) . $this->gettext('MB');
+            $unit = 'MB';
+            $mb   = $bytes/1048576;
+            $str  = sprintf($mb >= 10 ? "%d " : "%.1f ", $mb) . $this->gettext($unit);
         }
         else if ($bytes >= 1024) {
-            $str = sprintf("%d ",  round($bytes/1024)) . $this->gettext('KB');
+            $unit = 'KB';
+            $str  = sprintf("%d ",  round($bytes/1024)) . $this->gettext($unit);
         }
         else {
-            $str = sprintf('%d ', $bytes) . $this->gettext('B');
+            $unit = 'B';
+            $str  = sprintf('%d ', $bytes) . $this->gettext();
         }
 
         return $str;

--
Gitblit v1.9.1