+ /* now the children, checking each thread portion for
+ ),(, and space, adjusting the level and space values
+ to get the indent level
+ */
+ $level = 0;
+ $spaces = 0;
+ $indent = 0;
+ $fake = FALSE;
+ for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
+ $chars = count_chars($thread_new[$i][$k], 1);
+ if (isset($chars['40'])) { /* testing for ( */
+ $level = $level + $chars['40'];
+ }
+ if (isset($chars['41'])) { /* testing for ) */
+ $level = $level - $chars['41'];
+ $spaces = 0;
+ /* if we were faking lets stop, this portion
+ of the thread is over
+ */
+ if ($level == $cutoff) {
+ $fake = FALSE;
+ }
+ }
+ if (isset($chars['32'])) { /* testing for space */
+ $spaces = $spaces + $chars['32'];
+ }
+ $indent = $level + $spaces;
+ /* must have run into a message that broke the thread
+ so we are adjusting for that portion
+ */
+ if ($fake == TRUE) {
+ $indent = $indent +1;
+ }
+ if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
+ $child = $regs[1];
+ }
+ /* the thread must be broken if $indent == 0
+ so indent the message once and start faking it
+ */
+ if ($indent == 0) {
+ $indent = 1;
+ $fake = TRUE;
+ $cutoff = $level;
+ }
+ /* dont need abs but if indent was negative
+ errors would occur
+ */
+ $indent_array[$child] = abs($indent);
+ }
+ }
+ return $indent_array;
+}
+
+
+/* returns an array with each element as a string
+ representing one message thread as returned by
+ the IMAP server
+*/
+
+function get_thread_sort ($imap_stream) {
+ global $thread_new, $sort_by_ref, $default_charset, $server_sort_array;
+ if (session_is_registered('thread_new')) {
+ session_unregister('thread_new');
+ }
+ if (session_is_registered('server_sort_array')) {
+ session_unregister('server_srot_array');
+ }
+ $sid = sqimap_session_id();
+ $thread_temp = array ();
+ if ($sort_by_ref == 1) {
+ $sort_type = 'REFERENCES';
+ }
+ else {
+ $sort_type = 'ORDEREDSUBJECT';
+ }
+ $thread_query = "$sid THREAD $sort_type ".strtoupper($default_charset)." ALL\r\n";
+ fputs($imap_stream, $thread_query);
+ $thread_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
+ if (isset($thread_test[0])) {
+ if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
+ $thread_list = trim($regs[1]);
+ }
+ }
+ else {
+ $thread_list = "";
+ }
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ return $server_sort_array;
+ }
+ $thread_temp = preg_split("//", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+ $char_count = count($thread_temp);
+ $counter = 0;
+ $thread_new = array();
+ $k = 0;
+ $thread_new[0] = "";
+ for ($i=0;$i<$char_count;$i++) {
+ if ($thread_temp[$i] != ')' && $thread_temp[$i] != '(') {
+ $thread_new[$k] = $thread_new[$k] . $thread_temp[$i];
+ }
+ elseif ($thread_temp[$i] == '(') {
+ $thread_new[$k] .= $thread_temp[$i];
+ $counter++;
+ }
+ elseif ($thread_temp[$i] == ')') {
+ if ($counter > 1) {
+ $thread_new[$k] .= $thread_temp[$i];
+ $counter = $counter - 1;
+ }
+ else {
+ $thread_new[$k] .= $thread_temp[$i];
+ $k++;
+ $thread_new[$k] = "";
+ $counter = $counter - 1;
+ }
+ }
+ }
+ session_register('thread_new');
+ $thread_new = array_reverse($thread_new);
+ $thread_list = implode(" ", $thread_new);
+ $thread_list = str_replace("(", " ", $thread_list);
+ $thread_list = str_replace(")", " ", $thread_list);
+ $thread_list = preg_split("/\s/", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+ $server_sort_array = $thread_list;
+ session_register('server_sort_array');
+ return $thread_list;
+}
+
+
+
+function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
+ global $squirrelmail_language, $color, $data_dir, $username;
+
+ /* Get the small headers for each message in $msg_list */
+ $sid = sqimap_session_id();
+ $maxmsg = sizeof($msg_list);
+ $msgs_str = sqimap_message_list_squisher($msg_list);
+ $results = array();
+ $read_list = array();
+ $sizes_list = array();
+ /*
+ * We need to return the data in the same order as the caller supplied
+ * 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++) {
+ $id2index[$msg_list[$i]] = $i;
+ }
+
+ $query = "$sid FETCH $msgs_str BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type In-Reply-To)]\r\n";
+ fputs ($imap_stream, $query);
+ $readin_list = sqimap_read_data_list($imap_stream, $sid, true, $response, $message);
+
+ foreach ($readin_list as $r) {
+ if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) {
+ set_up_language($squirrelmail_language);
+ echo '<br><b><font color=$color[2]>' .
+ _("ERROR : Could not complete request.") .
+ '</b><br>' .
+ _("Unknown response from IMAP server: ") . ' 1.' .
+ $r[0] . "</font><br>\n";
+ } else if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) {
+ set_up_language($squirrelmail_language);
+ echo '<br><b><font color=$color[2]>' .
+ _("ERROR : Could not complete request.") .
+ '</b><br>' .
+ _("Unknown message number in reply from server: ") .
+ $regs[1] . "</font><br>\n";
+ } else {
+ $read_list[$id2index[$regs[1]]] = $r;
+ }
+ }
+ arsort($read_list);
+
+ $query = "$sid FETCH $msgs_str RFC822.SIZE\r\n";
+ fputs ($imap_stream, $query);
+ $sizesin_list = sqimap_read_data_list($imap_stream, $sid, true, $response, $message);
+
+ foreach ($sizesin_list as $r) {
+ if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) {
+ set_up_language($squirrelmail_language);
+ echo "<br><b><font color=$color[2]>\n";
+ echo _("ERROR : Could not complete request.");
+ echo "</b><br>\n";
+ echo _("Unknown response from IMAP server: ") . ' 2.';
+ echo $r[0] . "</font><br>\n";
+ exit;
+ }
+ if (!count($id2index[$regs[1]])) {
+ set_up_language($squirrelmail_language);
+ echo "<br><b><font color=$color[2]>\n";
+ echo _("ERROR : Could not complete request.");
+ echo "</b><br>\n";
+ echo _("Unknown messagenumber in reply from server: ");
+ echo $regs[1] . "</font><br>\n";
+ exit;
+ }
+ $sizes_list[$id2index[$regs[1]]] = $r;
+ }
+ arsort($sizes_list);
+
+ for ($msgi = 0; $msgi < $maxmsg; $msgi++) {
+ $subject = _("(no subject)");
+ $from = _("Unknown Sender");
+ $priority = 0;
+ $messageid = "<>";
+ $cc = "";
+ $to = "";
+ $date = "";
+ $type[0] = "";
+ $type[1] = "";
+ $inrepto = "";
+ $read = $read_list[$msgi];
+
+ $prevline = false;
+ foreach ($read as $read_part) {
+ //unfold multi-line headers
+ while ($prevline && strspn($read_part, "\t ") > 0) {
+ $read_part = substr($prevline, 0, -2) . ' ' . ltrim($read_part);
+ }
+ $prevline = $read_part;
+ if (eregi ("^to:(.*)$", $read_part, $regs)) {
+ $to = $regs[1];
+ } else if (eregi ("^from:(.*)$", $read_part, $regs)) {
+ $from = $regs[1];
+ } else if (eregi ("^x-priority:(.*)$", $read_part, $regs)) {
+ $priority = trim($regs[1]);
+ } else if (eregi ("^message-id:(.*)$", $read_part, $regs)) {
+ $messageid = trim($regs[1]);
+ } else if (eregi ("^cc:(.*)$", $read_part, $regs)) {
+ $cc = $regs[1];
+ } else if (eregi ("^date:(.*)$", $read_part, $regs)) {
+ $date = $regs[1];
+ } else if (eregi ("^subject:(.*)$", $read_part, $regs)) {
+ $subject = htmlspecialchars(trim($regs[1]));
+ if ($subject == "") {
+ $subject = _("(no subject)");
+ }
+ } else if (eregi ("^content-type:(.*)$", $read_part, $regs)) {
+ $type = strtolower(trim($regs[1]));
+ if ($pos = strpos($type, ";")) {
+ $type = substr($type, 0, $pos);
+ }
+ $type = explode("/", $type);
+ if (!isset($type[1])) {
+ $type[1] = '';
+ }
+ } else if (eregi ("^in-reply-to:(.*)$", $read_part, $regs)) {
+ $inrepto = trim($regs[1]);
+ }
+ }
+ $internaldate = getPref($data_dir, $username, 'internal_date_sort');
+ if (trim($date) == "" || $internaldate) {
+ fputs($imap_stream, "$sid FETCH $msg_list[$msgi] INTERNALDATE\r\n");
+ $readdate = sqimap_read_data($imap_stream, $sid, true, $response, $message);
+ if (eregi(".*INTERNALDATE \"(.*)\".*", $readdate[0], $regs)) {
+ $date_list = explode(' ', trim($regs[1]));
+ $date_list[0] = str_replace("-", ' ', $date_list[0]);
+ $date = implode(' ', $date_list);
+ }
+ }
+ eregi("([0-9]+)[^0-9]*$", $sizes_list[$msgi][0], $regs);
+ $size = $regs[1];
+
+ $header = new small_header;
+ if ($issent) {
+ $header->from = (trim($to) != '' ? $to : '(' ._("No To Address") . ')');
+ } else {
+ $header->from = $from;
+ }
+
+ $header->date = $date;
+ $header->subject = $subject;
+ $header->to = $to;
+ $header->priority = $priority;
+ $header->message_id = $messageid;
+ $header->cc = $cc;
+ $header->size = $size;
+ $header->type0 = $type[0];
+ $header->type1 = $type[1];
+ $header->inrepto = $inrepto;
+ $result[] = $header;
+ }
+ return $result;
+}
+
+/* Returns the flags for the specified messages */
+function sqimap_get_flags ($imap_stream, $i) {
+ $read = sqimap_run_command ($imap_stream, "FETCH $i:$i FLAGS", true, $response, $message);
+ if (ereg('FLAGS(.*)', $read[0], $regs)) {
+ return explode(' ', trim(ereg_replace('[\\(\\)\\\\]', '', $regs[1])));
+ }
+ return array('None');
+}
+
+function sqimap_get_flags_list ($imap_stream, $msg_list) {
+ $msgs_str = sqimap_message_list_squisher($msg_list);
+ for ($i = 0; $i < sizeof($msg_list); $i++) {
+ $id2index[$msg_list[$i]] = $i;
+ }
+ $result_list = sqimap_run_command_list ($imap_stream, "FETCH $msgs_str FLAGS", true, $response, $message);
+ $result_flags = array();
+
+ for ($i = 0; $i < sizeof($result_list); $i++) {
+ if (eregi('^\* ([0-9]+).*FETCH.*FLAGS(.*)', $result_list[$i][0], $regs)
+ && isset($id2index[$regs[1]]) && count($id2index[$regs[1]])) {
+ $result_flags[$id2index[$regs[1]]] = explode(" ", trim(ereg_replace('[\\(\\)\\\\]', '', $regs[2])));
+ } else {
+ set_up_language($squirrelmail_language);
+ echo "<br><b><font color=$color[2]>\n" .
+ _("ERROR : Could not complete request.") .
+ "</b><br>\n" .
+ _("Unknown response from IMAP server: ") .
+ $result_list[$i][0] . "</font><br>\n";
+ exit;
+ }
+ }
+ arsort($result_flags);
+ return $result_flags;
+}
+
+/*
+ * Returns a message array with all the information about a message.
+ * See the documentation folder for more information about this array.
+ */
+function sqimap_get_message ($imap_stream, $id, $mailbox) {
+ $header = sqimap_get_message_header($imap_stream, $id, $mailbox);
+ return sqimap_get_message_body($imap_stream, $header);
+}
+
+/* Wrapper function that reformats the header information. */
+function sqimap_get_message_header ($imap_stream, $id, $mailbox) {
+ $read = sqimap_run_command ($imap_stream, "FETCH $id:$id BODY[HEADER]", true, $response, $message);
+ $header = sqimap_get_header($imap_stream, $read);
+ $header->id = $id;
+ $header->mailbox = $mailbox;
+ return $header;
+}
+
+/* Wrapper function that reformats the entity header information. */
+function sqimap_get_ent_header ($imap_stream, $id, $mailbox, $ent) {
+ $read = sqimap_run_command ($imap_stream, "FETCH $id:$id BODY[$ent.HEADER]", true, $response, $message);
+ $header = sqimap_get_header($imap_stream, $read);
+ $header->id = $id;
+ $header->mailbox = $mailbox;
+ return $header;
+}
+
+
+/* Wrapper function that returns entity headers for use by decodeMime */
+/*
+function sqimap_get_entity_header ($imap_stream, &$read, &$type0, &$type1, &$bound, &$encoding, &$charset, &$filename) {
+ $header = sqimap_get_header($imap_stream, $read);
+ $type0 = $header["TYPE0"];
+ $type1 = $header["TYPE1"];
+ $bound = $header["BOUNDARY"];
+ $encoding = $header["ENCODING"];
+ $charset = $header["CHARSET"];
+ $filename = $header["FILENAME"];
+}
+*/
+/* Queries the IMAP server and gets all header information. */
+function sqimap_get_header ($imap_stream, $read) {
+ global $where, $what;
+
+ $hdr = new msg_header();
+ $i = 0;
+
+ /* Set up some defaults */
+ $hdr->type0 = "text";
+ $hdr->type1 = "plain";
+ $hdr->charset = "us-ascii";
+
+ while ($i < count($read)) {
+ //unfold multi-line headers
+ while ($i + 1 < count($read) && strspn($read[$i + 1], "\t ") > 0) {
+ $read[$i + 1] = substr($read[$i], 0, -2) . ' ' . ltrim($read[$i + 1]);
+ array_splice($read, $i, 1);
+ }
+
+ if (substr($read[$i], 0, 17) == "MIME-Version: 1.0") {