alecpl
2009-04-14 f86e8f5faa0fb5926001f2dccd970e031e7cb59a
program/include/rcube_imap.php
@@ -26,6 +26,7 @@
 */
require_once('lib/imap.inc');
require_once('lib/mime.inc');
require_once('lib/tnef_decoder.inc');
/**
@@ -954,11 +955,11 @@
    $results = $this->_search_index($mailbox, $str, $charset, $sort_field);
    // try search with ISO charset (should be supported by server)
    // try search with US-ASCII charset (should be supported by server)
    // only if UTF-8 search is not supported
    if (empty($results) && !is_array($results) && !empty($charset) && $charset!='ISO-8859-1')
    if (empty($results) && !is_array($results) && !empty($charset) && $charset!='US-ASCII')
      {
   // convert strings to ISO-8859-1
   // convert strings to US_ASCII
        if(preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE))
     {
     $last = 0; $res = '';
@@ -966,7 +967,8 @@
       {
       $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n
       $string = substr($str, $string_offset - 1, $m[0]);
       $string = rcube_charset_convert($string, $charset, 'ISO-8859-1');
       $string = rcube_charset_convert($string, $charset, 'US-ASCII');
       if (!$string) continue;
       $res .= sprintf("%s{%d}\r\n%s", substr($str, $last, $m[1] - $last - 1), strlen($string), $string);
       $last = $m[0] + $string_offset - 1;
       }
@@ -976,7 +978,7 @@
   else // strings for conversion not found
     $res = $str;
     
   $results = $this->search($mbox_name, $res, 'ISO-8859-1', $sort_field);
   $results = $this->search($mbox_name, $res, 'US-ASCII', $sort_field);
      }
    $this->set_search_set($str, $results, $charset, $sort_field);
@@ -1602,7 +1604,7 @@
    $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox;
    // make sure mailbox exists
    if (!in_array($to_mbox, $this->_list_mailboxes()))
    if ($to_mbox != 'INBOX' && !in_array($to_mbox, $this->_list_mailboxes()))
      {
      if (in_array($to_mbox_in, $this->default_folders))
        $this->create_mailbox($to_mbox_in, TRUE);
@@ -2492,6 +2494,40 @@
    
    return $out;
    }
  /**
   * Decode a Microsoft Outlook TNEF part (winmail.dat)
   *
   * @param object rcube_message_part Message part to decode
   * @param string UID of the message
   * @return array List of rcube_message_parts extracted from windmail.dat
   */
  function tnef_decode(&$part, $uid)
  {
    if (!isset($part->body))
      $part->body = $this->get_message_part($uid, $part->mime_id, $part);
    $pid = 0;
    $tnef_parts = array();
    $tnef_arr = tnef_decode($part->body);
    foreach ($tnef_arr as $winatt) {
      $tpart = new rcube_message_part;
      $tpart->filename = $winatt["name"];
      $tpart->encoding = 'stream';
      $tpart->ctype_primary = $winatt["type0"];
      $tpart->ctype_secondary = $winatt["type1"];
      $tpart->mimetype = strtolower($winatt["type0"] . "/" . $winatt["type1"]);
      $tpart->mime_id = "winmail." . $part->mime_id . ".$pid";
      $tpart->size = $winatt["size"];
      $tpart->body = $winatt['stream'];
      $tnef_parts[] = $tpart;
      $pid++;
    }
    return $tnef_parts;
  }
  /**
@@ -2923,13 +2959,13 @@
  function _parse_address_list($str, $decode=true)
    {
    // remove any newlines and carriage returns before
    $a = $this->_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
    $a = rcube_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
    $result = array();
    foreach ($a as $key => $val)
      {
      $val = preg_replace("/([\"\w])</", "$1 <", $val);
      $sub_a = $this->_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
      $sub_a = rcube_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
      $result[$key]['name'] = '';
      foreach ($sub_a as $k => $v)
@@ -2947,29 +2983,6 @@
        $result[$key]['address'] = $result[$key]['name'];
      }
    
    return $result;
    }
  /**
   * @access private
   */
  function _explode_quoted_string($delimiter, $string)
    {
    $result = array();
    $strlen = strlen($string);
    for ($q=$p=$i=0; $i < $strlen; $i++)
    {
      if ($string{$i} == "\"" && $string{$i-1} != "\\")
        $q = $q ? false : true;
      else if (!$q && preg_match("/$delimiter/", $string{$i}))
      {
        $result[] = substr($string, $p, $i - $p);
        $p = $i + 1;
      }
    }
    $result[] = substr($string, $p);
    return $result;
    }