Horde_Xml_Wbxml_Decoder::decode PHP Method

decode() public method

Decoding result is directly passed to the contentHandler. A contenthandler must be set using setContentHandler prior to invocation of this method
public decode ( string $wbxml )
$wbxml string The WBXML document to decode.
    public function decode($wbxml)
    {
        $this->_error = false;
        // reset state
        $this->_strpos = 0;
        if (empty($this->_ch)) {
            throw new Horde_Xml_Wbxml_Exception('No Contenthandler defined.');
        }
        // Get Version Number from Section 5.4
        // version = u_int8
        // currently 1, 2 or 3
        $this->_wbxmlVersion = $this->getVersionNumber($wbxml);
        // Get Document Public Idetifier from Section 5.5
        // publicid = mb_u_int32 | (zero index)
        // zero = u_int8
        // Containing the value zero (0)
        // The actual DPI is determined after the String Table is read.
        $dpiStruct = $this->getDocumentPublicIdentifier($wbxml);
        // Get Charset from 5.6
        // charset = mb_u_int32
        $this->_charset = $this->getCharset($wbxml);
        // Get String Table from 5.7
        // strb1 = length *byte
        $this->retrieveStringTable($wbxml);
        // Get Document Public Idetifier from Section 5.5.
        $this->_dpi = $this->getDocumentPublicIdentifierImpl($dpiStruct['dpiType'], $dpiStruct['dpiNumber'], $this->_stringTable);
        // Now the real fun begins.
        // From Sections 5.2 and 5.8
        // Default content handler.
        $this->_dtdManager = new Horde_Xml_Wbxml_DtdManager();
        // Get the starting DTD.
        $this->_tagDTD = $this->_dtdManager->getInstance($this->_dpi);
        if (!$this->_tagDTD) {
            throw new Horde_Xml_Wbxml_Exception('No DTD found for ' . $this->_dpi . '/' . $dpiStruct['dpiNumber']);
        }
        $this->_attributeDTD = $this->_tagDTD;
        while (empty($this->_error) && $this->_strpos < strlen($wbxml)) {
            $this->_decode($wbxml);
        }
        if (!empty($this->_error)) {
            throw $this->_error;
        }
    }

Usage Example

Esempio n. 1
0
 protected function _decode($input)
 {
     $token = $this->getByte($input);
     $str = '';
     // print "position: " . $this->_strpos . " token: " . $token . " str10: " . substr($input, $this->_strpos, 10) . "\n"; // @todo: remove debug output
     switch ($token) {
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_STR_I:
             // Section 5.8.4.1
             $str = $this->termstr($input);
             $this->_ch->characters($str);
             // print "str:$str\n"; // @TODO Remove debug code
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_STR_T:
             // Section 5.8.4.1
             $x = Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos);
             $str = $this->getStringTableEntry($x);
             $this->_ch->characters($str);
             break;
         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
             $str = $this->termstr($input);
             $this->_ch->characters($str);
             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
             $str = $this->getStringTableEnty(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->_ch->characters($str);
             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
             $extension = $this->getByte($input);
             $this->_ch->characters($extension);
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_ENTITY:
             // Section 5.8.4.3
             // UCS-4 chracter encoding?
             $entity = $this->entity(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->_ch->characters('&#' . $entity . ';');
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_PI:
             // Section 5.8.4.4
             throw new Horde_Xml_Wbxml_Exception('WBXML global token processing instruction is unsupported');
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_LITERAL:
             // Section 5.8.4.5
             $str = $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->parseTag($input, $str, false, false);
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_LITERAL_A:
             // Section 5.8.4.5
             $str = $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->parseTag($input, $str, true, false);
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_LITERAL_AC:
             // Section 5.8.4.5
             $str = $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->parseTag($input, $string, true, true);
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_LITERAL_C:
             // Section 5.8.4.5
             $str = $this->getStringTableEntry(Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos));
             $this->parseTag($input, $str, false, true);
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_OPAQUE:
             // Section 5.8.4.6
             $size = Horde_Xml_Wbxml::MBUInt32ToInt($input, $this->_strpos);
             if ($size > 0) {
                 $b = substr($input, $this->_strpos, $size);
                 // print "opaque of size $size: ($b)\n"; // @todo remove debug
                 $this->_strpos += $size;
                 // opaque data inside a <data> element may or may not be
                 // a nested wbxml document (for example devinf data).
                 // We find out by checking the first byte of the data: if it's
                 // 1, 2 or 3 we expect it to be the version number of a wbxml
                 // document and thus start a new wbxml decoder instance on it.
                 if ($size > 0 && $this->_isData && ord($b) <= 10) {
                     $decoder = new Horde_Xml_Wbxml_Decoder();
                     $decoder->setContentHandler($this->_ch);
                     $decoder->decode($b);
                     //                /* // @todo: FIXME currently we can't decode Nokia
                     // DevInf data. So ignore error for the time beeing.
                     // */
                     // $this->_ch->characters($s);
                 } else {
                     /* normal opaque behaviour: just copy the raw data: */
                     // print "opaque handled as string=$b\n"; // @todo remove debug
                     $this->_ch->characters($b);
                 }
             }
             // old approach to deal with opaque data inside ContentHandler:
             // FIXME Opaque is used by SYNCML.  Opaque data that depends on the context
             // if (contentHandler instanceof OpaqueContentHandler) {
             //     ((OpaqueContentHandler)contentHandler).opaque(b);
             // } else {
             //     String str = new String(b, 0, size, charset);
             //     char[] chars = str.toCharArray();
             //     contentHandler.characters(chars, 0, chars.length);
             // }
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_END:
             // Section 5.8.4.7.1
             $str = $this->endTag();
             break;
         case Horde_Xml_Wbxml::GLOBAL_TOKEN_SWITCH_PAGE:
             // Section 5.8.4.7.2
             $codePage = $this->getByte($input);
             // print "switch to codepage $codePage\n"; // @todo: remove debug code
             $this->switchElementCodePage($codePage);
             break;
         default:
             // Section 5.8.2
             // Section 5.8.3
             $hasAttributes = ($token & 0x80) != 0;
             $hasContent = ($token & 0x40) != 0;
             $realToken = $token & 0x3f;
             $str = $this->getTag($realToken);
             // print "element:$str\n"; // @TODO Remove debug code
             $this->parseTag($input, $str, $hasAttributes, $hasContent);
             if ($realToken == 0xf) {
                 // store if we're inside a Data tag. This may contain
                 // an additional enclosed wbxml document on which we have
                 // to run a seperate encoder
                 $this->_isData = true;
             } else {
                 $this->_isData = false;
             }
             break;
     }
 }