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 boolean $is_file True if $message is a filename
* @param array $flags Message flags * @param array $flags Message flags
* @param mixed $date Message internal date * @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 * @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)) { if (!strlen($folder)) {
$folder = $this->folder; $folder = $this->folder;
@ -2247,10 +2248,10 @@ class rcube_imap extends rcube_storage
$date = $this->date_format($date); $date = $this->date_format($date);
if ($is_file) { if ($is_file) {
$saved = $this->conn->appendFromFile($folder, $message, $headers, $flags, $date); $saved = $this->conn->appendFromFile($folder, $message, $headers, $flags, $date, $binary);
} }
else { else {
$saved = $this->conn->append($folder, $message, $flags, $date); $saved = $this->conn->append($folder, $message, $flags, $date, $binary);
} }
if ($saved) { if ($saved) {

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

Loading…
Cancel
Save