From 8cc8ec794a4111845258794961df8cb093ab2b3f Mon Sep 17 00:00:00 2001 From: stekkel Date: Sat, 22 May 2004 20:39:10 +0000 Subject: [PATCH] Another big update: 1) do not do a search 1:* UID request in case we do not sort. That isn't needed, just use a non uid fetch and request the UID together with the rest of the headers. 2) Started on adding envelope parsing to sqimap_get_small_header list so we can remove the imap related code from the messages class. 2) cleaned up the functions in mailbox_display, don't use trillions of arguments when you can provide an array as well. 3) adapted right_main.php and search.php to fit the adapted functions in mailbox_display I hope the code makes more sense now an is easier to understand so that we can start on separating the logic from the html output and prepare for templates. Volunteers? git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@7518 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- functions/imap_messages.php | 146 ++- functions/mailbox_display.php | 521 ++++----- src/right_main.php | 52 +- src/search.php | 1887 +++++++++++++++++---------------- 4 files changed, 1389 insertions(+), 1217 deletions(-) diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 53d89680..6dfb53b5 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -556,14 +556,17 @@ function parseArray($read,&$i) { function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $aHeaderFields = array('Date', 'To', 'Cc', 'From', 'Subject', 'X-Priority', 'Content-Type'), - $aFetchItems = array('FLAGS', 'UID', 'RFC822.SIZE', 'INTERNALDATE')) { - - global $squirrelmail_language, $color, $data_dir, $username, $imap_server_type; - global $allow_server_sort; + $aFetchItems = array('FLAGS', 'RFC822.SIZE', 'INTERNALDATE')) { $messages = array(); $read_list = array(); + if (array_search('UID',$aFetchItems,true) !== false) { + $bUidFetch = false; + } else { + $bUidFetch = true; + } + /* Get the small headers for each message in $msg_list */ if ($show_num != '999999' && $show_num != '*' ) { $msgs_str = sqimap_message_list_squisher($msg_list); @@ -572,8 +575,10 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, * in $msg_list, but IMAP servers are free to return responses in * whatever order they wish... So we need to re-sort manually */ - for ($i = 0; $i < sizeof($msg_list); $i++) { - $messages["$msg_list[$i]"] = array(); + if ($bUidFetch) { + for ($i = 0; $i < sizeof($msg_list); $i++) { + $messages["$msg_list[$i]"] = array(); + } } } else { $msgs_str = '1:*'; @@ -585,10 +590,6 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, * Create the query */ - $internaldate = getPref($data_dir, $username, 'internal_date_sort'); - if (($i = array_search('INTERNALDATE',$aFetchItems,true)) !== false && $internaldate == false) { - unset($aFetchItems[$i]); - } $sFetchItems = ''; $query = "FETCH $msgs_str ("; if (count($aFetchItems)) { @@ -599,7 +600,8 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $sFetchItems .= ' BODY.PEEK[HEADER.FIELDS ('.$sHeaderFields.')]'; } $query .= trim($sFetchItems) . ')'; - $read_list = sqimap_run_command_list ($imap_stream, $query, true, $response, $message, TRUE); + + $read_list = sqimap_run_command_list ($imap_stream, $query, true, $response, $message, $bUidFetch); $i = 0; foreach ($read_list as $r) { @@ -615,13 +617,8 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, $id = substr($read,2,$i_space-2); $fetch = substr($read,$i_space+1,5); if (!is_numeric($id) && $fetch !== 'FETCH') { - set_up_language($squirrelmail_language); - echo '
' . - _("ERROR : Could not complete request.") . - '
' . - _("Unknown response from IMAP server: ") . ' 1.' . - htmlspecialchars($read) . "

\n"; - break; + $msg['ERROR'] = $read; // htmlspecialchars should be done just before display. this is backend code + break; } $i = strpos($read,'(',$i_space+5); $read = substr($read,$i+1); @@ -670,6 +667,12 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, break 3; } + break; + case 'ENVELOPE': + break; // to be implemented, moving imap code out of the nessages class + sqimap_parse_address($read,$i,$msg); + break; // to be implemented, moving imap code out of the nessages class + case 'BODYSTRUCTURE': break; case 'INTERNALDATE': $msg['INTERNALDATE'] = str_replace(' ', ' ',parseString($read,$i)); @@ -732,6 +735,113 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $show_num=false, return $messages; } +function sqimap_parse_envelope($read, &$i, &$msg) { + $arg_no = 0; + $arg_a = array(); + ++$i; + for ($cnt = strlen($read); ($i < $cnt) && ($read{$i} != ')'); ++$i) { + $char = strtoupper($read{$i}); + switch ($char) { + case '{': + case '"': + $arg_a[] = parseString($read,$i); + ++$arg_no; + break; + case 'N': + /* probably NIL argument */ + if (strtoupper(substr($read, $i, 3)) == 'NIL') { + $arg_a[] = ''; + ++$arg_no; + $i += 2; + } + break; + case '(': + /* Address structure (with group support) + * Note: Group support is useless on SMTP connections + * because the protocol doesn't support it + */ + $addr_a = array(); + $group = ''; + $a=0; + for (; $i < $cnt && $read{$i} != ')'; ++$i) { + if ($read{$i} == '(') { + $addr = sqimap_parse_address($read, $i); + if (($addr[3] == '') && ($addr[2] != '')) { + /* start of group */ + $group = $addr[2]; + $group_addr = $addr; + $j = $a; + } else if ($group && ($addr[3] == '') && ($addr[2] == '')) { + /* end group */ + if ($a == ($j+1)) { /* no group members */ + $group_addr[4] = $group; + $group_addr[2] = ''; + $group_addr[0] = "$group: Undisclosed recipients;"; + $addr_a[] = $group_addr; + $group =''; + } + } else { + $addr[4] = $group; + $addr_a[] = $addr; + } + ++$a; + } + } + $arg_a[] = $addr_a; + break; + default: break; + } + } + + if (count($arg_a) > 9) { + $d = strtr($arg_a[0], array(' ' => ' ')); + $d = explode(' ', $d); + if (!$arg_a[1]) $arg_1[1] = ''; + $msg['DATE'] = $d; /* argument 1: date */ + $msg['SUBJECT'] = $arg_a[1]; /* argument 2: subject */ + $msg['FROM'] = is_array($arg_a[2]) ? $arg_a[2][0] : ''; /* argument 3: from */ + $msg['SENDER'] = is_array($arg_a[3]) ? $arg_a[3][0] : ''; /* argument 4: sender */ + $msg['REPLY-TO'] = is_array($arg_a[4]) ? $arg_a[4][0] : ''; /* argument 5: reply-to */ + $msg['TO'] = $arg_a[5]; /* argument 6: to */ + $msg['CC'] = $arg_a[6]; /* argument 7: cc */ + $msg['BCC'] = $arg_a[7]; /* argument 8: bcc */ + $msg['IN-REPLY-TO'] = $arg_a[8]; /* argument 9: in-reply-to */ + $msg['MESSAGE-ID'] = $arg_a[9]; /* argument 10: message-id */ + } +} + +function sqimap_parse_address($read, &$i) { + $arg_a = array(); + for (; $read{$i} != ')'; ++$i) { + $char = strtoupper($read{$i}); + switch ($char) { + case '{': + case '"': $arg_a[] = parseString($read,$i); break; + case 'n': + case 'N': + if (strtoupper(substr($read, $i, 3)) == 'NIL') { + $arg_a[] = ''; + $i += 2; + } + break; + default: break; + } + } + + if (count($arg_a) == 4) { + return $arg_a; + +// $adr = new AddressStructure(); +// $adr->personal = $arg_a[0]; +// $adr->adl = $arg_a[1]; +// $adr->mailbox = $arg_a[2]; +// $adr->host = $arg_a[3]; + } else { + $adr = ''; + } + return $adr; +} + /** * Returns a message array with all the information about a message. * See the documentation folder for more information about this array. diff --git a/functions/mailbox_display.php b/functions/mailbox_display.php index fd0e4955..1b177cb4 100644 --- a/functions/mailbox_display.php +++ b/functions/mailbox_display.php @@ -27,6 +27,9 @@ require_once(SM_PATH . 'functions/forms.php'); */ define('PG_SEL_MAX', 10); +/** +* Sort constants used for sorting of messages +*/ define('SQSORT_NONE',0); define('SQSORT_DATE_ASC',1); define('SQSORT_DATE_DEC',2); @@ -60,19 +63,13 @@ function elapsed($start) { } /** -* Displays message listing +* Displays message header row in messages list * -* @param mixed $t UNDOCUMENTED -* @param bool $not_last UNDOCUMENTED -* @param mixed $key UNDOCUMENTED -* @param string $mailbox mail folder -* @param mixed $start_msg UNDOCUMENTED -* @param mixed $where UNDOCUMENTED -* @param mixed $what UNDOCUMENTED +* @param array $aMsg contains all message related parameters +* @return void */ -function printMessageInfo($t, $last=false, $msg, $mailbox, - $start_msg, $where, $what) { +function printMessageInfo($aMsg) { global $checkall, $color, $td_str, $default_use_priority, @@ -91,22 +88,35 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $color_string = $color[4]; // initialisation: - $sSubject = (isset($msg['SUBJECT']) && $msg['SUBJECT'] != '') ? $msg['SUBJECT'] : _("(no subject)"); - $sFrom = (isset($msg['FROM'])) ? $msg['FROM'] : _("Unknown sender"); - $sTo = (isset($msg['TO'])) ? $msg['TO'] : _("Unknown recipient"); - $sCc = (isset($msg['CC'])) ? $msg['CC'] : ''; - $aFlags = (isset($msg['FLAGS'])) ? $msg['FLAGS'] : array(); - $iPrio = (isset($msg['PRIORITY'])) ? $msg['PRIORITY'] : 3; - $iSize = (isset($msg['SIZE'])) ? $msg['SIZE'] : 0; - $sType0 = (isset($msg['TYPE0'])) ? $msg['TYPE0'] : 'text'; - $sType1 = (isset($msg['TYPE1'])) ? $msg['TYPE1'] : 'plain'; - $sDate = (isset($msg['DATE'])) ? getDateString(getTimeStamp(explode(' ',$msg['DATE']))) : ''; - $iId = (isset($msg['ID'])) ? $msg['ID'] : false; - - sqgetGlobalVar('indent_array',$indent_array,SQ_SESSION); - if (!$iId) { - return; - } + $mailbox = $aMsg['MAILBOX']; + $msg = $aMsg['HEADER']; + $t = $aMsg['INDX']; + $start_msg = $aMsg['PAGEOFFSET']; + $last = $aMsg['LAST']; + if (isset($aMsg['SEARCH']) && count($aMsg['SEARCH']) >1 ) { + $where = $aMsg['SEARCH'][0]; + $what = $aMsg['SEARCH'][1]; + } else { + $where = false; + $what = false; + } + + $sSubject = (isset($msg['SUBJECT']) && $msg['SUBJECT'] != '') ? $msg['SUBJECT'] : _("(no subject)"); + $sFrom = (isset($msg['FROM'])) ? $msg['FROM'] : _("Unknown sender"); + $sTo = (isset($msg['TO'])) ? $msg['TO'] : _("Unknown recipient"); + $sCc = (isset($msg['CC'])) ? $msg['CC'] : ''; + $aFlags = (isset($msg['FLAGS'])) ? $msg['FLAGS'] : array(); + $iPrio = (isset($msg['PRIORITY'])) ? $msg['PRIORITY'] : 3; + $iSize = (isset($msg['SIZE'])) ? $msg['SIZE'] : 0; + $sType0 = (isset($msg['TYPE0'])) ? $msg['TYPE0'] : 'text'; + $sType1 = (isset($msg['TYPE1'])) ? $msg['TYPE1'] : 'plain'; + $sDate = (isset($msg['DATE'])) ? getDateString(getTimeStamp(explode(' ',$msg['DATE']))) : ''; + $iId = (isset($msg['ID'])) ? $msg['ID'] : false; + + sqgetGlobalVar('indent_array',$indent_array,SQ_SESSION); + if (!$iId) { + return; + } if ($GLOBALS['alt_index_colors']) { if (!isset($row_count)) { @@ -132,9 +142,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $email_address = getPref($datadir, $username, 'email_address'); } $bHandleAsSent = ((isset($from_array[0][0])) && ($from_array[0][0] == $email_address)); - } - else + } else { $bHandleAsSent = $bSentFolder; + } // If this is a Sent message, display To address instead of From if ($bHandleAsSent) { $sFrom = $sTo; @@ -172,38 +182,41 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, $senderAddress = _("To:") . ' ' . $senderAddress; } - if ($truncate_sender > 0) - $senderName = truncateWithEntities($senderName, $truncate_sender); - - echo html_tag( 'tr','','','','VALIGN="top"') . "\n"; - - if (isset($aFlags['\\flagged']) && ($aFlags['\\flagged'] == true)) { - $flag = ""; - $flag_end = ''; - } else { - $flag = ''; - $flag_end = ''; + if ($truncate_sender > 0) { + $senderName = truncateWithEntities($senderName, $truncate_sender); } - if (!isset($aFlags['\\seen']) || ($aFlags['\\seen'] == false)) { - $bold = ''; - $bold_end = ''; - } else { - $bold = ''; - $bold_end = ''; + + $flag = $flag_end = $bold = $bold_end = $fontstr = $fontstr_end = $italic = $italic_end = ''; + $bold = ''; + $bold_end = ''; + + + + foreach ($aFlags as $sFlag => $value) { + switch ($sFlag) { + case '\\flagged': + if ($value) { + $flag = ""; + $flag_end = ''; + } + break; + case '\\seen': + if ($value) { + $bold = ''; + $bold_end = ''; + } + break; + case '\\deleted': + if ($value) { + $fontstr = ""; + $fontstr_end = ''; + } + break; + } } if ($bHandleAsSent) { $italic = ''; $italic_end = ''; - } else { - $italic = ''; - $italic_end = ''; - } - if (isset($aFlags['\\deleted']) && $aFlags['\\deleted']) { - $fontstr = ""; - $fontstr_end = ''; - } else { - $fontstr = ''; - $fontstr_end = ''; } if ($where && $what) { @@ -211,7 +224,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, } else { $searchstr = ''; } - + /* + * Message highlight code + */ $matches = array('TO' => 'sTo', 'CC' => 'sCc', 'FROM' => 'sFrom', 'SUBJECT' => 'sSubject'); if (is_array($message_highlight_list) && count($message_highlight_list)) { $sTo = parseAddress($sTo); @@ -251,18 +266,21 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, } } } - } + } /* end Message highlight code */ if (!isset($hlt_color)) { $hlt_color = $color_string; } $col = 0; $sSubject = str_replace(' ', ' ', decodeHeader($sSubject)); - if (isset($indent_array[$iId])) { + if (isset($indent_array[$iId])) { /* Thread sort */ $subject = processSubject($sSubject, $indent_array[$iId]); } else { $subject = processSubject($sSubject, 0); } + + echo html_tag( 'tr','','','','VALIGN="top"') . "\n"; + if (sizeof($index_order)) { foreach ($index_order as $index_order_part) { switch ($index_order_part) { @@ -276,9 +294,9 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, if ($senderAddress != $senderName) { $senderAddress = strtr($senderAddress, array_flip(get_html_translation_table(HTML_SPECIALCHARS))); $title = ' title="' . str_replace('"', "''", $senderAddress) . '"'; - } - else + } else { $title = ''; + } echo html_tag( 'td', $italic . $bold . $flag . $fontstr . $senderName . $fontstr_end . $flag_end . $bold_end . $italic_end, @@ -370,7 +388,6 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, 'nowrap' ); } - // plain text message markers // else { @@ -420,6 +437,7 @@ function printMessageInfo($t, $last=false, $msg, $mailbox, ++$col; } } + /* html for separationlines between rows */ if ($last) { echo ''."\n"; } else { @@ -479,7 +497,7 @@ function get_sorted_msgs_list($imapConnection,$sort,$mode,&$error) { $bDirection = ($sort % 2); $error = false; switch ($mode) { - case 'thread': + case 'THREAD': $id = get_thread_sort($imapConnection); if ($id === false) { $error = '
' . @@ -488,7 +506,7 @@ function get_sorted_msgs_list($imapConnection,$sort,$mode,&$error) { '
'; } break; - case 'server_sort': + case 'SERVER': $sSortField = getSortField($sort,true); $id = sqimap_get_sort_order($imapConnection, $sSortField, $bDirection); if ($id === false) { @@ -511,22 +529,17 @@ function get_sorted_msgs_list($imapConnection,$sort,$mode,&$error) { * and shows them to the user. * * @param mixed $imapConnection -* @param string $mailbox mail folder -* @param mixed $num_msgs -* @param mixed $start_msg -* @param mixed $sort -* @param mixed $color -* @param mixed $show_num -* @param mixed $use_cache -* @param mixed $mode +* @param array $aMailbox associative array with mailbox related vars */ -function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, - $start_msg, $sort, $color, $show_num, - $use_cache, $mode='',$mbxresponse) { - global $msgs, $msort, $auto_expunge, $thread_sort_messages,$server_sort_array, - $allow_server_sort, $server_sort_order; +function showMessagesForMailbox($imapConnection, $aMailbox) { + global $msgs, $server_sort_array; + + // to retrieve the internaldate pref: (I know this is not the right place to do that, move up in front + // and use a properties array as function argument to provide user preferences + global $data_dir, $username; + /* if there's no messages in this folder */ - if ($mbxresponse['EXISTS'] == 0) { + if ($aMailbox['EXISTS'] == 0) { $string = '' . _("THIS FOLDER IS EMPTY") . ''; echo ' '; echo ' @@ -651,46 +693,46 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, //echo("elapsed time = $t seconds\n"); } - /** -* Generic function to convert the msgs array into an HTML table. +* Function to map an uid list with a msg header array by uid +* The mapped headers are printed with printMessage +* aMailbox parameters contains info about the page we are on, the +* used search criteria, the number of messages to show * -* @param resource $imapConnection -* @param int $num_msgs total number of messages in the mailbox -* @param int $start_msg offset in messages to sisplay -* @param array $msort sorted array which is used to map the index to the unsorted $msgs index -* @param string $mailbox mail folder name -* @param int $sort sort order. 6 means no sorting or server side / thread sort -* @param array $color -* @param int $show_num number of messages to show -* @param mixed $where -* @param mixed $what -*/ - -// fix me: -// $color not used -// remove thread stuff -// remove $msgs global and add it as argument (i hate globals) -function displayMessageArray($imapConnection, $num_msgs, $start_msg, - $id, $msgs, $mailbox, $sort, - $show_num, $where=0, $what=0) { - - // if client side sorting and no sort we only fetch num_msgs so the start_msg in the $msgs - // array must be corrected - $i = $start_msg -1; +* @param resource $imapConnection socket handle to imap +* @param array $aMailbox array with required elements MSG_HEADERS, UIDSET, OFFSET, LIMIT +* @return void +**/ +function displayMessageArray($imapConnection, $aMailbox) { + + $aId = $aMailbox['UIDSET']; + $aHeaders = $aMailbox['MSG_HEADERS']; + $iOffset = $aMailbox['OFFSET']; + $sort = $aMailbox['SORT']; + $iPageOffset = $aMailbox['PAGEOFFSET']; + $sMailbox = $aMailbox['NAME']; + $aSearch = (isset($aMailbox['SEARCH'])) ? $aMailbox['SEARCH'] : false; /* * Loop through and display the info for each message. * ($t is used for the checkbox number) */ - - $iEnd = $i + $show_num; - for ($j=$i,$t=0;$j<$iEnd;++$j) { - if (isset($id[$j])) { - $last = (isset($id[$j+1]) || $j == $iEnd) ? false : true; - $msg = $msgs[$id[$j]]; - printMessageInfo($t, $last, $msg, $mailbox, - $start_msg, $where, $what); + $iEnd = ($aMailbox['LIMIT']) ? $iOffset + $aMailbox['LIMIT'] : 99999999 /* no limit */; + for ($i=$iOffset,$t=0;$i<$iEnd;++$i) { + if (isset($aId[$i])) { + $bLast = ((isset($aId[$i+1]) && isset($aHeaders[$aId[$i+1]])) + || ($i == $iEnd )) ? false : true; + $aMsg = array( + 'HEADER' => $aHeaders[$aId[$i]], + 'INDX' => $t, + 'OFFSET' => $iOffset, + 'PAGEOFFSET' => $iPageOffset, + 'SORT' => $sort, + 'SEARCH' => $aSearch, + 'MAILBOX' => $sMailbox, + 'LAST' => $bLast + ); + printMessageInfo($aMsg); ++$t; } else { break; @@ -703,30 +745,26 @@ function displayMessageArray($imapConnection, $num_msgs, $start_msg, * * To finish the table, you need to do a "
'; @@ -542,17 +555,35 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, return; } - if ($mbxresponse['EXISTS'] > 0) { + if ($aMailbox['EXISTS'] > 0) { /* if $start_msg is lower than $num_msgs, we probably deleted all messages * in the last page. We need to re-adjust the start_msg */ - - if($start_msg > $num_msgs) { - $start_msg -= $show_num; + $start_msg = $aMailbox['PAGEOFFSET']; + if($aMailbox['PAGEOFFSET'] > $aMailbox['EXISTS']) { + $start_msg -= $aMailbox['LIMIT']; if($start_msg < 1) { $start_msg = 1; } } + $aMailbox['SEARCH'] = array(); // Alex maybe you can change this so that you can use it from a search + + // initialize the fields we want to retrieve: + $aHeaderFields = array('Date', 'To', 'Cc', 'From', 'Subject', 'X-Priority', 'Content-Type'); + $aFetchItems = array('FLAGS', 'RFC822.SIZE'); + // Are we sorting on internaldate then retrieve the internaldate value as well + $internaldate = getPref($data_dir, $username, 'internal_date_sort'); + if ($internaldate) { + $aFetchItems[] = 'INTERNALDATE'; + } + if ($aMailbox['SORT'] === SQSORT_NONE) { + /** + * retrieve messages by sequence id's and fetch the UID to retrieve + * the UID. for sorted lists this is not needed because a UID FETCH + * automaticly add the UID value in fetch results + **/ + $aFetchItems[] = 'UID'; + } /* This code and the next if() block check for * server-side sorting methods. The $id array is @@ -560,64 +591,76 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, * SM internal sorting */ - if ($thread_sort_messages == 1) { - $mode = 'thread'; - } else if ($allow_server_sort == 1) { - $mode = 'server_sort'; - } else { - $mode = ''; - } - - if (isset($mbxresponse['SORT_ARRAY']) && is_array($mbxresponse['SORT_ARRAY'])) { - $id = $mbxresponse['SORT_ARRAY']; + if ($aMailbox['SORT'] !== SQSORT_NONE && isset($aMailbox['UIDSET']) && //['SORT_ARRAY']) && + $aMailbox['UIDSET'] ) {//is_array($mbxresponse['SORT_ARRAY'])) { + $id = $aMailbox['UIDSET'];//$mbxresponse['SORT_ARRAY']; if (sqsession_is_registered('msgs')) { sqsession_unregister('msgs'); } - $id_slice = array_slice($id,$start_msg-1, $show_num); + $id_slice = array_slice($id,$start_msg-1,$aMailbox['LIMIT']); if (count($id_slice)) { - $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$show_num); + $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT']); } else { return false; } + // FIX ME, move to msgs cache bound to a mailbox sqsession_register($msgs, 'msgs'); } else { if (sqsession_is_registered('server_sort_array')) { sqsession_unregister('server_sort_array'); } - $id = get_sorted_msgs_list($imapConnection,$sort,$mode,$error); - if ($id !== false) { - sqsession_register($id, 'server_sort_array'); - $id_slice = array_slice($id,$start_msg-1, $show_num); - if (count($id_slice)) { - $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$show_num); - } else { - return false; + if ($aMailbox['SORT'] !== SQSORT_NONE) { + $id = get_sorted_msgs_list($imapConnection,$aMailbox['SORT'],$aMailbox['SORT_METHOD'],$error); + if ($id !== false) { + $id_slice = array_slice($id,$aMailbox['OFFSET'], $aMailbox['LIMIT']); + if (count($id_slice)) { + $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT'], + $aHeaderFields,$aFetchItems); + } else { + return false; + } } - sqsession_register($msgs, 'msgs'); } else { - echo $error; - return false; + //create id range + $iRangeEnd = (($aMailbox['EXISTS'] - $aMailbox['OFFSET']) > $aMailbox['LIMIT']) ? + $aMailbox['EXISTS'] - $aMailbox['OFFSET'] +1 - $aMailbox['LIMIT']: + $aMailbox['EXISTS'] - $aMailbox['OFFSET']; + $iRangeStart = (($aMailbox['EXISTS'] - $aMailbox['OFFSET']) > $aMailbox['LIMIT']) ? + $aMailbox['EXISTS']-$aMailbox['OFFSET'] +1:1; + $id_slice = range($iRangeStart, $iRangeEnd); + $msgs = sqimap_get_small_header_list($imapConnection,$id_slice,$aMailbox['LIMIT'], + $aHeaderFields,$aFetchItems); + $msgs = array_reverse($msgs,true /* preserve key */); + // generate id array + $id = array_keys($msgs); + $aMailbox['OFFSET'] = 0; + } + // FIX ME, use an id list bound to a mailbox + if ($id !== false) { + sqsession_register($id, 'server_sort_array'); } + sqsession_register($msgs, 'msgs'); } + $aMailbox['UIDSET'] =& $id; + $aMailbox['MSG_HEADERS'] =& $msgs; } /* if exists > 0 */ - $res = getEndMessage($start_msg, $show_num, $num_msgs); - $start_msg = $res[0]; + $res = getEndMessage($aMailbox['PAGEOFFSET'], $aMailbox['LIMIT'], $aMailbox['EXISTS']); + // $start_msg = $res[0]; $end_msg = $res[1]; - $paginator_str = get_paginator_str($mailbox, $start_msg, $end_msg, - $num_msgs, $show_num, $sort); + $paginator_str = get_paginator_str($aMailbox['NAME'], $aMailbox['PAGEOFFSET'], $end_msg, + $aMailbox['EXISTS'], $aMailbox['LIMIT'], $aMailbox['SORT']); - $msg_cnt_str = get_msgcnt_str($start_msg, $end_msg, $num_msgs); + $msg_cnt_str = get_msgcnt_str($aMailbox['PAGEOFFSET'], $aMailbox['EXISTS'], $aMailbox['LIMIT']); do_hook('mailbox_index_before'); ?> @@ -630,9 +673,8 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs, @@ -641,7 +683,7 @@ function showMessagesForMailbox($imapConnection, $mailbox, $num_msgs,
- +
"; * -* @param mixed $imapConnection -* @param array $mbxresponse the array with the results of SELECT against the current mailbox -* @param string $mailbox the current mailbox -* @param mixed $sort the current sorting method (-1 for no sorting available [searches]) -* @param mixed $msg_cnt_str -* @param mixed $paginator -* @param mixed $start_msg +* @param resource $imapConnection +* @param array $aMailbox associative array with mailbox related information +* @param string $msg_cnt_str +* @param string $paginator Paginator string */ function mail_message_listing_beginning ($imapConnection, - $mbxresponse, - $mailbox = '', $sort = -1, - $msg_cnt_str = '', - $paginator = ' ', - $start_msg = 1) { - global $color, $auto_expunge, $base_uri, $show_flag_buttons, - $allow_server_sort, $server_sort_order, - $PHP_SELF, $allow_thread_sort, $thread_sort_messages; + $aMailbox, + $msg_cnt_str = '', + $paginator = ' ' + ) { + global $color, $base_uri, $show_flag_buttons, $PHP_SELF; + + $php_self = $PHP_SELF; /* fix for incorrect $PHP_SELF */ if (strpos($php_self, 'move_messages.php')) { $php_self = str_replace('move_messages.php', 'right_main.php', $php_self); } - $urlMailbox = urlencode($mailbox); + $urlMailbox = urlencode($aMailbox['NAME']); if (preg_match('/^(.+)\?.+$/',$php_self,$regs)) { $source_url = $regs[1]; @@ -745,32 +783,32 @@ function mail_message_listing_beginning ($imapConnection, } $moveFields = addHidden('msg', $msg). - addHidden('mailbox', $mailbox). - addHidden('startMessage', $start_msg). - addHidden('location', $location); + addHidden('mailbox', $aMailbox['NAME']). + addHidden('startMessage', $aMailbox['PAGEOFFSET']). + addHidden('location', $location); /* build thread sorting links */ - if ($allow_thread_sort == TRUE) { - if ($thread_sort_messages == 1 ) { - $set_thread = 2; - $thread_name = _("Unthread View"); - } elseif ($thread_sort_messages == 0) { - $set_thread = 1; - $thread_name = _("Thread View"); - } - $thread_link_str = '[' . $thread_name - . ']'; - } - else - $thread_link_str =''; + if ($aMailbox['ALLOW_THREAD']) { + if ($aMailbox['SORT_METHOD'] == 'THREAD') { + $set_thread = 2; + $thread_name = _("Unthread View"); + } else { + $set_thread = 1; + $thread_name = _("Thread View"); + } + $thread_link_str = '[' . $thread_name + . ']'; + } else { + $thread_link_str =''; + } /* * This is the beginning of the message list table. * It wraps around all messages */ - $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $mailbox); + $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $aMailbox['NAME']); $form_name = "FormMsgs" . $safe_name; echo '
' ."\n" @@ -796,13 +834,13 @@ function mail_message_listing_beginning ($imapConnection, ' . _("Bypass Trash"); echo ' '; } - if (!$auto_expunge && $mbxresponse['RIGHTS'] != 'READ-ONLY') { + if (!$aMailbox['AUTO_EXPUNGE'] && $aMailbox['RIGHTS'] != 'READ-ONLY') { echo getButton('SUBMIT', 'expungeButton',_("Expunge")) .' ' . _("mailbox") . "\n"; echo ' '; } @@ -823,7 +861,7 @@ function mail_message_listing_beginning ($imapConnection, ?> '; //echo $thread_link_str; //previous behaviour @@ -841,26 +879,17 @@ function mail_message_listing_beginning ($imapConnection, @@ -890,16 +919,19 @@ if ($num_msgs) { } /** -* FIXME: Undocumented function +* Prints the table header for the messages list view * -* @param string $mailbox -* @param mixed $sort -* @param mixed $color -* @param bool $showsort -* @param mixed $start_msg +* @param array $aMailbox */ -function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { - global $index_order, $internal_date_sort; +function printHeader($aMailbox) { + global $index_order, $internal_date_sort, $color; + + if ($aMailbox['SORT_METHOD'] != 'THREAD') { + $showsort = true; + } else { + $showsort = false; + } + echo html_tag( 'tr' ,'' , 'center', $color[5] ); /* calculate the width of the subject column based on the @@ -913,23 +945,23 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { foreach ($index_order as $item) { switch ($item) { case 1: /* checkbox */ - echo html_tag( 'td',get_selectall_link($start_msg, $sort, $mailbox) , '', '', 'width="1%"' ); + echo html_tag( 'td',get_selectall_link($aMailbox) , '', '', 'width="1%"' ); break; case 5: /* flags */ echo html_tag( 'td','' , '', '', 'width="1%"' ); break; case 2: /* from */ - if (handleAsSent($mailbox)) { + if (handleAsSent($aMailbox['NAME'])) { echo html_tag( 'td' ,'' , 'left', '', 'width="25%"' ) . '' . _("To") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_TO_ASC, SQSORT_TO_DEC); + ShowSortButton($aMailbox, SQSORT_TO_ASC, SQSORT_TO_DEC); } } else { echo html_tag( 'td' ,'' , 'left', '', 'width="25%"' ) . '' . _("From") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_FROM_ASC, SQSORT_FROM_DEC); + ShowSortButton($aMailbox, SQSORT_FROM_ASC, SQSORT_FROM_DEC); } } echo "\n"; @@ -939,9 +971,9 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { . '' . _("Date") . ''; if ($showsort) { if ($internal_date_sort) { - ShowSortButton($sort, $mailbox, SQSORT_INT_DATE_ASC, SQSORT_INT_DATE_DEC); + ShowSortButton($aMailbox, SQSORT_INT_DATE_ASC, SQSORT_INT_DATE_DEC); } else { - ShowSortButton($sort, $mailbox, SQSORT_DATE_ASC, SQSORT_DATE_DEC); + ShowSortButton($aMailbox, SQSORT_DATE_ASC, SQSORT_DATE_DEC); } } echo "\n"; @@ -950,7 +982,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { echo html_tag( 'td' ,'' , 'left', '', 'width="'.$subjectwidth.'%"' ) . '' . _("Subject") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_SUBJ_ASC, SQSORT_SUBJ_DEC); + ShowSortButton($aMailbox, SQSORT_SUBJ_ASC, SQSORT_SUBJ_DEC); } echo "\n"; break; @@ -958,7 +990,7 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { echo html_tag( 'td', '', 'center','','width="5%" nowrap') . '' . _("Size") . ''; if ($showsort) { - ShowSortButton($sort, $mailbox, SQSORT_SIZE_ASC, SQSORT_SIZE_DEC); + ShowSortButton($aMailbox, SQSORT_SIZE_ASC, SQSORT_SIZE_DEC); } echo "\n"; break; @@ -971,19 +1003,18 @@ function printHeader($mailbox, $sort, $color, $showsort=true, $start_msg=1) { /** * This function shows the sort button. Isn't this a good comment? * -* @param mixed $sort -* @param string $mailbox -* @param mixed $Down -* @param mixed $Up +* @param array $aMailbox +* @param integer $Down +* @param integer $Up */ -function ShowSortButton($sort, $mailbox, $Down, $Up ) { +function ShowSortButton($aMailbox, $Down, $Up ) { global $PHP_SELF; /* Figure out which image we want to use. */ - if ($sort != $Up && $sort != $Down) { + if ($aMailbox['SORT'] != $Up && $aMailbox['SORT'] != $Down) { $img = 'sort_none.png'; $which = $Up; - } elseif ($sort == $Up) { + } elseif ($aMailbox['SORT'] == $Up) { $img = 'up_pointer.png'; $which = $Down; } else { @@ -999,7 +1030,7 @@ function ShowSortButton($sort, $mailbox, $Down, $Up ) { /* Now that we have everything figured out, show the actual button. */ echo ' sort'; @@ -1008,17 +1039,15 @@ function ShowSortButton($sort, $mailbox, $Down, $Up ) { /** * FIXME: Undocumented function * -* @param mixed $start_msg -* @param mixed $sort -* @param string $mailbox +* @param array $aMailbox */ -function get_selectall_link($start_msg, $sort, $mailbox) { - global $checkall, $what, $where, $javascript_on; +function get_selectall_link($aMailbox) { + global $checkall, $javascript_on; global $PHP_SELF, $PG_SHOWNUM; $result = ''; if ($javascript_on) { - $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $mailbox); + $safe_name = preg_replace("/[^0-9A-Za-z_]/", '_', $aMailbox['NAME']); $func_name = "CheckAll" . $safe_name; $form_name = "FormMsgs" . $safe_name; $result = '