?? mmencoder.java
字號:
if (msg.isPriorityAvailable()) {
if (msg.getPriority() >= MMConstants.PRIORITIES.length)
throw new MMEncodingException("Invalid X-MMS-Priority");
mime.setAttribute("X-MMS-Priority", msg.getPriorityStr());
}
if (msg.reportAllowed != null)
mime.setAttribute("X-MMS-Report-Allowed", String.valueOf(msg.reportAllowed));
if (msg.isResponseStatusAvailable()) {
if (msg.getResponseStatus() >= MMConstants.RESPONSE_STATUSES.length)
throw new MMEncodingException("Invalid X-MMS-Response-Status");
mime.setAttribute("X-MMS-Response-Status", msg.getResponseStatusStr());
}
if (msg.isResponseTextAvailable())
mime.setAttribute("X-MMS-Response-Text", msg.getResponseText());
// encode any custom headers
Iterator i = msg.getAttributes();
while (i.hasNext()) {
String name = (String) i.next();
String value = msg.getAttribute(name);
int a = 0;
for (a = 0; a < MMConstants.knownMMSHeaders.length; a++)
if (((String) MMConstants.knownMMSHeaders[a][0])
.equalsIgnoreCase(name))
break;
if (a < MMConstants.knownMMSHeaders.length)
continue;
mime.setAttribute(name, value);
}
if (msg.getContentType() != null) // content-type, the last header
mime.setContentType(msg.getContentType());
if (!msg.parts.isEmpty()) {
i = msg.parts.iterator();
while (i.hasNext())
mime.addPart((MimeMessage.MimePart) i.next());
}
} catch (Exception e) {
throw new MMEncodingException("Failed to encapsulate: " + e.toString());
}
return mime.toString();
}
/**
* encode headers
*/
protected static void encodeMessageHeader(
ByteArrayOutputStream res,
String name,
String value)
throws Exception {
// try to find header in table
int i = 0;
for (i = 0; i < MMConstants.knownMMSHeaders.length; i++)
if (((String) MMConstants.knownMMSHeaders[i][0]).equalsIgnoreCase(name))
break;
if (i < MMConstants.knownMMSHeaders.length) { // found
encodeInt(res, (i + 1));
// index in array, the value used to represent field
Integer intval = new Integer(0);
try {
intval = Integer.valueOf(value);
} catch (Exception e) {
}
// check what type of field we're talking about
switch (((Integer) MMConstants.knownMMSHeaders[i][1]).intValue()) {
case 0 : // TYPE_STRING
encodeString(res, value);
break;
case 1 : // TYPE_SHORTINT
encodeInt(res, intval.intValue());
break;
case 2 : // TYPE_UINTVAR
encodeUintvar(res, intval.intValue());
break;
case 3 : // TYPE_LONG
encodeLong(res, intval.intValue());
break;
case 4 : // TYPE_BOOLEAN
encodeBoolean(res, value);
break;
case 5 : // TYPE_DATE
encodeDate(res, value);
break;
case 17 : // TYPE_DATE_VARIABLE
encodeDateVariable(res, value, true);
break;
case 6 : // TYPE_MSGCLASS
encodeMessageClass(res, value);
break;
case 7 : // TYPE_MSGTYPE
encodeMessageType(res, value);
break;
case 8 : // TYPE_PRIORITY
encodePriority(res, value);
break;
case 9 : // TYPE_RESPONSESTATUS
encodeResponseStatus(res, value);
break;
case 10 : // TYPE_STATUS
encodeStatus(res, value);
break;
case 11 : // TYPE_CONTENTTYPE
encodeContentType(res, value);
break;
case 12 : // TYPE_VERSION
encodeInt(res, MMConstants.MMS_VERSION_1_0);
break;
case 13 : // TYPE_FROM
encodeFrom(res, value);
break;
default :
encodeString(res, value); // store string representation
}
} else {
encodeString(res, name);
encodeString(res, value);
}
}
/**
* encode headers
*/
protected static void encodeWSPHeader(ByteArrayOutputStream res, String name, String value) throws Exception {
// try to find header in table
int i = 0;
for (i = 0; i < MMConstants.knownWSPHeaders.length; i++)
if (((String) MMConstants.knownWSPHeaders[i][0]).equalsIgnoreCase(name))
break;
if (i < MMConstants.knownWSPHeaders.length) { // found
encodeInt(res, i);
// index in array, the value used to represent field
Integer intval = new Integer(0);
try {
intval = Integer.valueOf(value);
} catch (Exception e) {
}
// check what type of field we're talking about
switch (((Integer) MMConstants.knownWSPHeaders[i][1]).intValue()) {
case 0 : // TYPE_STRING
encodeString(res, value);
break;
case 1 : // TYPE_SHORTINT
encodeInt(res, intval.intValue());
break;
case 2 : // TYPE_UINTVAR
encodeUintvar(res, intval.intValue());
break;
case 3 : // TYPE_LONG
encodeLong(res, intval.intValue());
break;
case 4 : // TYPE_BOOLEAN
encodeBoolean(res, value);
break;
case 5 : // TYPE_DATE
encodeDate(res, value);
break;
case 6 : // TYPE_MSGCLASS
encodeMessageClass(res, value);
break;
case 7 : // TYPE_MSGTYPE
encodeMessageType(res, value);
break;
case 8 : // TYPE_PRIORITY
encodePriority(res, value);
break;
case 9 : // TYPE_RESPONSESTATUS
encodeResponseStatus(res, value);
break;
case 10 : // TYPE_STATUS
encodeStatus(res, value);
break;
case 11 : // TYPE_CONTENTTYPE
encodeContentType(res, value);
break;
case 12 : // TYPE_VERSION
encodeInt(res, intval.intValue());
break;
case 13 : // TYPE_FROM
encodeFrom(res, value);
break;
default :
encodeString(res, value); // store string representation
}
} else {
encodeString(res, name);
encodeString(res, value);
}
}
/**
* encode parameter
*/
protected static void encodeParameter(
ByteArrayOutputStream res,
String name,
String value)
throws Exception {
// try to find header in table
int i = 0;
for (i = 0; i < MMConstants.WELLKNOWN_PARAMETERS.length; i++)
if (((String) MMConstants.WELLKNOWN_PARAMETERS[i][0]).equalsIgnoreCase(name))
break;
if (i < MMConstants.WELLKNOWN_PARAMETERS.length) { // found
encodeInt(res, i);
// index in array, the value used to represent field
Integer intval = new Integer(0);
try {
intval = Integer.valueOf(value);
} catch (Exception e) {
}
// check what type of field we're talking about
switch (((Integer) MMConstants.WELLKNOWN_PARAMETERS[i][1]).intValue()) {
case 0 : // TYPE_STRING
encodeString(res, value);
break;
case 1 : // TYPE_SHORTINT
encodeInt(res, intval.intValue());
break;
case 2 : // TYPE_UINTVAR
encodeUintvar(res, intval.intValue());
break;
case 3 : // TYPE_LONG
encodeLong(res, intval.intValue());
break;
case 4 : // TYPE_BOOLEAN
encodeBoolean(res, value);
break;
case 5 : // TYPE_DATE
encodeDate(res, value);
break;
case 6 : // TYPE_MSGCLASS
encodeMessageClass(res, value);
break;
case 7 : // TYPE_MSGTYPE
encodeMessageType(res, value);
break;
case 8 : // TYPE_PRIORITY
encodePriority(res, value);
break;
case 9 : // TYPE_RESPONSESTATUS
encodeResponseStatus(res, value);
break;
case 10 : // TYPE_STATUS
encodeStatus(res, value);
break;
case 11 : // TYPE_CONTENTTYPE
encodeContentType(res, value);
break;
case 12 : // TYPE_VERSION
encodeInt(res, intval.intValue());
break;
case 13 : // TYPE_FROM
encodeFrom(res, value);
break;
case 14 : // TYPE_NOVALUE:
break;
case 15 : // TYPE_CHARSET
encodeCharset(res, value);
break;
case 16 : // TYPE_Q
break;
case 17 : // TYPE_INTEGER
encodeInteger(res, intval.intValue());
break;
default :
encodeString(res, value); // store string representation
}
} else {
encodeString(res, name);
encodeString(res, value);
}
}
/*****************************************************************************************
* Functions for encoding values according to [MMSEncapsulation] and [WAPWSP]
*/
/**
* encode a long value
*/
protected static void encodeLong(ByteArrayOutputStream res, long l)
throws Exception {
byte len = 0;
if (l < 256)
len = 1;
else if (l < 256 * 256)
len = 2;
else if (l < 256 * 256 * 256)
len = 3;
else
len = 4;
res.write((byte) len); // length of multi-octet integer
int i = (len - 1) * 8;
while (i >= 0) {
res.write((byte) ((l >> i) & 0xFF));
i -= 8;
}
}
/**
* encode a integer (short or long)
*/
protected static void encodeInteger(ByteArrayOutputStream res, int i)
throws Exception {
if (i >= 128) { // long form
encodeLong(res, i);
return;
}
encodeInt(res, i);
}
/**
* encode a Uintvar (variable length int). Max 32bits
*/
protected static void encodeUintvar(ByteArrayOutputStream res, int l)
throws Exception {
byte[] buf = new byte[5]; // max 5 bytes
// split into groups of 7 bits, start with most significant bits
buf[4] = (byte) (l & 0x7F);
l = l >> 7;
for (int i = 3; i >= 0; i--) {
buf[i] = (byte) (l & 0x7F);
buf[i] |= 0x80;
l = l >> 7;
}
for (int i = 0; i < buf.length; i++)
if ((buf[i] & 0xFF) != 0x80) // don't write empty octets
res.write(buf[i]);
}
/**
* encode a Date class into a long (4 octets)
*/
protected static void encodeDate(ByteArrayOutputStream res, Date date)
throws Exception {
long l = date.getTime() / 1000; // seconds since 1.1.1970, 00:00:00 GMT
//res.write((byte) 0x06); // length of multi-octet integer (4 bytes)
//if (absolute) encodeInt(res, 128); else
// encodeInt(res, 129);
encodeLong(res, l);
}
/**
* encode a Date class into a long (4 octets)
* String as input
*
* to-do: fix date string
*/
protected static void encodeDate(ByteArrayOutputStream res, String time)
throws Exception {
Date date = null;
SimpleDateFormat[] dateFormats =
{
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"),
// as specified in the specs
new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss z", Locale.US),
new SimpleDateFormat()};
// default locale
int i = 0;
boolean success = false;
while (!success) {
if (i > dateFormats.length - 1) {
//log.error("encodeDate: Unable to parse: " + time);
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -