📄 mmdecoder.java
字号:
/* * @(#)MMDecoder.java 1.1 build * * Copyright (c) Nokia Corporation 2002 * */package com.nokia.mms;import java.util.Date;import java.util.Hashtable;import java.util.Enumeration;/** * The MMDecoder class decodes an array of bytes representing a Multimedia Message (MM) * according with the specification. * The class can be used to obtain a MMMessage object from which you can access * to each field and content of the MM. * */public class MMDecoder implements IMMConstants { static final boolean FLAG_DEBUG=false; private MMMessage m_Message = null; private int m_i=0; private boolean m_bMultipartRelated = false; private boolean m_bMessageAvailable = false; private boolean m_bHeaderDecoded = false; private byte[] m_In; // ------------------------------------------------------------- BASIC RULES private long readMultipleByteInt(int length) { long value=0L; int start=m_i; int end=m_i+length-1; for (int ii=end, weight=1; ii>=start; ii--, weight*=256) { int bv=unsignedByte(m_In[ii]); value =value + bv*weight; } m_i=end+1; return value; } private String readTextString() { String value=""; if (m_In[m_i]==0x22) { // in this case it's a "Quoted-string" m_i++; } while (m_In[m_i]>0) { value=value+(char)m_In[m_i++]; } m_i++; return value; } private int readUintvar() { int value=0; int bv=unsignedByte(m_In[m_i]); if (bv<0x80) { value=bv; m_i++; } else { // In this case the format is "Variable Length Unsigned Integer" boolean flag=true; short count=0, inc=0; // Count the number of byte needed for the number while (flag) { flag=(m_In[m_i+count]&0x80)==0x80; count++; } inc=count; count--; int weight=1; while (count>=0) { bv=decodeByte(m_In[m_i+count])*weight; weight*=128; value=value+bv; count--; } m_i+=inc; } return value; } private int readValueLength() { int length=0; int temp = m_In[m_i++]; if (temp < 31) { length=temp; } else if (temp == 31) { length = readUintvar(); } return length; } private String readWellKnownMedia() { String value=""; switch (decodeByte(m_In[m_i])) { case 0x00: value= "*/*"; break; case 0x01: value= "text/*"; break; case 0x02: value= "text/html"; break; case 0x03: value= "text/plain"; break; case 0x04: value= "text/x-hdml"; break; case 0x05: value= "text/x-ttml"; break; case 0x06: value= "text/x-vCalendar"; break; case 0x07: value= "text/x-vCard"; break; case 0x08: value= "text/vnd.wap.wml"; break; case 0x09: value= "text/vnd.wap.wmlscript"; break; case 0x0A: value= "text/vnd.wap.channel"; break; case 0x0B: value= "multipart/*"; break; case 0x0C: value= "multipart/mixed"; break; case 0x0D: value= "multipart/form-data"; break; case 0x0E: value= "multipart/byteranges"; break; case 0x0F: value= "multipart/alternative"; break; case 0x10: value= "application/*"; break; case 0x11: value= "application/java-vm"; break; case 0x12: value= "application/x-www-form-urlencoded"; break; case 0x13: value= "application/x-hdmlc"; break; case 0x14: value= "application/vnd.wap.wmlc"; break; case 0x15: value= "application/vnd.wap.wmlscriptc"; break; case 0x16: value= "application/vnd.wap.channelc"; break; case 0x17: value= "application/vnd.wap.uaprof"; break; case 0x18: value= "application/vnd.wap.wtls-ca-certificate"; break; case 0x19: value= "application/vnd.wap.wtls-user-certificate"; break; case 0x1A: value= "application/x-x509-ca-cert"; break; case 0x1B: value= "application/x-x509-user-cert"; break; case 0x1C: value= "image/*"; break; case 0x1D: value= "image/gif"; break; case 0x1E: value= "image/jpeg"; break; case 0x1F: value= "image/tiff"; break; case 0x20: value= "image/png"; break; case 0x21: value= "image/vnd.wap.wbmp"; break; case 0x22: value= "application/vnd.wap.multipart.*"; break; case 0x23: value= "application/vnd.wap.multipart.mixed"; break; case 0x24: value= "application/vnd.wap.multipart.form-data"; break; case 0x25: value= "application/vnd.wap.multipart.byteranges"; break; case 0x26: value= "application/vnd.wap.multipart.alternative"; break; case 0x27: value= "application/xml"; break; case 0x28: value= "text/xml"; break; case 0x29: value= "application/vnd.wap.wbxml"; break; case 0x2A: value= "application/x-x968-cross-cert"; break; case 0x2B: value= "application/x-x968-ca-cert"; break; case 0x2C: value= "application/x-x968-user-cert"; break; case 0x2D: value= "text/vnd.wap.si"; break; case 0x2E: value= "application/vnd.wap.sic"; break; case 0x2F: value= "text/vnd.wap.sl"; break; case 0x30: value= "application/vnd.wap.slc"; break; case 0x31: value= "text/vnd.wap.co"; break; case 0x32: value= "application/vnd.wap.coc"; break; case 0x33: value= "application/vnd.wap.multipart.related"; m_bMultipartRelated = true; break; case 0x34: value= "application/vnd.wap.sia"; break; case 0x35: value= "text/vnd.wap.connectivity-xml"; break; case 0x36: value= "application/vnd.wap.connectivity-wbxml"; break; } m_i++; return value; } // ------------------------------------------------------- MMS Header Encoding private String readContentTypeValue() { int bv=unsignedByte(m_In[m_i]); String value=""; if (bv>=0x80) { /* Constrained-media - Short Integer*/ // Short-integer: the assigned number of the well-known encoding is // small enough to fit into Short-integer value=readWellKnownMedia(); } else /* Constrained-media - Extension-media*/ if (bv >= 0x20 && bv < 0x80) { value = readTextString(); } else /* Content-general-form */ if (bv < 0x20) { int valueLength = readValueLength(); bv=unsignedByte(m_In[m_i]); if (bv>=0x80) { //Well-known-media int i2=m_i; value=readWellKnownMedia(); if (value.equals("application/vnd.wap.multipart.related")) { bv=decodeByte(m_In[m_i]); if (bv==WKPA_TYPE) { // Type of the multipart/related m_i++; m_Message.setMultipartRelatedType( readTextString() ); bv=decodeByte(m_In[m_i]); if (bv==WKPA_START) { // Start (it is the pointer to the presentetion part) m_i++; m_Message.setPresentationId( readTextString() ); } } } m_i=i2+valueLength; } else { int i2=m_i; value=readTextString(); m_i=i2+valueLength; } } return(value); } // ------------------------------------------------------------------ MMS Body private void readMMBodyMultiPartRelated() { int n=0; int c_headerLen=0,c_dataLen=0; String c_type="",c_id=""; byte [] c_buf; int nEntries = m_In[m_i++]; while (n<nEntries) { c_headerLen=readUintvar(); c_dataLen=readUintvar(); int freeze_i=m_i; c_type=readContentTypeValue(); int c_typeLen=m_i-freeze_i; c_id="A"+n; if (c_headerLen-c_typeLen>0) { if ((decodeByte(m_In[m_i])==HFN_CONTENT_LOCATION) || (decodeByte(m_In[m_i])==HFN_CONTENT_ID) ) { m_i++; c_id=readTextString(); } } MMContent mmc=new MMContent(); mmc.setType(c_type); mmc.setContentId(c_id); mmc.setContent(m_In,m_i,c_dataLen); m_Message.addContent(mmc); m_i+=c_dataLen; n++; } } private void readMMBodyMultiPartMixed() { int n=0; int c_headerLen=0,c_dataLen=0; String c_type="",c_id=""; byte [] c_buf; int nEntries = m_In[m_i++]; while (n<nEntries) { c_headerLen=readUintvar(); c_dataLen=readUintvar(); c_type=readContentTypeValue(); c_id="A"+n; if (unsignedByte(m_In[m_i])==0x8E) { m_i++; c_id=readTextString();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -