亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmdecoder.java

?? 用于開發mms應用的Java庫
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Tambur MMS library.
 *
 * The Initial Developer of the Original Code is FlyerOne Ltd.
 * Portions created by the Initial Developer are Copyright (C) 2005
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * 	Anders Lindh <alindh@flyerone.com>
 *
 * ***** END LICENSE BLOCK ***** */

package net.tambur.mms;

import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.ListIterator;
import java.util.Locale;
import java.util.SimpleTimeZone;

import org.apache.log4j.Logger;

/**
 * This class creates MMMessages from various formats (e.g. encapsulated, string, etc.)
 * 
 * @author Anders Lindh
 * @copyright Copyright FlyerOne Ltd 2005
 * @version $Revision: 1.1.1.1 $ $Date: 2005/04/14 09:04:10 $
 */
public class MMDecoder {

	/**
	 * logger 
	 */
	protected transient static Logger log = Logger.getLogger(MMDecoder.class);
		
	/**
	 * Decode message, i.e. build message from a byte array (decapsulate)
	 * 
	 * @param buf A byte[] containing a binary representation of the message
	 * @return whether successfull
	 */
	public static MMMessage decode(byte[] buf) throws MMDecodingException {
		ByteArrayInputStream in = new ByteArrayInputStream(buf);
		
		MMMessage res = new MMMessage();
		
		log.debug("Decoding message");
		
		try {
			// first X-Mms-Message-Type, X-Mms-Transaction-Id and X-Mms-Version (in this order)
			// these codes can be found in [MMSEncapsulation]
		
			// decode well-known headers
			while (decodeMessageHeader(res, in, null, null)) {};
			in.read();

			int cnt = 1;
			while (in.available() != 0) { // process any existing parts
				int hlen = decodeUintvar(in); // length of headers + content-type
				int dlen = decodeUintvar(in); // length of body								
	
				if ((hlen == 0) && (dlen == 0)) continue;

				log.debug("\tDecoding part: " + cnt++);
				log.debug("\t\tHeaders: " + hlen + ", content: " + dlen);
			
				if (hlen < 0 || hlen > 1024 * 5) { 	// max 5kb of headers				
					log.debug("Invalid size for headers: " + hlen);
					break;
				}

				String contenttype = null;
				byte[] headers = new byte[hlen];
				in.read(headers);

				ByteArrayInputStream his = new ByteArrayInputStream(headers);
				if (hlen != 0) contenttype = decodeContentType(his);
				if (contenttype == null) {
					log.error("Unknown contenttype for part; aborting");
					break;
				}
				log.debug("\t\tContent-type: " + contenttype);
			
				byte[] data = new byte[dlen];
				if (dlen > 0) in.read(data);
						
				ArrayList hNames = new ArrayList();
				ArrayList hValues = new ArrayList();
				while (decodeWSPHeader(his, hNames, hValues)) {}; // decode any additional headers
			
				res.addPart(contenttype, data, false, hNames, hValues);
				
				if (dlen == 0) break;
			}
						
		} catch (MMDecodingException e) {
			throw e;
		} catch (Exception ee) {
			ee.printStackTrace();
			throw new MMDecodingException(ee.toString());
		}
		
		return res;
	}

	/**
	 * Create the message from a String containing a valid MIME multipart encoded
	 * mms message
	 * 
	 * @throws MMDecodingException
	 */
	public static MMMessage fromString(String s) throws MMDecodingException {
		MMMessage msg = new MMMessage();
		
		MimeMessage mime = new MimeMessage(s);		
		msg.setContentType("application/vnd.wap.mms-message");
		msg.setVersion(MMConstants.MMS_VERSION_1_0);
		
		// encode headers
		ListIterator i = mime.getAttributes();
		while (i.hasNext()) {
			String name = (String) i.next();
			String value = (String) mime.getAttribute(name);

			// check if this is a well-known header (i.e. it should be mapped into some field)
			
			int c = 0;
			for (c = 0; c < MMConstants.knownMMSHeaders.length; c++) 
				if (((String)MMConstants.knownMMSHeaders[c][0]).equalsIgnoreCase(name)) break;
			
			//	check what type of field we're talking about
			switch (c) {							
				case 0:	// bcc				 
				 	msg.addBccAddress(value); break;						
				case 1:		// cc
					msg.addCcAddress(value); break;			
				case 2:		// x-mms-content-location
					msg.setContentLocation(value); break;			
				case 3:		// content-type					
					msg.setContentType(value); break;
				case 4:		// date
					msg.setDate(dateFromString(value));	break;
				case 5:		// x-mms-delivery-report					
					msg.setDeliveryReport(Boolean.valueOf(value));
					break;
				case 6:		// x-mms-delivery-time
					msg.setDeliveryTime(dateFromString(value)); break;
				case 7:		// x-mms-expiry
					msg.setExpiry(dateFromString(value)); break;
				case 8:		// from
					msg.setFrom(value); break;
				case 9:		// x-mms-message-class
					 msg.setMessageClass(getMessageClass(value));					 
					 break;				
				case 10:		// message-id
					 msg.setMessageId(value); break;				
				case 11:		// x-mms-message-type
					 msg.setMessageType(getMessageType(value)); break;				
				case 12:		// x-mms-version
					 //msg.setVersion(decodeInt(in));
					 //value = versionToString(msg.getVersion());
					 break;				
				case 13:		// message-size
					 msg.setMessageSize(Long.valueOf(value).longValue()); break;										
				case 14:		// x-mms-priority
					 msg.setPriority(getPriority(value)); break;						
				 case 15:		// x-mms-read-reply
				 	 msg.setReadReply(Boolean.valueOf(value)); break;						
				 case 16:		// x-mms-report-allowed
					 msg.setReportAllowed(Boolean.valueOf(value));
					 break;				
				 case 17:		// x-mms-response-status
					 msg.setResponseStatus(getResponseStatus(value)); break;				
				 case 18:		// x-mms-response-text
					 msg.setResponseText(value); break;				
				 case 19:		// x-mms-sender-visibility
					 msg.setSenderVisibility(Boolean.valueOf(value));
					 break;				
				 case 20:		// x-mms-status
					 msg.setStatus(getMessageStatus(value));
					 break;				
				 case 21:		// subject
					 msg.setSubject(value); break;				
				 case 22:		// to
					 msg.addToAddress(value); break;				
				 case 23:		// x-mms-transaction-id
					 msg.setTransactionId(value); break;				
				 default:		// unknown field, store textual representation
					 //throw new MMDecodingException("Invalid (unhandled) encoded header entry: " + String.valueOf(i));
					// skip all headers that start with a "X-"
					//if (!name.startsWith("X-"))
					//	msg.setAttribute(name, value);								
			 }
		}

		// add any parts
		if (!mime.parts.isEmpty()) {
			i = mime.parts.listIterator();
			while (i.hasNext())
				msg.addPart((MimeMessage.MimePart) i.next());
		}			
		
		return msg;
	} 

	/**
	 * Decode message headers (MMS), i.e. the ones that are represented in this class.
	 * if headers table isn't null, the headers added to the table also
	 *
	 * @return true if there still are any headers left, false otherwise
	 */
	protected static boolean decodeMessageHeader(MMMessage msg, ByteArrayInputStream in, ArrayList headerNames, ArrayList headerValues) throws Exception {
		int i = in.read();
		if (i == -1) return false; // end of stream

		if (i <= 30) 
			return false;

		if (i == 0x20) { // some weird bug
			while (i < 128) i = in.read();
		} 
		
		// string based content
		if ((i > 31) && (i < 128)) {
			String name = decodeString(in);
			String value = decodeString(in);
			if ((name != null) && (value != null)) {
				name = (char) i + name;
				//debug(DEBUG_ENABLED, "			o: " + name + ": " + value);

				if ((headerNames != null) && (headerValues != null)) 
					setAttribute(name, value, headerNames, headerValues);
			}

			return true;		
		}
			
		if ((i & 0xFF) > 128) i &= 127;
		i--; // our arrays are zero-based, compensate for this
				
		if (i > MMConstants.knownMMSHeaders.length) throw new MMDecodingException("Invalid encoded header entry: " + String.valueOf(i));
		
		String name = null;
		String value = null;
		Boolean b = null;
		
		name = (String) MMConstants.knownMMSHeaders[i][0];	
		
		// check what type of field we're talking about
		switch (i) {							
			case 0:		// bcc
				value = decodeString(in);
				msg.addBccAddress(value);
				break;						
			case 1:		// cc
				value = decodeString(in);
				msg.addCcAddress(value);
				break;			
			case 2:		// x-mms-content-location
				value = decodeString(in);
				msg.setContentLocation(value);
				break;			
			case 3:		// content-type
				value = decodeContentType(in);
				msg.setContentType(value);			// content type is always last				
				break;
			case 4:		// date
				msg.setDate(decodeDate(in));
				value = msg.getDateStr();
				break;
			case 5:		// x-mms-delivery-report
				b = decodeBoolean(in); 
				msg.setDeliveryReport(b);
				value = b.toString();
				break;
			case 6:		// x-mms-delivery-time
				Object[] tmp = decodeDateVariable(in);
				msg.setDeliveryTime((Date) tmp[0]);
				msg.setDeliveryTimeAbsolute(((Boolean) tmp[1]).booleanValue()); 
				value = msg.getDeliveryTimeStr();
				break;
			case 7:		// x-mms-expiry
				tmp = decodeDateVariable(in);
				msg.setExpiry((Date) tmp[0]);
				msg.setExpiryAbsolute(((Boolean) tmp[1]).booleanValue()); 
				value = msg.getExpiryStr();
				break;
			case 8:		// from
				msg.setFrom(decodeFrom(in));
				value = msg.getFrom();
				break;
			case 9:		// x-mms-message-class
				msg.setMessageClass(decodeInt(in));
				if (msg.getMessageClass() < MMConstants.MESSAGE_CLASSES.length) value = MMConstants.MESSAGE_CLASSES[msg.getMessageClass()];
				break;				
			case 10:		// message-id
				value = decodeString(in);
				msg.setMessageId(value);
				break;				
			case 11:		// x-mms-message-type
				msg.setMessageType(decodeInt(in));
				if (msg.getMessageType() < MMConstants.MESSAGE_TYPES.length) value = MMConstants.MESSAGE_TYPES[msg.getMessageType()];
				break;				
			case 12:		// x-mms-version
				msg.setVersion(decodeInt(in));
				value = versionToString(msg.getVersion());
				break;				
			case 13:		// message-size
				msg.setMessageSize(decodeLong(in));
				value = String.valueOf(msg.getMessageSize());
				break;										
			case 14:		// x-mms-priority
				msg.setPriority(decodeInt(in));
				if (msg.getPriority() < MMConstants.PRIORITIES.length) value = MMConstants.PRIORITIES[msg.getPriority()];				
				break;						
			case 15:		// x-mms-read-reply
				b = decodeBoolean(in); 			
				msg.setReadReply(b);
				value = b.toString();
				break;						
			case 16:		// x-mms-report-allowed
				b = decodeBoolean(in); 			
				msg.setReportAllowed(b);
				value = b.toString();
				break;				
			case 17:		// x-mms-response-status
				msg.setResponseStatus(decodeInt(in));
				if (msg.getResponseStatus() < MMConstants.RESPONSE_STATUSES.length) value = MMConstants.RESPONSE_STATUSES[msg.getResponseStatus()];				
				break;				
			case 18:		// x-mms-response-text
				value = decodeString(in);
				msg.setResponseText(value);
				break;				
			case 19:		// x-mms-sender-visibility
				b = decodeBoolean(in); 						
				msg.setSenderVisibility(b);
				value = b.toString();
				break;				
			case 20:		// x-mms-status
				msg.setStatus(decodeInt(in));
				if (msg.getStatus() < MMConstants.STATUSES.length) value = MMConstants.STATUSES[msg.getStatus()];				
				break;				
			case 21:		// subject
				value = decodeString(in);
				msg.setSubject(value);
				break;				
			case 22:		// to
				value = decodeString(in);
				msg.addToAddress(value);
				break;				
			case 23:		// x-mms-transaction-id
				value = decodeString(in);
				msg.setTransactionId(value);
				break;				
			default:		// unknown field, store textual representation
				throw new MMDecodingException("Invalid (unhandled) encoded header entry: " + String.valueOf(i));								
		}
		
		// don't add content-type
		if ((i != 3) && (headerNames != null) && (headerValues != null) && (value != null)) {
			setAttribute(name, value, headerNames, headerValues);
		}

		// debug(DEBUG_ENABLED, "			o: " + name + ": " + value);
		
		if (name.equalsIgnoreCase("Content-type")) {			
			return false; // content-type is last
		}  
		
		return true;	
	}	
	
	/**
	 * Decode headers, and add them to given hashtable
	 * 
	 * @return true if there still are any headers left, false otherwise
	 */
	protected static boolean decodeWSPHeader(ByteArrayInputStream in, ArrayList names, ArrayList values) throws Exception {
		String name = null;
		String value = null;
	
		if (in.available() == 0) return false; // end-of-stream
	
		int i = in.read();
	
		if (i < 128) { // string
			if (i != 127) name = (char) i + decodeString(in); else
			  name = decodeString(in);
			value = decodeString(in);
			  
		} else {	
			if ((i & 0xFF) > 128) i &= 127;
				
			if (i > MMConstants.knownWSPHeaders.length) throw new MMDecodingException("Invalid WSP header entry: " + String.valueOf(i));
			
			name = (String) MMConstants.knownWSPHeaders[i][0];	
			int type = ((Integer) MMConstants.knownWSPHeaders[i][1]).intValue();
			
			value = decodeToken(in, type);			
		}

		// debug(DEBUG_ENABLED, "			o: " + name + ": " + value);

		setAttribute(name, value, names, values);

		return true;	
	}

	/**
	 * Decode well-known parameters, return as String
	 * 
	 * @return true if there still are any headers left, false otherwise
	 */
	protected static String decodeParameters(ByteArrayInputStream in) throws Exception {
		String res = "";
		byte[] buf = new byte[1];
		
		while (in.available() != 0) {
			in.read(buf);
			int i = (int) (buf[0] & 0xFF);
	  			
			if (i < 128) { // string
				res += decodeString(in);
				continue;
			} else i &= 127; // short form
				
			if (i > MMConstants.WELLKNOWN_PARAMETERS.length) continue; // invalid headers entry			
			String name = (String) MMConstants.WELLKNOWN_PARAMETERS[i][0];	
			int type = ((Integer) MMConstants.WELLKNOWN_PARAMETERS[i][1]).intValue();
						
			String value = decodeToken(in, type);
			res += "; " + name + "=\"" + value + "\"";		
		}		

		return res;
	}
	
	/**
	 * decode next token from stream
	 */
	protected static String decodeToken(ByteArrayInputStream in, int type) throws Exception {
		String value = null;
		// check what type of field we're talking about
		switch (type) {				
			case 0:		// TYPE_STRING
				value = decodeString(in);
				break;
			case 1:		// TYPE_SHORTINT
				value = String.valueOf(decodeInt(in));
				break;
			case 2:		// TYPE_UINTVAR
				value = String.valueOf(decodeUintvar(in));
				break;
			case 3:		// TYPE_LONG
				value = String.valueOf(decodeLong(in));				
				break;	
			case 4:		// TYPE_BOOLEAN
				value = String.valueOf(decodeBoolean(in));			
				break;	
			case 5:		// TYPE_DATE

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆.com| 国产一区不卡在线| 久久精品999| 成人成人成人在线视频| 69av一区二区三区| 国产亚洲短视频| 亚洲九九爱视频| 久久精品国产免费| 国产91精品精华液一区二区三区 | 欧美午夜宅男影院| 色婷婷综合激情| 亚洲精品在线电影| 亚洲综合视频网| 国产福利精品一区二区| 91成人免费在线视频| 精品捆绑美女sm三区| 亚洲少妇屁股交4| 狠狠色丁香久久婷婷综合丁香| 99精品1区2区| 国产无一区二区| 亚洲成人av一区| 国产一区在线观看麻豆| 在线不卡一区二区| 伊人婷婷欧美激情| 丁香亚洲综合激情啪啪综合| 欧美日韩国产一区二区三区地区| 日本一区二区综合亚洲| 亚洲成在人线免费| 色婷婷综合久久久中文一区二区 | 波多野结衣亚洲| 日韩你懂的在线观看| 亚洲综合在线视频| 99国内精品久久| 日本一区二区免费在线观看视频 | 成人永久aaa| 欧美一区二区在线看| 一区二区三区在线视频观看58| 国产91精品一区二区麻豆亚洲| 91精品在线一区二区| 综合久久久久久久| 成人18精品视频| 26uuu亚洲婷婷狠狠天堂| 国产又粗又猛又爽又黄91精品| 91精品麻豆日日躁夜夜躁| 亚洲高清不卡在线观看| 色婷婷激情久久| 成人免费在线播放视频| 成人av网站免费观看| 久久亚洲欧美国产精品乐播| 亚洲综合在线免费观看| 在线一区二区观看| 亚洲国产一二三| 51精品久久久久久久蜜臀| 中文字幕一区三区| 高清久久久久久| 欧美激情综合网| 91亚洲永久精品| 亚洲人吸女人奶水| 日本高清不卡aⅴ免费网站| 最新国产の精品合集bt伙计| 99免费精品在线| 中文字幕一区av| 色综合天天综合给合国产| 亚洲欧美日韩综合aⅴ视频| 欧洲中文字幕精品| 日韩黄色免费电影| 久久一区二区视频| 久草精品在线观看| 国产精品亲子乱子伦xxxx裸| 91麻豆福利精品推荐| 日韩成人dvd| 精品欧美乱码久久久久久1区2区| 麻豆精品国产91久久久久久| 久久久噜噜噜久噜久久综合| 99综合影院在线| 性久久久久久久久| 久久影院午夜论| 在线免费观看日本一区| 日韩在线观看一区二区| 久久亚洲精品国产精品紫薇| 97se亚洲国产综合自在线不卡| 亚洲国产日韩一级| 久久精品网站免费观看| 日本丶国产丶欧美色综合| 夜夜嗨av一区二区三区四季av| 欧美一区二区黄色| 成人avav影音| 麻豆一区二区在线| 亚洲欧美日韩一区二区| 精品sm在线观看| 欧美日韩一级二级| 成人做爰69片免费看网站| 午夜一区二区三区视频| 国产清纯美女被跳蛋高潮一区二区久久w | 欧洲一区在线电影| 国产成人综合网站| 麻豆国产91在线播放| 久久激情综合网| 2023国产一二三区日本精品2022| 99re视频这里只有精品| 免费成人在线观看| 亚洲另类在线视频| 国产精品拍天天在线| 一卡二卡三卡日韩欧美| 色又黄又爽网站www久久| 国产原创一区二区三区| 国产91丝袜在线播放0| 成人毛片视频在线观看| 成人av在线影院| 日本韩国精品在线| 欧美日韩国产一区二区三区地区| 欧美一区二区在线不卡| 精品福利在线导航| 国产女人aaa级久久久级| 中文字幕一区视频| 午夜视频久久久久久| 蜜乳av一区二区| 国产麻豆精品95视频| www.在线成人| 欧美日韩一区二区欧美激情| 欧美日韩亚洲不卡| 欧美mv日韩mv国产| 一区二区久久久久久| 日本aⅴ免费视频一区二区三区| 亚洲欧美精品午睡沙发| 亚洲综合激情另类小说区| 麻豆国产91在线播放| 成人福利电影精品一区二区在线观看| 一本一道久久a久久精品综合蜜臀| 欧美日韩国产大片| 国产女人aaa级久久久级| 亚洲已满18点击进入久久| 亚洲国产aⅴ天堂久久| 国内精品写真在线观看| 91色.com| 日韩欧美视频在线 | 国产精品家庭影院| 美国毛片一区二区| 欧美无砖专区一中文字| 中文字幕欧美激情| 极品少妇xxxx精品少妇| 精品视频在线免费| 亚洲人成人一区二区在线观看| 国产一区二区三区国产| 91精品国产综合久久小美女| 亚洲美女屁股眼交| 成人av片在线观看| 国产日韩综合av| 精品一区二区国语对白| 91麻豆精品国产91久久久资源速度| 亚洲欧美日韩久久| 国产成人av影院| 国产网站一区二区三区| 国产乱一区二区| 日韩精品一区二| 免费精品视频最新在线| 91精品国产综合久久香蕉麻豆| 亚洲一区二区综合| 在线国产亚洲欧美| 一区二区三区久久| 日本电影欧美片| 亚洲影院久久精品| 欧美日韩视频一区二区| 亚洲综合在线观看视频| 欧美人妇做爰xxxⅹ性高电影| 综合色中文字幕| 91麻豆蜜桃一区二区三区| 亚洲人成精品久久久久久| 色综合久久综合网欧美综合网| 亚洲欧美日韩国产一区二区三区| 99re这里只有精品视频首页| 《视频一区视频二区| 91国在线观看| 三级欧美韩日大片在线看| 91麻豆精品久久久久蜜臀| 美国毛片一区二区三区| 精品国产一区二区三区忘忧草 | 欧美一区二区二区| 久久99最新地址| www激情久久| 成人av手机在线观看| 亚洲精品老司机| 91精品国产一区二区三区蜜臀| 亚洲成人av一区二区| 精品精品国产高清a毛片牛牛| 精品一区二区在线免费观看| 国产欧美精品一区二区三区四区| youjizz久久| 五月激情综合网| 久久色中文字幕| 99精品国产视频| 日韩不卡手机在线v区| 26uuu久久天堂性欧美| av不卡在线播放| 午夜欧美电影在线观看| 精品国精品国产| 色噜噜狠狠成人网p站| 日产国产高清一区二区三区| 久久久久国产免费免费| 日本精品一区二区三区高清|