From fc7a41f75e7a3c8b0b3b8ada633172daa6a67931 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 25 Oct 2010 04:32:53 -0400
Subject: [PATCH] - Small improvements in NAMESPACE handling

---
 program/include/rcube_imap_generic.php |   78 +++++++++++++-------------------------
 1 files changed, 27 insertions(+), 51 deletions(-)

diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index 8df2a2e..29f23f6 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -534,24 +534,24 @@
         return $code;
     }
 
-    function getNamespace()
+    function getRootDir()
     {
 	    if (isset($this->prefs['rootdir']) && is_string($this->prefs['rootdir'])) {
     		$this->rootdir = $this->prefs['rootdir'];
 		    return true;
 	    }
 
-	    if (!is_array($data = $this->_namespace())) {
+	    if (!is_array($data = $this->getNamespace())) {
 	        return false;
 	    }
 
-	    $user_space_data = $data[0];
+	    $user_space_data = $data['personal'];
 	    if (!is_array($user_space_data)) {
 	        return false;
 	    }
 
 	    $first_userspace = $user_space_data[0];
-	    if (count($first_userspace)!=2) {
+	    if (count($first_userspace) !=2 ) {
 	        return false;
 	    }
 
@@ -562,7 +562,6 @@
 
 	    return true;
     }
-
 
     /**
      * Gets the delimiter, for example:
@@ -598,12 +597,12 @@
 
 	    // if that fails, try namespace extension
 	    // try to fetch namespace data
-	    if (!is_array($data = $this->_namespace())) {
+	    if (!is_array($data = $this->getNamespace())) {
             return false;
         }
 
 	    // extract user space data (opposed to global/shared space)
-	    $user_space_data = $data[0];
+	    $user_space_data = $data['personal'];
 	    if (!is_array($user_space_data)) {
 	        return false;
 	    }
@@ -618,23 +617,38 @@
 	    return $this->delimiter = $first_userspace[1];
     }
 
-    function _namespace()
+    /**
+     * NAMESPACE handler (RFC 2342)
+     *
+     * @return array Namespace data hash (personal, other, shared)
+     */
+    function getNamespace()
     {
+        if (array_key_exists('namespace', $this->prefs)) {
+            return $this->prefs['namespace'];
+        }
+    
         if (!$this->getCapability('NAMESPACE')) {
-	        return false;
+	        return self::ERROR_BAD;
 	    }
 
 	    list($code, $response) = $this->execute('NAMESPACE');
 
 		if ($code == self::ERROR_OK && preg_match('/^\* NAMESPACE /', $response)) {
-	        $data = $this->parseNamespace(substr($response, 11), $i, 0, 0);
+	        $data = $this->tokenizeResponse(substr($response, 11));
 		}
 
 	    if (!is_array($data)) {
-	        return false;
+	        return $code;
 	    }
 
-        return $data;
+        $this->prefs['namespace'] = array(
+            'personal' => $data[0],
+            'other'    => $data[1],
+            'shared'   => $data[2],
+        );
+
+        return $this->prefs['namespace'];
     }
 
     function connect($host, $user, $password, $options=null)
@@ -789,7 +803,7 @@
             if ($this->prefs['force_caps']) {
 			    $this->clearCapability();
             }
-		    $this->getNamespace();
+		    $this->getRootDir();
             $this->logged = true;
 
 		    return true;
@@ -2951,44 +2965,6 @@
 		    return $res;
 	    }
     	return $string;
-    }
-
-    private function parseNamespace($str, &$i, $len=0, $l)
-    {
-	    if (!$l) {
-	        $str = str_replace('NIL', '()', $str);
-	    }
-	    if (!$len) {
-	        $len = strlen($str);
-	    }
-	    $data      = array();
-	    $in_quotes = false;
-	    $elem      = 0;
-
-        for ($i; $i<$len; $i++) {
-		    $c = (string)$str[$i];
-		    if ($c == '(' && !$in_quotes) {
-			    $i++;
-			    $data[$elem] = $this->parseNamespace($str, $i, $len, $l++);
-			    $elem++;
-		    } else if ($c == ')' && !$in_quotes) {
-			    return $data;
-    		} else if ($c == '\\') {
-			    $i++;
-			    if ($in_quotes) {
-				    $data[$elem] .= $str[$i];
-        		}
-		    } else if ($c == '"') {
-			    $in_quotes = !$in_quotes;
-			    if (!$in_quotes) {
-				    $elem++;
-        		}
-		    } else if ($in_quotes) {
-			    $data[$elem].=$c;
-		    }
-	    }
-
-        return $data;
     }
 
     private function parseCapability($str)

--
Gitblit v1.9.1