From d4d1a2505dfa40c21b6268c352d790e3a4d8ee83 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 25 Apr 2009 14:38:59 -0400
Subject: [PATCH] - Fix attachment names encoding when charset isn't specified in attachment part (#1484969):    assume that the message charset or charset of the first part is better for attachment names   than detected by roundcube

---
 CHANGELOG                      |    1 +
 program/include/rcube_imap.php |   19 +++++++++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6f1bf30..e77f152 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Fix attachment names encoding when charset isn't specified in attachment part (#1484969)
 - Fix message normal priority problem (#1485820)
 - Fix autocomplete spinning wheel does not disappear (#1485804)
 - Added log_date_format option (#1485709)
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index e2b6c0d..6226c28 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -53,6 +53,7 @@
   var $delimiter = NULL;
   var $caching_enabled = FALSE;
   var $default_charset = 'ISO-8859-1';
+  var $struct_charset = NULL;
   var $default_folders = array('INBOX');
   var $default_folders_lc = array('inbox');
   var $fetch_add_headers = '';
@@ -1119,7 +1120,20 @@
       {
       $this->_msg_id = $msg_id;
       $headers = $this->get_headers($uid);
-      
+
+      // set message charset from message headers
+      if ($headers->charset)
+        $this->struct_charset = $headers->charset;
+      // ... or from first part headers
+      else if (is_array($structure[2]) && $structure[2][0] == 'charset')
+        $this->struct_charset = $structure[2][1];
+      else if (is_array($structure[0][2]) && $structure[0][2][0] == 'charset')
+        $this->struct_charset = $structure[0][2][1];
+      else if (is_array($structure[0][0][2]) && $structure[0][0][2][0] == 'charset')
+        $this->struct_charset = $structure[0][0][2][1];
+      else
+        $this->struct_charset = null;
+
       $struct = &$this->_structure_part($structure);
       $struct->headers = get_object_vars($headers);
 
@@ -1364,7 +1378,8 @@
     // decode filename
     if (!empty($filename_mime)) {
       $part->filename = rcube_imap::decode_mime_string($filename_mime, 
-        $part->charset ? $part->charset : rc_detect_encoding($filename_mime, $this->default_charset));
+        $part->charset ? $part->charset : $this->struct_charset ? $this->struct_charset :
+	    rc_detect_encoding($filename_mime, $this->default_charset));
       } 
     else if (!empty($filename_encoded)) {
       // decode filename according to RFC 2231, Section 4

--
Gitblit v1.9.1