From 7f1da4818efda0f4f0874f73c840ec46dc332223 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 23 Dec 2010 13:25:18 -0500
Subject: [PATCH] - Add debug handler support in rcube_imap_generic

---
 program/include/rcube_imap.php         |   24 ++++++++---
 program/include/rcmail.php             |    2 
 program/include/rcube_imap_generic.php |   49 ++++++++++++++++++++----
 3 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index f72b33e..afdb77c 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -503,7 +503,7 @@
       'auth_method' => $this->config->get('imap_auth_type', 'check'),
       'auth_cid'    => $this->config->get('imap_auth_cid'),
       'auth_pw'     => $this->config->get('imap_auth_pw'),
-      'debug_mode'  => (bool) $this->config->get('imap_debug', 0),
+      'debug'       => (bool) $this->config->get('imap_debug', 0),
       'force_caps'  => (bool) $this->config->get('imap_force_caps'),
       'timeout'     => (int) $this->config->get('imap_timeout', 0),
     );
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index 5715459..02efaff 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -148,6 +148,9 @@
 
         $this->options['port'] = $port;
 
+        if ($this->options['debug'])
+            $this->conn->setDebug(true, array($this, 'debug_handler'));
+
         $attempt = 0;
         do {
             $data = rcmail::get_instance()->plugins->exec_hook('imap_connect',
@@ -223,7 +226,7 @@
      */
     function get_error_code()
     {
-        return ($this->conn) ? $this->conn->errornum : 0;
+        return $this->conn->errornum;
     }
 
 
@@ -234,7 +237,7 @@
      */
     function get_error_str()
     {
-        return ($this->conn) ? $this->conn->error : null;
+        return $this->conn->error;
     }
 
 
@@ -245,9 +248,6 @@
      */
     function get_response_code()
     {
-        if (!$this->conn)
-            return self::UNKNOWN;
-
         switch ($this->conn->resultcode) {
             case 'NOPERM':
                 return self::NOPERM;
@@ -278,7 +278,7 @@
      */
     function get_response_str()
     {
-        return ($this->conn) ? $this->conn->result : null;
+        return $this->conn->result;
     }
 
 
@@ -546,7 +546,7 @@
         $imap_shared    = $config->get('imap_ns_shared');
         $imap_delimiter = $config->get('imap_delimiter');
 
-        if (!$this->conn)
+        if (!$this->conn->connected())
             return;
 
         $ns = $this->conn->getNamespace();
@@ -4740,6 +4740,16 @@
         return $result;
     }
 
+
+    /**
+     * This is our own debug handler for the IMAP connection
+     * @access public
+     */
+    public function debug_handler(&$imap, $message)
+    {
+        write_log('imap', $message);
+    }
+
 }  // end class rcube_imap
 
 
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index 512e7e4..d7afab1 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -109,6 +109,8 @@
     private $prefs;
     private $cmd_tag;
     private $cmd_num = 0;
+    private $_debug = false;
+    private $_debug_handler = false;
 
     const ERROR_OK = 0;
     const ERROR_NO = -1;
@@ -142,8 +144,8 @@
         if (!$this->fp)
             return false;
 
-        if (!empty($this->prefs['debug_mode'])) {
-            write_log('imap', 'C: '. rtrim($string));
+        if ($this->_debug) {
+            $this->debug('C: '. rtrim($string));
         }
 
         $res = fwrite($this->fp, $string . ($endln ? "\r\n" : ''));
@@ -231,8 +233,8 @@
                 $this->fp = null;
                 break;
             }
-            if (!empty($this->prefs['debug_mode'])) {
-                write_log('imap', 'S: '. rtrim($buffer));
+            if ($this->_debug) {
+                $this->debug('S: '. rtrim($buffer));
             }
             $line .= $buffer;
         } while ($buffer[strlen($buffer)-1] != "\n");
@@ -268,8 +270,8 @@
         while ($len < $bytes && !feof($this->fp))
         {
             $d = fread($this->fp, $bytes-$len);
-            if (!empty($this->prefs['debug_mode'])) {
-                write_log('imap', 'S: '. $d);
+            if ($this->_debug) {
+                $this->debug('S: '. $d);
             }
             $data .= $d;
             $data_len = strlen($data);
@@ -686,8 +688,8 @@
 
         $line = trim(fgets($this->fp, 8192));
 
-        if ($this->prefs['debug_mode'] && $line) {
-            write_log('imap', 'S: '. $line);
+        if ($this->_debug && $line) {
+            $this->debug('S: '. $line);
         }
 
         // Connected to wrong port or connection error?
@@ -3238,4 +3240,35 @@
         return strtr($string, array('\\"'=>'"', '\\\\' => '\\'));
     }
 
+    /**
+     * Set the value of the debugging flag.
+     *
+     * @param   boolean $debug      New value for the debugging flag.
+     *
+     * @access  public
+     * @since   0.5-stable
+     */
+    function setDebug($debug, $handler = null)
+    {
+        $this->_debug = $debug;
+        $this->_debug_handler = $handler;
+    }
+
+    /**
+     * Write the given debug text to the current debug output handler.
+     *
+     * @param   string  $message    Debug mesage text.
+     *
+     * @access  private
+     * @since   0.5-stable
+     */
+    private function debug($message)
+    {
+        if ($this->_debug_handler) {
+            call_user_func_array($this->_debug_handler, array(&$this, $message));
+        } else {
+            echo "DEBUG: $message\n";
+        }
+    }
+
 }

--
Gitblit v1.9.1