⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmlcparser.java

📁 手机Wap浏览器源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				//#endif
				return;
			}
			
			Tag currentTag = (Tag) tagStack.peek();
        	//#ifdef debug
			//# System.out.println("TAG END! -> " + Token.getTagName(currentTag.tagToken));
			//#endif
			if(baos.size() > 0)	// 如果有Text Content, 加入currentTag
			{
				Tag textTag = new Tag(Tag.TYPE_TEXT);
				textTag.text = getStrInCharset();
				currentTag.addSubTag(textTag);
				baos.reset();	// reset buffer
			}
				
			tagStack.pop();		// pop the stack
			return;
		} // early return!
		
		
		// =================================以下处理非Tag结束的情况=================================
		// 新Tag Token(MB_U_INT32)
		Tag tag = parseMB_U_INT32(b);
		//#ifdef debug
		//# System.out.println("new tag -> " + Token.getTagName(tag.tagToken) 
				//# + ", isHaveAtt=" + tag.isHaveAttribute
				//# + ", isHaveCon=" + tag.isHaveContent);
		//#endif
		
		if(tagStack.size() > 0)
		{
			//#ifdef debug
			//# System.out.println("tagStack.size > 0");
			//#endif
			Tag currentTag = (Tag) tagStack.peek();
			
			if(baos.size() > 0)					// buffer有内容, 新建Text Tag
			{
				Tag textTag = new Tag(Tag.TYPE_TEXT);
				textTag.text = getStrInCharset();
				//#ifdef debug
				//# System.out.println("add TEXT ->" + textTag.text);
				//#endif
				currentTag.addSubTag(textTag);
				baos.reset(); // 清空buffer
			}
			
			// 2. 做为上一级Tag的子Tag
			currentTag.addSubTag(tag);
		}else		// Fay: It's dirty!
		{
			rootTag = tag;
		}
		
		// 如果有属性, currentStatus转为ATTRIBUTE
		if(tag.isHaveAttribute)
		{
			currentStatus = STATUS_ATTRIBUTE;
		}
		
		if(tag.isHaveAttribute || tag.isHaveContent)
		{
			tagStack.addElement(tag);	// 加入tagStack
//			System.out.println("put tag -> " + Token.getTagName(tag.tagToken) 
//					+ ", isHaveAtt=" + tag.isHaveAttribute
//					+ ", isHaveCon=" + tag.isHaveContent);
		}
	}

	
	/**
	 * handle the b when it's ATTRIBUTE_STATUS
	 * 
	 * 分两种Token:
	 * Attribute Start,
	 * Attribute Value
	 * @param b
	 * @throws IOException 
	 */
	private void handle_Attribute_Status(int b) throws Exception
	{
		// b > 128 means b is an AttributeValue Token
//		if(preAttributeStart == -1 && (b > 128 || isGlobalTokenNeedHandle(b)))
		if(preAttributeStart == -1 && b > 128)	
		{
			// error
        	//#ifdef debug
			//# System.out.println("handle_Attribute_Status, error -> " + b);
			//#endif
			return;
		}
		
		if(tagStack.size() <= 0)
		{
        	//#ifdef debug
			//# System.out.println("handle_Attribute_Status, (tagStack.size() <= 0)");
			//#endif
			return;
		}
		
		Tag currentTag = (Tag) tagStack.peek();
		
		if(b == Token.GLOBAL_END)	// 属性结束
		{
			
        	//#ifdef debug
			//# System.out.println("ATTR END!");
			//#endif
			// 处理buffer, 完成前一个Attribute
			// 1. 解析AttributeStart
			// 2. 处理buffer(Value)
			String attLabel = Token.getAttLabelFromAttStartToken(preAttributeStart);
			String attValue = Token.getAttValueFromAttStartToken(preAttributeStart);
			if(attValue == null)
			{
				attValue = "";
			}
			attValue += getStrInCharset();
			if(attLabel == null )
			{
            	//#ifdef debug
				//# System.out.println("handle_Attribute_Status, (attLabel == null || attValue == null)");
				//#endif
				return;
			}
			
        	//#ifdef debug
			//# System.out.println("attr : " + attLabel + " = " + attValue);
			//#endif
			currentTag.addAttribute(attLabel, attValue);	// 增加attribute	
			this.currentStatus = STATUS_TAG;		// 改变status
			preAttributeStart = -1;					// 重置preAttributeStart
			baos.reset();
			if(currentTag.isHaveContent == false)
			{
				tagStack.pop();
            	//#ifdef debug
				//# System.out.println("ATT END & Pop -> " + Token.getTagName(currentTag.tagToken)); 
				//#endif
			}
			return;
		}
		
		// means Attribute Start
		if(b < 128)
		{
        	//#ifdef debug
			//# System.out.println("ATTR START TOKEN");
			//#endif
			// 处理buffer, 完成前一个Attribute
			// 1. 解析AttributeStart
			// 2. 处理buffer(Value)
			// 3. 设置preAttributeStart
			if(preAttributeStart != -1)
			{
				String attLabel = Token.getAttLabelFromAttStartToken(preAttributeStart);
				String attValue = Token.getAttValueFromAttStartToken(preAttributeStart);
				if(attValue == null)
				{
					attValue = "";
				}
//				attValue += new String(baos.toByteArray(), charsetStr);
				attValue += getStrInCharset();
				if(attLabel == null)
				{
	            	//#ifdef debug
					//# System.out.println("handle_Attribute_Status, (attLabel == null || attValue == null)2");
					//#endif
					return;
				}
            	//#ifdef debug
				//# System.out.println("attr : " + attLabel + " = " + attValue);
				//#endif
				currentTag.addAttribute(attLabel, attValue);	// 增加attribute
			}
			preAttributeStart = b;					// 设置preAttributeStart
			baos.reset();
			
		}else // "Attribute Value"
		{
        	//#ifdef debug
			//# System.out.println("ATTR VALUE TOKEN");
			//#endif
			
			// 找相应的AttributeValue, 放入buffer
			String value = Token.getValueFromAttValueToken(b);
			
        	//#ifdef debug
			//# System.out.println("value==" + value);
			//#endif
			baos.write(value.getBytes());
		}
	}
	
	static Tag parseMB_U_INT32(int b)
	{
		Tag tag = new Tag(Tag.TYPE_NORMAL);
		
		tag.isHaveAttribute = (((b >> 7) & 1) == 1);
		tag.isHaveContent = (((b >> 6) & 1) == 1);
//		System.out.println("isHaveAtt == " + tag.isHaveAttribute);
//		System.out.println("isHaveCon == " + tag.isHaveContent);
		tag.tagToken = b & 0x3f; 
		
//		System.out.println("new Tag -> " + tag.tagToken + ", name=" +  Token.getTagName(tag.tagToken));
		return tag;
	}
	
	private String getStrFromStringTable(int index) 
	{
		if(stringTable == null || index >= stringTable.length || index < 0)
		{
			return null;
		}
    	//#ifdef debug
		//# System.out.println("getStrFromStringTable -> " + index);
		//#endif
		StringBuffer buffer = new StringBuffer();
		for(int i = index; i < stringTable.length ; i ++)
		{
			if(stringTable[i] != 0)
			{
				buffer.append(new String(new byte[]{(byte)stringTable[i]}));
			}else
			{
            	//#ifdef debug
				//# System.out.println("getStr break -> " + i);
				//#endif
				break;
			}
		}
		
    	//#ifdef debug
		//# System.out.println("getStrFromTab111 == " + buffer.toString());
		//#endif
		return buffer.toString();
	}
	
	
	/**
	 * 判断b是否为Multi-byte Integers的结束.
	 * 即每一个字节是否为0
	 * 
	 * @param b
	 * @return
	 */
	static boolean isMB_U_INT32End(int b)
	{
		return (b >> 7 & 1) == 0;
	}
	
	/**
	 * 将Multi-byte Integers合并为一个int
	 * @param b
	 * @return
	 */
	static int mergeMB_U_INT32(byte[] b)
	{
		if(b == null || b.length == 0)	{ return -1; }
		
    	//#ifdef debug
		//# System.out.println("mergeMB's length == " + b.length);
		//#endif
		
		int value = 0;
		for(int i = 0 ; i < b.length ; i ++)
		{
        	//#ifdef debug
			//# System.out.println("mergeMB_U_INT32[" + i + "]=" + b[i]);
			//#endif
			value = (value << 7) | (b[i] & 0x7f); 
			if(isMB_U_INT32End(b[i]))
			{
				break;
			}
		}
		return value;
	}
	
	
	/**
	 * wml version	(mb_u_int32)
	 * 
	 * @param data
	 * @param pos
	 * @return
	 */
	private int parseWmlVersion(byte[] data, int pos)
	{
		while(true)
		{
			byte bb = data[pos];
			buffer_4_mb_int32.write(bb);
			pos ++;
			if(isMB_U_INT32End(bb))
			{
				break;
			}
		}
		
		xmlVersion = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
		buffer_4_mb_int32.reset();
		return pos;
	}
	
	/**
	 * charset		(mb_u_int32)
	 * 
	 * @param data
	 * @param pos
	 * @return
	 */
	private int parseWmlCharset(byte[] data, int pos)
	{
		while(true)
		{
			byte bb = data[pos];
			buffer_4_mb_int32.write(bb);
			pos ++;
			if(isMB_U_INT32End(bb))
			{
				break;
			}
		}
		charset = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
		buffer_4_mb_int32.reset();
		charsetStr = Token.getCharset(charset);
		if(charsetStr == null)
		{
			charsetStr = System.getProperty("microedition.encoding");
		}

		return pos;
	}
	/**
	 * table length	(mb_u_int32)
	 * and<br>
	 * table(if table length != 0)
	 * 
	 * @param data
	 * @param pos
	 * @return
	 */
	private int parseWmlTableStr(byte[] data, int pos)
	{
		while(true)
		{
			byte bb = data[pos];
			buffer_4_mb_int32.write(bb);
			pos ++;
			if(isMB_U_INT32End(bb))
			{
				break;
			}
		}
		
		int tbl = mergeMB_U_INT32(buffer_4_mb_int32.toByteArray());
    	//#ifdef debug
		//# System.out.println("tbl == " + tbl);
		//#endif
		buffer_4_mb_int32.reset();
		
		if(tbl != 0)
		{
			stringTable = new byte[tbl];
			System.arraycopy(data, pos, stringTable, 0, stringTable.length);
		}
		pos += tbl;
		
		return pos;
	}
	
	/**
	 * 2007-11-23 handle the exception now!
	 * 
	 * handle the charset
	 * 
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	private String getStrInCharset()
	{
		
		byte[] bs = baos.toByteArray(); 
		
		try{
			// from peter: transfer the utf-16 to utf-8
			if(charset == Token.IANA_UTF_16)	
			{
				bs = utf8utf16.ucs2_to_utf8(bs);
				return new String(bs, "UTF-8");
			}
			
			return new String(bs, charsetStr);
		}catch(Exception e)
		{
			return new String(bs);
		}
	}
	
	public String getCharsetStr() 
	{
		return charsetStr;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -