Corrected display (on Courier at least) of mailboxes with INBOX
[squirrelmail.git] / functions / imap_mailbox.php
index f13bae916ebd45aaca1df4982175f719d4890edf..6da2548a7d9151dead9d0d198b6cb6e29c623c18 100755 (executable)
@@ -188,7 +188,7 @@ function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true,
 
 /* Checks whether or not the specified mailbox exists */
 function sqimap_mailbox_exists ($imap_stream, $mailbox) {
-    if (!isset($mailbox)) {
+    if (!isset($mailbox) || empty($mailbox)) {
         return false;
     }
     $mbx = sqimap_run_command($imap_stream, "LIST \"\" \"$mailbox\"",
@@ -419,18 +419,29 @@ function user_strcasecmp($a, $b) {
  *   $folder_skip - array of folders to keep out of option list (compared in lower)
  *   $boxes - list of already fetched boxes (for places like folder panel, where
  *            you know these options will be shown 3 times in a row.. (most often unset).
+ *   $flag - flag to check for in mailbox flags, used to filter out mailboxes.
+ *           'noselect' by default to remove unselectable mailboxes.
+ *           'noinferiors' used to filter out folders that can not contain subfolders.
+ *           NULL to avoid flag check entirely.
+ *   $use_long_format - override folder display preference and always show full folder name.
  */
-function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_skip = 0, $boxes = 0 ) {
+function sqimap_mailbox_option_list($imap_stream, $show_selected = 0, $folder_skip = 0, $boxes = 0, 
+                                    $flag = 'noselect', $use_long_format = false ) {
     global $username, $data_dir;
     $mbox_options = '';
 
-    $shorten_box_names = getPref($data_dir, $username, 'mailbox_select_style', SMPREF_OFF);
+    if ( $use_long_format ) {
+        $shorten_box_names = 0;
+    } else {
+        $shorten_box_names = getPref($data_dir, $username, 'mailbox_select_style', SMPREF_OFF);
+    }
 
     if ($boxes == 0) {
         $boxes = sqimap_mailbox_list($imap_stream);
     }
+
     foreach ($boxes as $boxes_part) {
-        if (!in_array('noselect', $boxes_part['flags'])) {
+        if ($flag == NULL || !in_array($flag, $boxes_part['flags'])) {
             $box = $boxes_part['unformatted'];
             $lowerbox = strtolower($box);
 
@@ -725,13 +736,6 @@ function sqimap_mailbox_tree($imap_stream) {
                 $lsub_ary[$i] = $regs[1] . '"' . addslashes(trim($lsub_ary[$i])) . '"' . $regs[2];
             }
 
-            /*
-            if (preg_match("/^\*\s+LSUB\s+\((.*)\)\s+\"(.*)\"\s+\"?(.+(?=\")|.+).*$/",$lsub_ary[$i],$regs)) {
-                $flag = $regs[1];
-                $mbx = trim($regs[3]);
-                $sorted_lsub_ary[] = array ('mbx' => $mbx, 'flag' => $flag); 
-            }
-            */
             $mbx = find_mailbox_name($lsub_ary[$i]);
             $noselect = check_is_noselect($lsub_ary[$i]);
             if (substr($mbx, -1) == $delimiter) {
@@ -767,28 +771,18 @@ function sqimap_mailbox_tree($imap_stream) {
                 $mbx = substr($mbx, 0, strlen($mbx) - 1);
             }
             if ($mbx == 'INBOX') {
-                $sorted_lsub_ary[] = array ('mbx' => $mbx, 'flag' => ''); 
+                $sorted_lsub_ary[] = array ('mbx' => $mbx, 'noselect' => '0'); 
                 sqimap_subscribe($imap_stream, 'INBOX');
                 $cnt++;
             }
-
-            /*
-            if (preg_match("/^\*\s+LIST\s+\((.*)\)\s+\"(.*)\"\s+\"?(.+(?=\")|.+).*$/",$inbox_ary[0],$regs)) {
-                $flag = $regs[1];
-                $mbx = trim($regs[3]);
-                if (substr($mbx, -1) == $delimiter) {
-                    $mbx = substr($mbx, 0, strlen($mbx) - 1);
-                }
-                $sorted_lsub_ary[] = array ('mbx' => $mbx, 'flag' => $flag); 
-            }
-            */
         }
+
         for ($i = 0 ; $i < $cnt; $i++) {
             $mbx = $sorted_lsub_ary[$i]['mbx'];
             if (($unseen_notify == 2 && $mbx == 'INBOX') ||
                 ($unseen_notify == 3) ||
                 ($move_to_trash && ($mbx == $trash_folder))) {
-                if($sorted_lsub_ary[$i]['noselect']) {
+                if( $sorted_lsub_ary[$i]['noselect'] ) {
                     $sorted_lsub_ary[$i]['unseen'] = 0;
                 } else {
                     $sorted_lsub_ary[$i]['unseen'] = 
@@ -844,6 +838,11 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) {
             $mailbox = $mbx_ary[$i]['mbx'];
             switch ($mailbox) {
                 case 'INBOX':
+                    // $mailboxes IS the INBOX, change $mbx to refer to $mailboxes
+                    // for unread count, attribute setting, etc.
+                    unset($mbx);
+                    $mbx =& $mailboxes;
+
                     $mbx->is_inbox = true;
                     $mbx->is_special = true;
                     break;
@@ -877,10 +876,12 @@ function sqimap_fill_mailbox_tree($mbx_ary, $mbxs=false) {
                 $mbx->mailboxname_sub = $mbx_ary[$i]['mbx'];
             }
             $mbx->mailboxname_full = $mbx_ary[$i]['mbx'];
-            $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first);
+
+            // Don't add INBOX to itself
+            if ( $mailbox != 'INBOX' )
+                $mailboxes->addMbx($mbx, $delimiter, $start, $list_special_folders_first);
         }
     }
-
     return $mailboxes;
 }