typo fix
[squirrelmail.git] / functions / imap_messages.php
index 55932ca4cfbf470cd1b34a19cf664f3794a2d610..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)) {
@@ -90,6 +90,226 @@ function get_reference_header ($imap_stream, $message) {
        return $responses;
 }
 
+
+/* get sort order from server and
+ * return it as the $id array for
+ * mailbox_display
+ */
+function sqimap_get_sort_order ($imap_stream, $sort) {
+    global  $default_charset, $thread_sort_messages,
+            $internal_date_sort, $server_sort_array,
+            $sent_folder, $mailbox;
+            
+    if (session_is_registered('server_sort_array')) {
+        session_unregister('server_sort_array');
+    }
+    $sid = sqimap_session_id();
+    $sort_on = array();
+    $reverse = 0;
+    $server_sort_array = array();
+    $sort_test = array();
+    $sort_query = '';
+    $sort_on = array (0=> 'DATE',
+                      1=> 'DATE',
+                      2=> 'FROM',
+                      3=> 'FROM',
+                      4=> 'SUBJECT',
+                      5=> 'SUBJECT',
+                      6=> 'DATE');
+    if ($internal_date_sort == true) {
+        $sort_on[0] = 'ARRIVAL';
+        $sort_on[1] = 'ARRIVAL';
+    }
+    if ($sent_folder == $mailbox) {
+        $sort_on[2] = 'TO';
+        $sort_on[3] = 'TO';
+    }
+    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, false, $response, $message);
+    }
+    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;
+}
+       
+/* returns an indent array for printMessageinfo()
+   this represents the amount of indent needed (value)
+   for this message number (key)
+*/
+
+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]);
+        $thread_new[$i] = preg_split("/\|/", $thread_new[$i], -1, PREG_SPLIT_NO_EMPTY);
+    } 
+    $indent_array = array();
+        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];
+            }
+        }
+        $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;
+        $fake = FALSE;
+        for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
+            $chars = count_chars($thread_new[$i][$k], 1);
+            if (isset($chars['40'])) {       /* testing for ( */
+                $level = $level + $chars['40'];
+            }
+            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'])) {      /* 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);
+        }    
+    }
+    return $indent_array;
+}
+
+
+/* returns an array with each element as a string
+   representing one message thread as returned by
+   the IMAP server
+*/
+
+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');
+    }
+    if (session_is_registered('server_sort_array')) {
+        session_unregister('server_srot_array');
+    }
+    $sid = sqimap_session_id();
+    $thread_temp = array ();
+    if ($sort_by_ref == 1) {
+        $sort_type = 'REFERENCES';
+    }
+    else {
+        $sort_type = 'ORDEREDSUBJECT';
+    }
+    $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, 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;
+    $thread_new = array();
+    $k = 0;
+    $thread_new[0] = "";
+    for ($i=0;$i<$char_count;$i++) {
+            if ($thread_temp[$i] != ')' && $thread_temp[$i] != '(') {
+                    $thread_new[$k] = $thread_new[$k] . $thread_temp[$i];
+            }
+            elseif ($thread_temp[$i] == '(') {
+                    $thread_new[$k] .= $thread_temp[$i];
+                    $counter++;
+            }
+            elseif ($thread_temp[$i] == ')') {
+                    if ($counter > 1) {
+                            $thread_new[$k] .= $thread_temp[$i];
+                            $counter = $counter - 1;
+                    }
+                    else {
+                            $thread_new[$k] .= $thread_temp[$i];
+                            $k++;
+                            $thread_new[$k] = "";
+                            $counter = $counter - 1;
+                    }
+            }
+    }
+    session_register('thread_new');
+    $thread_new = array_reverse($thread_new);
+    $thread_list = implode(" ", $thread_new);
+    $thread_list = str_replace("(", " ", $thread_list);
+    $thread_list = str_replace(")", " ", $thread_list);
+    $thread_list = preg_split("/\s/", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+    $server_sort_array = $thread_list;
+    session_register('server_sort_array');
+    return $thread_list;
+}
+
+
+
 function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
     global $squirrelmail_language, $color, $data_dir, $username;
 
@@ -100,7 +320,6 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
     $results = array();
     $read_list = array();
     $sizes_list = array();
-
     /*
      * We need to return the data in the same order as the caller supplied
      * in $msg_list, but IMAP servers are free to return responses in
@@ -392,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 */