| | |
| | | } |
| | | $this->getNamespace(); |
| | | $this->logged = true; |
| | | |
| | | return true; |
| | | } else { |
| | | return false; |
| | |
| | | { |
| | | $node = array(); |
| | | if ($str[$begin] != '(') { |
| | | $stop = $begin + strspn($str, "1234567890", $begin, $end - $begin); |
| | | $stop = $begin + strspn($str, '1234567890', $begin, $end - $begin); |
| | | $msg = substr($str, $begin, $stop - $begin); |
| | | if ($msg == 0) |
| | | return $node; |
| | |
| | | |
| | | function thread($folder, $algorithm='REFERENCES', $criteria='', $encoding='US-ASCII') |
| | | { |
| | | $old_sel = $this->selected; |
| | | |
| | | if (!$this->select($folder)) { |
| | | return false; |
| | | return false; |
| | | } |
| | | |
| | | // return empty result when folder is empty and we're just after SELECT |
| | | if ($old_sel != $folder && !$this->exists) { |
| | | return array(array(), array(), array()); |
| | | } |
| | | |
| | | $encoding = $encoding ? trim($encoding) : 'US-ASCII'; |
| | | $algorithm = $algorithm ? trim($algorithm) : 'REFERENCES'; |
| | | $criteria = $criteria ? 'ALL '.trim($criteria) : 'ALL'; |
| | | $data = ''; |
| | | |
| | | if (!$this->putLineC("thrd1 THREAD $algorithm $encoding $criteria")) { |
| | | return false; |
| | | } |
| | | do { |
| | | $line = trim($this->readLine(10000)); |
| | | if (preg_match('/^\* THREAD/', $line)) { |
| | | $str = trim(substr($line, 8)); |
| | | $depthmap = array(); |
| | | $haschildren = array(); |
| | | $tree = $this->parseThread($str, 0, strlen($str), null, null, 0, $depthmap, $haschildren); |
| | | $line = trim($this->readLine()); |
| | | if ($this->startsWith($line, '* THREAD')) { |
| | | $data .= substr($line, 9); |
| | | } else if (preg_match('/^[0-9() ]+$/', $line)) { |
| | | $data .= $line; |
| | | } |
| | | } while (!$this->startsWith($line, 'thrd1', true, true)); |
| | | |
| | | $result_code = $this->parseResult($line); |
| | | if ($result_code == 0) { |
| | | return array($tree, $depthmap, $haschildren); |
| | | $depthmap = array(); |
| | | $haschildren = array(); |
| | | $tree = $this->parseThread($data, 0, strlen($data), null, null, 0, $depthmap, $haschildren); |
| | | return array($tree, $depthmap, $haschildren); |
| | | } |
| | | |
| | | $this->error = "Thread: $line"; |
| | |
| | | |
| | | function search($folder, $criteria, $return_uid=false) |
| | | { |
| | | $old_sel = $this->selected; |
| | | |
| | | if (!$this->select($folder)) { |
| | | return false; |
| | | } |
| | | |
| | | // return empty result when folder is empty and we're just after SELECT |
| | | if ($old_sel != $folder && !$this->exists) { |
| | | return array(); |
| | | } |
| | | |
| | | $data = ''; |
| | |
| | | $mode = 0; |
| | | } |
| | | |
| | | $reply_key = '* ' . $id; |
| | | $result = false; |
| | | |
| | | // format request |
| | | $key = 'ftch0'; |
| | | $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])"; |
| | | $reply_key = '* ' . $id; |
| | | $key = 'ftch0'; |
| | | $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])"; |
| | | |
| | | // send request |
| | | if (!$this->putLine($request)) { |
| | | return false; |
| | |
| | | $a = explode(' ', $line); |
| | | } while (!($end = $this->startsWith($line, $key, true)) && $a[2] != 'FETCH'); |
| | | |
| | | $len = strlen($line); |
| | | $len = strlen($line); |
| | | $result = false; |
| | | |
| | | // handle empty "* X FETCH ()" response |
| | | if ($line[$len-1] == ')' && $line[$len-2] != '(') { |
| | |
| | | $line = $this->readLine(1024); |
| | | } while (!$this->startsWith($line, $key, true)); |
| | | |
| | | if ($result) { |
| | | if ($result !== false) { |
| | | if ($file) { |
| | | fwrite($file, $result); |
| | | } else if ($print) { |