diff options
-rwxr-xr-x | core/res/res/values/config.xml | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/WapPushOverSms.java | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/WspTypeDecoder.java | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java | 54 |
4 files changed, 69 insertions, 1 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 032ec29..779028e 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -461,4 +461,11 @@ <!-- Set to true if the RSSI should always display CDMA signal strength even on EVDO --> <bool name="config_alwaysUseCdmaRssi">false</bool> + + <!-- If this value is true, duplicate Source/Destination port fields + in WDP header of some carriers OMADM wap push are supported. + ex: MSGTYPE-TotalSegments-CurrentSegment + -SourcePortDestPort-SourcePortDestPort-OMADM PDU + If false, not supported. --> + <bool name="config_duplicate_port_omadm_wappush">false</bool> </resources> diff --git a/telephony/java/com/android/internal/telephony/WapPushOverSms.java b/telephony/java/com/android/internal/telephony/WapPushOverSms.java index 168b63b..d661640 100644..100755 --- a/telephony/java/com/android/internal/telephony/WapPushOverSms.java +++ b/telephony/java/com/android/internal/telephony/WapPushOverSms.java @@ -135,6 +135,9 @@ public class WapPushOverSms { case WspTypeDecoder.CONTENT_TYPE_B_SUPL_INIT: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT; break; + case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI: + mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SYNCML_NOTI; + break; default: if (Config.LOGD) { Log.w(LOG_TAG, @@ -159,6 +162,8 @@ public class WapPushOverSms { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_SUPL_INIT; + } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SYNCML_NOTI)) { + binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI; } else { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Unknown Content-Type = " + mimeType); return Intents.RESULT_SMS_HANDLED; diff --git a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java index 5dc89f0..01206fd 100644..100755 --- a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java +++ b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java @@ -41,6 +41,7 @@ public class WspTypeDecoder { public static final int CONTENT_TYPE_B_MMS = 0x3e; public static final int CONTENT_TYPE_B_VND_DOCOMO_PF = 0x0310; public static final int CONTENT_TYPE_B_SUPL_INIT = 0x312; + public static final int CONTENT_TYPE_B_PUSH_SYNCML_NOTI = 0x44; public static final String CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML = "application/vnd.oma.drm.rights+xml"; @@ -52,10 +53,11 @@ public class WspTypeDecoder { public static final String CONTENT_MIME_TYPE_B_MMS = "application/vnd.wap.mms-message"; public static final String CONTENT_MIME_TYPE_B_VND_DOCOMO_PF = "application/vnd.docomo.pf"; public static final String CONTENT_MIME_TYPE_B_SUPL_INIT = "application/vnd.omaloc-supl-init"; + public static final String CONTENT_MIME_TYPE_B_PUSH_SYNCML_NOTI = + "application/vnd.syncml.notification"; public static final int PARAMETER_ID_X_WAP_APPLICATION_ID = 0x2f; - byte[] wspData; int dataLength; long unsigned32bit; diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java index 45b58e5..e409646 100644..100755 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java @@ -42,6 +42,7 @@ import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.SmsMessageBase; import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails; import com.android.internal.telephony.TelephonyProperties; +import com.android.internal.telephony.WspTypeDecoder; import com.android.internal.telephony.cdma.sms.SmsEnvelope; import com.android.internal.telephony.cdma.sms.UserData; import com.android.internal.util.HexDump; @@ -51,6 +52,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import android.content.res.Resources; + final class CdmaSMSDispatcher extends SMSDispatcher { private static final String TAG = "CDMA"; @@ -58,6 +61,9 @@ final class CdmaSMSDispatcher extends SMSDispatcher { private byte[] mLastDispatchedSmsFingerprint; private byte[] mLastAcknowledgedSmsFingerprint; + private boolean mCheckForDuplicatePortsInOmadmWapPush = Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_duplicate_port_omadm_wappush); + CdmaSMSDispatcher(CDMAPhone phone) { super(phone); } @@ -245,6 +251,13 @@ final class CdmaSMSDispatcher extends SMSDispatcher { sourcePort |= 0xFF & pdu[index++]; destinationPort = (0xFF & pdu[index++]) << 8; destinationPort |= 0xFF & pdu[index++]; + // Some carriers incorrectly send duplicate port fields in omadm wap pushes. + // If configured, check for that here + if (mCheckForDuplicatePortsInOmadmWapPush) { + if (checkDuplicatePortOmadmWappush(pdu,index)) { + index = index + 4; // skip duplicate port fields + } + } } // Lookup all other related parts @@ -488,4 +501,45 @@ final class CdmaSMSDispatcher extends SMSDispatcher { return CommandsInterface.CDMA_SMS_FAIL_CAUSE_ENCODING_PROBLEM; } } + + /** + * Optional check to see if the received WapPush is an OMADM notification with erroneous + * extra port fields. + * - Some carriers make this mistake. + * ex: MSGTYPE-TotalSegments-CurrentSegment + * -SourcePortDestPort-SourcePortDestPort-OMADM PDU + * @param origPdu The WAP-WDP PDU segment + * @param index Current Index while parsing the PDU. + * @return True if OrigPdu is OmaDM Push Message which has duplicate ports. + * False if OrigPdu is NOT OmaDM Push Message which has duplicate ports. + */ + private boolean checkDuplicatePortOmadmWappush(byte[] origPdu, int index) { + index += 4; + byte[] omaPdu = new byte[origPdu.length - index]; + System.arraycopy(origPdu, index, omaPdu, 0, omaPdu.length); + + WspTypeDecoder pduDecoder = new WspTypeDecoder(omaPdu); + int wspIndex = 2; + + // Process header length field + if (pduDecoder.decodeUintvarInteger(wspIndex) == false) { + return false; + } + + wspIndex += pduDecoder.getDecodedDataLength(); // advance to next field + + // Process content type field + if (pduDecoder.decodeContentType(wspIndex) == false) { + return false; + } + + String mimeType = pduDecoder.getValueString(); + if (mimeType == null) { + int binaryContentType = (int)pduDecoder.getValue32(); + if (binaryContentType == WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI) { + return true; + } + } + return false; + } } |