From 3f9edb4c3ec29b5b807d99da479333b62a406686 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Fri, 13 Jan 2006 12:14:38 -0500
Subject: [PATCH] Switched to full UTF-8 support

---
 program/include/rcube_shared.inc          |   10 +--
 program/include/main.inc                  |   92 ++++++++++++------------------
 program/steps/mail/func.inc               |    8 +-
 program/steps/mail/sendmail.inc           |    6 --
 program/steps/settings/manage_folders.inc |    6 -
 program/js/app.js                         |    6 +
 program/include/rcube_imap.inc            |   46 ++++++++++++---
 7 files changed, 85 insertions(+), 89 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index e40ab09..ab11911 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -289,7 +289,7 @@
 // init output object for GUI and add common scripts
 function load_gui()
   {
-  global $CONFIG, $OUTPUT, $COMM_PATH, $JS_OBJECT_NAME, $CHARSET, $sess_user_lang;
+  global $CONFIG, $OUTPUT, $COMM_PATH, $JS_OBJECT_NAME, $sess_user_lang;
 
   // init output page
   $OUTPUT = new rcube_html_page();
@@ -307,14 +307,9 @@
 
   // set user-selected charset
   if (!empty($CONFIG['charset']))
-    {
     $OUTPUT->set_charset($CONFIG['charset']);
-    $CHARSET = $CONFIG['charset'];
-    }
   else
-    {
     rcmail_set_locale($sess_user_lang);
-    }
 
   // add some basic label to client
   rcube_add_label('loading');
@@ -324,10 +319,8 @@
 // set localization charset based on the given language
 function rcmail_set_locale($lang)
   {
-  global $OUTPUT, $CHARSET;
-
-  $CHARSET = rcube_language_prop($lang, 'charset');
-  $OUTPUT->set_charset($CHARSET);
+  global $OUTPUT;
+  $OUTPUT->set_charset(rcube_language_prop($lang, 'charset'));
   }
 
 
@@ -704,39 +697,46 @@
 
 
 
-// decode characters from any charset to UTF-8
-function decode_specialchars($input, $charset='')
+// convert a string from one charset to another
+// this function is not complete and not tested well
+function rcube_charset_convert($str, $from, $to=NULL)
   {
-  global $CHARSET;
-  $charset = strtolower($charset);
+  $from = strtolower($from);
+  $to = $to==NULL ? strtolower($GLOBALS['CHARSET']) : strtolower($to);
   
-  if ($charset=='utf-7')
-    $output = UTF7DecodeString($input);
-  else if ($charset=='utf-8' && $CHARSET!='UTF-8' && function_exists('utf8_decode'))
-    $output = utf8_decode($input);
-  else if ($charset=="koi8-r")
-    $output = convert_cyr_string($input, 'k', 'w');
-  else if ($charset=="iso8859-5")
-    $output = convert_cyr_string($input, 'i', 'w');
-  else if ($charset=="x-cp866")
-    $output = convert_cyr_string($input, 'a', 'w');
-  else if ($charset=="x-mac-cyrillic")
-    $output = convert_cyr_string($input, 'm', 'w');
-  else
-    $output = $input;
-    
-  // encode string for output
-  if ($CHARSET=='UTF-8' && $charset!='utf-8' && function_exists('utf8_encode'))
-    $output = utf8_encode($output);
+  if ($from==$to)
+    return $str;
+  
+  // decode characters
+  if ($from=='utf-7')
+    $str = UTF7DecodeString($str);
+  else if ($from=='utf-8' && function_exists('utf8_decode'))
+    $str = utf8_decode($str);
+  else if ($from=="koi8-r")
+    $str = convert_cyr_string($str, 'k', 'i');
+  else if ($from=="windows-1251" || $from=="win-1251")
+    $str = convert_cyr_string($str, 'w', 'i');
+  else if ($from=="x-cp866")
+    $str = convert_cyr_string($str, 'a', 'i');
+  else if ($from=="x-mac-cyrillic")
+    $str = convert_cyr_string($str, 'm', 'i');
 
-  return $output;
+  // encode string for output
+  if ($to=='utf-8' && function_exists('utf8_encode'))
+    return utf8_encode($str);
+  else if ($to=='utf-7')
+    return UTF7EncodeString($str);
+
+  // return raw string
+  return $str;
   }
+
 
 
 // replace specials characters to a specific encoding type
 function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   {
-  global $OUTPUT_TYPE, $CHARSET;
+  global $OUTPUT_TYPE, $OUTPUT;
   static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table;
 
   if (!$enctype)
@@ -794,7 +794,7 @@
       $rtf_rep_table[Chr($c)] = "\\'$hex";
       $xml_rep_table[Chr($c)] = "&#$c;";
       
-      if ($CHARSET=='ISO-8859-1')
+      if ($OUTPUT->get_charset()=='ISO-8859-1')
         $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex);
       }
 
@@ -818,26 +818,6 @@
   return $str;
   }
 
-
-// convert a string from one charset to another
-// this function is not complete and not tested well
-function rcube_charset_convert($str, $from, $to)
-  {
-  $charset = strtolower($to);
-  
-  if (strtolower($from)==$charset)
-    return $str;
-  
-  $str = decode_specialchars($str, $from);
-  
-  if ($charset=='utf-8' && function_exists('utf8_encode'))
-    return utf8_encode($str);
-  else if ($charset=='utf-7')
-    return UTF7EncodeString($str);
-
-  return $str;
-  }
-  
 
 
 // ************** template parsing and gui functions **************
@@ -1022,7 +1002,7 @@
         else if (isset($GLOBALS['PAGE_TITLE']))
           $title .= $GLOBALS['PAGE_TITLE'];
         else if ($task=='mail' && ($mbox_name = $IMAP->get_mailbox_name()))
-          $title .= $OUTPUT->encode_string(UTF7DecodeString($mbox_name));
+          $title .= rcube_charset_convert($mbox_name, 'UTF-7', 'UTF-8');
         else
           $title .= $task;
           
diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc
index 7b71dc0..eb02115 100644
--- a/program/include/rcube_imap.inc
+++ b/program/include/rcube_imap.inc
@@ -70,7 +70,7 @@
    */
   function __construct($db_conn)
     {
-    $this->db = $db_conn;    
+    $this->db = $db_conn;
     }
 
 
@@ -376,14 +376,28 @@
     }
 
 
-  // get message count for a specific mailbox; acceptes modes are: ALL, UNSEEN, RECENT
+  /**
+   * Get message count for a specific mailbox
+   *
+   * @param   string   Mailbox/folder name
+   * @param   string   Mode for count [ALL|UNSEEN|RECENT]
+   * @param   boolean  Force reading from server and update cache
+   * @return  number   Number of messages
+   * @access  public   
+   */
   function messagecount($mbox='', $mode='ALL', $force=FALSE)
     {
     $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox;
     return $this->_messagecount($mailbox, $mode, $force);
     }
 
-  // private method for getting nr of mesages
+
+  /**
+   * Private method for getting nr of messages
+   *
+   * @access  private
+   * @see     rcube_imap::messagecount
+   */
   function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
     {
     $a_mailbox_cache = FALSE;
@@ -442,8 +456,17 @@
     }
 
 
-  // public method for listing headers
-  // convert mailbox name with root dir first
+  /**
+   * Public method for listing headers
+   * convert mailbox name with root dir first
+   *
+   * @param   string   Mailbox/folder name
+   * @param   number   Current page to list
+   * @param   string   Header field to sort by
+   * @param   string   Sort order [ASC|DESC]
+   * @return  array    Indexed array with message header objects
+   * @access  public   
+   */
   function list_headers($mbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
     {
     $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox;
@@ -451,7 +474,12 @@
     }
 
 
-  // private method for listing message header
+  /**
+   * Private method for listing message header
+   *
+   * @access  private
+   * @see     rcube_imap::list_headers
+   */
   function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
     {
     if (!strlen($mailbox))
@@ -1548,10 +1576,10 @@
         $rest = quoted_printable_decode($rest);
         }
 
-      return decode_specialchars($rest, $a[0]);
+      return rcube_charset_convert($rest, $a[0]);
       }
     else
-      return $str;    //we dont' know what to do with this  
+      return $str;    // we dont' know what to do with this  
     }
 
 
@@ -1599,7 +1627,7 @@
   function charset_decode($body, $ctype_param)
     {
     if (is_array($ctype_param) && !empty($ctype_param['charset']))
-      return decode_specialchars($body, $ctype_param['charset']);
+      return rcube_charset_convert($body, $ctype_param['charset']);
 
     return $body;
     }
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index b622203..a36458b 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -88,13 +88,9 @@
     $this->charset = $charset;
     }
     
-    
-  function encode_string($str)
+  function get_charset()
     {
-    if ($this->charset=='UTF-8' && function_exists('utf8_encode'))
-      return utf8_encode($str);
-    else
-      return $str;
+    return $this->charset;
     }
 
 
@@ -187,7 +183,7 @@
     // correct absolute pathes in images and other tags
     $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
   
-    print $output;
+    print rcube_charset_convert($output, 'UTF-8', $this->charset);
     }
     
     
diff --git a/program/js/app.js b/program/js/app.js
index 4ed77fb..ad91e1f 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -232,8 +232,10 @@
       this.display_message(this.pending_message[0], this.pending_message[1]);
       
     // start interval for keep-alive/recent_check signal
-    if (this.kepp_alive_interval)
-      this.kepp_alive_int = setInterval(this.ref+'.'+(this.task=='mail'?'check_for_recent()':'send_keep_alive()'), this.kepp_alive_interval);
+    if (this.kepp_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
+      this.kepp_alive_int = setInterval(this.ref+'.check_for_recent()', this.kepp_alive_interval);
+    else
+      this.kepp_alive_int = setInterval(this.ref+'.send_keep_alive()', this.kepp_alive_interval);
     };
 
 
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 4c6e56a..f05193d 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -21,8 +21,6 @@
 
 require_once('lib/html2text.inc');
 require_once('lib/enriched.inc');
-require_once('lib/utf8.inc');
-require_once('lib/utf7.inc');
 
 
 $EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i';
@@ -148,7 +146,7 @@
   if (!isset($arrFolders[$currentFolder]))
     {
     $arrFolders[$currentFolder] = array('id' => $path,
-                                        'name' => UTF7DecodeString($currentFolder),
+                                        'name' => rcube_charset_convert($currentFolder, 'UTF-7'),
                                         'folders' => array());
     }
 
@@ -174,7 +172,7 @@
       $foldername = rcube_label($folder_lc);
     else
       {
-      $foldername = $OUTPUT->encode_string($folder['name']);
+      $foldername = $folder['name'];
 
       // shorten the folder name to a given length
       if ($maxlength && $maxlength>1)
@@ -242,7 +240,7 @@
       $foldername = rcube_label($folder_lc);
     else
       {
-      $foldername = $OUTPUT->encode_string($folder['name']);
+      $foldername = $folder['name'];
       
       // shorten the folder name to a given length
       if ($maxlength && $maxlength>1)
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index ee27818..ab0c6ed 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -80,9 +80,6 @@
 $input_charset = $CHARSET;
 $message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset;
 
-// unset global var
-$CHARSET = '';
-
 $mailto_regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m');
 $mailto_replace = array(', ', ', ', '');
 
@@ -242,9 +239,6 @@
     $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
   }
 
-
-// resore page charset
-$CHARSET = $input_charset;
 
 // return to compose page if sending failed
 if (!$sent)
diff --git a/program/steps/settings/manage_folders.inc b/program/steps/settings/manage_folders.inc
index 0702ce9..c98de39 100644
--- a/program/steps/settings/manage_folders.inc
+++ b/program/steps/settings/manage_folders.inc
@@ -19,8 +19,6 @@
 
 */
 
-require_once('lib/utf7.inc');
-
 // init IAMP connection
 rcmail_imap_init(TRUE);
 
@@ -53,7 +51,7 @@
 
   if ($create && $_GET['_remote'])
     {
-    $commands = sprintf("this.add_folder_row('%s')", $OUTPUT->encode_string(rep_specialchars_output($create, 'js')));
+    $commands = sprintf("this.add_folder_row('%s')", rep_specialchars_output($create, 'js'));
     rcube_remote_response($commands);
     }
   else if (!$create && $_GET['_remote'])
@@ -129,7 +127,7 @@
     $out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td><td>%s</td><td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>',
                     $i+1,
                     $zebra_class,
-                    $OUTPUT->encode_string(rep_specialchars_output(UTF7DecodeString($folder), 'html', 'all')),
+                    rep_specialchars_output(rcube_charset_convert($folder, 'UTF-7', 'UTF-8'), 'html', 'all'),
                     $checkbox_subscribe->show(in_array($folder, $a_subscribed)?$folder:'', array('value' => $folder)),
                     $JS_OBJECT_NAME,
                     $folder_js,

--
Gitblit v1.9.1