alecpl
2009-07-12 99a4539170b87fbf665e4b6d8884f79d28903007
program/include/rcube_imap.php
@@ -537,13 +537,14 @@
   * @param   int      Current page to list
   * @param   string   Header field to sort by
   * @param   string   Sort order [ASC|DESC]
   * @param   boolean  Number of slice items to extract from result array
   * @return  array    Indexed array with message header objects
   * @access  public   
   */
  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
    {
    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order);
    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order, false, $slice);
    }
@@ -553,14 +554,14 @@
   * @access  private
   * @see     rcube_imap::list_headers
   */
  private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
  private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE, $slice=0)
    {
    if (!strlen($mailbox))
      return array();
    // use saved message set
    if ($this->search_string && $mailbox == $this->mailbox)
      return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order);
      return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order, $slice);
    $this->_set_sort_order($sort_field, $sort_order);
@@ -573,13 +574,16 @@
      {
      $start_msg = ($page-1) * $this->page_size;
      $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
      return array_values($a_msg_headers);
      $result = array_values($a_msg_headers);
      if ($slice)
        $result = array_slice($result, -$slice, $slice);
      return $result;
      }
    // cache is dirty, sync it
    else if ($this->caching_enabled && $cache_status==-1 && !$recursive)
      {
      $this->sync_header_index($mailbox);
      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE);
      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE, $slice);
      }
    // retrieve headers from IMAP
@@ -590,6 +594,9 @@
      list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
      $max = max($msg_index);
      $msg_index = array_slice($msg_index, $begin, $end-$begin);
      if ($slice)
        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
      // fetch reqested headers from server
      $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key);
@@ -606,6 +613,9 @@
      $max = max($msg_index);
      list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
      $msg_index = array_slice($msg_index, $begin, $end-$begin);
      if ($slice)
        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
      // fetch reqested headers from server
      $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
@@ -641,11 +651,12 @@
   * @param   int      Current page to list
   * @param   string   Header field to sort by
   * @param   string   Sort order [ASC|DESC]
   * @param   boolean  Number of slice items to extract from result array
   * @return  array    Indexed array with message header objects
   * @access  private
   * @see     rcube_imap::list_header_set()
   */
  private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL)
  private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
    {
    if (!strlen($mailbox) || empty($this->search_set))
      return array();
@@ -676,6 +687,9 @@
      // get messages uids for one page
      $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
      if ($slice)
        $msgs = array_slice($msgs, -$slice, $slice);
      // fetch headers
      $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
@@ -692,6 +706,8 @@
   $a_index = $this->message_index('', $this->sort_field, $this->sort_order);
        // get messages uids for one page...
        $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size));
        if ($slice)
          $msgs = array_slice($msgs, -$slice, $slice);
   // ...and fetch headers
        $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
@@ -717,7 +733,11 @@
        $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
      
        // only return the requested part of the set
        return array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
   $a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
        if ($slice)
          $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice);
        return $a_msg_headers;
        }
      }
    }
@@ -1015,14 +1035,6 @@
      }
    else
      $a_messages = iil_C_Search($this->conn, $mailbox, ($charset ? "CHARSET $charset " : '') . $criteria);
    // clean message list (there might be some empty entries)
    if (is_array($a_messages))
      {
      foreach ($a_messages as $i => $val)
        if (empty($val))
          unset($a_messages[$i]);
      }
    
    // update messagecount cache ?
//    $a_mailbox_cache = get_cache('messagecount');
@@ -1112,21 +1124,16 @@
      return $headers->structure;
    }
    // resolve message sequence number
    if (!($msg_id = $this->_uid2id($uid))) {
      return FALSE;
    }
    if (!$structure_str)
      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id);
      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true);
    $structure = iml_GetRawStructureArray($structure_str);
    $struct = false;
    // parse structure and add headers
    if (!empty($structure))
      {
      $this->_msg_id = $msg_id;
      $headers = $this->get_headers($uid);
      $this->_msg_id = $headers->id;
      // set message charset from message headers
      if ($headers->charset)
@@ -1147,7 +1154,7 @@
      // write structure to cache
      if ($this->caching_enabled)
        $this->add_message_cache($cache_key, $msg_id, $headers, $struct);
        $this->add_message_cache($cache_key, $this->_msg_id, $headers, $struct);
      }
    return $struct;
@@ -1264,7 +1271,7 @@
    // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
    if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) {
      if (empty($raw_headers))
        $raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id);
        $raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $struct->mime_id);
      $struct->headers = $this->_parse_headers($raw_headers) + $struct->headers;
    }
@@ -1307,7 +1314,7 @@
      // we must fetch and parse headers "manually"
      if ($i<2) {
   if (!$headers)
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id);
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
        $filename_mime = '';
        $i = 0;
        while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@@ -1324,7 +1331,7 @@
      }
      if ($i<2) {
   if (!$headers)
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id);
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
        $filename_encoded = '';
        $i = 0; $matches = array();
        while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@@ -1341,7 +1348,7 @@
      }
      if ($i<2) {
   if (!$headers)
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id);
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
        $filename_mime = '';
        $i = 0; $matches = array();
        while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@@ -1358,7 +1365,7 @@
      }
      if ($i<2) {
   if (!$headers)
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id);
          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
        $filename_encoded = '';
        $i = 0; $matches = array();
        while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@@ -1422,14 +1429,15 @@
   */
  function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL)
    {
    if (!($msg_id = $this->_uid2id($uid)))
      return FALSE;
    // get part encoding if not provided
    if (!is_object($o_part))
      {
      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id);
      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true);
      $structure = iml_GetRawStructureArray($structure_str);
      // error or message not found
      if (empty($structure))
        return false;
      $part_type = iml_GetPartTypeCode($structure, $part);
      $o_part = new rcube_message_part;
      $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other');
@@ -1441,9 +1449,9 @@
    if (!$part) $part = 'TEXT';
    $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part,
    $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, $part,
        $o_part->encoding, $print, $fp);
    if ($fp || $print)
      return true;
@@ -1483,10 +1491,7 @@
   */
  function &get_raw_body($uid)
    {
    if (!($msg_id = $this->_uid2id($uid)))
      return FALSE;
    return iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id);
    return iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true);
    }
@@ -1498,12 +1503,7 @@
   */
  function &get_raw_headers($uid)
    {
    if (!($msg_id = $this->_uid2id($uid)))
      return FALSE;
    $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
    return $headers;
    return iil_C_FetchPartHeader($this->conn, $this->mailbox, $uid, true);
    }
    
@@ -1514,10 +1514,7 @@
   */ 
  function print_raw_body($uid)
    {
    if (!($msg_id = $this->_uid2id($uid)))
      return FALSE;
    iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, NULL, true);
    iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, NULL, NULL, true);
    }