Loading core/java/android/provider/Telephony.java +12 −3 Original line number Diff line number Diff line Loading @@ -562,15 +562,24 @@ public final class Telephony { * values:</p> * * <ul> * <li><em>transactionId (Integer)</em> - The WAP transaction * ID</li> * <li><em>transactionId (Integer)</em> - The WAP transaction ID</li> * <li><em>pduType (Integer)</em> - The WAP PDU type</li> * <li><em>header (byte[])</em> - The header of the message</li> * <li><em>data (byte[])</em> - The data payload of the message</li> * <li><em>contentTypeParameters (HashMap<String,String>)</em> * - Any parameters associated with the content type * (decoded from the WSP Content-Type header)</li> * </ul> * * <p>If a BroadcastReceiver encounters an error while processing * this intent it should set the result code appropriately.</p> * * <p>The contentTypeParameters extra value is map of content parameters keyed by * their names.</p> * * <p>If any unassigned well-known parameters are encountered, the key of the map will * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If * a parameter has No-Value the value in the map will be null.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WAP_PUSH_RECEIVED_ACTION = Loading telephony/java/com/android/internal/telephony/WapPushOverSms.java +26 −119 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.provider.Telephony.Sms.Intents; import android.util.Config; import android.util.Log; /** * WAP push handler class. * Loading Loading @@ -59,7 +58,7 @@ public class WapPushOverSms { */ public int dispatchWapPdu(byte[] pdu) { if (Config.LOGD) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); if (Config.DEBUG) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); int index = 0; int transactionId = pdu[index++] & 0xFF; Loading @@ -68,7 +67,7 @@ public class WapPushOverSms { if ((pduType != WspTypeDecoder.PDU_TYPE_PUSH) && (pduType != WspTypeDecoder.PDU_TYPE_CONFIRMED_PUSH)) { if (Config.LOGD) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); if (Config.DEBUG) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); return Intents.RESULT_SMS_HANDLED; } Loading @@ -81,7 +80,7 @@ public class WapPushOverSms { * So it will be encoded in no more than 5 octets. */ if (pduDecoder.decodeUintvarInteger(index) == false) { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Header Length error."); if (Config.DEBUG) Log.w(LOG_TAG, "Received PDU. Header Length error."); return Intents.RESULT_SMS_GENERIC_ERROR; } headerLength = (int)pduDecoder.getValue32(); Loading @@ -102,136 +101,44 @@ public class WapPushOverSms { * Length = Uintvar-integer */ if (pduDecoder.decodeContentType(index) == false) { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); if (Config.DEBUG) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); return Intents.RESULT_SMS_GENERIC_ERROR; } int binaryContentType; String mimeType = pduDecoder.getValueString(); if (mimeType == null) { binaryContentType = (int)pduDecoder.getValue32(); // TODO we should have more generic way to map binaryContentType code to mimeType. switch (binaryContentType) { case WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_XML: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML; break; case WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_WBXML: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_WBXML; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SI: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SI; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SL: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SL; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO; break; case WspTypeDecoder.CONTENT_TYPE_B_MMS: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS; break; case WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_VND_DOCOMO_PF; break; default: if (Config.LOGD) { Log.w(LOG_TAG, "Received PDU. Unsupported Content-Type = " + binaryContentType); } return Intents.RESULT_SMS_HANDLED; } } else { if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_XML; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_WBXML)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_WBXML; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SI)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_SI; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SL)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_SL; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_MMS; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_VND_DOCOMO_PF)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF; } else { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Unknown Content-Type = " + mimeType); return Intents.RESULT_SMS_HANDLED; } } index += pduDecoder.getDecodedDataLength(); boolean dispatchedByApplication = false; switch (binaryContentType) { case WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO: dispatchWapPdu_PushCO(pdu, transactionId, pduType, headerStartIndex, headerLength); dispatchedByApplication = true; break; case WspTypeDecoder.CONTENT_TYPE_B_MMS: dispatchWapPdu_MMS(pdu, transactionId, pduType, headerStartIndex, headerLength); dispatchedByApplication = true; break; default: break; } if (dispatchedByApplication == false) { dispatchWapPdu_default(pdu, transactionId, pduType, mimeType, headerStartIndex, headerLength); } return Activity.RESULT_OK; } index += pduDecoder.getDecodedDataLength(); private void dispatchWapPdu_default(byte[] pdu, int transactionId, int pduType, String mimeType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); int dataIndex = headerStartIndex + headerLength; byte[] data; data = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, data, 0, data.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(mimeType); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", data); byte[] intentData; String permission; mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_WAP_PUSH"); if (mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { intentData = pdu; } else { int dataIndex = headerStartIndex + headerLength; intentData = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, intentData, 0, intentData.length); } private void dispatchWapPdu_PushCO(byte[] pdu, int transactionId, int pduType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", pdu); mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_WAP_PUSH"); if (mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_MMS)) { permission = "android.permission.RECEIVE_MMS"; } else { permission = "android.permission.RECEIVE_WAP_PUSH"; } private void dispatchWapPdu_MMS(byte[] pdu, int transactionId, int pduType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); int dataIndex = headerStartIndex + headerLength; byte[] data = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, data, 0, data.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS); intent.setType(mimeType); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", data); intent.putExtra("data", intentData); intent.putExtra("contentTypeParameters", pduDecoder.getContentParameters()); mSmsDispatcher.dispatch(intent, permission); mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_MMS"); return Activity.RESULT_OK; } } No newline at end of file Loading
core/java/android/provider/Telephony.java +12 −3 Original line number Diff line number Diff line Loading @@ -562,15 +562,24 @@ public final class Telephony { * values:</p> * * <ul> * <li><em>transactionId (Integer)</em> - The WAP transaction * ID</li> * <li><em>transactionId (Integer)</em> - The WAP transaction ID</li> * <li><em>pduType (Integer)</em> - The WAP PDU type</li> * <li><em>header (byte[])</em> - The header of the message</li> * <li><em>data (byte[])</em> - The data payload of the message</li> * <li><em>contentTypeParameters (HashMap<String,String>)</em> * - Any parameters associated with the content type * (decoded from the WSP Content-Type header)</li> * </ul> * * <p>If a BroadcastReceiver encounters an error while processing * this intent it should set the result code appropriately.</p> * * <p>The contentTypeParameters extra value is map of content parameters keyed by * their names.</p> * * <p>If any unassigned well-known parameters are encountered, the key of the map will * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If * a parameter has No-Value the value in the map will be null.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WAP_PUSH_RECEIVED_ACTION = Loading
telephony/java/com/android/internal/telephony/WapPushOverSms.java +26 −119 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.provider.Telephony.Sms.Intents; import android.util.Config; import android.util.Log; /** * WAP push handler class. * Loading Loading @@ -59,7 +58,7 @@ public class WapPushOverSms { */ public int dispatchWapPdu(byte[] pdu) { if (Config.LOGD) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); if (Config.DEBUG) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); int index = 0; int transactionId = pdu[index++] & 0xFF; Loading @@ -68,7 +67,7 @@ public class WapPushOverSms { if ((pduType != WspTypeDecoder.PDU_TYPE_PUSH) && (pduType != WspTypeDecoder.PDU_TYPE_CONFIRMED_PUSH)) { if (Config.LOGD) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); if (Config.DEBUG) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); return Intents.RESULT_SMS_HANDLED; } Loading @@ -81,7 +80,7 @@ public class WapPushOverSms { * So it will be encoded in no more than 5 octets. */ if (pduDecoder.decodeUintvarInteger(index) == false) { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Header Length error."); if (Config.DEBUG) Log.w(LOG_TAG, "Received PDU. Header Length error."); return Intents.RESULT_SMS_GENERIC_ERROR; } headerLength = (int)pduDecoder.getValue32(); Loading @@ -102,136 +101,44 @@ public class WapPushOverSms { * Length = Uintvar-integer */ if (pduDecoder.decodeContentType(index) == false) { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); if (Config.DEBUG) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); return Intents.RESULT_SMS_GENERIC_ERROR; } int binaryContentType; String mimeType = pduDecoder.getValueString(); if (mimeType == null) { binaryContentType = (int)pduDecoder.getValue32(); // TODO we should have more generic way to map binaryContentType code to mimeType. switch (binaryContentType) { case WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_XML: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML; break; case WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_WBXML: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_WBXML; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SI: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SI; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_SL: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SL; break; case WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO; break; case WspTypeDecoder.CONTENT_TYPE_B_MMS: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS; break; case WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF: mimeType = WspTypeDecoder.CONTENT_MIME_TYPE_B_VND_DOCOMO_PF; break; default: if (Config.LOGD) { Log.w(LOG_TAG, "Received PDU. Unsupported Content-Type = " + binaryContentType); } return Intents.RESULT_SMS_HANDLED; } } else { if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_XML)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_XML; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_DRM_RIGHTS_WBXML)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_DRM_RIGHTS_WBXML; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SI)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_SI; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_SL)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_SL; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_MMS; } else if (mimeType.equals(WspTypeDecoder.CONTENT_MIME_TYPE_B_VND_DOCOMO_PF)) { binaryContentType = WspTypeDecoder.CONTENT_TYPE_B_VND_DOCOMO_PF; } else { if (Config.LOGD) Log.w(LOG_TAG, "Received PDU. Unknown Content-Type = " + mimeType); return Intents.RESULT_SMS_HANDLED; } } index += pduDecoder.getDecodedDataLength(); boolean dispatchedByApplication = false; switch (binaryContentType) { case WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO: dispatchWapPdu_PushCO(pdu, transactionId, pduType, headerStartIndex, headerLength); dispatchedByApplication = true; break; case WspTypeDecoder.CONTENT_TYPE_B_MMS: dispatchWapPdu_MMS(pdu, transactionId, pduType, headerStartIndex, headerLength); dispatchedByApplication = true; break; default: break; } if (dispatchedByApplication == false) { dispatchWapPdu_default(pdu, transactionId, pduType, mimeType, headerStartIndex, headerLength); } return Activity.RESULT_OK; } index += pduDecoder.getDecodedDataLength(); private void dispatchWapPdu_default(byte[] pdu, int transactionId, int pduType, String mimeType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); int dataIndex = headerStartIndex + headerLength; byte[] data; data = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, data, 0, data.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(mimeType); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", data); byte[] intentData; String permission; mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_WAP_PUSH"); if (mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { intentData = pdu; } else { int dataIndex = headerStartIndex + headerLength; intentData = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, intentData, 0, intentData.length); } private void dispatchWapPdu_PushCO(byte[] pdu, int transactionId, int pduType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(WspTypeDecoder.CONTENT_MIME_TYPE_B_PUSH_CO); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", pdu); mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_WAP_PUSH"); if (mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_MMS)) { permission = "android.permission.RECEIVE_MMS"; } else { permission = "android.permission.RECEIVE_WAP_PUSH"; } private void dispatchWapPdu_MMS(byte[] pdu, int transactionId, int pduType, int headerStartIndex, int headerLength) { byte[] header = new byte[headerLength]; System.arraycopy(pdu, headerStartIndex, header, 0, header.length); int dataIndex = headerStartIndex + headerLength; byte[] data = new byte[pdu.length - dataIndex]; System.arraycopy(pdu, dataIndex, data, 0, data.length); Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); intent.setType(WspTypeDecoder.CONTENT_MIME_TYPE_B_MMS); intent.setType(mimeType); intent.putExtra("transactionId", transactionId); intent.putExtra("pduType", pduType); intent.putExtra("header", header); intent.putExtra("data", data); intent.putExtra("data", intentData); intent.putExtra("contentTypeParameters", pduDecoder.getContentParameters()); mSmsDispatcher.dispatch(intent, permission); mSmsDispatcher.dispatch(intent, "android.permission.RECEIVE_MMS"); return Activity.RESULT_OK; } } No newline at end of file