📄 wbxmlparser.java
字号:
case Wbxml.STR_T :
{
type = TEXT;
text = readStrT();
}
break;
default :
parseElement(id);
}
// }
// while (next == null);
// return next;
}
/** Overwrite this method to intercept all wap events */
public Object parseWapExtension(int id) throws IOException, XmlPullParserException {
switch (id) {
case Wbxml.EXT_I_0 :
case Wbxml.EXT_I_1 :
case Wbxml.EXT_I_2 :
return readStrI();
case Wbxml.EXT_T_0 :
case Wbxml.EXT_T_1 :
case Wbxml.EXT_T_2 :
return new Integer(readInt());
case Wbxml.EXT_0 :
case Wbxml.EXT_1 :
case Wbxml.EXT_2 :
return null;
case Wbxml.OPAQUE :
{
int count = readInt();
byte[] buf = new byte[count];
while(count > 0){
count -= in.read(buf, buf.length-count, count);
}
return buf;
} // case OPAQUE
default:
exception("illegal id: "+id);
return null; // dead code
} // SWITCH
}
public void readAttr() throws IOException, XmlPullParserException {
int id = readByte();
int i = 0;
while (id != 1) {
while(id == Wbxml.SWITCH_PAGE){
selectPage(readByte(), false);
id = readByte();
}
String name = resolveId(attrStartTable, id);
StringBuffer value;
int cut = name.indexOf('=');
if (cut == -1)
value = new StringBuffer();
else {
value =
new StringBuffer(name.substring(cut + 1));
name = name.substring(0, cut);
}
id = readByte();
while (id > 128
|| id == Wbxml.SWITCH_PAGE
|| id == Wbxml.ENTITY
|| id == Wbxml.STR_I
|| id == Wbxml.STR_T
|| (id >= Wbxml.EXT_I_0 && id <= Wbxml.EXT_I_2)
|| (id >= Wbxml.EXT_T_0 && id <= Wbxml.EXT_T_2)) {
switch (id) {
case Wbxml.SWITCH_PAGE :
selectPage(readByte(), false);
break;
case Wbxml.ENTITY :
value.append((char) readInt());
break;
case Wbxml.STR_I :
value.append(readStrI());
break;
case Wbxml.EXT_I_0 :
case Wbxml.EXT_I_1 :
case Wbxml.EXT_I_2 :
case Wbxml.EXT_T_0 :
case Wbxml.EXT_T_1 :
case Wbxml.EXT_T_2 :
case Wbxml.EXT_0 :
case Wbxml.EXT_1 :
case Wbxml.EXT_2 :
case Wbxml.OPAQUE :
value.append(resolveWapExtension(id, parseWapExtension(id)));
break;
case Wbxml.STR_T :
value.append(readStrT());
break;
default :
value.append(
resolveId(attrValueTable, id));
}
id = readByte();
}
attributes = ensureCapacity(attributes, i + 4);
attributes[i++] = "";
attributes[i++] = null;
attributes[i++] = name;
attributes[i++] = value.toString();
attributeCount++;
}
}
private int peekId () throws IOException {
if (nextId == -2) {
nextId = in.read ();
}
return nextId;
}
/** overwrite for own WAP extension handling in attributes and high level parsing
* (above nextToken() level) */
protected String resolveWapExtension(int id, Object data){
if(data instanceof byte[]){
StringBuffer sb = new StringBuffer();
byte[] b = (byte[]) data;
for (int i = 0; i < b.length; i++) {
sb.append(HEX_DIGITS.charAt((b[i] >> 4) & 0x0f));
sb.append(HEX_DIGITS.charAt(b[i] & 0x0f));
}
return sb.toString();
}
return "$("+data+")";
}
String resolveId(String[] tab, int id) throws IOException {
int idx = (id & 0x07f) - 5;
if (idx == -1){
wapCode = -1;
return readStrT();
}
if (idx < 0
|| tab == null
|| idx >= tab.length
|| tab[idx] == null)
throw new IOException("id " + id + " undef.");
wapCode = idx+5;
return tab[idx];
}
void parseElement(int id)
throws IOException, XmlPullParserException {
type = START_TAG;
name = resolveId(tagTable, id & 0x03f);
attributeCount = 0;
if ((id & 128) != 0) {
readAttr();
}
degenerated = (id & 64) == 0;
int sp = depth++ << 2;
// transfer to element stack
elementStack = ensureCapacity(elementStack, sp + 4);
elementStack[sp + 3] = name;
if (depth >= nspCounts.length) {
int[] bigger = new int[depth + 4];
System.arraycopy(nspCounts, 0, bigger, 0, nspCounts.length);
nspCounts = bigger;
}
nspCounts[depth] = nspCounts[depth - 1];
for (int i = attributeCount - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (getAttributeName(i)
.equals(getAttributeName(j)))
exception(
"Duplicate Attribute: "
+ getAttributeName(i));
}
}
if (processNsp)
adjustNsp();
else
namespace = "";
elementStack[sp] = namespace;
elementStack[sp + 1] = prefix;
elementStack[sp + 2] = name;
}
private final String[] ensureCapacity(
String[] arr,
int required) {
if (arr.length >= required)
return arr;
String[] bigger = new String[required + 16];
System.arraycopy(arr, 0, bigger, 0, arr.length);
return bigger;
}
int readByte() throws IOException {
int i = in.read();
if (i == -1)
throw new IOException("Unexpected EOF");
return i;
}
int readInt() throws IOException {
int result = 0;
int i;
do {
i = readByte();
result = (result << 7) | (i & 0x7f);
}
while ((i & 0x80) != 0);
return result;
}
String readStrI() throws IOException {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
boolean wsp = true;
while (true){
int i = in.read();
if (i == 0){
break;
}
if (i == -1){
throw new IOException(UNEXPECTED_EOF);
}
if (i > 32){
wsp = false;
}
buf.write(i);
}
isWhitespace = wsp;
String result = new String(buf.toByteArray(), encoding);
buf.close();
return result;
}
String readStrT() throws IOException {
int pos = readInt();
// As the main reason of stringTable is compression we build a cache of Strings
// stringTable is supposed to help create Strings from parts which means some cache hit rate
// This will help to minimize the Strings created when invoking readStrT() repeatedly
if (cacheStringTable == null){
//Lazy init if device is not using StringTable but inline 0x03 strings
cacheStringTable = new Hashtable();
}
String forReturn = (String) cacheStringTable.get(new Integer(pos));
if (forReturn == null){
int end = pos;
while(end < stringTable.length && stringTable[end] != '\0'){
end++;
}
forReturn = new String(stringTable, pos, end-pos, encoding);
cacheStringTable.put(new Integer(pos), forReturn);
}
return forReturn;
}
/**
* Sets the tag table for a given page.
* The first string in the array defines tag 5, the second tag 6 etc.
*/
public void setTagTable(int page, String[] table) {
setTable(page, TAG_TABLE, table);
// this.tagTable = tagTable;
// if (page != 0)
// throw new RuntimeException("code pages curr. not supp.");
}
/** Sets the attribute start Table for a given page.
* The first string in the array defines attribute
* 5, the second attribute 6 etc. Please use the
* character '=' (without quote!) as delimiter
* between the attribute name and the (start of the) value
*/
public void setAttrStartTable(
int page,
String[] table) {
setTable(page, ATTR_START_TABLE, table);
}
/** Sets the attribute value Table for a given page.
* The first string in the array defines attribute value 0x85,
* the second attribute value 0x86 etc.
*/
public void setAttrValueTable(
int page,
String[] table) {
setTable(page, ATTR_VALUE_TABLE, table);
}
/** Returns the token ID for start tags or the event type for wap proprietary events
* such as OPAQUE.
*/
public int getWapCode(){
return wapCode;
}
public Object getWapExtensionData(){
return wapExtensionData;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -