+
+ function parseThread($thread_list, $i=0, $thread_cnt=0) {
+ $par = false;
+ $thread_id = '';
+ for ($cnt = strlen($thread_list);$i<$cnt;++$i) {
+ $char = $thread_list{$i};
+ switch ($char) {
+ case '(':
+ $par = new thread();
+ ++$thread_cnt;
+ $thread_id = '';
+ break;
+ case ' ':
+ $par->id = $thread_id;
+ ++$thread_cnt;
+ $res_a = $this->parseThread($thread,$i, $thread_cnt);
+ $par->childs[] = $res_a[0];
+ $i = $res_a[1];
+ $thread_id = '';
+ break;
+ case ')':
+ if ($thread_id) {
+ $par->id = $thread_id;
+ $thread_id='';
+ }
+ $par->thread_cnt=$thread_cnt;
+ if (count($this->childs)) {
+ return array($par, $i);
+ } else {
+ $this->childs[] = $par;
+ }
+ default:
+ $thread_id .= $char;
+ break;
+ }
+ }
+ print_r($this);
+ }
+}
+
+function elapsedTime($start) {
+ $stop = gettimeofday();
+ $timepassed = 1000000 * ($stop['sec'] - $start['sec']) + $stop['usec'] - $start['usec'];
+ return $timepassed;
+}
+
+function sqimap_get_small_header_list ($imap_stream, $msg_list) {
+ global $squirrelmail_language, $color, $data_dir, $username, $imap_server_type;
+ global $uid_support;
+
+ /* Get the small headers for each message in $msg_list */
+ $sid = sqimap_session_id($uid_support);
+
+ $maxmsg = sizeof($msg_list);
+ $msgs_str = sqimap_message_list_squisher($msg_list);
+ $results = array();
+ $read_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;
+ }
+
+ $internaldate = getPref($data_dir, $username, 'internal_date_sort');
+ if ($internaldate) {
+ $query = "$sid FETCH $msgs_str (FLAGS UID RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject X-Priority Content-Type)])\r\n";
+ } else {
+ $query = "$sid FETCH $msgs_str (FLAGS UID RFC822.SIZE BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject X-Priority Content-Type)])\r\n";
+ }
+ fputs ($imap_stream, $query);
+ $readin_list = sqimap_read_data_list($imap_stream, $sid, false, $response, $message);
+ $i = 0;
+ foreach ($readin_list as $r) {
+ if (!$uid_support) {
+ if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH/iAU",$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;
+ }
+ } else {
+ if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH.*UID\s+([0-9]+)\s+/iAU",$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[2]]) || !count($id2index[$regs[2]])) {
+ 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[2] . "</font><br>\n";
+ } else {
+ $read_list[$id2index[$regs[2]]] = $r;
+ $unique_id = $regs[2];
+ }
+ }
+ }
+ arsort($read_list);
+
+ $patterns = array (
+ "/^To:(.*)\$/AUi",
+ "/^From:(.*)\$/AUi",
+ "/^X-Priority:(.*)\$/AUi",
+ "/^Cc:(.*)\$/AUi",
+ "/^Date:(.*)\$/AUi",
+ "/^Subject:(.*)\$/AUi",
+ "/^Content-Type:(.*)\$/AUi"
+ );
+ $regpattern = '';
+
+ for ($msgi = 0; $msgi < $maxmsg; $msgi++) {
+ $subject = _("(no subject)");
+ $from = _("Unknown Sender");
+ $priority = 0;
+ $messageid = "<>";
+ $cc = "";
+ $to = "";
+ $date = "";
+ $type[0] = "";
+ $type[1] = "";
+ $inrepto = "";
+ $flag_seen = false;
+ $flag_answered = false;
+ $flag_deleted = false;
+ $flag_flagged = false;
+ $read = $read_list[$msgi];
+ $prevline = false;
+
+ foreach ($read as $read_part) {
+ //unfold multi-line headers
+ if ($prevline && strpos($read_part, "\t ") === true) {
+ $read_part = substr($prevline, 0, -2) . preg_replace('/(\t\s+)/',' ',$read_part);
+ }
+ $prevline = $read_part;
+ if ($read_part{0} == '*') {
+ if ($internaldate) {
+ if (preg_match ("/^.+INTERNALDATE\s+\"(.+)\".+/iUA",$read_part, $reg)) {
+ $tmpdate = trim($reg[1]);
+ $tmpdate = str_replace(' ',' ',$tmpdate);
+ $tmpdate = explode(' ',$tmpdate);
+ $date = str_replace('-',' ',$tmpdate[0]) . " " .
+ $tmpdate[1] . " " .
+ $tmpdate[2];
+ }
+ }
+ if (preg_match ("/^.+RFC822.SIZE\s+(\d+).+/iA",$read_part, $reg)) {
+ $size = $reg[1];
+ }
+ if (preg_match("/^.+FLAGS\s+\((.*)\).+/iUA", $read_part, $regs)) {
+ $flags = explode(' ',trim($regs[1]));
+ foreach ($flags as $flag) {
+ $flag = strtolower($flag);
+ if ($flag == '\\seen') {
+ $flag_seen = true;
+ } else if ($flag == '\\answered') {
+ $flag_answered = true;
+ } else if ($flag == '\\deleted') {
+ $flag_deleted = true;
+ } else if ($flag == '\\flagged') {
+ $flag_flagged = true;
+ }
+ }
+ }
+ if (preg_match ("/^.+UID\s+(\d+).+/iA",$read_part, $reg)) {
+ $unique_id = $reg[1];
+ }
+ } else {
+ $firstchar = $read_part{0};
+ if ($firstchar == 'T') {
+ $regpattern = $patterns[0];
+ $id = 1;
+ } else if ($firstchar == 'F') {
+ $regpattern = $patterns[1];
+ $id = 2;
+ } else if ($firstchar == 'X') {
+ $regpattern = $patterns[2];
+ $id = 3;
+ } else if ($firstchar == 'C') {
+ if (strtolower($read_part{1}) == 'c') {
+ $regpattern = $patterns[3];
+ $id = 4;
+ } else if (strtolower($read_part{1}) == 'o') {
+ $regpattern = $patterns[6];
+ $id = 7;
+ }
+ } else if ($firstchar == 'D' && !$internaldate ) {
+ $regpattern = $patterns[4];
+ $id = 5;
+ } else if ($firstchar == 'S') {
+ $regpattern = $patterns[5];
+ $id = 6;
+ } else $regpattern = '';
+
+ if ($regpattern) {
+ if (preg_match ($regpattern, $read_part, $regs)) {
+ switch ($id) {
+ case 1:
+ $to = $regs[1];
+ break;
+ case 2:
+ $from = $regs[1];
+ break;
+ case 3:
+ $priority = $regs[1];
+ break;
+ case 4:
+ $cc = $regs[1];
+ break;
+ case 5:
+ $date = $regs[1];
+ break;
+ case 6:
+ $subject = htmlspecialchars(trim($regs[1]));
+ if ($subject == "") {
+ $subject = _("(no subject)");
+ }
+ break;
+ case 7:
+ $type = strtolower(trim($regs[1]));
+ if ($pos = strpos($type, ";")) {
+ $type = substr($type, 0, $pos);
+ }
+ $type = explode("/", $type);
+ if (!isset($type[1])) {
+ $type[1] = '';
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }