| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.telephony.cdma; |
| |
| import android.hardware.radio.V1_0.CdmaSmsMessage; |
| import android.os.Parcel; |
| import android.os.SystemProperties; |
| import android.telephony.PhoneNumberUtils; |
| import android.telephony.SmsCbLocation; |
| import android.telephony.SmsCbMessage; |
| import android.telephony.TelephonyManager; |
| import android.telephony.cdma.CdmaSmsCbProgramData; |
| import android.telephony.Rlog; |
| import android.util.Log; |
| import android.text.TextUtils; |
| import android.content.res.Resources; |
| |
| import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; |
| import com.android.internal.telephony.SmsConstants; |
| import com.android.internal.telephony.SmsHeader; |
| import com.android.internal.telephony.SmsMessageBase; |
| import com.android.internal.telephony.TelephonyProperties; |
| import com.android.internal.telephony.cdma.sms.BearerData; |
| import com.android.internal.telephony.cdma.sms.CdmaSmsAddress; |
| import com.android.internal.telephony.cdma.sms.CdmaSmsSubaddress; |
| import com.android.internal.telephony.cdma.sms.SmsEnvelope; |
| import com.android.internal.telephony.cdma.sms.UserData; |
| import com.android.internal.telephony.uicc.IccUtils; |
| import com.android.internal.util.BitwiseInputStream; |
| import com.android.internal.util.HexDump; |
| import com.android.internal.telephony.Sms7BitEncodingTranslator; |
| |
| import java.io.BufferedOutputStream; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.DataInputStream; |
| import java.io.DataOutputStream; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| |
| /** |
| * A Factory class to convert from RIL to Framework SMS |
| * |
| */ |
| public class SmsMessageConverter { |
| static final String LOG_TAG = "SmsMessageConverter"; |
| static private final String LOGGABLE_TAG = "CDMA:SMS"; |
| private static final boolean VDBG = false; |
| |
| /** |
| * Create a "raw" CDMA SmsMessage from a Parcel that was forged in ril.cpp. |
| * Note: Only primitive fields are set. |
| */ |
| public static SmsMessage newCdmaSmsMessageFromRil( |
| CdmaSmsMessage cdmaSmsMessage) { |
| // Note: Parcel.readByte actually reads one Int and masks to byte |
| SmsEnvelope env = new SmsEnvelope(); |
| CdmaSmsAddress addr = new CdmaSmsAddress(); |
| CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress(); |
| byte[] data; |
| byte count; |
| int countInt; |
| int addressDigitMode; |
| |
| //currently not supported by the modem-lib: env.mMessageType |
| env.teleService = cdmaSmsMessage.teleserviceId; |
| |
| if (cdmaSmsMessage.isServicePresent) { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_BROADCAST; |
| } |
| else { |
| if (SmsEnvelope.TELESERVICE_NOT_SET == env.teleService) { |
| // assume type ACK |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_ACKNOWLEDGE; |
| } else { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; |
| } |
| } |
| env.serviceCategory = cdmaSmsMessage.serviceCategory; |
| |
| // address |
| addressDigitMode = cdmaSmsMessage.address.digitMode; |
| addr.digitMode = (byte) (0xFF & addressDigitMode); |
| addr.numberMode = (byte) (0xFF & cdmaSmsMessage.address.numberMode); |
| addr.ton = cdmaSmsMessage.address.numberType; |
| addr.numberPlan = (byte) (0xFF & cdmaSmsMessage.address.numberPlan); |
| count = (byte) cdmaSmsMessage.address.digits.size(); |
| addr.numberOfDigits = count; |
| data = new byte[count]; |
| for (int index=0; index < count; index++) { |
| data[index] = cdmaSmsMessage.address.digits.get(index); |
| |
| // convert the value if it is 4-bit DTMF to 8 bit |
| if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) { |
| data[index] = SmsMessage.convertDtmfToAscii(data[index]); |
| } |
| } |
| |
| addr.origBytes = data; |
| |
| subaddr.type = cdmaSmsMessage.subAddress.subaddressType; |
| subaddr.odd = (byte) (cdmaSmsMessage.subAddress.odd ? 1 : 0); |
| count = (byte) cdmaSmsMessage.subAddress.digits.size(); |
| |
| if (count < 0) { |
| count = 0; |
| } |
| |
| // p_cur->sSubAddress.digits[digitCount] : |
| |
| data = new byte[count]; |
| |
| for (int index = 0; index < count; ++index) { |
| data[index] = cdmaSmsMessage.subAddress.digits.get(index); |
| } |
| |
| subaddr.origBytes = data; |
| |
| /* currently not supported by the modem-lib: |
| env.bearerReply |
| env.replySeqNo |
| env.errorClass |
| env.causeCode |
| */ |
| |
| // bearer data |
| countInt = cdmaSmsMessage.bearerData.size(); |
| if (countInt < 0) { |
| countInt = 0; |
| } |
| |
| data = new byte[countInt]; |
| for (int index=0; index < countInt; index++) { |
| data[index] = cdmaSmsMessage.bearerData.get(index); |
| } |
| // BD gets further decoded when accessed in SMSDispatcher |
| env.bearerData = data; |
| |
| // link the the filled objects to the SMS |
| env.origAddress = addr; |
| env.origSubaddress = subaddr; |
| |
| SmsMessage msg = new SmsMessage(addr, env); |
| |
| return msg; |
| } |
| |
| public static android.telephony.SmsMessage newSmsMessageFromCdmaSmsMessage( |
| CdmaSmsMessage msg) { |
| return new android.telephony.SmsMessage((SmsMessageBase)newCdmaSmsMessageFromRil(msg)); |
| } |
| } |