diff options
author | Marco Nelissen <marcone@google.com> | 2011-06-15 13:44:56 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-06-15 13:44:56 -0700 |
commit | 181aafd75c339d5c420c5755ab3889e0a7e909b9 (patch) | |
tree | b22fd5f1c3d3f14170c8d19bb02111b74d0d2959 | |
parent | 554344ee7444c0d973f0d4ef768f72d33cc8d4fc (diff) | |
parent | 9c3c3004c4206da3f2579e863ce89a2f99269dd6 (diff) | |
download | frameworks_base-181aafd75c339d5c420c5755ab3889e0a7e909b9.zip frameworks_base-181aafd75c339d5c420c5755ab3889e0a7e909b9.tar.gz frameworks_base-181aafd75c339d5c420c5755ab3889e0a7e909b9.tar.bz2 |
am 9c3c3004: am d8f9a83c: resolved conflicts for merge of d027329c to gingerbread-plus-aosp
* commit '9c3c3004c4206da3f2579e863ce89a2f99269dd6':
Ignore duplicate WAP push PDU source/destination port if configured
-rwxr-xr-x | core/res/res/values/config.xml | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/WapPushOverSms.java | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/WspTypeDecoder.java | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java | 51 |
4 files changed, 59 insertions, 0 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 3b4798e..271ad8c 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -633,4 +633,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 e2779dc..e2779dc 100644..100755 --- a/telephony/java/com/android/internal/telephony/WapPushOverSms.java +++ b/telephony/java/com/android/internal/telephony/WapPushOverSms.java diff --git a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java index c8dd718..73260fb 100644..100755 --- a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java +++ b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java @@ -194,6 +194,7 @@ public class WspTypeDecoder { public static final String CONTENT_TYPE_B_PUSH_CO = "application/vnd.wap.coc"; public static final String CONTENT_TYPE_B_MMS = "application/vnd.wap.mms-message"; + public static final String CONTENT_TYPE_B_PUSH_SYNCML_NOTI = "application/vnd.syncml.notification"; byte[] wspData; int dataLength; diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java index 29349db..07b0f4f 100644..100755 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java @@ -41,6 +41,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; @@ -50,6 +51,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"; @@ -57,6 +60,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); } @@ -253,6 +259,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 @@ -502,4 +515,42 @@ 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 && mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI)) { + return true; + } + return false; + } } |