Added to check for supporting mms content-disposition, utf8 decoding.

Change-Id: Ieae1bb2ac36675f569fb21285ca6ef289c367bf7
Signed-off-by: Soojung Shin <sj46.shin@samsung.com>
This commit is contained in:
Soojung Shin
2011-03-02 09:39:35 +09:00
committed by Simon Wilson
parent b028ce55ca
commit ff5a09904f
3 changed files with 101 additions and 41 deletions

74
core/java/com/google/android/mms/pdu/PduParser.java Normal file → Executable file
View File

@@ -29,6 +29,8 @@ import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.HashMap;
import android.content.res.Resources;
public class PduParser {
/**
* The next are WAP values defined in WSP specification.
@@ -1550,43 +1552,55 @@ public class PduParser {
* Attachment = <Octet 129>
* Inline = <Octet 130>
*/
int len = parseValueLength(pduDataStream);
pduDataStream.mark(1);
int thisStartPos = pduDataStream.available();
int thisEndPos = 0;
int value = pduDataStream.read();
if (value == PduPart.P_DISPOSITION_FROM_DATA ) {
part.setContentDisposition(PduPart.DISPOSITION_FROM_DATA);
} else if (value == PduPart.P_DISPOSITION_ATTACHMENT) {
part.setContentDisposition(PduPart.DISPOSITION_ATTACHMENT);
} else if (value == PduPart.P_DISPOSITION_INLINE) {
part.setContentDisposition(PduPart.DISPOSITION_INLINE);
} else {
pduDataStream.reset();
/* Token-text */
part.setContentDisposition(parseWapString(pduDataStream, TYPE_TEXT_STRING));
}
/*
* some carrier mmsc servers do not support content_disposition
* field correctly
*/
boolean contentDisposition = Resources.getSystem().getBoolean(com
.android.internal.R.bool.config_mms_content_disposition_support);
/* get filename parameter and skip other parameters */
thisEndPos = pduDataStream.available();
if (thisStartPos - thisEndPos < len) {
value = pduDataStream.read();
if (value == PduPart.P_FILENAME) { //filename is text-string
part.setFilename(parseWapString(pduDataStream, TYPE_TEXT_STRING));
if (contentDisposition) {
int len = parseValueLength(pduDataStream);
pduDataStream.mark(1);
int thisStartPos = pduDataStream.available();
int thisEndPos = 0;
int value = pduDataStream.read();
if (value == PduPart.P_DISPOSITION_FROM_DATA ) {
part.setContentDisposition(PduPart.DISPOSITION_FROM_DATA);
} else if (value == PduPart.P_DISPOSITION_ATTACHMENT) {
part.setContentDisposition(PduPart.DISPOSITION_ATTACHMENT);
} else if (value == PduPart.P_DISPOSITION_INLINE) {
part.setContentDisposition(PduPart.DISPOSITION_INLINE);
} else {
pduDataStream.reset();
/* Token-text */
part.setContentDisposition(parseWapString(pduDataStream
, TYPE_TEXT_STRING));
}
/* skip other parameters */
/* get filename parameter and skip other parameters */
thisEndPos = pduDataStream.available();
if (thisStartPos - thisEndPos < len) {
int last = len - (thisStartPos - thisEndPos);
byte[] temp = new byte[last];
pduDataStream.read(temp, 0, last);
}
}
value = pduDataStream.read();
if (value == PduPart.P_FILENAME) { //filename is text-string
part.setFilename(parseWapString(pduDataStream
, TYPE_TEXT_STRING));
}
tempPos = pduDataStream.available();
lastLen = length - (startPos - tempPos);
/* skip other parameters */
thisEndPos = pduDataStream.available();
if (thisStartPos - thisEndPos < len) {
int last = len - (thisStartPos - thisEndPos);
byte[] temp = new byte[last];
pduDataStream.read(temp, 0, last);
}
}
tempPos = pduDataStream.available();
lastLen = length - (startPos - tempPos);
}
break;
default:
if (LOCAL_LOGV) {

23
core/res/res/values/config.xml Normal file → Executable file
View File

@@ -380,4 +380,27 @@
<!-- The VoiceMail default value is displayed to my own number if it is true -->
<bool name="config_telephony_use_own_number_for_voicemail">false</bool>
<!-- If this value is true, Sms encoded as octet is decoded by utf8 decoder.
If false, decoded by Latin decoder. -->
<bool name="config_sms_utf8_support">false</bool>
<!-- If this value is true, The mms content-disposition field is supported correctly.
If false, Content-disposition fragments are ignored -->
<bool name="config_mms_content_disposition_support">true</bool>
<!-- If this value is true, the carrier supports sms delivery reports.
If false, sms delivery reports are not supported and the preference
option to enable/disable delivery reports is removed in the Messaging app. -->
<bool name="config_sms_delivery_reports_support">true</bool>
<!-- If this value is true, the carrier supports mms delivery reports.
If false, mms delivery reports are not supported and the preference
option to enable/disable delivery reports is removed in the Messaging app. -->
<bool name="config_mms_delivery_reports_support">true</bool>
<!-- If this value is true, the carrier supports mms read reports.
If false, mms read reports are not supported and the preference
option to enable/disable read reports is removed in the Messaging app. -->
<bool name="config_mms_read_reports_support">true</bool>
</resources>

View File

@@ -37,6 +37,9 @@ import com.android.internal.util.HexDump;
import com.android.internal.util.BitwiseInputStream;
import com.android.internal.util.BitwiseOutputStream;
import android.content.res.Resources;
/**
* An object to encode and decode CDMA SMS bearer data.
@@ -912,6 +915,16 @@ public final class BearerData {
return true;
}
private static String decodeUtf8(byte[] data, int offset, int numFields)
throws CodingException
{
try {
return new String(data, offset, numFields, "UTF-8");
} catch (java.io.UnsupportedEncodingException ex) {
throw new CodingException("UTF-8 decode failed: " + ex);
}
}
private static String decodeUtf16(byte[] data, int offset, int numFields)
throws CodingException
{
@@ -996,19 +1009,29 @@ public final class BearerData {
}
switch (userData.msgEncoding) {
case UserData.ENCODING_OCTET:
// Strip off any padding bytes, meaning any differences between the length of the
// array and the target length specified by numFields. This is to avoid any confusion
// by code elsewhere that only considers the payload array length.
byte[] payload = new byte[userData.numFields];
int copyLen = userData.numFields < userData.payload.length
? userData.numFields : userData.payload.length;
/*
* Octet decoding depends on the carrier service.
*/
boolean decodingtypeUTF8 = Resources.getSystem()
.getBoolean(com.android.internal.R.bool.config_sms_utf8_support);
System.arraycopy(userData.payload, 0, payload, 0, copyLen);
userData.payload = payload;
if (!decodingtypeUTF8) {
// Strip off any padding bytes, meaning any differences between the length of the
// array and the target length specified by numFields. This is to avoid any
// confusion by code elsewhere that only considers the payload array length.
byte[] payload = new byte[userData.numFields];
int copyLen = userData.numFields < userData.payload.length
? userData.numFields : userData.payload.length;
// There are many devices in the market that send 8bit text sms (latin encoded) as
// octet encoded.
userData.payloadStr = decodeLatin(userData.payload, offset, userData.numFields);
System.arraycopy(userData.payload, 0, payload, 0, copyLen);
userData.payload = payload;
// There are many devices in the market that send 8bit text sms (latin encoded) as
// octet encoded.
userData.payloadStr = decodeLatin(userData.payload, offset, userData.numFields);
} else {
userData.payloadStr = decodeUtf8(userData.payload, offset, userData.numFields);
}
break;
case UserData.ENCODING_IA5:
case UserData.ENCODING_7BIT_ASCII: