Ignore duplicate WAP push PDU source/destination port if configured
Some carriers duplicate the OMADM wap push PDU source/destination
port.
e.g. MSGTYPE-TotalSegments-CurrentSegment
-SourcePortDestPort-SourcePortDestPort-OMADM PDU
So the client has to ignore the duplicate source/destination
port.
Change-Id: I83df6e8e7d2e2e4275036a1b574247f9f40c5cf4
Signed-off-by: Soojung Shin <sj46.shin@samsung.com>
This commit is contained in:
committed by
Simon Wilson
parent
8688d47081
commit
d027329cd6
@@ -461,4 +461,11 @@
|
|||||||
<!-- Set to true if the RSSI should always display CDMA signal strength
|
<!-- Set to true if the RSSI should always display CDMA signal strength
|
||||||
even on EVDO -->
|
even on EVDO -->
|
||||||
<bool name="config_alwaysUseCdmaRssi">false</bool>
|
<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>
|
</resources>
|
||||||
|
|||||||
5
telephony/java/com/android/internal/telephony/WapPushOverSms.java
Normal file → Executable file
5
telephony/java/com/android/internal/telephony/WapPushOverSms.java
Normal file → Executable file
@@ -135,6 +135,9 @@ public class WapPushOverSms {
|
|||||||
case WspTypeDecoder.CONTENT_TYPE_B_SUPL_INIT:
|
case WspTypeDecoder.CONTENT_TYPE_B_SUPL_INIT:
|
||||||
mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT;
|
mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT;
|
||||||
break;
|
break;
|
||||||
|
case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SYNCML_NOTI:
|
||||||
|
mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SYNCML_NOTI;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (Config.LOGD) {
|
if (Config.LOGD) {
|
||||||
Log.w(LOG_TAG,
|
Log.w(LOG_TAG,
|
||||||
@@ -159,6 +162,8 @@ public class WapPushOverSms {
|
|||||||
binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF;
|
binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF;
|
||||||
} else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT)) {
|
} else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_SUPL_INIT)) {
|
||||||
binaryContentType = WspTypeDecoder.CONTENT_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 {
|
} else {
|
||||||
if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Unknown Content-Type = " + mimeType);
|
if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Unknown Content-Type = " + mimeType);
|
||||||
return Intents.RESULT_SMS_HANDLED;
|
return Intents.RESULT_SMS_HANDLED;
|
||||||
|
|||||||
4
telephony/java/com/android/internal/telephony/WspTypeDecoder.java
Normal file → Executable file
4
telephony/java/com/android/internal/telephony/WspTypeDecoder.java
Normal file → Executable file
@@ -41,6 +41,7 @@ public class WspTypeDecoder {
|
|||||||
public static final int CONTENT_TYPE_B_MMS = 0x3e;
|
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_VND_DOCOMO_PF = 0x0310;
|
||||||
public static final int CONTENT_TYPE_B_SUPL_INIT = 0x312;
|
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 =
|
public static final String CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML =
|
||||||
"application/vnd.oma.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_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_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_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;
|
public static final int PARAMETER_ID_X_WAP_APPLICATION_ID = 0x2f;
|
||||||
|
|
||||||
|
|
||||||
byte[] wspData;
|
byte[] wspData;
|
||||||
int dataLength;
|
int dataLength;
|
||||||
long unsigned32bit;
|
long unsigned32bit;
|
||||||
|
|||||||
54
telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
Normal file → Executable file
54
telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
Normal file → Executable file
@@ -42,6 +42,7 @@ import com.android.internal.telephony.SmsHeader;
|
|||||||
import com.android.internal.telephony.SmsMessageBase;
|
import com.android.internal.telephony.SmsMessageBase;
|
||||||
import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails;
|
import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails;
|
||||||
import com.android.internal.telephony.TelephonyProperties;
|
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.SmsEnvelope;
|
||||||
import com.android.internal.telephony.cdma.sms.UserData;
|
import com.android.internal.telephony.cdma.sms.UserData;
|
||||||
import com.android.internal.util.HexDump;
|
import com.android.internal.util.HexDump;
|
||||||
@@ -51,6 +52,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import android.content.res.Resources;
|
||||||
|
|
||||||
|
|
||||||
final class CdmaSMSDispatcher extends SMSDispatcher {
|
final class CdmaSMSDispatcher extends SMSDispatcher {
|
||||||
private static final String TAG = "CDMA";
|
private static final String TAG = "CDMA";
|
||||||
@@ -58,6 +61,9 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
|
|||||||
private byte[] mLastDispatchedSmsFingerprint;
|
private byte[] mLastDispatchedSmsFingerprint;
|
||||||
private byte[] mLastAcknowledgedSmsFingerprint;
|
private byte[] mLastAcknowledgedSmsFingerprint;
|
||||||
|
|
||||||
|
private boolean mCheckForDuplicatePortsInOmadmWapPush = Resources.getSystem().getBoolean(
|
||||||
|
com.android.internal.R.bool.config_duplicate_port_omadm_wappush);
|
||||||
|
|
||||||
CdmaSMSDispatcher(CDMAPhone phone) {
|
CdmaSMSDispatcher(CDMAPhone phone) {
|
||||||
super(phone);
|
super(phone);
|
||||||
}
|
}
|
||||||
@@ -245,6 +251,13 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
|
|||||||
sourcePort |= 0xFF & pdu[index++];
|
sourcePort |= 0xFF & pdu[index++];
|
||||||
destinationPort = (0xFF & pdu[index++]) << 8;
|
destinationPort = (0xFF & pdu[index++]) << 8;
|
||||||
destinationPort |= 0xFF & pdu[index++];
|
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
|
// Lookup all other related parts
|
||||||
@@ -488,4 +501,45 @@ final class CdmaSMSDispatcher extends SMSDispatcher {
|
|||||||
return CommandsInterface.CDMA_SMS_FAIL_CAUSE_ENCODING_PROBLEM;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user