From 6d2714b3b3660f8a4efbb9c53e00b76245c2bcc2 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 11 Apr 2008 12:53:59 -0400
Subject: [PATCH] #1484972: optimization: mark as read in one action with preview, deleted redundant quota reads

---
 index.php                           |    4 -
 /dev/null                           |   28 ---------
 program/steps/mail/check_recent.inc |    2 
 program/steps/mail/func.inc         |   31 +++++++---
 program/steps/mail/show.inc         |   18 ++++-
 program/js/app.js                   |   43 +++++++++++---
 program/steps/mail/move_del.inc     |    2 
 7 files changed, 70 insertions(+), 58 deletions(-)

diff --git a/index.php b/index.php
index e9c1cee..b160dd6 100644
--- a/index.php
+++ b/index.php
@@ -326,10 +326,6 @@
   if ($_action=='rss')
     include('program/steps/mail/rss.inc');
     
-  if ($_action=='quotadisplay')
-    include('program/steps/mail/quotadisplay.inc');
-
-
   // make sure the message count is refreshed
   $IMAP->messagecount($_SESSION['mbox'], 'ALL', TRUE);
 }
diff --git a/program/js/app.js b/program/js/app.js
index 05a4385..02c1cf5 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -179,7 +179,6 @@
           {
           this.enable_command('compose', 'add-contact', false);
           parent.rcmail.show_contentframe(true);
-          parent.rcmail.mark_message('read', this.env.uid);
           }
 
         if ((this.env.action=='show' || this.env.action=='preview') && this.env.blockedobjects)
@@ -1569,6 +1568,28 @@
 
     this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
   };
+
+  // set class to read/unread
+  this.mark_as_read_from_preview = function(uid)
+  {
+    var icn_src;
+    var rows = parent.rcmail.message_list.rows;
+    if(rows[uid].unread)
+      {
+        rows[uid].unread = false;
+        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
+        parent.rcmail.set_classname(rows[uid].obj, 'unread', false);
+
+        if (rows[uid].replied && parent.rcmail.env.repliedicon)
+    	  icn_src = parent.rcmail.env.repliedicon;
+        else if (parent.rcmail.env.messageicon)
+          icn_src = parent.rcmail.env.messageicon;
+      
+	if (rows[uid].icon && icn_src)
+          rows[uid].icon.src = icn_src;
+      }
+  }
+  
   
   // mark all message rows as deleted/undeleted
   this.toggle_delete_status = function(a_uids)
@@ -3254,16 +3275,13 @@
     this.set_page_buttons();
     };
 
+
   // replace content of quota display
-  this.set_quota = function()
+  this.set_quota = function(content)
     {
-    if (this.gui_objects.quotadisplay &&
-        this.gui_objects.quotadisplay.attributes.getNamedItem('display') &&
-        this.gui_objects.quotadisplay.attributes.getNamedItem('id'))
-      this.http_request('quotadisplay', '_display='+
-      this.gui_objects.quotadisplay.attributes.getNamedItem('display').nodeValue+
-      '&_id='+this.gui_objects.quotadisplay.attributes.getNamedItem('id').nodeValue, false);
-     };
+    if (this.gui_objects.quotadisplay && content)
+      this.gui_objects.quotadisplay.innerHTML = content;
+    };
 
 
   // update the mailboxlist
@@ -3308,7 +3326,12 @@
       }
     };
 
-
+  // update parent's mailboxlist (from preview)
+  this.set_unread_count_from_preview = function(mbox, count, set_title)
+  {
+    parent.rcmail.set_unread_count(mbox, count, set_title);
+  }
+  
   // add row to contacts list
   this.add_contact_row = function(cid, cols, select)
     {
diff --git a/program/steps/mail/check_recent.inc b/program/steps/mail/check_recent.inc
index 3e03016..dee8ca6 100644
--- a/program/steps/mail/check_recent.inc
+++ b/program/steps/mail/check_recent.inc
@@ -37,7 +37,7 @@
       $OUTPUT->set_env('messagecount', $IMAP->messagecount());
       $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, ($mbox_name == 'INBOX'));
       $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
-      $OUTPUT->command('set_quota', $IMAP->get_quota());
+      $OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
 
       // add new message headers to list
       $a_headers = array();
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index af36181..393fcaa 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -408,30 +408,43 @@
   if (!$attrib['id'])
     $attrib['id'] = 'rcmquotadisplay';
 
+  if(isset($attrib['display']))
+    $_SESSION['quota_display'] = $attrib['display'];
+
   $OUTPUT->add_gui_object('quotadisplay', $attrib['id']);
 
   // allow the following attributes to be added to the <span> tag
   $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'display'));
 
   $out = '<span' . $attrib_str . '>';
-  $out .= rcmail_quota_content($attrib['display']);
+  $out .= rcmail_quota_content();
   $out .= '</span>';
   return $out;
   }
 
 
-function rcmail_quota_content($display)
+function rcmail_quota_content($quota=NULL)
   {
   global $IMAP, $COMM_PATH;
 
-  if (!$IMAP->get_capability('QUOTA'))
-    $quota_text = rcube_label('unknown');
-  else if ($quota = $IMAP->get_quota())
+  $display = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+
+  if (is_array($quota) && !empty($quota['used']) && !empty($quota['total']))
     {
-    $quota_text = sprintf("%s / %s (%.0f%%)",
-                          show_bytes($quota["used"] * 1024),
-                          show_bytes($quota["total"] * 1024),
-                          $quota["percent"]);
+      if (!isset($quota['percent']))
+        $quota['percent'] = $quota['used'] / $quota['total'];
+    }
+  elseif (!$IMAP->get_capability('QUOTA'))
+    return rcube_label('unknown');
+  else
+    $quota = $IMAP->get_quota();
+
+  if ($quota)
+    {
+    $quota_text = sprintf('%s / %s (%.0f%%)',
+                          show_bytes($quota['used'] * 1024),
+                          show_bytes($quota['total'] * 1024),
+                          $quota['percent']);
 
     // show quota as image (by Brett Patterson)
     if ($display == 'image' && function_exists('imagegif'))
diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc
index 3bc644f..131ad2e 100644
--- a/program/steps/mail/move_del.inc
+++ b/program/steps/mail/move_del.inc
@@ -92,7 +92,7 @@
 if ($_action=='moveto' && $target)
   $OUTPUT->command('set_unread_count', $target, $IMAP->messagecount($target, 'UNSEEN'));
 
-$OUTPUT->command('set_quota', $IMAP->get_quota());
+$OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
 
 // add new rows from next page (if any)
 if ($_POST['_from']!='show' && ($jump_back || $nextpage_count > 0))
diff --git a/program/steps/mail/quotadisplay.inc b/program/steps/mail/quotadisplay.inc
deleted file mode 100644
index 223dd58..0000000
--- a/program/steps/mail/quotadisplay.inc
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/quotadisplay.inc                                   |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Remote call to return the quota image or text                       |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Robin Elfrink <robin@15augustus.nl>                           |
- +-----------------------------------------------------------------------+
-
- $Id$
-
-*/
-
-$display = isset($_GET['_display']) ? $_GET['_display'] : 'text';
-$id = isset($_GET['_id']) ? $_GET['_id'] : 'rcmquotadisplay';
-$quota = rcmail_quota_content($display);
-$OUTPUT->remote_response(sprintf("this.gui_objects.%s.innerHTML = '%s';\n", $id, $quota));
-
-exit;
-?>
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 27d2660..94e4c61 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -53,8 +53,10 @@
   else if ($_SESSION['safe_messages'][$MESSAGE['UID']])
     $MESSAGE['is_safe'] = 1;
 
+  $mbox_name = $IMAP->get_mailbox_name();
+  
   // calculate Etag for this request
-  $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().intval($MESSAGE['headers']->mdn_sent).intval($MESSAGE['is_safe']).intval($PRINT_MODE));
+  $etag = md5($MESSAGE['UID'].$mbox_name.session_id().intval($MESSAGE['headers']->mdn_sent).intval($MESSAGE['is_safe']).intval($PRINT_MODE));
 
   // allow caching, unless remote images are present
   if ((bool)$MESSAGE['is_safe'])
@@ -75,17 +77,23 @@
   else
     $MESSAGE['body'] = $IMAP->get_body($MESSAGE['UID']);
 
-
   // mark message as read
-  if (!$MESSAGE['headers']->seen && $_action != 'preview')
-    $IMAP->set_flag($MESSAGE['UID'], 'SEEN');
+  if (!$MESSAGE['headers']->seen)
+    {
+      $marked = $IMAP->set_flag($MESSAGE['UID'], 'SEEN');
+      if($_action == 'preview' && $marked != -1)
+	{
+	$OUTPUT->command('set_unread_count_from_preview', $mbox_name, $IMAP->messagecount($mbox_name, 'UNSEEN'), ($mbox_name == 'INBOX'));
+	$OUTPUT->command('mark_as_read_from_preview', $MESSAGE['UID']);
+	}
+    }
 
   // give message uid to the client
   $OUTPUT->set_env('uid', $MESSAGE['UID']);
   $OUTPUT->set_env('safemode', $MESSAGE['is_safe']);
   
   // check for unset disposition notification
-  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent && $IMAP->get_mailbox_name() != $CONFIG['drafts_mbox'])
+  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent && $mbox_name != $CONFIG['drafts_mbox'])
   {
     if (intval($CONFIG['mdn_requests']) === 1)
     {

--
Gitblit v1.9.1