From 0b2ce91f25aed4c174c437e679155d30bd0387bf Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Fri, 05 Jun 2009 12:13:24 -0400 Subject: [PATCH] - Reviewed/fixed skip_deleted/read_when_deleted/flag_for_deletion options handling in UI --- program/include/rcube_imap.php | 129 +++++++++++------------------------------- 1 files changed, 35 insertions(+), 94 deletions(-) diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 6d44efb..7b24d23 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -303,7 +303,7 @@ if (is_array($str) && $msgs == null) list($str, $msgs, $charset, $sort_field) = $str; if ($msgs != null && !is_array($msgs)) - $msgs = split(',', $msgs); + $msgs = explode(',', $msgs); $this->search_string = $str; $this->search_set = $msgs; @@ -1156,7 +1156,7 @@ { $struct = new rcube_message_part; $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count"; - + // multipart if (is_array($part[0])) { @@ -1178,18 +1178,19 @@ // fetch message headers if message/rfc822 or named part (could contain Content-Location header) if (strtolower($part[$i][0]) == 'message' || (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL'))) { - $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.$i+1 : $i+1; + $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1; } - + // pre-fetch headers of all parts (in one command for better performance) if ($part_headers) $part_headers = iil_C_FetchMIMEHeaders($this->conn, $this->mailbox, $this->_msg_id, $part_headers); $struct->parts = array(); for ($i=0, $count=0; $i<count($part); $i++) - if (is_array($part[$i]) && count($part[$i]) > 3) + if (is_array($part[$i]) && count($part[$i]) > 3) { $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id, - $part_headers[$struct->mime_id ? $struck->mime_id.'.'.$i+1 : $i+1]); + $part_headers[$struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1]); + } return $struct; } @@ -1518,25 +1519,28 @@ * * @param mixed Message UIDs as array or as comma-separated string * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT + * @param string Folder name * @return boolean True on success, False on failure */ - function set_flag($uids, $flag) + function set_flag($uids, $flag, $mbox_name=NULL) { + $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox; + $flag = strtoupper($flag); if (!is_array($uids)) $uids = explode(',',$uids); if ($flag=='UNDELETED') - $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', $uids)); + $result = iil_C_Undelete($this->conn, $mailbox, join(',', $uids)); else if ($flag=='UNSEEN') - $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', $uids)); + $result = iil_C_Unseen($this->conn, $mailbox, join(',', $uids)); else if ($flag=='UNFLAGGED') - $result = iil_C_UnFlag($this->conn, $this->mailbox, join(',', $uids), 'FLAGGED'); + $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), 'FLAGGED'); else - $result = iil_C_Flag($this->conn, $this->mailbox, join(',', $uids), $flag); + $result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag); // reload message headers if cached - $cache_key = $this->mailbox.'.msg'; + $cache_key = $mailbox.'.msg'; if ($this->caching_enabled) { foreach ($uids as $uid) @@ -1553,11 +1557,11 @@ // clear message count cache if ($result && $flag=='SEEN') - $this->_set_messagecount($this->mailbox, 'UNSEEN', $count*(-1)); + $this->_set_messagecount($mailbox, 'UNSEEN', $count*(-1)); else if ($result && $flag=='UNSEEN') - $this->_set_messagecount($this->mailbox, 'UNSEEN', $count); + $this->_set_messagecount($mailbox, 'UNSEEN', $count); else if ($result && $flag=='DELETED') - $this->_set_messagecount($this->mailbox, 'ALL', $count*(-1)); + $this->_set_messagecount($mailbox, 'ALL', $count*(-1)); return $result; } @@ -1623,13 +1627,9 @@ // send expunge command in order to have the moved message // really deleted from the source mailbox if ($moved) { - // but only when flag_for_deletion is set to false - if (!rcmail::get_instance()->config->get('flag_for_deletion', false)) - { - $this->_expunge($from_mbox, FALSE); - $this->_clear_messagecount($from_mbox); - $this->_clear_messagecount($to_mbox); - } + $this->_expunge($from_mbox, FALSE, $a_uids); + $this->_clear_messagecount($from_mbox); + $this->_clear_messagecount($to_mbox); } // moving failed else if (rcmail::get_instance()->config->get('delete_always', false)) { @@ -1685,7 +1685,7 @@ // really deleted from the mailbox if ($deleted) { - $this->_expunge($mailbox, FALSE); + $this->_expunge($mailbox, FALSE, $a_uids); $this->_clear_messagecount($mailbox); unset($this->uid_id_map[$mailbox]); } @@ -1765,11 +1765,20 @@ * Send IMAP expunge command and clear cache * * @see rcube_imap::expunge() + * @param string Mailbox name + * @param boolean False if cache should not be cleared + * @param string List of UIDs to remove, separated by comma + * @return boolean True on success * @access private */ - function _expunge($mailbox, $clear_cache=TRUE) + function _expunge($mailbox, $clear_cache=TRUE, $uids=NULL) { - $result = iil_C_Expunge($this->conn, $mailbox); + if ($uids && $this->get_capability('UIDPLUS')) + $a_uids = is_array($uids) ? join(',', $uids) : $uids; + else + $a_uids = NULL; + + $result = iil_C_Expunge($this->conn, $mailbox, $a_uids); if ($result>=0 && $clear_cache) { @@ -2759,7 +2768,7 @@ if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p]) $a_defaults[$p] = $folder; else - $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF-7')); + $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP')); } // sort folders and place defaults on the top @@ -3063,71 +3072,3 @@ return $posa - $posb; } } - - -/** - * Add quoted-printable encoding to a given string - * - * @param string String to encode - * @param int Add new line after this number of characters - * @param boolean True if spaces should be converted into =20 - * @return string Encoded string - */ -function quoted_printable_encode($input, $line_max=76, $space_conv=false) - { - $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); - $lines = preg_split("/(?:\r\n|\r|\n)/", $input); - $eol = "\r\n"; - $escape = "="; - $output = ""; - - while( list(, $line) = each($lines)) - { - //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary - $linlen = strlen($line); - $newline = ""; - for($i = 0; $i < $linlen; $i++) - { - $c = substr( $line, $i, 1 ); - $dec = ord( $c ); - if ( ( $i == 0 ) && ( $dec == 46 ) ) // convert first point in the line into =2E - { - $c = "=2E"; - } - if ( $dec == 32 ) - { - if ( $i == ( $linlen - 1 ) ) // convert space at eol only - { - $c = "=20"; - } - else if ( $space_conv ) - { - $c = "=20"; - } - } - else if ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) // always encode "\t", which is *not* required - { - $h2 = floor($dec/16); - $h1 = floor($dec%16); - $c = $escape.$hex["$h2"].$hex["$h1"]; - } - - if ( (strlen($newline) + strlen($c)) >= $line_max ) // CRLF is not counted - { - $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay - $newline = ""; - // check if newline first character will be point or not - if ( $dec == 46 ) - { - $c = "=2E"; - } - } - $newline .= $c; - } // end of for - $output .= $newline.$eol; - } // end of while - - return trim($output); - } - - -- Gitblit v1.9.1