summaryrefslogtreecommitdiff
path: root/program/include
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2011-10-03 13:13:44 +0000
committeralecpl <alec@alec.pl>2011-10-03 13:13:44 +0000
commit765fdeb5b5269f7647972046bac3d0054a6b7946 (patch)
tree8c949c61f76730fa9a38ba95be2c984f62446aa6 /program/include
parent56ec81cb6fafde1a662aac0a8feeb87e45b80bff (diff)
- Improved performance of draft saving by usage of APPENDUID response if available (skipped SEARCH call)
Diffstat (limited to 'program/include')
-rw-r--r--program/include/rcube_imap.php2
-rw-r--r--program/include/rcube_imap_generic.php39
2 files changed, 38 insertions, 3 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index f37cfdaf1..5eee8d6d3 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2531,7 +2531,7 @@ class rcube_imap
* @param string $headers Headers string if $message contains only the body
* @param boolean $is_file True if $message is a filename
*
- * @return boolean True on success, False on error
+ * @return int|bool Appended message UID or True on success, False on error
*/
function save_message($mailbox, &$message, $headers='', $is_file=false)
{
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index 8b99da486..a25413c11 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -310,6 +310,10 @@ class rcube_imap_generic
}
else {
$this->resultcode = null;
+ // parse response for [APPENDUID 1204196876 3456]
+ if (preg_match("/^\[APPENDUID [0-9]+ ([0-9,:*]+)\]/i", $str, $m)) {
+ $this->data['APPENDUID'] = $m[1];
+ }
}
$this->result = $str;
@@ -2498,8 +2502,18 @@ class rcube_imap_generic
return ($result == self::ERROR_OK);
}
+ /**
+ * Handler for IMAP APPEND command
+ *
+ * @param string $mailbox Mailbox name
+ * @param string $message Message content
+ *
+ * @return string|bool On success APPENDUID response (if available) or True, False on failure
+ */
function append($mailbox, &$message)
{
+ unset($this->data['APPENDUID']);
+
if (!$mailbox) {
return false;
}
@@ -2538,7 +2552,12 @@ class rcube_imap_generic
// Clear internal status cache
unset($this->data['STATUS:'.$mailbox]);
- return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK);
+ if ($this->parseResult($line, 'APPEND: ') != self::ERROR_OK)
+ return false;
+ else if (!empty($this->data['APPENDUID']))
+ return $this->data['APPENDUID'];
+ else
+ return true;
}
else {
$this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
@@ -2547,8 +2566,19 @@ class rcube_imap_generic
return false;
}
+ /**
+ * Handler for IMAP APPEND command.
+ *
+ * @param string $mailbox Mailbox name
+ * @param string $path Path to the file with message body
+ * @param string $headers Message headers
+ *
+ * @return string|bool On success APPENDUID response (if available) or True, False on failure
+ */
function appendFromFile($mailbox, $path, $headers=null)
{
+ unset($this->data['APPENDUID']);
+
if (!$mailbox) {
return false;
}
@@ -2615,7 +2645,12 @@ class rcube_imap_generic
// Clear internal status cache
unset($this->data['STATUS:'.$mailbox]);
- return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK);
+ if ($this->parseResult($line, 'APPEND: ') != self::ERROR_OK)
+ return false;
+ else if (!empty($this->data['APPENDUID']))
+ return $this->data['APPENDUID'];
+ else
+ return true;
}
else {
$this->setError(self::ERROR_COMMAND, "Unable to send command: $request");