From bc404ffd41c3411510a022ae5b0c9f2bfe8f5db1 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Thu, 11 Mar 2010 17:44:43 -0500 Subject: [PATCH] Save draft information in one header; finally fixes #1486203 --- program/steps/mail/compose.inc | 19 ++++++++++++++----- program/steps/mail/func.inc | 24 ++++++++++++++++++++++++ program/lib/imap.inc | 2 +- program/steps/mail/sendmail.inc | 9 ++++++--- 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/program/lib/imap.inc b/program/lib/imap.inc index 2316e40..1a6a7ac 100644 --- a/program/lib/imap.inc +++ b/program/lib/imap.inc @@ -1451,7 +1451,7 @@ $request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC "; $request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID "; $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY "; - $request .= "X-REPLY-UID X-FORWARD-UID".$add.")])"; + $request .= "X-DRAFT-INFO".$add.")])"; if (!iil_PutLine($fp, $request)) { return false; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 36a3529..a5b0a34 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -151,18 +151,27 @@ if (!empty($_SESSION['compose']['param']['all'])) $MESSAGE->reply_all = 1; - + $OUTPUT->set_env('compose_mode', 'reply'); } else if ($compose_mode == RCUBE_COMPOSE_DRAFT) { - if($MESSAGE->headers->in_reply_to) + if ($MESSAGE->headers->others['x-draft-info']) { // get reply_uid/forward_uid to flag the original message when sending - $_SESSION['compose']['reply_uid'] = $MESSAGE->headers->others['x-reply-uid']; - $_SESSION['compose']['forward_uid'] = $MESSAGE->headers->others['x-forward-uid']; - $_SESSION['compose']['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>'; + $info = rcmail_draftinfo_decode($MESSAGE->headers->others['x-draft-info']); + + if ($info['type'] == 'reply') + $_SESSION['compose']['reply_uid'] = $info['uid']; + else if ($info['type'] == 'forward') + $_SESSION['compose']['forward_uid'] = $info['uid']; + + $_SESSION['compose']['mailbox'] = $info['folder']; } + + if ($MESSAGE->headers->in_reply_to) + $_SESSION['compose']['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>'; + $_SESSION['compose']['references'] = $MESSAGE->headers->references; } else if ($compose_mode == RCUBE_COMPOSE_FORWARD) diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 101a978..3f2ac02 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1288,6 +1288,30 @@ } +function rcmail_draftinfo_encode($p) +{ + $parts = array(); + foreach ($p as $key => $val) + $parts[] = $key . '=' . ($key == 'folder' ? base64_encode($val) : $val); + + return join('; ', $parts); +} + + +function rcmail_draftinfo_decode($str) +{ + $info = array(); + foreach (preg_split('/;\s+/', $str) as $part) { + list($key, $val) = explode('=', $part, 2); + if ($key == 'folder') + $val = base64_decode($val); + $info[$key] = $val; + } + + return $info; +} + + function rcmail_message_part_controls() { global $MESSAGE; diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index acff62d..13210be 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -313,12 +313,12 @@ if (!empty($_SESSION['compose']['reply_msgid'])) $headers['In-Reply-To'] = $_SESSION['compose']['reply_msgid']; - + // remember reply/forward UIDs in special headers if (!empty($_SESSION['compose']['reply_uid']) && $savedraft) - $headers['X-Reply-UID'] = $_SESSION['compose']['reply_uid']; + $headers['X-Draft-Info'] = array('type' => 'reply', 'uid' => $_SESSION['compose']['reply_uid']); else if (!empty($_SESSION['compose']['forward_uid']) && $savedraft) - $headers['X-Forward-UID'] = $_SESSION['compose']['forward_uid']; + $headers['X-Draft-Info'] = array('type' => 'forward', 'uid' => $_SESSION['compose']['forward_uid']); if (!empty($_SESSION['compose']['references'])) $headers['References'] = $_SESSION['compose']['references']; @@ -341,6 +341,9 @@ $headers['Message-ID'] = $message_id; $headers['X-Sender'] = $from; +if (is_array($headers['X-Draft-Info'])) + $headers['X-Draft-Info'] = rcmail_draftinfo_encode($headers['X-Draft-Info'] + array('folder' => $_SESSION['compose']['mailbox'])); + if (!empty($CONFIG['useragent'])) $headers['User-Agent'] = $CONFIG['useragent']; -- Gitblit v1.9.1