ソースを参照

Fix for 636577.
Make subfolders of Sent/Drafts show To: instead of From:
(like Sent and Drafts do already).
Needs some UW verification but should work pretty well.

Erin Schnabel 22 年 前
コミット
a28c320c37
2 ファイル変更45 行追加19 行削除
  1. 41 14
      functions/imap_mailbox.php
  2. 4 5
      functions/mailbox_display.php

+ 41 - 14
functions/imap_mailbox.php

@@ -105,30 +105,41 @@ function readMailboxParent($haystack, $needle) {
     return( $ret );
 }
 
+/** 
+ * Check if $subbox is below the specified $parentbox
+ */
+function isBoxBelow( $subbox, $parentbox ) {
+    global $delimiter, $folder_prefix, $imap_server_type;
+
+    /* 
+     * Eliminate the obvious mismatch, where the 
+     * subfolder path is shorter than that of the potential parent
+     */
+    if ( strlen($subbox) < strlen($parentbox) ) {
+      return false;
+    }
 
-function isBoxBelow( $box2, $box1 ) {
-global $delimiter, $folder_prefix, $imap_server_type;
 	if ( $imap_server_type == 'uw' ) {
-		$boxs = $box2;
-		$i = strpos( $box1, $delimiter, strlen( $folder_prefix ) );
+		$boxs = $parentbox;
+		$i = strpos( $subbox, $delimiter, strlen( $folder_prefix ) );
 		if ( $i === false ) {
-			$i = strlen( $box2 );
+			$i = strlen( $parentbox );
 		}
 	} else {
-		if (substr($box2,0,strlen($box1)) == $box1) {
+		if (substr($parentbox,0,strlen($subbox)) == $subbox) {
 			return true;
 		}
-		$boxs = $box2 . $delimiter;
+		$boxs = $parentbox . $delimiter;
 		/* Skip next second delimiter */
-		$i = strpos( $box1, $delimiter );
-		$i = strpos( $box1, $delimiter, $i + 1  );
+		$i = strpos( $subbox, $delimiter );
+		$i = strpos( $subbox, $delimiter, $i + 1  );
 		if ( $i === false ) {
-			$i = strlen( $box2 );
+			$i = strlen( $parentbox );
 		} else {
 			$i++;
 		}
 	}
-	return ( substr( $box1, 0, $i ) == substr( $boxs, 0, $i ) );
+	return ( substr( $subbox, 0, $i ) == substr( $boxs, 0, $i ) );
 }
 
 /* Defines special mailboxes */
@@ -137,9 +148,7 @@ function isSpecialMailbox( $box ) {
            $move_to_trash, $move_to_sent, $save_as_draft;
 
     $ret = ( (strtolower($box) == 'inbox') ||
-             ( $move_to_trash && $trash_folder && isBoxBelow( $box, $trash_folder )) ||
-             ( $move_to_sent  && $sent_folder  && isBoxBelow( $box, $sent_folder  )) ||
-             ($save_as_draft && $box == $draft_folder ) );
+             isTrashMailbox($box) || isSentMailbox($box) || isDraftMailbox($box) );
 
     if ( !$ret ) {
         $ret = do_hook_function( 'special_mailbox', $box );
@@ -147,6 +156,24 @@ function isSpecialMailbox( $box ) {
     return $ret;
 }
 
+function isTrashMailbox ($box) {
+    global $trash_folder, $move_to_trash;
+    return $move_to_trash && $trash_folder &&
+           ( $box == $trash_folder || isBoxBelow($box, $trash_folder) );
+}
+
+function isSentMailbox($box) {
+   global $sent_folder, $move_to_sent;
+   return $move_to_sent && $sent_folder &&
+          ( $box == $sent_folder || isBoxBelow($box, $sent_folder) );
+}
+
+function isDraftMailbox($box) {
+   global $draft_folder, $save_as_draft;
+   return $save_as_draft &&
+          ( $box == $draft_folder || isBoxBelow($box, $draft_folder) );
+}
+
 /* Expunges a mailbox */
 function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true, $id='') {
     global $uid_support;

+ 4 - 5
functions/mailbox_display.php

@@ -1247,16 +1247,15 @@ function getEndMessage($start_msg, $show_num, $num_msgs) {
 }
 
 function handleAsSent($mailbox) {
-    global $sent_folder, $draft_folder, $handleAsSent_result;
-
+    global $handleAsSent_result;
+ 
     /* First check if this is the sent or draft folder. */
-    $handleAsSent_result = (($mailbox == $sent_folder)
-                             || ($mailbox == $draft_folder));
+    $handleAsSent_result = isSentMailbox($mailbox) || isDraftMailbox($mailbox);
 
     /* Then check the result of the handleAsSent hook. */
     do_hook('check_handleAsSent_result', $mailbox);
 
     /* And return the result. */
-    return ($handleAsSent_result);
+    return $handleAsSent_result;
 }
 ?>