|
|
|
@ -1128,26 +1128,50 @@ class rcube_imap_generic
|
|
|
|
|
|
|
|
|
|
$response = explode("\r\n", $response);
|
|
|
|
|
foreach ($response as $line) {
|
|
|
|
|
if (preg_match('/^\* ([0-9]+) (EXISTS|RECENT)$/i', $line, $m)) {
|
|
|
|
|
$this->data[strtoupper($m[2])] = (int) $m[1];
|
|
|
|
|
if (preg_match('/^\* OK \[/i', $line)) {
|
|
|
|
|
$pos = strcspn($line, ' ]', 6);
|
|
|
|
|
$token = strtoupper(substr($line, 6, $pos));
|
|
|
|
|
$pos += 7;
|
|
|
|
|
|
|
|
|
|
switch ($token) {
|
|
|
|
|
case 'UIDNEXT':
|
|
|
|
|
case 'UIDVALIDITY':
|
|
|
|
|
case 'UNSEEN':
|
|
|
|
|
if ($len = strspn($line, '0123456789', $pos)) {
|
|
|
|
|
$this->data[$token] = (int) substr($line, $pos, $len);
|
|
|
|
|
}
|
|
|
|
|
else if (preg_match('/^\* OK \[/i', $line, $match)) {
|
|
|
|
|
$line = substr($line, 6);
|
|
|
|
|
if (preg_match('/^(UIDNEXT|UIDVALIDITY|UNSEEN) ([0-9]+)/i', $line, $match)) {
|
|
|
|
|
$this->data[strtoupper($match[1])] = (int) $match[2];
|
|
|
|
|
}
|
|
|
|
|
else if (preg_match('/^(HIGHESTMODSEQ) ([0-9]+)/i', $line, $match)) {
|
|
|
|
|
$this->data[strtoupper($match[1])] = (string) $match[2];
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'HIGHESTMODSEQ':
|
|
|
|
|
if ($len = strspn($line, '0123456789', $pos)) {
|
|
|
|
|
$this->data[$token] = (string) substr($line, $pos, $len);
|
|
|
|
|
}
|
|
|
|
|
else if (preg_match('/^(NOMODSEQ)/i', $line, $match)) {
|
|
|
|
|
$this->data[strtoupper($match[1])] = true;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'NOMODSEQ':
|
|
|
|
|
$this->data[$token] = true;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'PERMANENTFLAGS':
|
|
|
|
|
$start = strpos($line, '(', $pos);
|
|
|
|
|
$end = strrpos($line, ')');
|
|
|
|
|
if ($start && $end) {
|
|
|
|
|
$flags = substr($line, $start + 1, $end - $start - 1);
|
|
|
|
|
$this->data[$token] = explode(' ', $flags);
|
|
|
|
|
}
|
|
|
|
|
else if (preg_match('/^PERMANENTFLAGS \(([^\)]+)\)/iU', $line, $match)) {
|
|
|
|
|
$this->data['PERMANENTFLAGS'] = explode(' ', $match[1]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (preg_match('/^\* ([0-9]+) (EXISTS|RECENT|FETCH)/i', $line, $match)) {
|
|
|
|
|
$token = strtoupper($match[2]);
|
|
|
|
|
switch ($token) {
|
|
|
|
|
case 'EXISTS':
|
|
|
|
|
case 'RECENT':
|
|
|
|
|
$this->data[$token] = (int) $match[1];
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'FETCH':
|
|
|
|
|
// QRESYNC FETCH response (RFC5162)
|
|
|
|
|
else if (preg_match('/^\* ([0-9+]) FETCH/i', $line, $match)) {
|
|
|
|
|
$line = substr($line, strlen($match[0]));
|
|
|
|
|
$fetch_data = $this->tokenizeResponse($line, 1);
|
|
|
|
|
$data = array('id' => $match[1]);
|
|
|
|
@ -1157,6 +1181,8 @@ class rcube_imap_generic
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->data['QRESYNC'][$data['uid']] = $data;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// QRESYNC VANISHED response (RFC5162)
|
|
|
|
|
else if (preg_match('/^\* VANISHED [()EARLIER]*/i', $line, $match)) {
|
|
|
|
|