Support IMAP MOVE extension [RFC 6851]

pull/60/merge
Aleksander Machniak 12 years ago
parent 32da699830
commit d9dc320a40

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Support IMAP MOVE extension [RFC 6851]
- Fix javascript errors when working in a page opened with taget="_blank"
- Mention SQLite database format change in UPGRADING file (#1488983)
- Increase maxlength to 254 chars for email input fields in addressbook (#1488987)

@ -2333,10 +2333,7 @@ class rcube_imap extends rcube_storage
// move messages
$moved = $this->conn->move($uids, $from_mbox, $to_mbox);
// send expunge command in order to have the moved message
// really deleted from the source folder
if ($moved) {
$this->expunge_message($uids, $from_mbox, false);
$this->clear_messagecount($from_mbox);
$this->clear_messagecount($to_mbox);
}

@ -1065,8 +1065,8 @@ class rcube_imap_generic
/**
* Executes EXPUNGE command
*
* @param string $mailbox Mailbox name
* @param string $messages Message UIDs to expunge
* @param string $mailbox Mailbox name
* @param string|array $messages Message UIDs to expunge
*
* @return boolean True on success, False on error
*/
@ -1084,10 +1084,13 @@ class rcube_imap_generic
// Clear internal status cache
unset($this->data['STATUS:'.$mailbox]);
if ($messages)
$result = $this->execute('UID EXPUNGE', array($messages), self::COMMAND_NORESPONSE);
else
if (!empty($messages) && $messages != '*' && $this->hasCapability('UIDPLUS')) {
$messages = self::compressMessageSet($messages);
$result = $this->execute('UID EXPUNGE', array($messages), self::COMMAND_NORESPONSE);
}
else {
$result = $this->execute('EXPUNGE', null, self::COMMAND_NORESPONSE);
}
if ($result == self::ERROR_OK) {
$this->selected = null; // state has changed, need to reselect
@ -1980,7 +1983,6 @@ class rcube_imap_generic
/**
* Moves message(s) from one folder to another.
* Original message(s) will be marked as deleted.
*
* @param string|array $messages Message UID(s)
* @param string $from Mailbox name
@ -1999,14 +2001,39 @@ class rcube_imap_generic
return false;
}
$r = $this->copy($messages, $from, $to);
// use MOVE command (RFC 6851)
if ($this->hasCapability('MOVE')) {
// Clear last COPYUID data
unset($this->data['COPYUID']);
if ($r) {
// Clear internal status cache
unset($this->data['STATUS:'.$to]);
unset($this->data['STATUS:'.$from]);
return $this->flag($from, $messages, 'DELETED');
$r = $this->execute('UID MOVE', array(
$this->compressMessageSet($messages), $this->escape($to)),
self::COMMAND_NORESPONSE);
}
// use COPY + STORE +FLAGS.SILENT \Deleted + EXPUNGE
else {
$r = $this->copy($messages, $from, $to);
if ($r) {
// Clear internal status cache
unset($this->data['STATUS:'.$from]);
$r = $this->flag($from, $messages, 'DELETED');
if ($messages == '*') {
// CLOSE+SELECT should be faster than EXPUNGE
$this->close();
}
else {
$this->expunge($from, $messages);
}
}
}
return $r;
}
@ -3502,7 +3529,7 @@ class rcube_imap_generic
// if less than 255 bytes long, let's not bother
if (!$force && strlen($messages)<255) {
return $messages;
}
}
// see if it's already been compressed
if (strpos($messages, ':') !== false) {

Loading…
Cancel
Save