alecpl
2009-06-05 0b2ce91f25aed4c174c437e679155d30bd0387bf
program/include/rcube_imap.php
@@ -303,7 +303,7 @@
    if (is_array($str) && $msgs == null)
      list($str, $msgs, $charset, $sort_field) = $str;
    if ($msgs != null && !is_array($msgs))
      $msgs = split(',', $msgs);
      $msgs = explode(',', $msgs);
      
    $this->search_string = $str;
    $this->search_set = $msgs;
@@ -1156,7 +1156,7 @@
    {
    $struct = new rcube_message_part;
    $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count";
    // multipart
    if (is_array($part[0]))
      {
@@ -1178,18 +1178,19 @@
     // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
     if (strtolower($part[$i][0]) == 'message' ||
       (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL'))) {
       $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.$i+1 : $i+1;
       $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
       }
      // pre-fetch headers of all parts (in one command for better performance)
      if ($part_headers)
        $part_headers = iil_C_FetchMIMEHeaders($this->conn, $this->mailbox, $this->_msg_id, $part_headers);
      $struct->parts = array();
      for ($i=0, $count=0; $i<count($part); $i++)
        if (is_array($part[$i]) && count($part[$i]) > 3)
        if (is_array($part[$i]) && count($part[$i]) > 3) {
          $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id,
      $part_headers[$struct->mime_id ? $struck->mime_id.'.'.$i+1 : $i+1]);
      $part_headers[$struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1]);
   }
      return $struct;
      }
@@ -1433,44 +1434,19 @@
    if (!$part) $part = 'TEXT';
    if ($print)
      {
      $mode = $o_part->encoding == 'base64' ? 3 : ($o_part->encoding == 'quoted-printable' ? 1 : 2);
      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $mode);
    $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part,
        $o_part->encoding, $print, $fp);
      
      // we have to decode the part manually before printing
      if ($mode == 1)
        {
        echo $this->mime_decode($body, $o_part->encoding);
        $body = true;
        }
      }
    else
      {
      if ($fp && $o_part->encoding == 'base64')
        return iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 3, $fp);
      else
        $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1);
    if ($fp || $print)
      return true;
      // decode part body
      if ($o_part->encoding)
        $body = $this->mime_decode($body, $o_part->encoding);
    // convert charset (if text or message part)
    if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') {
      // assume default if no charset specified
      if (empty($o_part->charset))
        $o_part->charset = $this->default_charset;
      // convert charset (if text or message part)
      if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message')
        {
        // assume default if no charset specified
        if (empty($o_part->charset))
          $o_part->charset = $this->default_charset;
        $body = rcube_charset_convert($body, $o_part->charset);
        }
      if ($fp)
        {
        fwrite($fp, $body);
        return true;
        }
      $body = rcube_charset_convert($body, $o_part->charset);
      }
    
    return $body;
@@ -1487,8 +1463,7 @@
  function &get_body($uid, $part=1)
    {
    $headers = $this->get_headers($uid);
    return rcube_charset_convert(
      $this->mime_decode($this->get_message_part($uid, $part), 'quoted-printable'),
    return rcube_charset_convert($this->get_message_part($uid, $part, NULL),
      $headers->charset ? $headers->charset : $this->default_charset);
    }
@@ -1535,7 +1510,7 @@
    if (!($msg_id = $this->_uid2id($uid)))
      return FALSE;
    iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 2);
    iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, NULL, true);
    }
@@ -1544,25 +1519,28 @@
   *
   * @param mixed  Message UIDs as array or as comma-separated string
   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
   * @param string Folder name
   * @return boolean True on success, False on failure
   */
  function set_flag($uids, $flag)
  function set_flag($uids, $flag, $mbox_name=NULL)
    {
    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
    $flag = strtoupper($flag);
    if (!is_array($uids))
      $uids = explode(',',$uids);
      
    if ($flag=='UNDELETED')
      $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', $uids));
      $result = iil_C_Undelete($this->conn, $mailbox, join(',', $uids));
    else if ($flag=='UNSEEN')
      $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', $uids));
      $result = iil_C_Unseen($this->conn, $mailbox, join(',', $uids));
    else if ($flag=='UNFLAGGED')
      $result = iil_C_UnFlag($this->conn, $this->mailbox, join(',', $uids), 'FLAGGED');
      $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), 'FLAGGED');
    else
      $result = iil_C_Flag($this->conn, $this->mailbox, join(',', $uids), $flag);
      $result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag);
    // reload message headers if cached
    $cache_key = $this->mailbox.'.msg';
    $cache_key = $mailbox.'.msg';
    if ($this->caching_enabled)
      {
      foreach ($uids as $uid)
@@ -1579,11 +1557,11 @@
    // clear message count cache
    if ($result && $flag=='SEEN')
      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count*(-1));
      $this->_set_messagecount($mailbox, 'UNSEEN', $count*(-1));
    else if ($result && $flag=='UNSEEN')
      $this->_set_messagecount($this->mailbox, 'UNSEEN', $count);
      $this->_set_messagecount($mailbox, 'UNSEEN', $count);
    else if ($result && $flag=='DELETED')
      $this->_set_messagecount($this->mailbox, 'ALL', $count*(-1));
      $this->_set_messagecount($mailbox, 'ALL', $count*(-1));
    return $result;
    }
@@ -1649,13 +1627,9 @@
    // send expunge command in order to have the moved message
    // really deleted from the source mailbox
    if ($moved) {
      // but only when flag_for_deletion is set to false
      if (!rcmail::get_instance()->config->get('flag_for_deletion', false))
        {
        $this->_expunge($from_mbox, FALSE);
        $this->_clear_messagecount($from_mbox);
        $this->_clear_messagecount($to_mbox);
        }
      $this->_expunge($from_mbox, FALSE, $a_uids);
      $this->_clear_messagecount($from_mbox);
      $this->_clear_messagecount($to_mbox);
    }
    // moving failed
    else if (rcmail::get_instance()->config->get('delete_always', false)) {
@@ -1711,7 +1685,7 @@
    // really deleted from the mailbox
    if ($deleted)
      {
      $this->_expunge($mailbox, FALSE);
      $this->_expunge($mailbox, FALSE, $a_uids);
      $this->_clear_messagecount($mailbox);
      unset($this->uid_id_map[$mailbox]);
      }
@@ -1791,11 +1765,20 @@
   * Send IMAP expunge command and clear cache
   *
   * @see rcube_imap::expunge()
   * @param string    Mailbox name
   * @param boolean    False if cache should not be cleared
   * @param string    List of UIDs to remove, separated by comma
   * @return boolean True on success
   * @access private
   */
  function _expunge($mailbox, $clear_cache=TRUE)
  function _expunge($mailbox, $clear_cache=TRUE, $uids=NULL)
    {
    $result = iil_C_Expunge($this->conn, $mailbox);
    if ($uids && $this->get_capability('UIDPLUS'))
      $a_uids = is_array($uids) ? join(',', $uids) : $uids;
    else
      $a_uids = NULL;
    $result = iil_C_Expunge($this->conn, $mailbox, $a_uids);
    if ($result>=0 && $clear_cache)
      {
@@ -2665,10 +2648,6 @@
    {
    switch (strtolower($encoding))
      {
      case '7bit':
        return $input;
        break;
      case 'quoted-printable':
        return quoted_printable_decode($input);
        break;
@@ -2676,7 +2655,15 @@
      case 'base64':
        return base64_decode($input);
        break;
      case 'x-uuencode':
      case 'x-uue':
      case 'uue':
      case 'uuencode':
        return convert_uudecode($input);
        break;
      case '7bit':
      default:
        return $input;
      }
@@ -2781,7 +2768,7 @@
      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
        $a_defaults[$p] = $folder;
      else
        $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF-7'));
        $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP'));
      }
    // sort folders and place defaults on the top
@@ -3085,71 +3072,3 @@
      return $posa - $posb;
   }
}
/**
 * Add quoted-printable encoding to a given string
 *
 * @param string   String to encode
 * @param int      Add new line after this number of characters
 * @param boolean  True if spaces should be converted into =20
 * @return string Encoded string
 */
function quoted_printable_encode($input, $line_max=76, $space_conv=false)
  {
  $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
  $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
  $eol = "\r\n";
  $escape = "=";
  $output = "";
  while( list(, $line) = each($lines))
    {
    //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
    $linlen = strlen($line);
    $newline = "";
    for($i = 0; $i < $linlen; $i++)
      {
      $c = substr( $line, $i, 1 );
      $dec = ord( $c );
      if ( ( $i == 0 ) && ( $dec == 46 ) ) // convert first point in the line into =2E
        {
        $c = "=2E";
        }
      if ( $dec == 32 )
        {
        if ( $i == ( $linlen - 1 ) ) // convert space at eol only
          {
          $c = "=20";
          }
        else if ( $space_conv )
          {
          $c = "=20";
          }
        }
      else if ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) )  // always encode "\t", which is *not* required
        {
        $h2 = floor($dec/16);
        $h1 = floor($dec%16);
        $c = $escape.$hex["$h2"].$hex["$h1"];
        }
      if ( (strlen($newline) + strlen($c)) >= $line_max )  // CRLF is not counted
        {
        $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
        $newline = "";
        // check if newline first character will be point or not
        if ( $dec == 46 )
          {
          $c = "=2E";
          }
        }
      $newline .= $c;
      } // end of for
    $output .= $newline.$eol;
    } // end of while
  return trim($output);
  }