/** * Constructor. * * @param Horde_Imap_Client_Tokenize $token Tokenized data returned from * the server. */ public function __construct(Horde_Imap_Client_Tokenize $token) { $this->token = $token; /* Check for response status. */ $status = $token->current(); $valid = array('BAD', 'BYE', 'NO', 'OK', 'PREAUTH'); if (in_array($status, $valid)) { $this->status = constant(__CLASS__ . '::' . $status); $resp_text = $token->next(); /* Check for response code. Only occurs if there is a response * status. */ if (is_string($resp_text) && $resp_text[0] == '[') { $resp = new stdClass(); $resp->data = array(); if ($resp_text[strlen($resp_text) - 1] == ']') { $resp->code = substr($resp_text, 1, -1); } else { $resp->code = substr($resp_text, 1); while (($elt = $token->next()) !== false) { if (is_string($elt) && $elt[strlen($elt) - 1] == ']') { $resp->data[] = substr($elt, 0, -1); break; } $resp->data[] = is_string($elt) ? $elt : iterator_to_array($elt); } } $token->next(); $this->responseCode = $resp; } } }
/** * Parse a METADATA response (RFC 5464 [4.4]). * * @param Horde_Imap_Client_Tokenize $data The server response. * * @throws Horde_Imap_Client_Exception */ protected function _parseMetadata(Horde_Imap_Client_Tokenize $data) { switch ($data->current()) { case 'ANNOTATION': $mbox = $data->next(); // Ignore unsolicited responses. if (is_object($entry = $data->next())) { break; } $m_data = $data->next(); $type = $m_data->rewind(); do { switch ($type) { case 'value.priv': $this->_temp['metadata'][$mbox]['/private' . $entry] = $m_data->next(); break; case 'value.shared': $this->_temp['metadata'][$mbox]['/shared' . $entry] = $m_data->next(); break; default: throw new Horde_Imap_Client_Exception(sprintf(Horde_Imap_Client_Translation::t("Invalid METADATA value type \"%s\"."), $type), Horde_Imap_Client_Exception::METADATA_INVALID); } } while (($type = $data->next()) !== false); break; case 'METADATA': $mbox = $data->next(); // Ignore unsolicited responses. if (!is_object($m_data = $data->next())) { break; } $entry = $m_data->rewind(); do { $this->_temp['metadata'][$mbox][$entry] = $m_data->next(); } while (($entry = $m_data->next()) !== false); break; } }