[sync] (no subject)
Anthony Mills
amills at gascard.net
Thu Dec 4 00:09:41 PST 2003
With two small problems of course.
One look on line 231. It treats the token as a false, or as not a false.
Two opaque data is ignored. Not sure how SyncML upstream will handle opaque
data.
I know it's kludgy, but it works with SyncML.
Have fun.
Anthony
-------------- next part --------------
? patch.txt
? docs/examples/DecoderTest.php
? docs/examples/test-syncml_client_packet_1.xml.wbxml
Index: WBXML.php
===================================================================
RCS file: /repository/framework/XML_WBXML/WBXML.php,v
retrieving revision 1.7
diff -u -r1.7 WBXML.php
--- WBXML.php 4 Dec 2003 04:11:47 -0000 1.7
+++ WBXML.php 4 Dec 2003 08:08:12 -0000
@@ -86,14 +86,15 @@
$b = 0;
do {
- $b = fread($in, 1);
- $bs->set($j++, ($b & 64) != 0); // 0x40
- $bs->set($j++, ($b & 32) != 0); // 0x20
- $bs->set($j++, ($b & 16) != 0); // 0x10
- $bs->set($j++, ($b & 8) != 0); // 0x08
- $bs->set($j++, ($b & 4) != 0); // 0x04
- $bs->set($j++, ($b & 2) != 0); // 0x02
- $bs->set($j++, ($b & 1) != 0); // 0x01
+ $b = ord(fread($in, 1));
+
+ $bs->set($j++, ((($b & 64) != 0) ? 1 : 0)); // 0x40
+ $bs->set($j++, ((($b & 32) != 0) ? 1 : 0)); // 0x20
+ $bs->set($j++, ((($b & 16) != 0) ? 1 : 0)); // 0x10
+ $bs->set($j++, ((($b & 8) != 0) ? 1 : 0)); // 0x08
+ $bs->set($j++, ((($b & 4) != 0) ? 1 : 0)); // 0x04
+ $bs->set($j++, ((($b & 2) != 0) ? 1 : 0)); // 0x02
+ $bs->set($j++, ((($b & 1) != 0) ? 1 : 0)); // 0x01
} while (($b & 128) != 0);
$value = 0;
Index: WBXML/DTD.php
===================================================================
RCS file: /repository/framework/XML_WBXML/WBXML/DTD.php,v
retrieving revision 1.3
diff -u -r1.3 DTD.php
--- WBXML/DTD.php 2 Dec 2003 19:15:58 -0000 1.3
+++ WBXML/DTD.php 4 Dec 2003 08:08:12 -0000
@@ -26,7 +26,7 @@
var $XMLNS;
var $DPI;
- function XML_WBXMLDTD($v)
+ function XML_WBXML_DTD($v)
{
$this->version = $v;
$this->init();
Index: WBXML/Decoder.php
===================================================================
RCS file: /repository/framework/XML_WBXML/WBXML/Decoder.php,v
retrieving revision 1.6
diff -u -r1.6 Decoder.php
--- WBXML/Decoder.php 4 Dec 2003 04:35:56 -0000 1.6
+++ WBXML/Decoder.php 4 Dec 2003 08:08:13 -0000
@@ -75,6 +75,11 @@
{
$this->_dtdManager = &new XML_WBXML_DTDManager();
}
+
+ function getbyte($input)
+ {
+ return ord(fread($input, 1));
+ }
function decode($input)
{
@@ -82,6 +87,8 @@
// version = u_int8
// currently 1, 2 or 3
$this->_wbxmlVersion = $this->getVersionNumber($input);
+ //debug
+ //print("Version: |" . $this->_wbxmlVersion . "|\n");
// Get Document Public Idetifier from Section 5.5
// publicid = mb_u_int32 | (zero index)
@@ -89,19 +96,26 @@
// Containing the value zero (0)
// The actual DPI is determined after the String Table is read.
$dpiStruct = $this->getDocumentPublicIdentifier($input);
+
+ //print("dpiType: " . $dpiStruct['dpiType'] . " dpiNumber: " . $dpiStruct['dpiNumber'] . "\n");
// Get Charset from 5.6
// charset = mb_u_int32
$this->_charset = $this->getCharset($input);
+ //debug
+ //print("Charset: " . $this->_charset . "\n");
// Get String Table from 5.7
// strb1 = length *byte
$this->_stringTable = $this->getStringTable($input, $this->_charset);
+ //debug
+ //$this->print_stringtable($this->_stringTable);
// Get Document Public Idetifier from Section 5.5
$this->_dpi = $this->getDocumentPublicIdentifierImpl($dpiStruct['dpiType'],
$dpiStruct['dpiNumber'],
$this->_stringTable);
+ //print("DPI: " . $this->_dpi . "\n");
// Now the real fun begins.
// from Sections 5.2 and 5.8
@@ -109,12 +123,26 @@
// Default content handler.
$this->_ch = &new XML_WBXML_ContentHandler();
+ // Default content handler.
+ $this->_dtdManager = new XML_WBXML_DTDManager();
+
+ $this->_tagDTD = $this->_dtdManager->getInstance('-//SYNCML//DTD SyncML 1.1//EN');
+ $this->_attributeDTD= $this->_tagDTD;
+
+ //print("dtd=|" . $this->_tagDTD->getURI() . "|\n");
+
+ //get the starting DTD
+ $this->_tagDTD = $this->_dtdManager->getInstance($this->_dpi);
+ $this->_attributeDTD= $this->_tagDTD;
+
+ //print("dtd=|" . $this->_tagDTD->getURI() . "|\n");
+
while ($this->decodeInternal($input));
}
function getVersionNumber($input)
{
- return fread($input, 1);
+ return $this->getbyte($input);
}
function getDocumentPublicIdentifier($input)
@@ -126,7 +154,7 @@
if ($i == 0) {
$dpiStruct['dpiType'] = 2;
- $dpiStruct['dpiNumber'] = fread($input, 1);
+ $dpiStruct['dpiNumber'] = $this->getbyte($input);
} else {
$dpiStruct['dpiType'] = 1;
$dpiStruct['dpiNumber'] = $i;
@@ -153,7 +181,10 @@
function getCharset($input)
{
$cs = XML_WBXML::MBUInt32ToInt($input);
+ //print("cs num" . $cs . "\n");
+
$ret = XML_WBXML::getCharsetString($cs);
+
return $ret;
}
@@ -162,52 +193,59 @@
*/
function getStringTable($input, $cs)
{
- $st = array();
+ $strtable = array();
$size = XML_WBXML::MBUInt32ToInt($input);
+ //print("Size: " . $size);
+ //a hack to make it work with arrays
+ $str = "j";
+
+ $numstr = 0;
+ $start = 0;
+ $j = 0;
+ for ($i = 0; $i < $size; $i++ ) {
+ //May need to fix the null detector for more than single byte charsets like ASCII, UTF-8, etc
+ $ch = fread($input, 1);
+ if (ord($ch) == 0) {
+ $strtable[$numstr++] = $str;
+ $str = "#";
+ $start = $i+1;
+ } else {
+ $str[$j++] = $ch;
+ //print($ch);
+ }
+ }
- // Nice big ol'
- // FIXME
- // Will need help rewriting this one
-// byte[] bytes = new byte[size];
-//
-// int start = 0;
-// for (int i = 0; i < size; i++ ) {
-// //May need to fix the null detector for more than ASCII, UTF-8, etc charsets
-// if (isStringTerminator(pbis, cs)) {
-// pbis.read();
-// String newString = new String( bytes, start, i - start, charset );
-// st.put(new Integer(start), newString);
-// start = i+1;
-// System.err.println("start: " + start + " newString: " + newString);
-// } else {
-// bytes[i] = (byte)pbis.read();
-// }
-// }
-//
-// if (start<size) {
-// String newString = new String( bytes, start, size - start, charset);
-// st.put(new Integer(start), newString);
-// }
-//
+ if ($start<$size) {
+ $strtable[$numstr++] = $str;
+ }
- return $st;
+ return $strtable;
}
function decodeInternal($input)
{
- $token = fread($input, 1);
-
+ $token = $this->getbyte($input);
+
+ //print("\$token=" . $token);
+
+ //zero is read as false it messes up
+ //this way will never end
+ //if ($token == 0 || $token) {
+ //zero is read as false it messes up
+ //this way will end too soon
if ($token) {
$str = '';
switch ($token) {
case XML_WBXML_GLOBAL_TOKEN_STR_I:
+ //print("XML_WBXML_GLOBAL_TOKEN_STR_I " . $token);
// Section 5.8.4.1
$str = $this->termstr($input);
$this->_ch->characters($str);
break;
case XML_WBXML_GLOBAL_TOKEN_STR_T:
+ //print("XML_WBXML_GLOBAL_TOKEN_STR_T " . $token);
// Section 5.8.4.1
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($intput)];
$this->_ch->characters($str);
@@ -216,6 +254,7 @@
case XML_WBXML_GLOBAL_TOKEN_EXT_I_0:
case XML_WBXML_GLOBAL_TOKEN_EXT_I_1:
case XML_WBXML_GLOBAL_TOKEN_EXT_I_2:
+ //print("XML_WBXML_GLOBAL_TOKEN_EXT_I_? " . $token);
// Section 5.8.4.2
$str = $this->termstr($input);
$this->_ch->characters($str);
@@ -224,6 +263,7 @@
case XML_WBXML_GLOBAL_TOKEN_EXT_T_0:
case XML_WBXML_GLOBAL_TOKEN_EXT_T_1:
case XML_WBXML_GLOBAL_TOKEN_EXT_T_2:
+ //print("XML_WBXML_GLOBAL_TOKEN_EXT_T_? " . $token);
// Section 5.8.4.2
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($intput)];
$this->_ch->characters($str);
@@ -232,12 +272,14 @@
case XML_WBXML_GLOBAL_TOKEN_EXT_0:
case XML_WBXML_GLOBAL_TOKEN_EXT_1:
case XML_WBXML_GLOBAL_TOKEN_EXT_2:
+ //print("XML_WBXML_GLOBAL_TOKEN_EXT_? " . $token);
// Section 5.8.4.2
- $extension = fread($input, 1);
+ $extension = getbyte($input, 1);
$this->_ch->characters($extension);
break;
case XML_WBXML_GLOBAL_TOKEN_ENTITY:
+ //print("XML_WBXML_GLOBAL_TOKEN_ENTITY " . $token);
// Section 5.8.4.3
// UCS-4 chracter encoding?
$entity = $this->entity(XML_WBXML::MBUInt32ToInt($input));
@@ -246,35 +288,41 @@
break;
case XML_WBXML_GLOBAL_TOKEN_PI:
+ //print("XML_WBXML_GLOBAL_TOKEN_PI " . $token);
// Section 5.8.4.4
// throw new IOException("WBXML global token processing instruction(PI, " + token + ") is unsupported!");
break;
case XML_WBXML_GLOBAL_TOKEN_LITERAL:
+ //print("XML_WBXML_GLOBAL_TOKEN_LITERAL " . $token);
// Section 5.8.4.5
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($input)];
$this->parseTag($input, $str, false, false);
break;
case XML_WBXML_GLOBAL_TOKEN_LITERAL_A:
+ //print("XML_WBXML_GLOBAL_TOKEN_LITERAL_A " . $token);
// Section 5.8.4.5
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($input)];
$this->parseTag($input, $str, true, false);
break;
case XML_WBXML_GLOBAL_TOKEN_LITERAL_AC:
+ //print("XML_WBXML_GLOBAL_TOKEN_LITERAL_AC " . $token);
// Section 5.8.4.5
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($input)];
$this->parseTag($input, $string, true, true);
break;
case XML_WBXML_GLOBAL_TOKEN_LITERAL_C:
+ //print("XML_WBXML_GLOBAL_TOKEN_LITERAL_C " . $token);
// Section 5.8.4.5
$str = $this->_stringTable[XML_WBXML::MBUInt32ToInt($input)];
$this->parseTag($input, $str, false, true);
break;
case XML_WBXML_GLOBAL_TOKEN_OPAQUE:
+ //print("XML_WBXML_GLOBAL_TOKEN_OPAQUE " . $token);
// Section 5.8.4.6
$size = XML_WBXML::MBUInt32ToInt($input);
$b = fread($input, $size);
@@ -294,23 +342,27 @@
break;
case XML_WBXML_GLOBAL_TOKEN_END:
+ //print("XML_WBXML_GLOBAL_TOKEN_END " . $token);
// Section 5.8.4.7.1
$str = $this->endTag();
break;
case XML_WBXML_GLOBAL_TOKEN_SWITCH_PAGE:
+ //print('XML_WBXML_GLOBAL_TOKEN_SWITCH_PAGE ' . $token);
// Section 5.8.4.7.2
- $codePage = fread($input, 1);
+ $codePage = $this->getbyte($input, 1);
$this->switchElementCodePage($codePage);
break;
default:
+ //print("default " . $token);
// Section 5.8.2
// Section 5.8.3
$hasAttributes = (($token & 0x80) != 0);
$hasContent = (($token & 0x40) != 0);
$realToken = $token & 0x3F;
$str = $this->getTag($realToken);
+ //print("\$str=" . $str);
$this->parseTag($input, $str, $hasAttributes, $hasContent);
@@ -373,7 +425,7 @@
$token = null;
while ($hasMoreAttributes) {
- $token = fread($input, 1);
+ $token = getbyte($input, 1);
switch ($token) {
// Attribute specified.
@@ -443,7 +495,7 @@
case XML_WBXML_GLOBAL_TOKEN_SWITCH_PAGE:
// Section 5.8.4.7.2
- $codePage = fread($input, 1);
+ $codePage = getbyte($input, 1);
if (!$this->_prevAttributeDTD) {
$this->_prevAttributeDTD = $this->_attributeDTD;
}
@@ -500,25 +552,31 @@
function getTag($tag)
{
+ //print("\$tag=" . $tag);
// Should know which state it is in.
- return $this->_tagDTD->toTag($tag);
+ return $this->_tagDTD->toTagStr($tag);
}
function getAttribute($attribute)
{
// Should know which state it is in.
- $this->_attributeDTD->toAttribute($attribute);
+ $this->_attributeDTD->toAttributeInt($attribute);
}
function switchElementCodePage($codePage)
{
- $this->_tagDTD = &$this->_dtdManager->getInstance($codePage);
+ print("\$this->_tagDTD->getURI()=" . $codePage);
+
+ $this->_tagDTD = &$this->_dtdManager->getInstance($this->_tagDTD->toCodePageStr($codePage));
+
+ print("\$this->_tagDTD->getURI()=" . $this->_tagDTD->getURI());
+
$this->switchAttributeCodePage($codePage);
}
function switchAttributeCodePage($codePage)
{
- $this->_attributeDTD = &$this->_dtdManager->getInstance($codePage);
+ $this->_attributeDTD = &$this->_dtdManager->getInstance($this->_attributeDTD->toCodePageStr($codePage));
}
/**
@@ -526,7 +584,7 @@
*/
function entity($entity)
{
- return $entity;
+ return dechex($entity);
}
/**
@@ -534,7 +592,29 @@
*/
function termstr($input)
{
- return '';
+ $str = '#';
+ $i = 0;
+ $ch = fread($input, 1);
+ while (ord($ch) != 0) {
+ $str[$i++] = $ch;
+ $ch = fread($input, 1);
+ }
+
+ return $str;
+ }
+
+ /**
+ * For debugging
+ */
+
+ function print_stringtable($st)
+ {
+ print("String Table: ");
+ foreach ($st as $s) {
+ print($s . ", ");
+ }
+
+ print("\n");
}
}
Index: docs/examples/decode.php
===================================================================
RCS file: /repository/framework/XML_WBXML/docs/examples/decode.php,v
retrieving revision 1.1
diff -u -r1.1 decode.php
--- docs/examples/decode.php 4 Dec 2003 04:35:56 -0000 1.1
+++ docs/examples/decode.php 4 Dec 2003 08:08:13 -0000
@@ -10,3 +10,8 @@
$input = fopen('syncml_client_packet_1.wbxml', 'rb');
$decoder->decode($input);
+
+fclose($input);
+
+
+
More information about the sync
mailing list