typo fix
[squirrelmail.git] / functions / imap_messages.php
index 18b89234fdcbefae11c24c8f0cacaf0220171760..8ae69c3c9c10c8759cd40622718199028e89c740 100755 (executable)
@@ -81,7 +81,7 @@ function get_reference_header ($imap_stream, $message) {
     $sid = sqimap_session_id();
        $results = array();
        $references = "";
-    $query = "$sid FETCH $message BODY.PEEK[HEADER.FIELDS (References)]\r\n";
+    $query = "$sid FETCH $message BODY[HEADER.FIELDS (References)]\r\n";
     fputs ($imap_stream, $query);
        $responses = sqimap_read_data_list($imap_stream, $sid, true, $responses, $message);
     if (!eregi("^\\* ([0-9]+) FETCH", $responses[0][0], $regs)) {
@@ -128,14 +128,19 @@ function sqimap_get_sort_order ($imap_stream, $sort) {
     if (!empty($sort_on[$sort])) {
         $sort_query = "$sid SORT ($sort_on[$sort]) ".strtoupper($default_charset)." ALL\r\n";
         fputs($imap_stream, $sort_query);
-        $sort_test = sqimap_read_data($imap_stream, $sid, true, $response, $message);
+        $sort_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
     }
-    if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) {
-        $server_sort_array = preg_split("/ /", trim($regs[1]));
+    if (isset($sort_test[0])) {
+        if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) {
+            $server_sort_array = preg_split("/ /", trim($regs[1]));
+        }
     }
     if ($sort == 0 || $sort == 2 || $sort == 4) {
        $server_sort_array = array_reverse($server_sort_array);
     }
+    if (!preg_match("/OK/", $response)) {
+          $server_sort_array = 'no';
+       }
     session_register('server_sort_array');
     return $server_sort_array;
 }
@@ -149,6 +154,11 @@ function get_parent_level ($imap_stream) {
     global $sort_by_ref, $default_charset, $thread_new;
         $parent = "";
         $child = "";
+        $cutoff = 0;
+        
+    /* loop through the threads and take unwanted characters out 
+       of the thread string then chop it up 
+     */
     for ($i=0;$i<count($thread_new);$i++) {
         $thread_new[$i] = preg_replace("/\s\(/", "(", $thread_new[$i]);
         $thread_new[$i] = preg_replace("/(\d+)/", "$1|", $thread_new[$i]);
@@ -158,53 +168,65 @@ function get_parent_level ($imap_stream) {
         if (!$thread_new) {
                 $thread_new = array();
         }
+    /* looping through the parts of one message thread */
+    
     for ($i=0;$i<count($thread_new);$i++) {
+    /* first grab the parent, it does not indent */
+    
         if (isset($thread_new[$i][0])) {
-        if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
-            $parent = $regs[1];
-        }
+            if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+                $parent = $regs[1];
+            }
         }
         $indent_array[$parent] = 0;
+
+    /* now the children, checking each thread portion for
+       ),(, and space, adjusting the level and space values
+       to get the indent level
+    */
+        $level = 0;
+        $spaces = 0;
         $indent = 0;
-        $go = 'stop';
-        $spaces = array ();
-        $l = 0;
+        $fake = FALSE;
         for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
             $chars = count_chars($thread_new[$i][$k], 1);
-            if (isset($chars['40']) && isset($chars['41'])) {
-                $l--;
-            }
-            if (isset($chars['40'])) {  // (
-                $indent = $indent + $chars[40];
-                $go = 'start';
-                $l++;
+            if (isset($chars['40'])) {       /* testing for ( */
+                $level = $level + $chars['40'];
             }
-            if (isset($chars['41'])) {  //  )
-                if ($go == 'start') {
-                    if (!isset($spaces[$l])) {
-                                                $spaces[$l] = 0;
-                                        }
-                    $indent = $indent - $spaces[$l];
-                    $indent = $indent - $chars[41] ;
-                    $go = 'stop';
-                    $l--;
-                }
-                else {
-                    $indent = $indent - $chars[41];
+            if (isset($chars['41'])) {      /* testing for ) */
+                $level = $level - $chars['41'];
+                $spaces = 0;
+                /* if we were faking lets stop, this portion
+                   of the thread is over
+                */
+                if ($level == $cutoff) {
+                    $fake = FALSE;
                 }
             }
-            if (isset($chars['32'])) {  //  space
-                $indent = $indent + $chars[32];
-                if ($go == 'start') {
-                    if (!isset($spaces[$l])) {
-                                                $spaces[$l] = 0;
-                                        }
-                    $spaces[$l] = $spaces[$l] + $chars[32];
-                }
+            if (isset($chars['32'])) {      /* testing for space */
+                $spaces = $spaces + $chars['32'];
+            }
+            $indent = $level + $spaces;
+            /* must have run into a message that broke the thread
+               so we are adjusting for that portion
+            */
+            if ($fake == TRUE) {
+                $indent = $indent +1;
             }
             if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
                 $child = $regs[1];
             }
+            /* the thread must be broken if $indent == 0
+               so indent the message once and start faking it
+            */
+            if ($indent == 0) {
+                $indent = 1;
+                $fake = TRUE;
+                $cutoff = $level;
+            }
+            /* dont need abs but if indent was negative
+               errors would occur
+            */
             $indent_array[$child] = abs($indent);
         }    
     }
@@ -219,7 +241,6 @@ function get_parent_level ($imap_stream) {
 
 function get_thread_sort ($imap_stream) {
     global $thread_new, $sort_by_ref, $default_charset, $server_sort_array;
-
     if (session_is_registered('thread_new')) {
         session_unregister('thread_new');
     }
@@ -236,13 +257,19 @@ function get_thread_sort ($imap_stream) {
     }
     $thread_query = "$sid THREAD $sort_type ".strtoupper($default_charset)." ALL\r\n";
     fputs($imap_stream, $thread_query);
-    $thread_test = sqimap_read_data($imap_stream, $sid, true, $response, $message);
-    if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
-       $thread_list = trim($regs[1]);
+    $thread_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
+    if (isset($thread_test[0])) {
+        if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
+            $thread_list = trim($regs[1]);
+        }
     }
     else {
        $thread_list = "";
     }
+    if (!preg_match("/OK/", $response)) {
+          $server_sort_array = 'no';
+          return $server_sort_array;
+       }
     $thread_temp = preg_split("//", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
     $char_count = count($thread_temp);
     $counter = 0;
@@ -270,7 +297,7 @@ function get_thread_sort ($imap_stream) {
                     }
             }
     }
-        session_register('$thread_new');
+    session_register('thread_new');
     $thread_new = array_reverse($thread_new);
     $thread_list = implode(" ", $thread_new);
     $thread_list = str_replace("(", " ", $thread_list);
@@ -584,6 +611,17 @@ function sqimap_get_header ($imap_stream, $read) {
             } else {
                 $hdr->charset = "us-ascii";
             }
+           /* Detect type in case of multipart/related */
+           if (strpos(strtolower(trim($line)), "type=")) {
+               $pos = strpos($line, "type=") + 6;
+               $type = trim($line);
+                if (strpos($line, ";", $pos) > 0) {
+                    $type = substr($type, $pos, strpos($line, ";", $pos)-$pos);
+                } else {
+                    $type = substr($type, $pos);
+                }
+               $hdr->type = $type;
+           }
         }
         else if (strtolower(substr($read[$i], 0, 20)) == "content-disposition:") {
             /* Add better content-disposition support */