From 030c848b0d68321b711875886f90e680f232715b Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 11 Dec 2008 03:30:00 -0500
Subject: [PATCH] - Performance: allow setting imap rootdir and delimiter before connect (#1485172)

---
 CHANGELOG                  |    4 ++
 program/include/rcmail.php |    4 --
 program/lib/imap.inc       |   53 +++++++++++++++++---------
 UPGRADING                  |    1 
 config/main.inc.php.dist   |    9 +++-
 5 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 4957157..3cef60c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+2008/12/11 (alec)
+----------
+- Performance: allow setting imap rootdir and delimiter before connect (#1485172)
+
 2008/12/06 (alec)
 ----------
 - Fix sorting of folders with more than 2 levels (#1485569)
diff --git a/UPGRADING b/UPGRADING
index b2c1977..e5f6e83 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -18,6 +18,7 @@
    open http://url-to-roundcube/installer/ in a browser. To enable
    the latter one, you have to temporary set 'enable_installer' to true
    in your local config/main.inc.php file.
+   WARNING: If you don't know what is IMAP root directory, set imap_root option to NULL
 3. Let the update script/installer check your configuration and
    update your config files as suggested by the updater.
 4. If suggested by the update script, run all commands in
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index e78b91e..8b4fbad 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -61,6 +61,12 @@
 // Optional, defaults to "check"
 $rcmail_config['imap_auth_type'] = null;
 
+// If you know your imap's root directory and its folder delimiter,
+// you can specify them here. Otherwise they will be determined
+// during every imap connection.
+$rcmail_config['imap_root'] = null;
+$rcmail_config['imap_delimiter'] = null;
+
 // Automatically add this domain to user names for login
 // Only for IMAP servers that require full e-mail addresses for login
 // Specify an array with 'host' => 'domain' values to support multiple hosts
@@ -151,9 +157,6 @@
 
 // use this name to compose page titles
 $rcmail_config['product_name'] = 'RoundCube Webmail';
-
-// only list folders within this path
-$rcmail_config['imap_root'] = '';
 
 // store draft message is this mailbox
 // leave blank if draft messages should not be stored
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 9690d8d..c7f26d9 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -515,10 +515,6 @@
   {
     $this->imap->set_charset($this->config->get('default_charset', RCMAIL_CHARSET));
 
-    // set root dir from config
-    if ($imap_root = $this->config->get('imap_root')) {
-      $this->imap->set_rootdir($imap_root);
-    }
     if ($default_folders = $this->config->get('default_imap_folders')) {
       $this->imap->set_default_mailboxes($default_folders);
     }
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index 6fb60e9..7b53630 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -73,6 +73,8 @@
 		- fix iil_C_FetchPartHeader() in some cases by use of iil_C_HandlePartBody()
 		- allow iil_C_HandlePartBody() to fetch whole message
 		- optimize iil_C_FetchHeaders() to use only one FETCH command
+		- added 4th argument to iil_Connect()
+		- allow setting rootdir and delimiter before connect
 
 ********************************************************/
 
@@ -196,7 +198,7 @@
 }
 
 function iil_PutLine($fp, $string, $endln=true) {
-//      console('C: '. rtrim($string));
+      console('C: '. rtrim($string));
         return fputs($fp, $string . ($endln ? "\r\n" : ''));
 }
 
@@ -476,13 +478,14 @@
 
 function iil_C_NameSpace(&$conn) {
 	global $my_prefs;
+
+	if (isset($my_prefs['rootdir']) && is_string($my_prefs['rootdir'])) {
+    		$conn->rootdir = $my_prefs['rootdir'];
+		return true;
+	}
 	
 	if (!iil_C_GetCapability($conn, 'NAMESPACE')) {
 	    return false;
-	}
-    
-	if ($my_prefs["rootdir"]) {
-	    return true;
 	}
     
 	iil_PutLine($conn->fp, "ns1 NAMESPACE");
@@ -510,12 +513,13 @@
     
 	$conn->rootdir       = $first_userspace[0];
 	$conn->delimiter     = $first_userspace[1];
-	$my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
+	$my_prefs['rootdir'] = substr($conn->rootdir, 0, -1);
+	$my_prefs['delimiter'] = $conn->delimiter;
 	
 	return true;
 }
 
-function iil_Connect($host, $user, $password) {	
+function iil_Connect($host, $user, $password, $options=null) {	
 	global $iil_error, $iil_errornum;
 	global $ICL_SSL, $ICL_PORT;
 	global $IMAP_NO_CACHE;
@@ -523,18 +527,23 @@
 	
 	$iil_error = '';
 	$iil_errornum = 0;
-	
-	//set auth method
-	$auth_method = 'plain';
-	if (func_num_args() >= 4) {
-		$auth_array = func_get_arg(3);
-		if (is_array($auth_array)) {
-			$auth_method = $auth_array['imap'];
-    		}
-		if (empty($auth_method)) {
-        		$auth_method = "plain";
-    		}
+
+	// set some imap options
+	if (is_array($options)) {
+		foreach($options as $optkey => $optval) {
+			if ($optkey == 'imap') {
+				$auth_method = $optval;
+			} else if ($optkey == 'rootdir') {
+    				$my_prefs['rootdir'] = $optval;
+			} else if ($optkey == 'delimiter') {
+    				$my_prefs['delimiter'] = $optval;
+			}
+		}
 	}
+
+	if (empty($auth_method))
+    		$auth_method = 'plain';
+		
 	$message = "INITIAL: $auth_method\n";
 		
 	$result = false;
@@ -2138,8 +2147,14 @@
  * @see iil_Connect()
  */
 function iil_C_GetHierarchyDelimiter(&$conn) {
+
+	global $my_prefs;
+	
 	if ($conn->delimiter) {
-        return $conn->delimiter;
+    		return $conn->delimiter;
+	}
+	if (!empty($my_prefs['delimiter'])) {
+    	    return ($conn->delimiter = $my_prefs['delimiter']);
 	}
     
 	$fp        = $conn->fp;

--
Gitblit v1.9.1