Add support for IMAP BINARY (RFC3516)

pull/51/head
Aleksander Machniak 12 years ago
parent d414cc05a3
commit 4f1c887eaa

@ -2226,10 +2226,11 @@ class rcube_imap extends rcube_storage
* @param boolean $is_file True if $message is a filename
* @param array $flags Message flags
* @param mixed $date Message internal date
* @param bool $binary Enables BINARY append
*
* @return int|bool Appended message UID or True on success, False on error
*/
public function save_message($folder, &$message, $headers='', $is_file=false, $flags = array(), $date = null)
public function save_message($folder, &$message, $headers='', $is_file=false, $flags = array(), $date = null, $binary = false)
{
if (!strlen($folder)) {
$folder = $this->folder;
@ -2247,10 +2248,10 @@ class rcube_imap extends rcube_storage
$date = $this->date_format($date);
if ($is_file) {
$saved = $this->conn->appendFromFile($folder, $message, $headers, $flags, $date);
$saved = $this->conn->appendFromFile($folder, $message, $headers, $flags, $date, $binary);
}
else {
$saved = $this->conn->append($folder, $message, $flags, $date);
$saved = $this->conn->append($folder, $message, $flags, $date, $binary);
}
if ($saved) {

@ -2548,10 +2548,11 @@ class rcube_imap_generic
* @param string $message Message content
* @param array $flags Message flags
* @param string $date Message internal date
* @param bool $binary Enable BINARY append (RFC3516)
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
function append($mailbox, &$message, $flags = array(), $date = null)
function append($mailbox, &$message, $flags = array(), $date = null, $binary = false)
{
unset($this->data['APPENDUID']);
@ -2559,8 +2560,13 @@ class rcube_imap_generic
return false;
}
$message = str_replace("\r", '', $message);
$message = str_replace("\n", "\r\n", $message);
$binary = $binary && $this->getCapability('BINARY');
$literal_plus = !$binary && $this->prefs['literal+'];
if (!$binary) {
$message = str_replace("\r", '', $message);
$message = str_replace("\n", "\r\n", $message);
}
$len = strlen($message);
if (!$len) {
@ -2573,12 +2579,12 @@ class rcube_imap_generic
if (!empty($date)) {
$request .= ' ' . $this->escape($date);
}
$request .= ' {' . $len . ($this->prefs['literal+'] ? '+' : '') . '}';
$request .= ' ' . ($binary ? '~' : '') . '{' . $len . ($literal_plus ? '+' : '') . '}';
// send APPEND command
if ($this->putLine($request)) {
// Do not wait when LITERAL+ is supported
if (!$this->prefs['literal+']) {
if (!$literal_plus) {
$line = $this->readReply();
if ($line[0] != '+') {
@ -2620,10 +2626,11 @@ class rcube_imap_generic
* @param string $headers Message headers
* @param array $flags Message flags
* @param string $date Message internal date
* @param bool $binary Enable BINARY append (RFC3516)
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
function appendFromFile($mailbox, $path, $headers=null, $flags = array(), $date = null)
function appendFromFile($mailbox, $path, $headers=null, $flags = array(), $date = null, $binary = false)
{
unset($this->data['APPENDUID']);
@ -2654,18 +2661,21 @@ class rcube_imap_generic
$len += strlen($headers) + strlen($body_separator);
}
$binary = $binary && $this->getCapability('BINARY');
$literal_plus = !$binary && $this->prefs['literal+'];
// build APPEND command
$key = $this->nextTag();
$request = "$key APPEND " . $this->escape($mailbox) . ' (' . $this->flagsToStr($flags) . ')';
if (!empty($date)) {
$request .= ' ' . $this->escape($date);
}
$request .= ' {' . $len . ($this->prefs['literal+'] ? '+' : '') . '}';
$request .= ' ' . ($binary ? '~' : '') . '{' . $len . ($literal_plus ? '+' : '') . '}';
// send APPEND command
if ($this->putLine($request)) {
// Don't wait when LITERAL+ is supported
if (!$this->prefs['literal+']) {
if (!$literal_plus) {
$line = $this->readReply();
if ($line[0] != '+') {

Loading…
Cancel
Save