split mailbox_display in functions. Added UID support, adapt it to make is
[squirrelmail.git] / functions / imap_search.php
index 2c4ebbaf8720eee8ca7cb86755e6bd22fc178305..fa2b6a95e6fbbcd280991bc12c9e0f6d93c8eb49 100644 (file)
@@ -21,8 +21,7 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
                        $color, $search_position = '', $search_all, $count_all) {
 
     global $msgs, $message_highlight_list, $squirrelmail_language, $languages,
-           $index_order, $pos;
-
+           $index_order, $pos, $allow_charset_search, $imap_server_type;
     $pos = $search_position;
 
     $urlMailbox = urlencode($mailbox);
@@ -33,15 +32,31 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
     $search_what  = ereg_replace('[ ]{2,}', ' ', $search_what);
     $multi_search = explode(' ', $search_what);
     $search_string = '';
-    foreach ($multi_search as $multi_search_part) {
-        $search_string .= $search_where . ' {' . strlen($multi_search_part)
-            . "}\r\n" . $multi_search_part . ' ';
-    }
 
+    /* it seems macosx does not support the prefered search 
+       syntax so we fall back to the older style. This IMAP
+       server has a problem with multiple search terms. Instead
+       of returning the messages that match all the terms it
+       returns the messages that match each term. Could be fixed
+       on the client side, but should be fixed on the server
+       as per the RFC */
+       
+    if ($imap_server_type == 'macosx') {
+        foreach ($multi_search as $multi_search_part) {
+            $search_string .= $search_where . ' ' .$multi_search_part. ' ';
+        }
+    }
+    else {
+        foreach ($multi_search as $multi_search_part) {
+            $search_string .= $search_where . ' {' . strlen($multi_search_part)
+                . "}\r\n" . $multi_search_part . ' ';
+        }
+    }
+    
     $search_string = trim($search_string);
 
     /* now use $search_string in the imap search */
-    if (isset($languages[$squirrelmail_language]['CHARSET']) &&
+    if ($allow_charset_search && isset($languages[$squirrelmail_language]['CHARSET']) &&
         $languages[$squirrelmail_language]['CHARSET']) {
         $ss = "SEARCH CHARSET "
             . strtoupper($languages[$squirrelmail_language]['CHARSET']) 
@@ -51,7 +66,7 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
     }
 
     /* read data back from IMAP */
-    $readin = sqimap_run_command($imapConnection, $ss, true, $result, $message);
+    $readin = sqimap_run_command($imapConnection, $ss, false, $result, $message);
 
     /* try US-ASCII charset if search fails */
     if (isset($languages[$squirrelmail_language]['CHARSET']) 
@@ -98,7 +113,8 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
     }
     $issent = ($mailbox == $sent_folder);
     $hdr_list = sqimap_get_small_header_list($imapConnection, $id, $issent);
-    $flags = sqimap_get_flags_list($imapConnection, $id, $issent);
+//    $flags = sqimap_get_flags_list($imapConnection, $id, $issent);
+
     foreach ($hdr_list as $hdr) {
         $from[] = $hdr->from;
         $date[] = $hdr->date;
@@ -108,6 +124,10 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
         $cc[] = $hdr->cc;
         $size[] = $hdr->size;
         $type[] = $hdr->type0;
+       $flag_deleted[] = $hdr->flag_deleted;
+       $flag_answered[] = $hdr->flag_answered;
+       $flag_seen[] = $hdr->flag_seen;
+       $flag_flagged[] = $hdr->flag_flagged;
     }
 
     $j = 0;
@@ -127,7 +147,11 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
             $messages[$j]["CC"] = $cc[$j];
             $messages[$j]["SIZE"] = $size[$j];
             $messages[$j]["TYPE0"] = $type[$j];
-
+           $messages[$j]['FLAG_DELETED'] = $flag_deleted[$j];
+            $messages[$j]['FLAG_ANSWERED'] = $flag_answered[$j];
+            $messages[$j]['FLAG_SEEN'] = $flag_seen[$j];
+            $messages[$j]['FLAG_FLAGGED'] = $flag_flagged[$j];
+/*
             $num = 0;
             while ($num < count($flags[$j])) {
                 if ($flags[$j][$num] == 'Deleted') {
@@ -141,7 +165,9 @@ function sqimap_search($imapConnection, $search_where, $search_what, $mailbox,
                 }
                 $num++;
             }
+*/         
             $j++;
+
     }
 
     /* Find and remove the ones that are deleted */