$sid = sqimap_session_id();
$results = array();
$references = "";
- $query = "$sid FETCH $message BODY.PEEK[HEADER.FIELDS (References)]\r\n";
+ $query = "$sid FETCH $message BODY[HEADER.FIELDS (References)]\r\n";
fputs ($imap_stream, $query);
$responses = sqimap_read_data_list($imap_stream, $sid, true, $responses, $message);
if (!eregi("^\\* ([0-9]+) FETCH", $responses[0][0], $regs)) {
if (!empty($sort_on[$sort])) {
$sort_query = "$sid SORT ($sort_on[$sort]) ".strtoupper($default_charset)." ALL\r\n";
fputs($imap_stream, $sort_query);
- $sort_test = sqimap_read_data($imap_stream, $sid, true, $response, $message);
+ $sort_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
}
- if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) {
- $server_sort_array = preg_split("/ /", trim($regs[1]));
+ if (isset($sort_test[0])) {
+ if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) {
+ $server_sort_array = preg_split("/ /", trim($regs[1]));
+ }
}
if ($sort == 0 || $sort == 2 || $sort == 4) {
$server_sort_array = array_reverse($server_sort_array);
}
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ }
session_register('server_sort_array');
return $server_sort_array;
}
global $sort_by_ref, $default_charset, $thread_new;
$parent = "";
$child = "";
+ $cutoff = 0;
+
+ /* loop through the threads and take unwanted characters out
+ of the thread string then chop it up
+ */
for ($i=0;$i<count($thread_new);$i++) {
$thread_new[$i] = preg_replace("/\s\(/", "(", $thread_new[$i]);
$thread_new[$i] = preg_replace("/(\d+)/", "$1|", $thread_new[$i]);
if (!$thread_new) {
$thread_new = array();
}
+ /* looping through the parts of one message thread */
+
for ($i=0;$i<count($thread_new);$i++) {
+ /* first grab the parent, it does not indent */
+
if (isset($thread_new[$i][0])) {
- if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
- $parent = $regs[1];
- }
+ if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+ $parent = $regs[1];
+ }
}
$indent_array[$parent] = 0;
+
+ /* 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;
- $go = 'stop';
- $spaces = array ();
- $l = 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']) && isset($chars['41'])) {
- $l--;
- }
- if (isset($chars['40'])) { // (
- $indent = $indent + $chars[40];
- $go = 'start';
- $l++;
+ if (isset($chars['40'])) { /* testing for ( */
+ $level = $level + $chars['40'];
}
- if (isset($chars['41'])) { // )
- if ($go == 'start') {
- if (!isset($spaces[$l])) {
- $spaces[$l] = 0;
- }
- $indent = $indent - $spaces[$l];
- $indent = $indent - $chars[41] ;
- $go = 'stop';
- $l--;
- }
- else {
- $indent = $indent - $chars[41];
+ 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'])) { // space
- $indent = $indent + $chars[32];
- if ($go == 'start') {
- if (!isset($spaces[$l])) {
- $spaces[$l] = 0;
- }
- $spaces[$l] = $spaces[$l] + $chars[32];
- }
+ 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);
}
}
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');
}
}
$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, true, $response, $message);
- if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
- $thread_list = trim($regs[1]);
+ $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;
}
}
}
- session_register('$thread_new');
+ session_register('thread_new');
$thread_new = array_reverse($thread_new);
$thread_list = implode(" ", $thread_new);
$thread_list = str_replace("(", " ", $thread_list);
} else {
$hdr->charset = "us-ascii";
}
+ /* Detect type in case of multipart/related */
+ if (strpos(strtolower(trim($line)), "type=")) {
+ $pos = strpos($line, "type=") + 6;
+ $type = trim($line);
+ if (strpos($line, ";", $pos) > 0) {
+ $type = substr($type, $pos, strpos($line, ";", $pos)-$pos);
+ } else {
+ $type = substr($type, $pos);
+ }
+ $hdr->type = $type;
+ }
}
else if (strtolower(substr($read[$i], 0, 20)) == "content-disposition:") {
/* Add better content-disposition support */