Skip to content

Commit 7d4046e

Browse files
Jake HambyAndroid (Google) Code Review
authored andcommitted
Merge "Fix 3GPP SMS send failure for 7-bit national language tables." into ics-mr0
2 parents c3cf16d + 87d14a1 commit 7d4046e

File tree

3 files changed

+52
-11
lines changed

3 files changed

+52
-11
lines changed

telephony/java/com/android/internal/telephony/SmsHeader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,9 @@ public static SmsHeader fromByteArray(byte[] data) {
190190
public static byte[] toByteArray(SmsHeader smsHeader) {
191191
if ((smsHeader.portAddrs == null) &&
192192
(smsHeader.concatRef == null) &&
193-
(smsHeader.miscEltList.size() == 0)) {
193+
(smsHeader.miscEltList.isEmpty()) &&
194+
(smsHeader.languageShiftTable == 0) &&
195+
(smsHeader.languageTable == 0)) {
194196
return null;
195197
}
196198

telephony/java/com/android/internal/telephony/gsm/GsmSMSDispatcher.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,11 @@ protected void sendData(String destAddr, String scAddr, int destPort,
197197
byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
198198
SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
199199
scAddr, destAddr, destPort, data, (deliveryIntent != null));
200-
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
200+
if (pdu != null) {
201+
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
202+
} else {
203+
Log.e(TAG, "GsmSMSDispatcher.sendData(): getSubmitPdu() returned null");
204+
}
201205
}
202206

203207
/** {@inheritDoc} */
@@ -206,7 +210,11 @@ protected void sendText(String destAddr, String scAddr, String text,
206210
PendingIntent sentIntent, PendingIntent deliveryIntent) {
207211
SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
208212
scAddr, destAddr, text, (deliveryIntent != null));
209-
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
213+
if (pdu != null) {
214+
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
215+
} else {
216+
Log.e(TAG, "GsmSMSDispatcher.sendText(): getSubmitPdu() returned null");
217+
}
210218
}
211219

212220
/** {@inheritDoc} */
@@ -224,7 +232,11 @@ protected void sendNewSubmitPdu(String destinationAddress, String scAddress,
224232
SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(scAddress, destinationAddress,
225233
message, deliveryIntent != null, SmsHeader.toByteArray(smsHeader),
226234
encoding, smsHeader.languageTable, smsHeader.languageShiftTable);
227-
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
235+
if (pdu != null) {
236+
sendRawPdu(pdu.encodedScAddress, pdu.encodedMessage, sentIntent, deliveryIntent);
237+
} else {
238+
Log.e(TAG, "GsmSMSDispatcher.sendNewSubmitPdu(): getSubmitPdu() returned null");
239+
}
228240
}
229241

230242
/** {@inheritDoc} */

telephony/java/com/android/internal/telephony/gsm/SmsMessage.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@
1616

1717
package com.android.internal.telephony.gsm;
1818

19-
import android.os.Parcel;
2019
import android.telephony.PhoneNumberUtils;
2120
import android.text.format.Time;
2221
import android.util.Log;
23-
import com.android.internal.telephony.IccUtils;
22+
2423
import com.android.internal.telephony.EncodeException;
2524
import com.android.internal.telephony.GsmAlphabet;
25+
import com.android.internal.telephony.IccUtils;
2626
import com.android.internal.telephony.SmsHeader;
2727
import com.android.internal.telephony.SmsMessageBase;
2828

2929
import java.io.ByteArrayOutputStream;
3030
import java.io.UnsupportedEncodingException;
3131

32+
import static android.telephony.SmsMessage.ENCODING_16BIT;
3233
import static android.telephony.SmsMessage.ENCODING_7BIT;
3334
import static android.telephony.SmsMessage.ENCODING_8BIT;
34-
import static android.telephony.SmsMessage.ENCODING_16BIT;
3535
import static android.telephony.SmsMessage.ENCODING_KSC5601;
3636
import static android.telephony.SmsMessage.ENCODING_UNKNOWN;
3737
import static android.telephony.SmsMessage.MAX_USER_DATA_BYTES;
@@ -240,18 +240,43 @@ public static SubmitPdu getSubmitPdu(String scAddress,
240240
return null;
241241
}
242242

243+
if (encoding == ENCODING_UNKNOWN) {
244+
// Find the best encoding to use
245+
TextEncodingDetails ted = calculateLength(message, false);
246+
encoding = ted.codeUnitSize;
247+
languageTable = ted.languageTable;
248+
languageShiftTable = ted.languageShiftTable;
249+
250+
if (encoding == ENCODING_7BIT && (languageTable != 0 || languageShiftTable != 0)) {
251+
if (header != null) {
252+
SmsHeader smsHeader = SmsHeader.fromByteArray(header);
253+
if (smsHeader.languageTable != languageTable
254+
|| smsHeader.languageShiftTable != languageShiftTable) {
255+
Log.w(LOG_TAG, "Updating language table in SMS header: "
256+
+ smsHeader.languageTable + " -> " + languageTable + ", "
257+
+ smsHeader.languageShiftTable + " -> " + languageShiftTable);
258+
smsHeader.languageTable = languageTable;
259+
smsHeader.languageShiftTable = languageShiftTable;
260+
header = SmsHeader.toByteArray(smsHeader);
261+
}
262+
} else {
263+
SmsHeader smsHeader = new SmsHeader();
264+
smsHeader.languageTable = languageTable;
265+
smsHeader.languageShiftTable = languageShiftTable;
266+
header = SmsHeader.toByteArray(smsHeader);
267+
}
268+
}
269+
}
270+
243271
SubmitPdu ret = new SubmitPdu();
244272
// MTI = SMS-SUBMIT, UDHI = header != null
245273
byte mtiByte = (byte)(0x01 | (header != null ? 0x40 : 0x00));
246274
ByteArrayOutputStream bo = getSubmitPduHead(
247275
scAddress, destinationAddress, mtiByte,
248276
statusReportRequested, ret);
277+
249278
// User Data (and length)
250279
byte[] userData;
251-
if (encoding == ENCODING_UNKNOWN) {
252-
// First, try encoding it with the GSM alphabet
253-
encoding = ENCODING_7BIT;
254-
}
255280
try {
256281
if (encoding == ENCODING_7BIT) {
257282
userData = GsmAlphabet.stringToGsm7BitPackedWithHeader(message, header,
@@ -283,6 +308,7 @@ public static SubmitPdu getSubmitPdu(String scAddress,
283308
if (encoding == ENCODING_7BIT) {
284309
if ((0xff & userData[0]) > MAX_USER_DATA_SEPTETS) {
285310
// Message too long
311+
Log.e(LOG_TAG, "Message too long (" + (0xff & userData[0]) + " septets)");
286312
return null;
287313
}
288314
// TP-Data-Coding-Scheme
@@ -297,6 +323,7 @@ public static SubmitPdu getSubmitPdu(String scAddress,
297323
} else { // assume UCS-2
298324
if ((0xff & userData[0]) > MAX_USER_DATA_BYTES) {
299325
// Message too long
326+
Log.e(LOG_TAG, "Message too long (" + (0xff & userData[0]) + " bytes)");
300327
return null;
301328
}
302329
// TP-Data-Coding-Scheme

0 commit comments

Comments
 (0)