public function getAttributes($input)
{
$this->startGetAttributes();
$hasMoreAttributes = true;
$attrs = array();
$attr = null;
$value = null;
$token = null;
while ($hasMoreAttributes) {
$token = $this->getByte($input);
switch ($token) {
// Attribute specified.
case Horde_Xml_Wbxml::GLOBAL_TOKEN_LITERAL:
// Section 5.8.4.5
if (isset($attr)) {
$attrs[] = array('attribute' => $attr, 'value' => $value);
}
$attr = $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
break;
// Value specified.
// Value specified.
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_I_0:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_I_1:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_I_2:
// Section 5.8.4.2
$value .= $this->termstr($input);
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_T_0:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_T_1:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_T_2:
// Section 5.8.4.2
$value .= $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_0:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_1:
case Horde_Xml_Wbxml::GLOBAL_TOKEN_EXT_2:
// Section 5.8.4.2
$value .= $input[$this->_strpos++];
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_ENTITY:
// Section 5.8.4.3
$value .= $this->entity(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_STR_I:
// Section 5.8.4.1
$value .= $this->termstr($input);
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_STR_T:
// Section 5.8.4.1
$value .= $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_OPAQUE:
// Section 5.8.4.6
$size = Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos);
$b = substr($input, $this->_strpos, $this->_strpos + $size);
$this->_strpos += $size;
$value .= $b;
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_END:
// Section 5.8.4.7.1
$hasMoreAttributes = false;
if (isset($attr)) {
$attrs[] = array('attribute' => $attr, 'value' => $value);
}
break;
case Horde_Xml_Wbxml::GLOBAL_TOKEN_SWITCH_PAGE:
// Section 5.8.4.7.2
$codePage = $this->getByte($input);
if (!$this->_prevAttributeDTD) {
$this->_prevAttributeDTD = $this->_attributeDTD;
}
$this->switchAttributeCodePage($codePage);
break;
default:
if ($token > 128) {
if (isset($attr)) {
$attrs[] = array('attribute' => $attr, 'value' => $value);
}
$attr = $this->_attributeDTD->toAttribute($token);
} else {
// Value.
$value .= $this->_attributeDTD->toAttribute($token);
}
break;
}
}
if (!$this->_prevAttributeDTD) {
$this->_attributeDTD = $this->_prevAttributeDTD;
$this->_prevAttributeDTD = false;
}
$this->stopGetAttributes();
}