📄 mmencoder.java
字号:
/*
* @(#)MMEncoder.java 1.1
*
* Copyright (c) Nokia Corporation 2002
*
*/
package com.nokia.mms;
import java.util.Date;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Vector;
import java.io.*;
/**
* The MMEncoder class encodes Multimedia Message object (MMMessage)
* into an array of bytes according to the specification WAP-209-MMSEncapsulation
* (WAP Forum).
*
*/
public class MMEncoder implements IMMConstants {
private MMMessage m_Message;
private boolean m_bMessageAvailable;
private boolean m_bMultipartRelated;
private boolean m_bMessageEcoded;
private ByteArrayOutputStream m_Out;
public MMEncoder() {
super();
reset();
}
/**
* Resets the Decoder object.
*
*/
public void reset() {
m_Message = null;
m_bMultipartRelated = false;
m_bMessageAvailable = false;
m_bMessageEcoded = false;
m_Out = null;
}
/**
* Sets the Multimedia Message to be encoded.
*/
public void setMessage(MMMessage msg) {
m_Message = msg;
m_bMessageAvailable = true;
}
/**
* Retrieve the buffer of byte representing the encoded Multimedia Message.
* This method has to be called after the calling to encodeMessasge()
*
* @return the array of bytes representing the Multmedia Message
*/
public byte[] getMessage() {
if (m_bMessageEcoded) {
return m_Out.toByteArray();
} else {
return null;
}
}
/**
* Encode known content type assignments.
* List of the content type assignments can be found from WAP-203-WSP, Table 40
* This version is compliant with Approved version 4-May-2000
*
* @return assigned number
*/
private byte encodeContentType(String sContentType) {
if(sContentType.equalsIgnoreCase("*/*"))
return 0x00;
else
if(sContentType.equalsIgnoreCase("text/*"))
return 0x01;
else
if(sContentType.equalsIgnoreCase("text/html"))
return 0x02;
else
if(sContentType.equalsIgnoreCase("text/plain"))
return 0x03;
else
if(sContentType.equalsIgnoreCase("text/x-hdml"))
return 0x04;
else
if(sContentType.equalsIgnoreCase("text/x-ttml"))
return 0x05;
else
if(sContentType.equalsIgnoreCase("text/x-vCalendar"))
return 0x06;
else
if(sContentType.equalsIgnoreCase("text/x-vCard"))
return 0x07;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.wml"))
return 0x08;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.wmlscript"))
return 0x09;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.channel"))
return 0x0A;
else
if(sContentType.equalsIgnoreCase("multipart/*"))
return 0x0B;
else
if(sContentType.equalsIgnoreCase("multipart/mixed"))
return 0x0C;
else
if(sContentType.equalsIgnoreCase("multipart/form-data"))
return 0x0D;
else
if(sContentType.equalsIgnoreCase("multipart/byteranges"))
return 0x0E;
else
if(sContentType.equalsIgnoreCase("multipart/alternative"))
return 0x0F;
else
if(sContentType.equalsIgnoreCase("application/*"))
return 0x10;
else
if(sContentType.equalsIgnoreCase("application/java-vm"))
return 0x11;
else
if(sContentType.equalsIgnoreCase("application/x-www-form-urlencoded"))
return 0x12;
else
if(sContentType.equalsIgnoreCase("application/x-hdmlc"))
return 0x13;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.wmlc"))
return 0x14;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.wmlscriptc"))
return 0x15;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.channelc"))
return 0x16;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.uaprof"))
return 0x17;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.wtls-ca-certificate"))
return 0x18;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.wtls-user-certificate"))
return 0x19;
else
if(sContentType.equalsIgnoreCase("application/x-x509-ca-cert"))
return 0x1A;
else
if(sContentType.equalsIgnoreCase("application/x-x509-user-cert"))
return 0x1B;
else
if(sContentType.equalsIgnoreCase("image/*"))
return 0x1C;
else
if(sContentType.equalsIgnoreCase("image/gif"))
return 0x1D;
else
if(sContentType.equalsIgnoreCase("image/jpeg"))
return 0x1E;
else
if(sContentType.equalsIgnoreCase("image/tiff"))
return 0x1F;
else
if(sContentType.equalsIgnoreCase("image/png"))
return 0x20;
else
if(sContentType.equalsIgnoreCase("image/vnd.wap.wbmp"))
return 0x21;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.*"))
return 0x22;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.mixed"))
return 0x23;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.form-data"))
return 0x24;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.byteranges"))
return 0x25;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.alternative"))
return 0x26;
else
if(sContentType.equalsIgnoreCase("application/xml"))
return 0x27;
else
if(sContentType.equalsIgnoreCase("text/xml"))
return 0x28;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.wbxml"))
return 0x29;
else
if(sContentType.equalsIgnoreCase("application/x-x968-cross-cert"))
return 0x2A;
else
if(sContentType.equalsIgnoreCase("application/x-x968-ca-cert"))
return 0x2B;
else
if(sContentType.equalsIgnoreCase("application/x-x968-user-cert"))
return 0x2C;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.si"))
return 0x2D;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.sic"))
return 0x2E;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.sl"))
return 0x2F;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.slc"))
return 0x30;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.co"))
return 0x31;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.coc"))
return 0x32;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.multipart.related"))
return 0x33;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.sia"))
return 0x34;
else
if(sContentType.equalsIgnoreCase("text/vnd.wap.connectivity-xml"))
return 0x35;
else
if(sContentType.equalsIgnoreCase("application/vnd.wap.connectivity-wbxml"))
return 0x36;
else
return 0;
}
private int unsignedByte(byte value) {
if (value<0) {
return (value+256);
} else {
return value;
}
}
private void writeValueLength(long value) {
if (value <=30)
m_Out.write((int)value);
else {
m_Out.write(31);
int data[] = EncodeUintvarNumber(value);
int numValue;
for(int i = 1; i <= data[0]; i++) {
numValue = data[i];
m_Out.write(numValue);
}
}
}
private void writeUintvar(long value) {
int data[] = EncodeUintvarNumber(value);
int numValue;
for(int i = 1; i <= data[0]; i++) {
numValue = data[i];
m_Out.write(numValue);
}
}
/**
* Encodes the Multimedia Message set by calling setMessage(MMMessage msg)
*/
public void encodeMessage() throws MMEncoderException {
int numValue;
String strValue;
m_bMessageEcoded = false;
m_bMultipartRelated = false;
if(!m_bMessageAvailable)
throw new MMEncoderException("No Multimedia Messages set in the encoder");
try {
m_Out = new ByteArrayOutputStream();
if(!m_Message.isMessageTypeAvailable()) {
m_Out.close();
throw new MMEncoderException("Invalid Multimedia Message format.");
}
byte nMessageType = m_Message.getMessageType();
switch(nMessageType) {
default:
{
m_Out.close();
throw new MMEncoderException("Invalid Multimedia Message format.");
}
case MESSAGE_TYPE_M_DELIVERY_IND: // ---------------------------- m-delivery-ind
// ------------------- MESSAGE TYPE --------
m_Out.write(FN_MESSAGE_TYPE + 0x80);
m_Out.write(nMessageType);
// ------------------- MESSAGE ID ------
if(m_Message.isMessageIdAvailable()) {
m_Out.write(FN_MESSAGE_ID + 0x80);
m_Out.write(m_Message.getMessageId().getBytes());
m_Out.write(0x00);
} else {
m_Out.close();
throw new MMEncoderException ("The field Message-ID of the Multimedia Message is null");
}
// ------------------- VERSION -------------
m_Out.write(FN_MMS_VERSION + 0x80);
if(!m_Message.isVersionAvailable()) {
numValue = MMS_VERSION_10;
} else {
numValue = m_Message.getVersion();
}
m_Out.write(numValue);
// ------------------- DATE ----------------
if(m_Message.isDateAvailable()) {
long secs=(m_Message.getDate()).getTime() / 1000;
int data[] = EncodeMultiByteNumber(secs);
if(data == null) {
m_Out.close();
throw new MMEncoderException("An error occurred encoding the sending date of the Multimedia Message");
}
m_Out.write(FN_DATE + 0x80);
int nCount = data[0];
m_Out.write(nCount);
for(int i = 1; i <= nCount; i++) {
m_Out.write(data[i]);
}
}
// ------------------- TO ------------------
if(m_Message.isToAvailable()) {
Vector sAddress = m_Message.getTo();
int nAddressCount = sAddress.size();
if(sAddress == null) {
m_Out.close();
throw new MMEncoderException("The field TO of the Multimedia Message is set to null.");
}
for(int i = 0; i < nAddressCount; i++) {
strValue = ((MMAddress)sAddress.elementAt(i)).getFullAddress();
if(strValue != null) {
m_Out.write(FN_TO + 0x80);
m_Out.write(strValue.getBytes());
m_Out.write(0x00);
}
}
} else {
m_Out.close();
throw new MMEncoderException("No recipient specified in the Multimedia Message.");
}
// ------------------- MESSAGE-STATUS ----------------
if(m_Message.isStatusAvailable()) {
m_Out.write(FN_STATUS + 0x80);
m_Out.write(m_Message.getMessageStatus());
} else {
m_Out.close();
throw new MMEncoderException ("The field Message-ID of the Multimedia Message is null");
}
break;
case MESSAGE_TYPE_M_SEND_REQ: // ---------------------------- m-send-req
// ------------------- MESSAGE TYPE --------
m_Out.write(FN_MESSAGE_TYPE + 0x80);
m_Out.write(nMessageType);
// ------------------- TRANSACTION ID ------
if(m_Message.isTransactionIdAvailable()) {
m_Out.write(FN_TRANSACTION_ID + 0x80);
m_Out.write(m_Message.getTransactionId().getBytes());
m_Out.write(0x00);
}
// ------------------- VERSION -------------
m_Out.write(FN_MMS_VERSION + 0x80);
if(!m_Message.isVersionAvailable()) {
numValue = MMS_VERSION_10;
} else {
numValue = m_Message.getVersion();
}
m_Out.write(numValue);
// ------------------- DATE ----------------
if(m_Message.isDateAvailable()) {
long secs=(m_Message.getDate()).getTime() / 1000;
int data[] = EncodeMultiByteNumber(secs);
if(data == null) {
m_Out.close();
throw new MMEncoderException("An error occurred encoding the sending date of the Multimedia Message");
}
m_Out.write(FN_DATE + 0x80);
int nCount = data[0];
m_Out.write(nCount);
for(int i = 1; i <= nCount; i++) {
m_Out.write(data[i]);
}
}
// ------------------- FROM ----------------
if(m_Message.isFromAvailable()) {
m_Out.write(FN_FROM + 0x80);
strValue = (m_Message.getFrom()).getFullAddress();
if(strValue == null) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -