thomascube
2006-01-13 3f9edb4c3ec29b5b807d99da479333b62a406686
Switched to full UTF-8 support


7 files modified
174 ■■■■ changed files
program/include/main.inc 92 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap.inc 46 ●●●● patch | view | raw | blame | history
program/include/rcube_shared.inc 10 ●●●●● patch | view | raw | blame | history
program/js/app.js 6 ●●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 8 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 6 ●●●●● patch | view | raw | blame | history
program/steps/settings/manage_folders.inc 6 ●●●●● patch | view | raw | blame | history
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;
          
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;
    }
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);
    }
    
    
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);
    };
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)
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)
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,