RIL.java revision 6ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7
1/* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.internal.telephony; 18 19import static com.android.internal.telephony.RILConstants.*; 20import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN; 21import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE; 22import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS; 23import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS; 24import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA; 25import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA; 26import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA; 27 28import android.content.BroadcastReceiver; 29import android.content.Context; 30import android.content.Intent; 31import android.content.IntentFilter; 32import android.net.ConnectivityManager; 33import android.net.LocalSocket; 34import android.net.LocalSocketAddress; 35import android.os.AsyncResult; 36import android.os.Handler; 37import android.os.HandlerThread; 38import android.os.Looper; 39import android.os.Message; 40import android.os.Parcel; 41import android.os.PowerManager; 42import android.os.SystemProperties; 43import android.os.PowerManager.WakeLock; 44import android.provider.Settings.SettingNotFoundException; 45import android.telephony.CellInfo; 46import android.telephony.NeighboringCellInfo; 47import android.telephony.PhoneNumberUtils; 48import android.telephony.Rlog; 49import android.telephony.SignalStrength; 50import android.telephony.SmsManager; 51import android.telephony.SmsMessage; 52import android.text.TextUtils; 53import android.util.SparseArray; 54 55import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; 56import com.android.internal.telephony.gsm.SuppServiceNotification; 57import com.android.internal.telephony.uicc.IccCardApplicationStatus; 58import com.android.internal.telephony.uicc.IccCardStatus; 59import com.android.internal.telephony.uicc.IccIoResult; 60import com.android.internal.telephony.uicc.IccRefreshResponse; 61import com.android.internal.telephony.uicc.IccUtils; 62import com.android.internal.telephony.cdma.CdmaCallWaitingNotification; 63import com.android.internal.telephony.cdma.CdmaInformationRecords; 64import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; 65import com.android.internal.telephony.dataconnection.DcFailCause; 66import com.android.internal.telephony.dataconnection.DataCallResponse; 67import com.android.internal.telephony.dataconnection.DataProfile; 68import com.android.internal.telephony.TelephonyDevController; 69import com.android.internal.telephony.HardwareConfig; 70 71import java.io.ByteArrayInputStream; 72import java.io.DataInputStream; 73import java.io.FileDescriptor; 74import java.io.IOException; 75import java.io.InputStream; 76import java.io.PrintWriter; 77import java.util.ArrayList; 78import java.util.Collections; 79import java.util.concurrent.atomic.AtomicBoolean; 80import java.util.concurrent.atomic.AtomicInteger; 81import java.util.Random; 82 83/** 84 * {@hide} 85 */ 86class RILRequest { 87 static final String LOG_TAG = "RilRequest"; 88 89 //***** Class Variables 90 static Random sRandom = new Random(); 91 static AtomicInteger sNextSerial = new AtomicInteger(0); 92 private static Object sPoolSync = new Object(); 93 private static RILRequest sPool = null; 94 private static int sPoolSize = 0; 95 private static final int MAX_POOL_SIZE = 4; 96 private Context mContext; 97 98 //***** Instance Variables 99 int mSerial; 100 int mRequest; 101 Message mResult; 102 Parcel mParcel; 103 RILRequest mNext; 104 105 /** 106 * Retrieves a new RILRequest instance from the pool. 107 * 108 * @param request RIL_REQUEST_* 109 * @param result sent when operation completes 110 * @return a RILRequest instance from the pool. 111 */ 112 static RILRequest obtain(int request, Message result) { 113 RILRequest rr = null; 114 115 synchronized(sPoolSync) { 116 if (sPool != null) { 117 rr = sPool; 118 sPool = rr.mNext; 119 rr.mNext = null; 120 sPoolSize--; 121 } 122 } 123 124 if (rr == null) { 125 rr = new RILRequest(); 126 } 127 128 rr.mSerial = sNextSerial.getAndIncrement(); 129 130 rr.mRequest = request; 131 rr.mResult = result; 132 rr.mParcel = Parcel.obtain(); 133 134 if (result != null && result.getTarget() == null) { 135 throw new NullPointerException("Message target must not be null"); 136 } 137 138 // first elements in any RIL Parcel 139 rr.mParcel.writeInt(request); 140 rr.mParcel.writeInt(rr.mSerial); 141 142 return rr; 143 } 144 145 /** 146 * Returns a RILRequest instance to the pool. 147 * 148 * Note: This should only be called once per use. 149 */ 150 void release() { 151 synchronized (sPoolSync) { 152 if (sPoolSize < MAX_POOL_SIZE) { 153 mNext = sPool; 154 sPool = this; 155 sPoolSize++; 156 mResult = null; 157 } 158 } 159 } 160 161 private RILRequest() { 162 } 163 164 static void 165 resetSerial() { 166 // use a random so that on recovery we probably don't mix old requests 167 // with new. 168 sNextSerial.set(sRandom.nextInt()); 169 } 170 171 String 172 serialString() { 173 //Cheesy way to do %04d 174 StringBuilder sb = new StringBuilder(8); 175 String sn; 176 177 long adjustedSerial = (((long)mSerial) - Integer.MIN_VALUE)%10000; 178 179 sn = Long.toString(adjustedSerial); 180 181 //sb.append("J["); 182 sb.append('['); 183 for (int i = 0, s = sn.length() ; i < 4 - s; i++) { 184 sb.append('0'); 185 } 186 187 sb.append(sn); 188 sb.append(']'); 189 return sb.toString(); 190 } 191 192 void 193 onError(int error, Object ret) { 194 CommandException ex; 195 196 ex = CommandException.fromRilErrno(error); 197 198 if (RIL.RILJ_LOGD) Rlog.d(LOG_TAG, serialString() + "< " 199 + RIL.requestToString(mRequest) 200 + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)); 201 202 if (mResult != null) { 203 AsyncResult.forMessage(mResult, ret, ex); 204 mResult.sendToTarget(); 205 } 206 207 if (mParcel != null) { 208 mParcel.recycle(); 209 mParcel = null; 210 } 211 } 212} 213 214 215/** 216 * RIL implementation of the CommandsInterface. 217 * 218 * {@hide} 219 */ 220public final class RIL extends BaseCommands implements CommandsInterface { 221 static final String RILJ_LOG_TAG = "RILJ"; 222 static final boolean RILJ_LOGD = true; 223 static final boolean RILJ_LOGV = false; // STOPSHIP if true 224 225 /** 226 * Wake lock timeout should be longer than the longest timeout in 227 * the vendor ril. 228 */ 229 private static final int DEFAULT_WAKE_LOCK_TIMEOUT = 60000; 230 231 //***** Instance Variables 232 233 LocalSocket mSocket; 234 HandlerThread mSenderThread; 235 RILSender mSender; 236 Thread mReceiverThread; 237 RILReceiver mReceiver; 238 WakeLock mWakeLock; 239 final int mWakeLockTimeout; 240 // The number of wakelock requests currently active. Don't release the lock 241 // until dec'd to 0 242 int mWakeLockCount; 243 244 SparseArray<RILRequest> mRequestList = new SparseArray<RILRequest>(); 245 246 Object mLastNITZTimeInfo; 247 248 // When we are testing emergency calls 249 AtomicBoolean mTestingEmergencyCall = new AtomicBoolean(false); 250 251 private Integer mInstanceId; 252 253 //***** Events 254 255 static final int EVENT_SEND = 1; 256 static final int EVENT_WAKE_LOCK_TIMEOUT = 2; 257 258 //***** Constants 259 260 // match with constant in ril.cpp 261 static final int RIL_MAX_COMMAND_BYTES = (8 * 1024); 262 static final int RESPONSE_SOLICITED = 0; 263 static final int RESPONSE_UNSOLICITED = 1; 264 265 static final String[] SOCKET_NAME_RIL = {"rild", "rild2", "rild3"}; 266 267 static final int SOCKET_OPEN_RETRY_MILLIS = 4 * 1000; 268 269 // The number of the required config values for broadcast SMS stored in the C struct 270 // RIL_CDMA_BroadcastServiceInfo 271 private static final int CDMA_BSI_NO_OF_INTS_STRUCT = 3; 272 273 private static final int CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES = 31; 274 275 BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 276 @Override 277 public void onReceive(Context context, Intent intent) { 278 if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 279 sendScreenState(true); 280 } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 281 sendScreenState(false); 282 } else { 283 Rlog.w(RILJ_LOG_TAG, "RIL received unexpected Intent: " + intent.getAction()); 284 } 285 } 286 }; 287 288 class RILSender extends Handler implements Runnable { 289 public RILSender(Looper looper) { 290 super(looper); 291 } 292 293 // Only allocated once 294 byte[] dataLength = new byte[4]; 295 296 //***** Runnable implementation 297 @Override 298 public void 299 run() { 300 //setup if needed 301 } 302 303 304 //***** Handler implementation 305 @Override public void 306 handleMessage(Message msg) { 307 RILRequest rr = (RILRequest)(msg.obj); 308 RILRequest req = null; 309 310 switch (msg.what) { 311 case EVENT_SEND: 312 try { 313 LocalSocket s; 314 315 s = mSocket; 316 317 if (s == null) { 318 rr.onError(RADIO_NOT_AVAILABLE, null); 319 rr.release(); 320 decrementWakeLock(); 321 return; 322 } 323 324 synchronized (mRequestList) { 325 mRequestList.append(rr.mSerial, rr); 326 } 327 328 byte[] data; 329 330 data = rr.mParcel.marshall(); 331 rr.mParcel.recycle(); 332 rr.mParcel = null; 333 334 if (data.length > RIL_MAX_COMMAND_BYTES) { 335 throw new RuntimeException( 336 "Parcel larger than max bytes allowed! " 337 + data.length); 338 } 339 340 // parcel length in big endian 341 dataLength[0] = dataLength[1] = 0; 342 dataLength[2] = (byte)((data.length >> 8) & 0xff); 343 dataLength[3] = (byte)((data.length) & 0xff); 344 345 //Rlog.v(RILJ_LOG_TAG, "writing packet: " + data.length + " bytes"); 346 347 s.getOutputStream().write(dataLength); 348 s.getOutputStream().write(data); 349 } catch (IOException ex) { 350 Rlog.e(RILJ_LOG_TAG, "IOException", ex); 351 req = findAndRemoveRequestFromList(rr.mSerial); 352 // make sure this request has not already been handled, 353 // eg, if RILReceiver cleared the list. 354 if (req != null) { 355 rr.onError(RADIO_NOT_AVAILABLE, null); 356 rr.release(); 357 decrementWakeLock(); 358 } 359 } catch (RuntimeException exc) { 360 Rlog.e(RILJ_LOG_TAG, "Uncaught exception ", exc); 361 req = findAndRemoveRequestFromList(rr.mSerial); 362 // make sure this request has not already been handled, 363 // eg, if RILReceiver cleared the list. 364 if (req != null) { 365 rr.onError(GENERIC_FAILURE, null); 366 rr.release(); 367 decrementWakeLock(); 368 } 369 } 370 371 break; 372 373 case EVENT_WAKE_LOCK_TIMEOUT: 374 // Haven't heard back from the last request. Assume we're 375 // not getting a response and release the wake lock. 376 377 // The timer of WAKE_LOCK_TIMEOUT is reset with each 378 // new send request. So when WAKE_LOCK_TIMEOUT occurs 379 // all requests in mRequestList already waited at 380 // least DEFAULT_WAKE_LOCK_TIMEOUT but no response. 381 // 382 // Note: Keep mRequestList so that delayed response 383 // can still be handled when response finally comes. 384 385 synchronized (mRequestList) { 386 if (clearWakeLock()) { 387 if (RILJ_LOGD) { 388 int count = mRequestList.size(); 389 Rlog.d(RILJ_LOG_TAG, "WAKE_LOCK_TIMEOUT " + 390 " mRequestList=" + count); 391 for (int i = 0; i < count; i++) { 392 rr = mRequestList.valueAt(i); 393 Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] " 394 + requestToString(rr.mRequest)); 395 } 396 } 397 } 398 } 399 break; 400 } 401 } 402 } 403 404 /** 405 * Reads in a single RIL message off the wire. A RIL message consists 406 * of a 4-byte little-endian length and a subsequent series of bytes. 407 * The final message (length header omitted) is read into 408 * <code>buffer</code> and the length of the final message (less header) 409 * is returned. A return value of -1 indicates end-of-stream. 410 * 411 * @param is non-null; Stream to read from 412 * @param buffer Buffer to fill in. Must be as large as maximum 413 * message size, or an ArrayOutOfBounds exception will be thrown. 414 * @return Length of message less header, or -1 on end of stream. 415 * @throws IOException 416 */ 417 private static int readRilMessage(InputStream is, byte[] buffer) 418 throws IOException { 419 int countRead; 420 int offset; 421 int remaining; 422 int messageLength; 423 424 // First, read in the length of the message 425 offset = 0; 426 remaining = 4; 427 do { 428 countRead = is.read(buffer, offset, remaining); 429 430 if (countRead < 0 ) { 431 Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message length"); 432 return -1; 433 } 434 435 offset += countRead; 436 remaining -= countRead; 437 } while (remaining > 0); 438 439 messageLength = ((buffer[0] & 0xff) << 24) 440 | ((buffer[1] & 0xff) << 16) 441 | ((buffer[2] & 0xff) << 8) 442 | (buffer[3] & 0xff); 443 444 // Then, re-use the buffer and read in the message itself 445 offset = 0; 446 remaining = messageLength; 447 do { 448 countRead = is.read(buffer, offset, remaining); 449 450 if (countRead < 0 ) { 451 Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message. messageLength=" + messageLength 452 + " remaining=" + remaining); 453 return -1; 454 } 455 456 offset += countRead; 457 remaining -= countRead; 458 } while (remaining > 0); 459 460 return messageLength; 461 } 462 463 class RILReceiver implements Runnable { 464 byte[] buffer; 465 466 RILReceiver() { 467 buffer = new byte[RIL_MAX_COMMAND_BYTES]; 468 } 469 470 @Override 471 public void 472 run() { 473 int retryCount = 0; 474 String rilSocket = "rild"; 475 476 try {for (;;) { 477 LocalSocket s = null; 478 LocalSocketAddress l; 479 480 if (mInstanceId == null || mInstanceId == 0 ) { 481 rilSocket = SOCKET_NAME_RIL[0]; 482 } else { 483 rilSocket = SOCKET_NAME_RIL[mInstanceId]; 484 } 485 486 try { 487 s = new LocalSocket(); 488 l = new LocalSocketAddress(rilSocket, 489 LocalSocketAddress.Namespace.RESERVED); 490 s.connect(l); 491 } catch (IOException ex){ 492 try { 493 if (s != null) { 494 s.close(); 495 } 496 } catch (IOException ex2) { 497 //ignore failure to close after failure to connect 498 } 499 500 // don't print an error message after the the first time 501 // or after the 8th time 502 503 if (retryCount == 8) { 504 Rlog.e (RILJ_LOG_TAG, 505 "Couldn't find '" + rilSocket 506 + "' socket after " + retryCount 507 + " times, continuing to retry silently"); 508 } else if (retryCount > 0 && retryCount < 8) { 509 Rlog.i (RILJ_LOG_TAG, 510 "Couldn't find '" + rilSocket 511 + "' socket; retrying after timeout"); 512 } 513 514 try { 515 Thread.sleep(SOCKET_OPEN_RETRY_MILLIS); 516 } catch (InterruptedException er) { 517 } 518 519 retryCount++; 520 continue; 521 } 522 523 retryCount = 0; 524 525 mSocket = s; 526 Rlog.i(RILJ_LOG_TAG, "Connected to '" + rilSocket + "' socket"); 527 528 int length = 0; 529 try { 530 InputStream is = mSocket.getInputStream(); 531 532 for (;;) { 533 Parcel p; 534 535 length = readRilMessage(is, buffer); 536 537 if (length < 0) { 538 // End-of-stream reached 539 break; 540 } 541 542 p = Parcel.obtain(); 543 p.unmarshall(buffer, 0, length); 544 p.setDataPosition(0); 545 546 //Rlog.v(RILJ_LOG_TAG, "Read packet: " + length + " bytes"); 547 548 processResponse(p); 549 p.recycle(); 550 } 551 } catch (java.io.IOException ex) { 552 Rlog.i(RILJ_LOG_TAG, "'" + rilSocket + "' socket closed", 553 ex); 554 } catch (Throwable tr) { 555 Rlog.e(RILJ_LOG_TAG, "Uncaught exception read length=" + length + 556 "Exception:" + tr.toString()); 557 } 558 559 Rlog.i(RILJ_LOG_TAG, "Disconnected from '" + rilSocket 560 + "' socket"); 561 562 setRadioState (RadioState.RADIO_UNAVAILABLE); 563 564 try { 565 mSocket.close(); 566 } catch (IOException ex) { 567 } 568 569 mSocket = null; 570 RILRequest.resetSerial(); 571 572 // Clear request list on close 573 clearRequestList(RADIO_NOT_AVAILABLE, false); 574 }} catch (Throwable tr) { 575 Rlog.e(RILJ_LOG_TAG,"Uncaught exception", tr); 576 } 577 578 /* We're disconnected so we don't know the ril version */ 579 notifyRegistrantsRilConnectionChanged(-1); 580 } 581 } 582 583 584 585 //***** Constructors 586 587 public RIL(Context context, int preferredNetworkType, int cdmaSubscription) { 588 this(context, preferredNetworkType, cdmaSubscription, null); 589 } 590 591 public RIL(Context context, int preferredNetworkType, 592 int cdmaSubscription, Integer instanceId) { 593 super(context); 594 if (RILJ_LOGD) { 595 riljLog("RIL(context, preferredNetworkType=" + preferredNetworkType + 596 " cdmaSubscription=" + cdmaSubscription + ")"); 597 } 598 599 mContext = context; 600 mCdmaSubscription = cdmaSubscription; 601 mPreferredNetworkType = preferredNetworkType; 602 mPhoneType = RILConstants.NO_PHONE; 603 mInstanceId = instanceId; 604 605 PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 606 mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, RILJ_LOG_TAG); 607 mWakeLock.setReferenceCounted(false); 608 mWakeLockTimeout = SystemProperties.getInt(TelephonyProperties.PROPERTY_WAKE_LOCK_TIMEOUT, 609 DEFAULT_WAKE_LOCK_TIMEOUT); 610 mWakeLockCount = 0; 611 612 mSenderThread = new HandlerThread("RILSender"); 613 mSenderThread.start(); 614 615 Looper looper = mSenderThread.getLooper(); 616 mSender = new RILSender(looper); 617 618 ConnectivityManager cm = (ConnectivityManager)context.getSystemService( 619 Context.CONNECTIVITY_SERVICE); 620 if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false) { 621 riljLog("Not starting RILReceiver: wifi-only"); 622 } else { 623 riljLog("Starting RILReceiver"); 624 mReceiver = new RILReceiver(); 625 mReceiverThread = new Thread(mReceiver, "RILReceiver"); 626 mReceiverThread.start(); 627 628 IntentFilter filter = new IntentFilter(); 629 filter.addAction(Intent.ACTION_SCREEN_ON); 630 filter.addAction(Intent.ACTION_SCREEN_OFF); 631 context.registerReceiver(mIntentReceiver, filter); 632 } 633 634 TelephonyDevController tdc = TelephonyDevController.getInstance(); 635 tdc.registerRIL(this); 636 } 637 638 //***** CommandsInterface implementation 639 640 @Override 641 public void getVoiceRadioTechnology(Message result) { 642 RILRequest rr = RILRequest.obtain(RIL_REQUEST_VOICE_RADIO_TECH, result); 643 644 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 645 646 send(rr); 647 } 648 649 650 public void getImsRegistrationState(Message result) { 651 RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_REGISTRATION_STATE, result); 652 653 if (RILJ_LOGD) { 654 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 655 } 656 send(rr); 657 } 658 659 @Override public void 660 setOnNITZTime(Handler h, int what, Object obj) { 661 super.setOnNITZTime(h, what, obj); 662 663 // Send the last NITZ time if we have it 664 if (mLastNITZTimeInfo != null) { 665 mNITZTimeRegistrant 666 .notifyRegistrant( 667 new AsyncResult (null, mLastNITZTimeInfo, null)); 668 mLastNITZTimeInfo = null; 669 } 670 } 671 672 @Override 673 public void 674 getIccCardStatus(Message result) { 675 //Note: This RIL request has not been renamed to ICC, 676 // but this request is also valid for SIM and RUIM 677 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SIM_STATUS, result); 678 679 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 680 681 send(rr); 682 } 683 684 public void setUiccSubscription(int slotId, int appIndex, int subId, 685 int subStatus, Message result) { 686 //Note: This RIL request is also valid for SIM and RUIM (ICC card) 687 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_UICC_SUBSCRIPTION, result); 688 689 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 690 + " slot: " + slotId + " appIndex: " + appIndex 691 + " subId: " + subId + " subStatus: " + subStatus); 692 693 rr.mParcel.writeInt(slotId); 694 rr.mParcel.writeInt(appIndex); 695 rr.mParcel.writeInt(subId); 696 rr.mParcel.writeInt(subStatus); 697 698 send(rr); 699 } 700 701 // FIXME This API should take an AID and slot ID 702 public void setDataAllowed(boolean allowed, Message result) { 703 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ALLOW_DATA, result); 704 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 705 706 rr.mParcel.writeInt(1); 707 rr.mParcel.writeInt(allowed ? 1 : 0); 708 send(rr); 709 } 710 711 @Override public void 712 supplyIccPin(String pin, Message result) { 713 supplyIccPinForApp(pin, null, result); 714 } 715 716 @Override public void 717 supplyIccPinForApp(String pin, String aid, Message result) { 718 //Note: This RIL request has not been renamed to ICC, 719 // but this request is also valid for SIM and RUIM 720 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result); 721 722 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 723 724 rr.mParcel.writeInt(2); 725 rr.mParcel.writeString(pin); 726 rr.mParcel.writeString(aid); 727 728 send(rr); 729 } 730 731 @Override public void 732 supplyIccPuk(String puk, String newPin, Message result) { 733 supplyIccPukForApp(puk, newPin, null, result); 734 } 735 736 @Override public void 737 supplyIccPukForApp(String puk, String newPin, String aid, Message result) { 738 //Note: This RIL request has not been renamed to ICC, 739 // but this request is also valid for SIM and RUIM 740 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK, result); 741 742 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 743 744 rr.mParcel.writeInt(3); 745 rr.mParcel.writeString(puk); 746 rr.mParcel.writeString(newPin); 747 rr.mParcel.writeString(aid); 748 749 send(rr); 750 } 751 752 @Override public void 753 supplyIccPin2(String pin, Message result) { 754 supplyIccPin2ForApp(pin, null, result); 755 } 756 757 @Override public void 758 supplyIccPin2ForApp(String pin, String aid, Message result) { 759 //Note: This RIL request has not been renamed to ICC, 760 // but this request is also valid for SIM and RUIM 761 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN2, result); 762 763 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 764 765 rr.mParcel.writeInt(2); 766 rr.mParcel.writeString(pin); 767 rr.mParcel.writeString(aid); 768 769 send(rr); 770 } 771 772 @Override public void 773 supplyIccPuk2(String puk2, String newPin2, Message result) { 774 supplyIccPuk2ForApp(puk2, newPin2, null, result); 775 } 776 777 @Override public void 778 supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) { 779 //Note: This RIL request has not been renamed to ICC, 780 // but this request is also valid for SIM and RUIM 781 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK2, result); 782 783 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 784 785 rr.mParcel.writeInt(3); 786 rr.mParcel.writeString(puk); 787 rr.mParcel.writeString(newPin2); 788 rr.mParcel.writeString(aid); 789 790 send(rr); 791 } 792 793 @Override public void 794 changeIccPin(String oldPin, String newPin, Message result) { 795 changeIccPinForApp(oldPin, newPin, null, result); 796 } 797 798 @Override public void 799 changeIccPinForApp(String oldPin, String newPin, String aid, Message result) { 800 //Note: This RIL request has not been renamed to ICC, 801 // but this request is also valid for SIM and RUIM 802 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN, result); 803 804 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 805 806 rr.mParcel.writeInt(3); 807 rr.mParcel.writeString(oldPin); 808 rr.mParcel.writeString(newPin); 809 rr.mParcel.writeString(aid); 810 811 send(rr); 812 } 813 814 @Override public void 815 changeIccPin2(String oldPin2, String newPin2, Message result) { 816 changeIccPin2ForApp(oldPin2, newPin2, null, result); 817 } 818 819 @Override public void 820 changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) { 821 //Note: This RIL request has not been renamed to ICC, 822 // but this request is also valid for SIM and RUIM 823 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN2, result); 824 825 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 826 827 rr.mParcel.writeInt(3); 828 rr.mParcel.writeString(oldPin2); 829 rr.mParcel.writeString(newPin2); 830 rr.mParcel.writeString(aid); 831 832 send(rr); 833 } 834 835 @Override 836 public void 837 changeBarringPassword(String facility, String oldPwd, String newPwd, Message result) { 838 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_BARRING_PASSWORD, result); 839 840 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 841 842 rr.mParcel.writeInt(3); 843 rr.mParcel.writeString(facility); 844 rr.mParcel.writeString(oldPwd); 845 rr.mParcel.writeString(newPwd); 846 847 send(rr); 848 } 849 850 @Override 851 public void 852 supplyNetworkDepersonalization(String netpin, Message result) { 853 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, result); 854 855 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 856 857 rr.mParcel.writeInt(1); 858 rr.mParcel.writeString(netpin); 859 860 send(rr); 861 } 862 863 @Override 864 public void 865 getCurrentCalls (Message result) { 866 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result); 867 868 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 869 870 send(rr); 871 } 872 873 @Override 874 @Deprecated public void 875 getPDPContextList(Message result) { 876 getDataCallList(result); 877 } 878 879 @Override 880 public void 881 getDataCallList(Message result) { 882 RILRequest rr = RILRequest.obtain(RIL_REQUEST_DATA_CALL_LIST, result); 883 884 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 885 886 send(rr); 887 } 888 889 @Override 890 public void 891 dial (String address, int clirMode, Message result) { 892 dial(address, clirMode, null, result); 893 } 894 895 @Override 896 public void 897 dial(String address, int clirMode, UUSInfo uusInfo, Message result) { 898 RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); 899 900 rr.mParcel.writeString(address); 901 rr.mParcel.writeInt(clirMode); 902 903 if (uusInfo == null) { 904 rr.mParcel.writeInt(0); // UUS information is absent 905 } else { 906 rr.mParcel.writeInt(1); // UUS information is present 907 rr.mParcel.writeInt(uusInfo.getType()); 908 rr.mParcel.writeInt(uusInfo.getDcs()); 909 rr.mParcel.writeByteArray(uusInfo.getUserData()); 910 } 911 912 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 913 914 send(rr); 915 } 916 917 @Override 918 public void 919 getIMSI(Message result) { 920 getIMSIForApp(null, result); 921 } 922 923 @Override 924 public void 925 getIMSIForApp(String aid, Message result) { 926 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMSI, result); 927 928 rr.mParcel.writeInt(1); 929 rr.mParcel.writeString(aid); 930 931 if (RILJ_LOGD) riljLog(rr.serialString() + 932 "> getIMSI: " + requestToString(rr.mRequest) 933 + " aid: " + aid); 934 935 send(rr); 936 } 937 938 @Override 939 public void 940 getIMEI(Message result) { 941 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMEI, result); 942 943 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 944 945 send(rr); 946 } 947 948 @Override 949 public void 950 getIMEISV(Message result) { 951 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMEISV, result); 952 953 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 954 955 send(rr); 956 } 957 958 959 @Override 960 public void 961 hangupConnection (int gsmIndex, Message result) { 962 if (RILJ_LOGD) riljLog("hangupConnection: gsmIndex=" + gsmIndex); 963 964 RILRequest rr = RILRequest.obtain(RIL_REQUEST_HANGUP, result); 965 966 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " + 967 gsmIndex); 968 969 rr.mParcel.writeInt(1); 970 rr.mParcel.writeInt(gsmIndex); 971 972 send(rr); 973 } 974 975 @Override 976 public void 977 hangupWaitingOrBackground (Message result) { 978 RILRequest rr = RILRequest.obtain(RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, 979 result); 980 981 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 982 983 send(rr); 984 } 985 986 @Override 987 public void 988 hangupForegroundResumeBackground (Message result) { 989 RILRequest rr 990 = RILRequest.obtain( 991 RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, 992 result); 993 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 994 995 send(rr); 996 } 997 998 @Override 999 public void 1000 switchWaitingOrHoldingAndActive (Message result) { 1001 RILRequest rr 1002 = RILRequest.obtain( 1003 RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, 1004 result); 1005 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1006 1007 send(rr); 1008 } 1009 1010 @Override 1011 public void 1012 conference (Message result) { 1013 RILRequest rr 1014 = RILRequest.obtain(RIL_REQUEST_CONFERENCE, result); 1015 1016 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1017 1018 send(rr); 1019 } 1020 1021 1022 @Override 1023 public void setPreferredVoicePrivacy(boolean enable, Message result) { 1024 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE, 1025 result); 1026 1027 rr.mParcel.writeInt(1); 1028 rr.mParcel.writeInt(enable ? 1:0); 1029 1030 send(rr); 1031 } 1032 1033 @Override 1034 public void getPreferredVoicePrivacy(Message result) { 1035 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE, 1036 result); 1037 send(rr); 1038 } 1039 1040 @Override 1041 public void 1042 separateConnection (int gsmIndex, Message result) { 1043 RILRequest rr 1044 = RILRequest.obtain(RIL_REQUEST_SEPARATE_CONNECTION, result); 1045 1046 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1047 + " " + gsmIndex); 1048 1049 rr.mParcel.writeInt(1); 1050 rr.mParcel.writeInt(gsmIndex); 1051 1052 send(rr); 1053 } 1054 1055 @Override 1056 public void 1057 acceptCall (Message result) { 1058 RILRequest rr 1059 = RILRequest.obtain(RIL_REQUEST_ANSWER, result); 1060 1061 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1062 1063 send(rr); 1064 } 1065 1066 @Override 1067 public void 1068 rejectCall (Message result) { 1069 RILRequest rr 1070 = RILRequest.obtain(RIL_REQUEST_UDUB, result); 1071 1072 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1073 1074 send(rr); 1075 } 1076 1077 @Override 1078 public void 1079 explicitCallTransfer (Message result) { 1080 RILRequest rr 1081 = RILRequest.obtain(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, result); 1082 1083 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1084 1085 send(rr); 1086 } 1087 1088 @Override 1089 public void 1090 getLastCallFailCause (Message result) { 1091 RILRequest rr 1092 = RILRequest.obtain(RIL_REQUEST_LAST_CALL_FAIL_CAUSE, result); 1093 1094 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1095 1096 send(rr); 1097 } 1098 1099 /** 1100 * @deprecated 1101 */ 1102 @Deprecated 1103 @Override 1104 public void 1105 getLastPdpFailCause (Message result) { 1106 getLastDataCallFailCause (result); 1107 } 1108 1109 /** 1110 * The preferred new alternative to getLastPdpFailCause 1111 */ 1112 @Override 1113 public void 1114 getLastDataCallFailCause (Message result) { 1115 RILRequest rr 1116 = RILRequest.obtain(RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE, result); 1117 1118 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1119 1120 send(rr); 1121 } 1122 1123 @Override 1124 public void 1125 setMute (boolean enableMute, Message response) { 1126 RILRequest rr 1127 = RILRequest.obtain(RIL_REQUEST_SET_MUTE, response); 1128 1129 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1130 + " " + enableMute); 1131 1132 rr.mParcel.writeInt(1); 1133 rr.mParcel.writeInt(enableMute ? 1 : 0); 1134 1135 send(rr); 1136 } 1137 1138 @Override 1139 public void 1140 getMute (Message response) { 1141 RILRequest rr 1142 = RILRequest.obtain(RIL_REQUEST_GET_MUTE, response); 1143 1144 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1145 1146 send(rr); 1147 } 1148 1149 @Override 1150 public void 1151 getSignalStrength (Message result) { 1152 RILRequest rr 1153 = RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result); 1154 1155 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1156 1157 send(rr); 1158 } 1159 1160 @Override 1161 public void 1162 getVoiceRegistrationState (Message result) { 1163 RILRequest rr 1164 = RILRequest.obtain(RIL_REQUEST_VOICE_REGISTRATION_STATE, result); 1165 1166 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1167 1168 send(rr); 1169 } 1170 1171 @Override 1172 public void 1173 getDataRegistrationState (Message result) { 1174 RILRequest rr 1175 = RILRequest.obtain(RIL_REQUEST_DATA_REGISTRATION_STATE, result); 1176 1177 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1178 1179 send(rr); 1180 } 1181 1182 @Override 1183 public void 1184 getOperator(Message result) { 1185 RILRequest rr 1186 = RILRequest.obtain(RIL_REQUEST_OPERATOR, result); 1187 1188 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1189 1190 send(rr); 1191 } 1192 1193 @Override 1194 public void 1195 getHardwareConfig (Message result) { 1196 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_HARDWARE_CONFIG, result); 1197 1198 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1199 1200 send(rr); 1201 } 1202 1203 @Override 1204 public void 1205 sendDtmf(char c, Message result) { 1206 RILRequest rr 1207 = RILRequest.obtain(RIL_REQUEST_DTMF, result); 1208 1209 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1210 1211 rr.mParcel.writeString(Character.toString(c)); 1212 1213 send(rr); 1214 } 1215 1216 @Override 1217 public void 1218 startDtmf(char c, Message result) { 1219 RILRequest rr 1220 = RILRequest.obtain(RIL_REQUEST_DTMF_START, result); 1221 1222 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1223 1224 rr.mParcel.writeString(Character.toString(c)); 1225 1226 send(rr); 1227 } 1228 1229 @Override 1230 public void 1231 stopDtmf(Message result) { 1232 RILRequest rr 1233 = RILRequest.obtain(RIL_REQUEST_DTMF_STOP, result); 1234 1235 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1236 1237 send(rr); 1238 } 1239 1240 @Override 1241 public void 1242 sendBurstDtmf(String dtmfString, int on, int off, Message result) { 1243 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_BURST_DTMF, result); 1244 1245 rr.mParcel.writeInt(3); 1246 rr.mParcel.writeString(dtmfString); 1247 rr.mParcel.writeString(Integer.toString(on)); 1248 rr.mParcel.writeString(Integer.toString(off)); 1249 1250 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1251 + " : " + dtmfString); 1252 1253 send(rr); 1254 } 1255 1256 private void 1257 constructGsmSendSmsRilRequest (RILRequest rr, String smscPDU, String pdu) { 1258 rr.mParcel.writeInt(2); 1259 rr.mParcel.writeString(smscPDU); 1260 rr.mParcel.writeString(pdu); 1261 } 1262 1263 public void 1264 sendSMS (String smscPDU, String pdu, Message result) { 1265 RILRequest rr 1266 = RILRequest.obtain(RIL_REQUEST_SEND_SMS, result); 1267 1268 constructGsmSendSmsRilRequest(rr, smscPDU, pdu); 1269 1270 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1271 1272 send(rr); 1273 } 1274 1275 @Override 1276 public void 1277 sendSMSExpectMore (String smscPDU, String pdu, Message result) { 1278 RILRequest rr 1279 = RILRequest.obtain(RIL_REQUEST_SEND_SMS_EXPECT_MORE, result); 1280 1281 constructGsmSendSmsRilRequest(rr, smscPDU, pdu); 1282 1283 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1284 1285 send(rr); 1286 } 1287 1288 private void 1289 constructCdmaSendSmsRilRequest(RILRequest rr, byte[] pdu) { 1290 int address_nbr_of_digits; 1291 int subaddr_nbr_of_digits; 1292 int bearerDataLength; 1293 ByteArrayInputStream bais = new ByteArrayInputStream(pdu); 1294 DataInputStream dis = new DataInputStream(bais); 1295 1296 try { 1297 rr.mParcel.writeInt(dis.readInt()); //teleServiceId 1298 rr.mParcel.writeByte((byte) dis.readInt()); //servicePresent 1299 rr.mParcel.writeInt(dis.readInt()); //serviceCategory 1300 rr.mParcel.writeInt(dis.read()); //address_digit_mode 1301 rr.mParcel.writeInt(dis.read()); //address_nbr_mode 1302 rr.mParcel.writeInt(dis.read()); //address_ton 1303 rr.mParcel.writeInt(dis.read()); //address_nbr_plan 1304 address_nbr_of_digits = (byte) dis.read(); 1305 rr.mParcel.writeByte((byte) address_nbr_of_digits); 1306 for(int i=0; i < address_nbr_of_digits; i++){ 1307 rr.mParcel.writeByte(dis.readByte()); // address_orig_bytes[i] 1308 } 1309 rr.mParcel.writeInt(dis.read()); //subaddressType 1310 rr.mParcel.writeByte((byte) dis.read()); //subaddr_odd 1311 subaddr_nbr_of_digits = (byte) dis.read(); 1312 rr.mParcel.writeByte((byte) subaddr_nbr_of_digits); 1313 for(int i=0; i < subaddr_nbr_of_digits; i++){ 1314 rr.mParcel.writeByte(dis.readByte()); //subaddr_orig_bytes[i] 1315 } 1316 1317 bearerDataLength = dis.read(); 1318 rr.mParcel.writeInt(bearerDataLength); 1319 for(int i=0; i < bearerDataLength; i++){ 1320 rr.mParcel.writeByte(dis.readByte()); //bearerData[i] 1321 } 1322 }catch (IOException ex){ 1323 if (RILJ_LOGD) riljLog("sendSmsCdma: conversion from input stream to object failed: " 1324 + ex); 1325 } 1326 } 1327 1328 public void 1329 sendCdmaSms(byte[] pdu, Message result) { 1330 RILRequest rr 1331 = RILRequest.obtain(RIL_REQUEST_CDMA_SEND_SMS, result); 1332 1333 constructCdmaSendSmsRilRequest(rr, pdu); 1334 1335 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1336 1337 send(rr); 1338 } 1339 1340 public void 1341 sendImsGsmSms (String smscPDU, String pdu, int retry, int messageRef, 1342 Message result) { 1343 RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_SEND_SMS, result); 1344 1345 rr.mParcel.writeInt(RILConstants.GSM_PHONE); 1346 rr.mParcel.writeByte((byte)retry); 1347 rr.mParcel.writeInt(messageRef); 1348 1349 constructGsmSendSmsRilRequest(rr, smscPDU, pdu); 1350 1351 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1352 1353 send(rr); 1354 } 1355 1356 public void 1357 sendImsCdmaSms(byte[] pdu, int retry, int messageRef, Message result) { 1358 RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_SEND_SMS, result); 1359 1360 rr.mParcel.writeInt(RILConstants.CDMA_PHONE); 1361 rr.mParcel.writeByte((byte)retry); 1362 rr.mParcel.writeInt(messageRef); 1363 1364 constructCdmaSendSmsRilRequest(rr, pdu); 1365 1366 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1367 1368 send(rr); 1369 } 1370 1371 @Override 1372 public void deleteSmsOnSim(int index, Message response) { 1373 RILRequest rr = RILRequest.obtain(RIL_REQUEST_DELETE_SMS_ON_SIM, 1374 response); 1375 1376 rr.mParcel.writeInt(1); 1377 rr.mParcel.writeInt(index); 1378 1379 if (RILJ_LOGV) riljLog(rr.serialString() + "> " 1380 + requestToString(rr.mRequest) 1381 + " " + index); 1382 1383 send(rr); 1384 } 1385 1386 @Override 1387 public void deleteSmsOnRuim(int index, Message response) { 1388 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1389 response); 1390 1391 rr.mParcel.writeInt(1); 1392 rr.mParcel.writeInt(index); 1393 1394 if (RILJ_LOGV) riljLog(rr.serialString() + "> " 1395 + requestToString(rr.mRequest) 1396 + " " + index); 1397 1398 send(rr); 1399 } 1400 1401 @Override 1402 public void writeSmsToSim(int status, String smsc, String pdu, Message response) { 1403 status = translateStatus(status); 1404 1405 RILRequest rr = RILRequest.obtain(RIL_REQUEST_WRITE_SMS_TO_SIM, 1406 response); 1407 1408 rr.mParcel.writeInt(status); 1409 rr.mParcel.writeString(pdu); 1410 rr.mParcel.writeString(smsc); 1411 1412 if (RILJ_LOGV) riljLog(rr.serialString() + "> " 1413 + requestToString(rr.mRequest) 1414 + " " + status); 1415 1416 send(rr); 1417 } 1418 1419 @Override 1420 public void writeSmsToRuim(int status, String pdu, Message response) { 1421 status = translateStatus(status); 1422 1423 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM, 1424 response); 1425 1426 rr.mParcel.writeInt(status); 1427 rr.mParcel.writeString(pdu); 1428 1429 if (RILJ_LOGV) riljLog(rr.serialString() + "> " 1430 + requestToString(rr.mRequest) 1431 + " " + status); 1432 1433 send(rr); 1434 } 1435 1436 /** 1437 * Translates EF_SMS status bits to a status value compatible with 1438 * SMS AT commands. See TS 27.005 3.1. 1439 */ 1440 private int translateStatus(int status) { 1441 switch(status & 0x7) { 1442 case SmsManager.STATUS_ON_ICC_READ: 1443 return 1; 1444 case SmsManager.STATUS_ON_ICC_UNREAD: 1445 return 0; 1446 case SmsManager.STATUS_ON_ICC_SENT: 1447 return 3; 1448 case SmsManager.STATUS_ON_ICC_UNSENT: 1449 return 2; 1450 } 1451 1452 // Default to READ. 1453 return 1; 1454 } 1455 1456 @Override 1457 public void 1458 setupDataCall(String radioTechnology, String profile, String apn, 1459 String user, String password, String authType, String protocol, 1460 Message result) { 1461 RILRequest rr 1462 = RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result); 1463 1464 rr.mParcel.writeInt(7); 1465 1466 rr.mParcel.writeString(radioTechnology); 1467 rr.mParcel.writeString(profile); 1468 rr.mParcel.writeString(apn); 1469 rr.mParcel.writeString(user); 1470 rr.mParcel.writeString(password); 1471 rr.mParcel.writeString(authType); 1472 rr.mParcel.writeString(protocol); 1473 1474 if (RILJ_LOGD) riljLog(rr.serialString() + "> " 1475 + requestToString(rr.mRequest) + " " + radioTechnology + " " 1476 + profile + " " + apn + " " + user + " " 1477 + password + " " + authType + " " + protocol); 1478 1479 send(rr); 1480 } 1481 1482 @Override 1483 public void 1484 deactivateDataCall(int cid, int reason, Message result) { 1485 RILRequest rr 1486 = RILRequest.obtain(RIL_REQUEST_DEACTIVATE_DATA_CALL, result); 1487 1488 rr.mParcel.writeInt(2); 1489 rr.mParcel.writeString(Integer.toString(cid)); 1490 rr.mParcel.writeString(Integer.toString(reason)); 1491 1492 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + 1493 requestToString(rr.mRequest) + " " + cid + " " + reason); 1494 1495 send(rr); 1496 } 1497 1498 @Override 1499 public void 1500 setRadioPower(boolean on, Message result) { 1501 RILRequest rr = RILRequest.obtain(RIL_REQUEST_RADIO_POWER, result); 1502 1503 rr.mParcel.writeInt(1); 1504 rr.mParcel.writeInt(on ? 1 : 0); 1505 1506 if (RILJ_LOGD) { 1507 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1508 + (on ? " on" : " off")); 1509 } 1510 1511 send(rr); 1512 } 1513 1514 @Override 1515 public void requestShutdown(Message result) { 1516 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SHUTDOWN, result); 1517 1518 if (RILJ_LOGD) 1519 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1520 1521 send(rr); 1522 } 1523 1524 @Override 1525 public void 1526 setSuppServiceNotifications(boolean enable, Message result) { 1527 RILRequest rr 1528 = RILRequest.obtain(RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, result); 1529 1530 rr.mParcel.writeInt(1); 1531 rr.mParcel.writeInt(enable ? 1 : 0); 1532 1533 if (RILJ_LOGD) riljLog(rr.serialString() + "> " 1534 + requestToString(rr.mRequest)); 1535 1536 send(rr); 1537 } 1538 1539 @Override 1540 public void 1541 acknowledgeLastIncomingGsmSms(boolean success, int cause, Message result) { 1542 RILRequest rr 1543 = RILRequest.obtain(RIL_REQUEST_SMS_ACKNOWLEDGE, result); 1544 1545 rr.mParcel.writeInt(2); 1546 rr.mParcel.writeInt(success ? 1 : 0); 1547 rr.mParcel.writeInt(cause); 1548 1549 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1550 + " " + success + " " + cause); 1551 1552 send(rr); 1553 } 1554 1555 @Override 1556 public void 1557 acknowledgeLastIncomingCdmaSms(boolean success, int cause, Message result) { 1558 RILRequest rr 1559 = RILRequest.obtain(RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE, result); 1560 1561 rr.mParcel.writeInt(success ? 0 : 1); //RIL_CDMA_SMS_ErrorClass 1562 // cause code according to X.S004-550E 1563 rr.mParcel.writeInt(cause); 1564 1565 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1566 + " " + success + " " + cause); 1567 1568 send(rr); 1569 } 1570 1571 @Override 1572 public void 1573 acknowledgeIncomingGsmSmsWithPdu(boolean success, String ackPdu, Message result) { 1574 RILRequest rr 1575 = RILRequest.obtain(RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, result); 1576 1577 rr.mParcel.writeInt(2); 1578 rr.mParcel.writeString(success ? "1" : "0"); 1579 rr.mParcel.writeString(ackPdu); 1580 1581 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1582 + ' ' + success + " [" + ackPdu + ']'); 1583 1584 send(rr); 1585 } 1586 1587 @Override 1588 public void 1589 iccIO (int command, int fileid, String path, int p1, int p2, int p3, 1590 String data, String pin2, Message result) { 1591 iccIOForApp(command, fileid, path, p1, p2, p3, data, pin2, null, result); 1592 } 1593 @Override 1594 public void 1595 iccIOForApp (int command, int fileid, String path, int p1, int p2, int p3, 1596 String data, String pin2, String aid, Message result) { 1597 //Note: This RIL request has not been renamed to ICC, 1598 // but this request is also valid for SIM and RUIM 1599 RILRequest rr 1600 = RILRequest.obtain(RIL_REQUEST_SIM_IO, result); 1601 1602 rr.mParcel.writeInt(command); 1603 rr.mParcel.writeInt(fileid); 1604 rr.mParcel.writeString(path); 1605 rr.mParcel.writeInt(p1); 1606 rr.mParcel.writeInt(p2); 1607 rr.mParcel.writeInt(p3); 1608 rr.mParcel.writeString(data); 1609 rr.mParcel.writeString(pin2); 1610 rr.mParcel.writeString(aid); 1611 1612 if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: " 1613 + requestToString(rr.mRequest) 1614 + " 0x" + Integer.toHexString(command) 1615 + " 0x" + Integer.toHexString(fileid) + " " 1616 + " path: " + path + "," 1617 + p1 + "," + p2 + "," + p3 1618 + " aid: " + aid); 1619 1620 send(rr); 1621 } 1622 1623 @Override 1624 public void 1625 getCLIR(Message result) { 1626 RILRequest rr 1627 = RILRequest.obtain(RIL_REQUEST_GET_CLIR, result); 1628 1629 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1630 1631 send(rr); 1632 } 1633 1634 @Override 1635 public void 1636 setCLIR(int clirMode, Message result) { 1637 RILRequest rr 1638 = RILRequest.obtain(RIL_REQUEST_SET_CLIR, result); 1639 1640 // count ints 1641 rr.mParcel.writeInt(1); 1642 1643 rr.mParcel.writeInt(clirMode); 1644 1645 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1646 + " " + clirMode); 1647 1648 send(rr); 1649 } 1650 1651 @Override 1652 public void 1653 queryCallWaiting(int serviceClass, Message response) { 1654 RILRequest rr 1655 = RILRequest.obtain(RIL_REQUEST_QUERY_CALL_WAITING, response); 1656 1657 rr.mParcel.writeInt(1); 1658 rr.mParcel.writeInt(serviceClass); 1659 1660 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1661 + " " + serviceClass); 1662 1663 send(rr); 1664 } 1665 1666 @Override 1667 public void 1668 setCallWaiting(boolean enable, int serviceClass, Message response) { 1669 RILRequest rr 1670 = RILRequest.obtain(RIL_REQUEST_SET_CALL_WAITING, response); 1671 1672 rr.mParcel.writeInt(2); 1673 rr.mParcel.writeInt(enable ? 1 : 0); 1674 rr.mParcel.writeInt(serviceClass); 1675 1676 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1677 + " " + enable + ", " + serviceClass); 1678 1679 send(rr); 1680 } 1681 1682 @Override 1683 public void 1684 setNetworkSelectionModeAutomatic(Message response) { 1685 RILRequest rr 1686 = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, 1687 response); 1688 1689 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1690 1691 send(rr); 1692 } 1693 1694 @Override 1695 public void 1696 setNetworkSelectionModeManual(String operatorNumeric, Message response) { 1697 RILRequest rr 1698 = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, 1699 response); 1700 1701 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1702 + " " + operatorNumeric); 1703 1704 rr.mParcel.writeString(operatorNumeric); 1705 1706 send(rr); 1707 } 1708 1709 @Override 1710 public void 1711 getNetworkSelectionMode(Message response) { 1712 RILRequest rr 1713 = RILRequest.obtain(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, 1714 response); 1715 1716 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1717 1718 send(rr); 1719 } 1720 1721 @Override 1722 public void 1723 getAvailableNetworks(Message response) { 1724 RILRequest rr 1725 = RILRequest.obtain(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS, 1726 response); 1727 1728 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1729 1730 send(rr); 1731 } 1732 1733 @Override 1734 public void 1735 setCallForward(int action, int cfReason, int serviceClass, 1736 String number, int timeSeconds, Message response) { 1737 RILRequest rr 1738 = RILRequest.obtain(RIL_REQUEST_SET_CALL_FORWARD, response); 1739 1740 rr.mParcel.writeInt(action); 1741 rr.mParcel.writeInt(cfReason); 1742 rr.mParcel.writeInt(serviceClass); 1743 rr.mParcel.writeInt(PhoneNumberUtils.toaFromString(number)); 1744 rr.mParcel.writeString(number); 1745 rr.mParcel.writeInt (timeSeconds); 1746 1747 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1748 + " " + action + " " + cfReason + " " + serviceClass 1749 + timeSeconds); 1750 1751 send(rr); 1752 } 1753 1754 @Override 1755 public void 1756 queryCallForwardStatus(int cfReason, int serviceClass, 1757 String number, Message response) { 1758 RILRequest rr 1759 = RILRequest.obtain(RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, response); 1760 1761 rr.mParcel.writeInt(2); // 2 is for query action, not in used anyway 1762 rr.mParcel.writeInt(cfReason); 1763 rr.mParcel.writeInt(serviceClass); 1764 rr.mParcel.writeInt(PhoneNumberUtils.toaFromString(number)); 1765 rr.mParcel.writeString(number); 1766 rr.mParcel.writeInt (0); 1767 1768 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1769 + " " + cfReason + " " + serviceClass); 1770 1771 send(rr); 1772 } 1773 1774 @Override 1775 public void 1776 queryCLIP(Message response) { 1777 RILRequest rr 1778 = RILRequest.obtain(RIL_REQUEST_QUERY_CLIP, response); 1779 1780 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1781 1782 send(rr); 1783 } 1784 1785 1786 @Override 1787 public void 1788 getBasebandVersion (Message response) { 1789 RILRequest rr 1790 = RILRequest.obtain(RIL_REQUEST_BASEBAND_VERSION, response); 1791 1792 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1793 1794 send(rr); 1795 } 1796 1797 @Override 1798 public void 1799 queryFacilityLock(String facility, String password, int serviceClass, 1800 Message response) { 1801 queryFacilityLockForApp(facility, password, serviceClass, null, response); 1802 } 1803 1804 @Override 1805 public void 1806 queryFacilityLockForApp(String facility, String password, int serviceClass, String appId, 1807 Message response) { 1808 RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_FACILITY_LOCK, response); 1809 1810 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1811 + " [" + facility + " " + serviceClass 1812 + " " + appId + "]"); 1813 1814 // count strings 1815 rr.mParcel.writeInt(4); 1816 1817 rr.mParcel.writeString(facility); 1818 rr.mParcel.writeString(password); 1819 1820 rr.mParcel.writeString(Integer.toString(serviceClass)); 1821 rr.mParcel.writeString(appId); 1822 1823 send(rr); 1824 } 1825 1826 @Override 1827 public void 1828 setFacilityLock (String facility, boolean lockState, String password, 1829 int serviceClass, Message response) { 1830 setFacilityLockForApp(facility, lockState, password, serviceClass, null, response); 1831 } 1832 1833 @Override 1834 public void 1835 setFacilityLockForApp(String facility, boolean lockState, String password, 1836 int serviceClass, String appId, Message response) { 1837 String lockString; 1838 RILRequest rr 1839 = RILRequest.obtain(RIL_REQUEST_SET_FACILITY_LOCK, response); 1840 1841 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1842 + " [" + facility + " " + lockState 1843 + " " + serviceClass + " " + appId + "]"); 1844 1845 // count strings 1846 rr.mParcel.writeInt(5); 1847 1848 rr.mParcel.writeString(facility); 1849 lockString = (lockState)?"1":"0"; 1850 rr.mParcel.writeString(lockString); 1851 rr.mParcel.writeString(password); 1852 rr.mParcel.writeString(Integer.toString(serviceClass)); 1853 rr.mParcel.writeString(appId); 1854 1855 send(rr); 1856 1857 } 1858 1859 @Override 1860 public void 1861 sendUSSD (String ussdString, Message response) { 1862 RILRequest rr 1863 = RILRequest.obtain(RIL_REQUEST_SEND_USSD, response); 1864 1865 if (RILJ_LOGD) { 1866 String logUssdString = "*******"; 1867 if (RILJ_LOGV) logUssdString = ussdString; 1868 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1869 + " " + logUssdString); 1870 } 1871 1872 rr.mParcel.writeString(ussdString); 1873 1874 send(rr); 1875 } 1876 1877 // inherited javadoc suffices 1878 @Override 1879 public void cancelPendingUssd (Message response) { 1880 RILRequest rr 1881 = RILRequest.obtain(RIL_REQUEST_CANCEL_USSD, response); 1882 1883 if (RILJ_LOGD) riljLog(rr.serialString() 1884 + "> " + requestToString(rr.mRequest)); 1885 1886 send(rr); 1887 } 1888 1889 1890 @Override 1891 public void resetRadio(Message result) { 1892 RILRequest rr 1893 = RILRequest.obtain(RIL_REQUEST_RESET_RADIO, result); 1894 1895 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1896 1897 send(rr); 1898 } 1899 1900 @Override 1901 public void invokeOemRilRequestRaw(byte[] data, Message response) { 1902 RILRequest rr 1903 = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_RAW, response); 1904 1905 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1906 + "[" + IccUtils.bytesToHexString(data) + "]"); 1907 1908 rr.mParcel.writeByteArray(data); 1909 1910 send(rr); 1911 1912 } 1913 1914 @Override 1915 public void invokeOemRilRequestStrings(String[] strings, Message response) { 1916 RILRequest rr 1917 = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_STRINGS, response); 1918 1919 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1920 1921 rr.mParcel.writeStringArray(strings); 1922 1923 send(rr); 1924 } 1925 1926 /** 1927 * Assign a specified band for RF configuration. 1928 * 1929 * @param bandMode one of BM_*_BAND 1930 * @param response is callback message 1931 */ 1932 @Override 1933 public void setBandMode (int bandMode, Message response) { 1934 RILRequest rr 1935 = RILRequest.obtain(RIL_REQUEST_SET_BAND_MODE, response); 1936 1937 rr.mParcel.writeInt(1); 1938 rr.mParcel.writeInt(bandMode); 1939 1940 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 1941 + " " + bandMode); 1942 1943 send(rr); 1944 } 1945 1946 /** 1947 * Query the list of band mode supported by RF. 1948 * 1949 * @param response is callback message 1950 * ((AsyncResult)response.obj).result is an int[] where int[0] is 1951 * the size of the array and the rest of each element representing 1952 * one available BM_*_BAND 1953 */ 1954 @Override 1955 public void queryAvailableBandMode (Message response) { 1956 RILRequest rr 1957 = RILRequest.obtain(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE, 1958 response); 1959 1960 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1961 1962 send(rr); 1963 } 1964 1965 /** 1966 * {@inheritDoc} 1967 */ 1968 @Override 1969 public void sendTerminalResponse(String contents, Message response) { 1970 RILRequest rr = RILRequest.obtain( 1971 RILConstants.RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, response); 1972 1973 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1974 1975 rr.mParcel.writeString(contents); 1976 send(rr); 1977 } 1978 1979 /** 1980 * {@inheritDoc} 1981 */ 1982 @Override 1983 public void sendEnvelope(String contents, Message response) { 1984 RILRequest rr = RILRequest.obtain( 1985 RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, response); 1986 1987 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1988 1989 rr.mParcel.writeString(contents); 1990 send(rr); 1991 } 1992 1993 /** 1994 * {@inheritDoc} 1995 */ 1996 @Override 1997 public void sendEnvelopeWithStatus(String contents, Message response) { 1998 RILRequest rr = RILRequest.obtain( 1999 RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, response); 2000 2001 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 2002 + '[' + contents + ']'); 2003 2004 rr.mParcel.writeString(contents); 2005 send(rr); 2006 } 2007 2008 /** 2009 * {@inheritDoc} 2010 */ 2011 @Override 2012 public void handleCallSetupRequestFromSim( 2013 boolean accept, Message response) { 2014 2015 RILRequest rr = RILRequest.obtain( 2016 RILConstants.RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, 2017 response); 2018 2019 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2020 2021 int[] param = new int[1]; 2022 param[0] = accept ? 1 : 0; 2023 rr.mParcel.writeIntArray(param); 2024 send(rr); 2025 } 2026 2027 /** 2028 * {@inheritDoc} 2029 */ 2030 @Override 2031 public void setPreferredNetworkType(int networkType , Message response) { 2032 RILRequest rr = RILRequest.obtain( 2033 RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response); 2034 2035 rr.mParcel.writeInt(1); 2036 rr.mParcel.writeInt(networkType); 2037 2038 mPreferredNetworkType = networkType; 2039 2040 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 2041 + " : " + networkType); 2042 2043 send(rr); 2044 } 2045 2046 /** 2047 * {@inheritDoc} 2048 */ 2049 @Override 2050 public void getPreferredNetworkType(Message response) { 2051 RILRequest rr = RILRequest.obtain( 2052 RILConstants.RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, response); 2053 2054 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2055 2056 send(rr); 2057 } 2058 2059 /** 2060 * {@inheritDoc} 2061 */ 2062 @Override 2063 public void getNeighboringCids(Message response) { 2064 RILRequest rr = RILRequest.obtain( 2065 RILConstants.RIL_REQUEST_GET_NEIGHBORING_CELL_IDS, response); 2066 2067 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2068 2069 send(rr); 2070 } 2071 2072 /** 2073 * {@inheritDoc} 2074 */ 2075 @Override 2076 public void setLocationUpdates(boolean enable, Message response) { 2077 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_LOCATION_UPDATES, response); 2078 rr.mParcel.writeInt(1); 2079 rr.mParcel.writeInt(enable ? 1 : 0); 2080 2081 if (RILJ_LOGD) riljLog(rr.serialString() + "> " 2082 + requestToString(rr.mRequest) + ": " + enable); 2083 2084 send(rr); 2085 } 2086 2087 /** 2088 * {@inheritDoc} 2089 */ 2090 @Override 2091 public void getSmscAddress(Message result) { 2092 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SMSC_ADDRESS, result); 2093 2094 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2095 2096 send(rr); 2097 } 2098 2099 /** 2100 * {@inheritDoc} 2101 */ 2102 @Override 2103 public void setSmscAddress(String address, Message result) { 2104 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_SMSC_ADDRESS, result); 2105 2106 rr.mParcel.writeString(address); 2107 2108 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 2109 + " : " + address); 2110 2111 send(rr); 2112 } 2113 2114 /** 2115 * {@inheritDoc} 2116 */ 2117 @Override 2118 public void reportSmsMemoryStatus(boolean available, Message result) { 2119 RILRequest rr = RILRequest.obtain(RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, result); 2120 rr.mParcel.writeInt(1); 2121 rr.mParcel.writeInt(available ? 1 : 0); 2122 2123 if (RILJ_LOGD) riljLog(rr.serialString() + "> " 2124 + requestToString(rr.mRequest) + ": " + available); 2125 2126 send(rr); 2127 } 2128 2129 /** 2130 * {@inheritDoc} 2131 */ 2132 @Override 2133 public void reportStkServiceIsRunning(Message result) { 2134 RILRequest rr = RILRequest.obtain(RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, result); 2135 2136 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2137 2138 send(rr); 2139 } 2140 2141 /** 2142 * {@inheritDoc} 2143 */ 2144 @Override 2145 public void getGsmBroadcastConfig(Message response) { 2146 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_GET_BROADCAST_CONFIG, response); 2147 2148 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2149 2150 send(rr); 2151 } 2152 2153 /** 2154 * {@inheritDoc} 2155 */ 2156 @Override 2157 public void setGsmBroadcastConfig(SmsBroadcastConfigInfo[] config, Message response) { 2158 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_SET_BROADCAST_CONFIG, response); 2159 2160 int numOfConfig = config.length; 2161 rr.mParcel.writeInt(numOfConfig); 2162 2163 for(int i = 0; i < numOfConfig; i++) { 2164 rr.mParcel.writeInt(config[i].getFromServiceId()); 2165 rr.mParcel.writeInt(config[i].getToServiceId()); 2166 rr.mParcel.writeInt(config[i].getFromCodeScheme()); 2167 rr.mParcel.writeInt(config[i].getToCodeScheme()); 2168 rr.mParcel.writeInt(config[i].isSelected() ? 1 : 0); 2169 } 2170 2171 if (RILJ_LOGD) { 2172 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 2173 + " with " + numOfConfig + " configs : "); 2174 for (int i = 0; i < numOfConfig; i++) { 2175 riljLog(config[i].toString()); 2176 } 2177 } 2178 2179 send(rr); 2180 } 2181 2182 /** 2183 * {@inheritDoc} 2184 */ 2185 @Override 2186 public void setGsmBroadcastActivation(boolean activate, Message response) { 2187 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_BROADCAST_ACTIVATION, response); 2188 2189 rr.mParcel.writeInt(1); 2190 rr.mParcel.writeInt(activate ? 0 : 1); 2191 2192 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 2193 2194 send(rr); 2195 } 2196 2197 //***** Private Methods 2198 2199 private void sendScreenState(boolean on) { 2200 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SCREEN_STATE, null); 2201 rr.mParcel.writeInt(1); 2202 rr.mParcel.writeInt(on ? 1 : 0); 2203 2204 if (RILJ_LOGD) riljLog(rr.serialString() 2205 + "> " + requestToString(rr.mRequest) + ": " + on); 2206 2207 send(rr); 2208 } 2209 2210 @Override 2211 protected void 2212 onRadioAvailable() { 2213 // In case screen state was lost (due to process crash), 2214 // this ensures that the RIL knows the correct screen state. 2215 2216 PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); 2217 sendScreenState(pm.isScreenOn()); 2218 } 2219 2220 private RadioState getRadioStateFromInt(int stateInt) { 2221 RadioState state; 2222 2223 /* RIL_RadioState ril.h */ 2224 switch(stateInt) { 2225 case 0: state = RadioState.RADIO_OFF; break; 2226 case 1: state = RadioState.RADIO_UNAVAILABLE; break; 2227 case 10: state = RadioState.RADIO_ON; break; 2228 2229 default: 2230 throw new RuntimeException( 2231 "Unrecognized RIL_RadioState: " + stateInt); 2232 } 2233 return state; 2234 } 2235 2236 private void switchToRadioState(RadioState newState) { 2237 setRadioState(newState); 2238 } 2239 2240 /** 2241 * Holds a PARTIAL_WAKE_LOCK whenever 2242 * a) There is outstanding RIL request sent to RIL deamon and no replied 2243 * b) There is a request pending to be sent out. 2244 * 2245 * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't 2246 * happen often. 2247 */ 2248 2249 private void 2250 acquireWakeLock() { 2251 synchronized (mWakeLock) { 2252 mWakeLock.acquire(); 2253 mWakeLockCount++; 2254 2255 mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 2256 Message msg = mSender.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 2257 mSender.sendMessageDelayed(msg, mWakeLockTimeout); 2258 } 2259 } 2260 2261 private void 2262 decrementWakeLock() { 2263 synchronized (mWakeLock) { 2264 if (mWakeLockCount > 1) { 2265 mWakeLockCount--; 2266 } else { 2267 mWakeLockCount = 0; 2268 mWakeLock.release(); 2269 mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 2270 } 2271 } 2272 } 2273 2274 // true if we had the wakelock 2275 private boolean 2276 clearWakeLock() { 2277 synchronized (mWakeLock) { 2278 if (mWakeLockCount == 0 && mWakeLock.isHeld() == false) return false; 2279 Rlog.d(RILJ_LOG_TAG, "NOTE: mWakeLockCount is " + mWakeLockCount + "at time of clearing"); 2280 mWakeLockCount = 0; 2281 mWakeLock.release(); 2282 mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 2283 return true; 2284 } 2285 } 2286 2287 private void 2288 send(RILRequest rr) { 2289 Message msg; 2290 2291 if (mSocket == null) { 2292 rr.onError(RADIO_NOT_AVAILABLE, null); 2293 rr.release(); 2294 return; 2295 } 2296 2297 msg = mSender.obtainMessage(EVENT_SEND, rr); 2298 2299 acquireWakeLock(); 2300 2301 msg.sendToTarget(); 2302 } 2303 2304 private void 2305 processResponse (Parcel p) { 2306 int type; 2307 2308 type = p.readInt(); 2309 2310 if (type == RESPONSE_UNSOLICITED) { 2311 processUnsolicited (p); 2312 } else if (type == RESPONSE_SOLICITED) { 2313 RILRequest rr = processSolicited (p); 2314 if (rr != null) { 2315 rr.release(); 2316 decrementWakeLock(); 2317 } 2318 } 2319 } 2320 2321 /** 2322 * Release each request in mRequestList then clear the list 2323 * @param error is the RIL_Errno sent back 2324 * @param loggable true means to print all requests in mRequestList 2325 */ 2326 private void clearRequestList(int error, boolean loggable) { 2327 RILRequest rr; 2328 synchronized (mRequestList) { 2329 int count = mRequestList.size(); 2330 if (RILJ_LOGD && loggable) { 2331 Rlog.d(RILJ_LOG_TAG, "clearRequestList " + 2332 " mWakeLockCount=" + mWakeLockCount + 2333 " mRequestList=" + count); 2334 } 2335 2336 for (int i = 0; i < count ; i++) { 2337 rr = mRequestList.valueAt(i); 2338 if (RILJ_LOGD && loggable) { 2339 Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] " + 2340 requestToString(rr.mRequest)); 2341 } 2342 rr.onError(error, null); 2343 rr.release(); 2344 decrementWakeLock(); 2345 } 2346 mRequestList.clear(); 2347 } 2348 } 2349 2350 private RILRequest findAndRemoveRequestFromList(int serial) { 2351 RILRequest rr = null; 2352 synchronized (mRequestList) { 2353 rr = mRequestList.get(serial); 2354 if (rr != null) { 2355 mRequestList.remove(serial); 2356 } 2357 } 2358 2359 return rr; 2360 } 2361 2362 private RILRequest 2363 processSolicited (Parcel p) { 2364 int serial, error; 2365 boolean found = false; 2366 2367 serial = p.readInt(); 2368 error = p.readInt(); 2369 2370 RILRequest rr; 2371 2372 rr = findAndRemoveRequestFromList(serial); 2373 2374 if (rr == null) { 2375 Rlog.w(RILJ_LOG_TAG, "Unexpected solicited response! sn: " 2376 + serial + " error: " + error); 2377 return null; 2378 } 2379 2380 Object ret = null; 2381 2382 if (error == 0 || p.dataAvail() > 0) { 2383 // either command succeeds or command fails but with data payload 2384 try {switch (rr.mRequest) { 2385 /* 2386 cat libs/telephony/ril_commands.h \ 2387 | egrep "^ *{RIL_" \ 2388 | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/' 2389 */ 2390 case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break; 2391 case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break; 2392 case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break; 2393 case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break; 2394 case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break; 2395 case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break; 2396 case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break; 2397 case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: ret = responseInts(p); break; 2398 case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break; 2399 case RIL_REQUEST_DIAL: ret = responseVoid(p); break; 2400 case RIL_REQUEST_GET_IMSI: ret = responseString(p); break; 2401 case RIL_REQUEST_HANGUP: ret = responseVoid(p); break; 2402 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break; 2403 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: { 2404 if (mTestingEmergencyCall.getAndSet(false)) { 2405 if (mEmergencyCallbackModeRegistrant != null) { 2406 riljLog("testing emergency call, notify ECM Registrants"); 2407 mEmergencyCallbackModeRegistrant.notifyRegistrant(); 2408 } 2409 } 2410 ret = responseVoid(p); 2411 break; 2412 } 2413 case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break; 2414 case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break; 2415 case RIL_REQUEST_UDUB: ret = responseVoid(p); break; 2416 case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break; 2417 case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break; 2418 case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break; 2419 case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break; 2420 case RIL_REQUEST_OPERATOR: ret = responseStrings(p); break; 2421 case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break; 2422 case RIL_REQUEST_DTMF: ret = responseVoid(p); break; 2423 case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break; 2424 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break; 2425 case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break; 2426 case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break; 2427 case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break; 2428 case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break; 2429 case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break; 2430 case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break; 2431 case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break; 2432 case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break; 2433 case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break; 2434 case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break; 2435 case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; 2436 case RIL_REQUEST_GET_IMEI: ret = responseString(p); break; 2437 case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break; 2438 case RIL_REQUEST_ANSWER: ret = responseVoid(p); break; 2439 case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break; 2440 case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break; 2441 case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break; 2442 case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break; 2443 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break; 2444 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break; 2445 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break; 2446 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break; 2447 case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break; 2448 case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break; 2449 case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break; 2450 case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break; 2451 case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break; 2452 case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break; 2453 case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break; 2454 case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break; 2455 case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break; 2456 case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break; 2457 case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break; 2458 case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break; 2459 case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break; 2460 case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break; 2461 case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break; 2462 case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break; 2463 case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break; 2464 case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break; 2465 case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break; 2466 case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break; 2467 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break; 2468 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break; 2469 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break; 2470 case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break; 2471 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break; 2472 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break; 2473 case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break; 2474 case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break; 2475 case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; 2476 case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break; 2477 case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break; 2478 case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break; 2479 case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break; 2480 case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break; 2481 case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break; 2482 case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break; 2483 case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break; 2484 case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break; 2485 case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; 2486 case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break; 2487 case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; 2488 case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break; 2489 case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break; 2490 case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; 2491 case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break; 2492 case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break; 2493 case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break; 2494 case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break; 2495 case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break; 2496 case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break; 2497 case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break; 2498 case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break; 2499 case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; 2500 case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break; 2501 case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break; 2502 case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret = responseInts(p); break; 2503 case RIL_REQUEST_ISIM_AUTHENTICATION: ret = responseString(p); break; 2504 case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break; 2505 case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break; 2506 case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break; 2507 case RIL_REQUEST_GET_CELL_INFO_LIST: ret = responseCellInfoList(p); break; 2508 case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: ret = responseVoid(p); break; 2509 case RIL_REQUEST_SET_INITIAL_ATTACH_APN: ret = responseVoid(p); break; 2510 case RIL_REQUEST_SET_DATA_PROFILE: ret = responseVoid(p); break; 2511 case RIL_REQUEST_IMS_REGISTRATION_STATE: ret = responseInts(p); break; 2512 case RIL_REQUEST_IMS_SEND_SMS: ret = responseSMS(p); break; 2513 case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: ret = responseICC_IO(p); break; 2514 case RIL_REQUEST_SIM_OPEN_CHANNEL: ret = responseInts(p); break; 2515 case RIL_REQUEST_SIM_CLOSE_CHANNEL: ret = responseVoid(p); break; 2516 case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: ret = responseICC_IO(p); break; 2517 case RIL_REQUEST_NV_READ_ITEM: ret = responseString(p); break; 2518 case RIL_REQUEST_NV_WRITE_ITEM: ret = responseVoid(p); break; 2519 case RIL_REQUEST_NV_WRITE_CDMA_PRL: ret = responseVoid(p); break; 2520 case RIL_REQUEST_NV_RESET_CONFIG: ret = responseVoid(p); break; 2521 case RIL_REQUEST_SET_UICC_SUBSCRIPTION: ret = responseVoid(p); break; 2522 case RIL_REQUEST_ALLOW_DATA: ret = responseVoid(p); break; 2523 case RIL_REQUEST_GET_HARDWARE_CONFIG: ret = responseHardwareConfig(p); break; 2524 case RIL_REQUEST_SIM_AUTHENTICATION: ret = responseICC_IOBase64(p); break; 2525 case RIL_REQUEST_SHUTDOWN: ret = responseVoid(p); break; 2526 default: 2527 throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest); 2528 //break; 2529 }} catch (Throwable tr) { 2530 // Exceptions here usually mean invalid RIL responses 2531 2532 Rlog.w(RILJ_LOG_TAG, rr.serialString() + "< " 2533 + requestToString(rr.mRequest) 2534 + " exception, possible invalid RIL response", tr); 2535 2536 if (rr.mResult != null) { 2537 AsyncResult.forMessage(rr.mResult, null, tr); 2538 rr.mResult.sendToTarget(); 2539 } 2540 return rr; 2541 } 2542 } 2543 2544 if (rr.mRequest == RIL_REQUEST_SHUTDOWN) { 2545 // Set RADIO_STATE to RADIO_UNAVAILABLE to continue shutdown process 2546 // regardless of error code to continue shutdown procedure. 2547 riljLog("Response to RIL_REQUEST_SHUTDOWN received. Error is " + 2548 error + " Setting Radio State to Unavailable regardless of error."); 2549 setRadioState(RadioState.RADIO_UNAVAILABLE); 2550 } 2551 2552 // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789. 2553 // This is needed otherwise we don't automatically transition to the main lock 2554 // screen when the pin or puk is entered incorrectly. 2555 switch (rr.mRequest) { 2556 case RIL_REQUEST_ENTER_SIM_PUK: 2557 case RIL_REQUEST_ENTER_SIM_PUK2: 2558 if (mIccStatusChangedRegistrants != null) { 2559 if (RILJ_LOGD) { 2560 riljLog("ON enter sim puk fakeSimStatusChanged: reg count=" 2561 + mIccStatusChangedRegistrants.size()); 2562 } 2563 mIccStatusChangedRegistrants.notifyRegistrants(); 2564 } 2565 break; 2566 } 2567 2568 if (error != 0) { 2569 switch (rr.mRequest) { 2570 case RIL_REQUEST_ENTER_SIM_PIN: 2571 case RIL_REQUEST_ENTER_SIM_PIN2: 2572 case RIL_REQUEST_CHANGE_SIM_PIN: 2573 case RIL_REQUEST_CHANGE_SIM_PIN2: 2574 case RIL_REQUEST_SET_FACILITY_LOCK: 2575 if (mIccStatusChangedRegistrants != null) { 2576 if (RILJ_LOGD) { 2577 riljLog("ON some errors fakeSimStatusChanged: reg count=" 2578 + mIccStatusChangedRegistrants.size()); 2579 } 2580 mIccStatusChangedRegistrants.notifyRegistrants(); 2581 } 2582 break; 2583 } 2584 2585 rr.onError(error, ret); 2586 } else { 2587 2588 if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) 2589 + " " + retToString(rr.mRequest, ret)); 2590 2591 if (rr.mResult != null) { 2592 AsyncResult.forMessage(rr.mResult, ret, null); 2593 rr.mResult.sendToTarget(); 2594 } 2595 } 2596 return rr; 2597 } 2598 2599 static String 2600 retToString(int req, Object ret) { 2601 if (ret == null) return ""; 2602 switch (req) { 2603 // Don't log these return values, for privacy's sake. 2604 case RIL_REQUEST_GET_IMSI: 2605 case RIL_REQUEST_GET_IMEI: 2606 case RIL_REQUEST_GET_IMEISV: 2607 if (!RILJ_LOGV) { 2608 // If not versbose logging just return and don't display IMSI and IMEI, IMEISV 2609 return ""; 2610 } 2611 } 2612 2613 StringBuilder sb; 2614 String s; 2615 int length; 2616 if (ret instanceof int[]){ 2617 int[] intArray = (int[]) ret; 2618 length = intArray.length; 2619 sb = new StringBuilder("{"); 2620 if (length > 0) { 2621 int i = 0; 2622 sb.append(intArray[i++]); 2623 while ( i < length) { 2624 sb.append(", ").append(intArray[i++]); 2625 } 2626 } 2627 sb.append("}"); 2628 s = sb.toString(); 2629 } else if (ret instanceof String[]) { 2630 String[] strings = (String[]) ret; 2631 length = strings.length; 2632 sb = new StringBuilder("{"); 2633 if (length > 0) { 2634 int i = 0; 2635 sb.append(strings[i++]); 2636 while ( i < length) { 2637 sb.append(", ").append(strings[i++]); 2638 } 2639 } 2640 sb.append("}"); 2641 s = sb.toString(); 2642 }else if (req == RIL_REQUEST_GET_CURRENT_CALLS) { 2643 ArrayList<DriverCall> calls = (ArrayList<DriverCall>) ret; 2644 sb = new StringBuilder(" "); 2645 for (DriverCall dc : calls) { 2646 sb.append("[").append(dc).append("] "); 2647 } 2648 s = sb.toString(); 2649 } else if (req == RIL_REQUEST_GET_NEIGHBORING_CELL_IDS) { 2650 ArrayList<NeighboringCellInfo> cells; 2651 cells = (ArrayList<NeighboringCellInfo>) ret; 2652 sb = new StringBuilder(" "); 2653 for (NeighboringCellInfo cell : cells) { 2654 sb.append(cell).append(" "); 2655 } 2656 s = sb.toString(); 2657 } else if (req == RIL_REQUEST_GET_HARDWARE_CONFIG) { 2658 ArrayList<HardwareConfig> hwcfgs = (ArrayList<HardwareConfig>) ret; 2659 sb = new StringBuilder(" "); 2660 for (HardwareConfig hwcfg : hwcfgs) { 2661 sb.append("[").append(hwcfg).append("] "); 2662 } 2663 s = sb.toString(); 2664 } else { 2665 s = ret.toString(); 2666 } 2667 return s; 2668 } 2669 2670 private void 2671 processUnsolicited (Parcel p) { 2672 int response; 2673 Object ret; 2674 2675 response = p.readInt(); 2676 2677 try {switch(response) { 2678/* 2679 cat libs/telephony/ril_unsol_commands.h \ 2680 | egrep "^ *{RIL_" \ 2681 | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: \2(rr, p); break;/' 2682*/ 2683 2684 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: ret = responseVoid(p); break; 2685 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: ret = responseVoid(p); break; 2686 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: ret = responseVoid(p); break; 2687 case RIL_UNSOL_RESPONSE_NEW_SMS: ret = responseString(p); break; 2688 case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: ret = responseString(p); break; 2689 case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: ret = responseInts(p); break; 2690 case RIL_UNSOL_ON_USSD: ret = responseStrings(p); break; 2691 case RIL_UNSOL_NITZ_TIME_RECEIVED: ret = responseString(p); break; 2692 case RIL_UNSOL_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break; 2693 case RIL_UNSOL_DATA_CALL_LIST_CHANGED: ret = responseDataCallList(p);break; 2694 case RIL_UNSOL_SUPP_SVC_NOTIFICATION: ret = responseSuppServiceNotification(p); break; 2695 case RIL_UNSOL_STK_SESSION_END: ret = responseVoid(p); break; 2696 case RIL_UNSOL_STK_PROACTIVE_COMMAND: ret = responseString(p); break; 2697 case RIL_UNSOL_STK_EVENT_NOTIFY: ret = responseString(p); break; 2698 case RIL_UNSOL_STK_CALL_SETUP: ret = responseInts(p); break; 2699 case RIL_UNSOL_SIM_SMS_STORAGE_FULL: ret = responseVoid(p); break; 2700 case RIL_UNSOL_SIM_REFRESH: ret = responseSimRefresh(p); break; 2701 case RIL_UNSOL_CALL_RING: ret = responseCallRing(p); break; 2702 case RIL_UNSOL_RESTRICTED_STATE_CHANGED: ret = responseInts(p); break; 2703 case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: ret = responseVoid(p); break; 2704 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: ret = responseCdmaSms(p); break; 2705 case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: ret = responseRaw(p); break; 2706 case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: ret = responseVoid(p); break; 2707 case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; 2708 case RIL_UNSOL_CDMA_CALL_WAITING: ret = responseCdmaCallWaiting(p); break; 2709 case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: ret = responseInts(p); break; 2710 case RIL_UNSOL_CDMA_INFO_REC: ret = responseCdmaInformationRecord(p); break; 2711 case RIL_UNSOL_OEM_HOOK_RAW: ret = responseRaw(p); break; 2712 case RIL_UNSOL_RINGBACK_TONE: ret = responseInts(p); break; 2713 case RIL_UNSOL_RESEND_INCALL_MUTE: ret = responseVoid(p); break; 2714 case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: ret = responseInts(p); break; 2715 case RIL_UNSOl_CDMA_PRL_CHANGED: ret = responseInts(p); break; 2716 case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; 2717 case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break; 2718 case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: ret = responseInts(p); break; 2719 case RIL_UNSOL_CELL_INFO_LIST: ret = responseCellInfoList(p); break; 2720 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: ret = responseVoid(p); break; 2721 case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: ret = responseInts(p); break; 2722 case RIL_UNSOL_SRVCC_STATE_NOTIFY: ret = responseInts(p); break; 2723 case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: ret = responseHardwareConfig(p); break; 2724 2725 default: 2726 throw new RuntimeException("Unrecognized unsol response: " + response); 2727 //break; (implied) 2728 }} catch (Throwable tr) { 2729 Rlog.e(RILJ_LOG_TAG, "Exception processing unsol response: " + response + 2730 "Exception:" + tr.toString()); 2731 return; 2732 } 2733 2734 switch(response) { 2735 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 2736 /* has bonus radio state int */ 2737 RadioState newState = getRadioStateFromInt(p.readInt()); 2738 if (RILJ_LOGD) unsljLogMore(response, newState.toString()); 2739 2740 switchToRadioState(newState); 2741 break; 2742 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: 2743 if (RILJ_LOGD) unsljLog(response); 2744 2745 mImsNetworkStateChangedRegistrants 2746 .notifyRegistrants(new AsyncResult(null, null, null)); 2747 break; 2748 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: 2749 if (RILJ_LOGD) unsljLog(response); 2750 2751 mCallStateRegistrants 2752 .notifyRegistrants(new AsyncResult(null, null, null)); 2753 break; 2754 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: 2755 if (RILJ_LOGD) unsljLog(response); 2756 2757 mVoiceNetworkStateRegistrants 2758 .notifyRegistrants(new AsyncResult(null, null, null)); 2759 break; 2760 case RIL_UNSOL_RESPONSE_NEW_SMS: { 2761 if (RILJ_LOGD) unsljLog(response); 2762 2763 // FIXME this should move up a layer 2764 String a[] = new String[2]; 2765 2766 a[1] = (String)ret; 2767 2768 SmsMessage sms; 2769 2770 sms = SmsMessage.newFromCMT(a); 2771 if (mGsmSmsRegistrant != null) { 2772 mGsmSmsRegistrant 2773 .notifyRegistrant(new AsyncResult(null, sms, null)); 2774 } 2775 break; 2776 } 2777 case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: 2778 if (RILJ_LOGD) unsljLogRet(response, ret); 2779 2780 if (mSmsStatusRegistrant != null) { 2781 mSmsStatusRegistrant.notifyRegistrant( 2782 new AsyncResult(null, ret, null)); 2783 } 2784 break; 2785 case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: 2786 if (RILJ_LOGD) unsljLogRet(response, ret); 2787 2788 int[] smsIndex = (int[])ret; 2789 2790 if(smsIndex.length == 1) { 2791 if (mSmsOnSimRegistrant != null) { 2792 mSmsOnSimRegistrant. 2793 notifyRegistrant(new AsyncResult(null, smsIndex, null)); 2794 } 2795 } else { 2796 if (RILJ_LOGD) riljLog(" NEW_SMS_ON_SIM ERROR with wrong length " 2797 + smsIndex.length); 2798 } 2799 break; 2800 case RIL_UNSOL_ON_USSD: 2801 String[] resp = (String[])ret; 2802 2803 if (resp.length < 2) { 2804 resp = new String[2]; 2805 resp[0] = ((String[])ret)[0]; 2806 resp[1] = null; 2807 } 2808 if (RILJ_LOGD) unsljLogMore(response, resp[0]); 2809 if (mUSSDRegistrant != null) { 2810 mUSSDRegistrant.notifyRegistrant( 2811 new AsyncResult (null, resp, null)); 2812 } 2813 break; 2814 case RIL_UNSOL_NITZ_TIME_RECEIVED: 2815 if (RILJ_LOGD) unsljLogRet(response, ret); 2816 2817 // has bonus long containing milliseconds since boot that the NITZ 2818 // time was received 2819 long nitzReceiveTime = p.readLong(); 2820 2821 Object[] result = new Object[2]; 2822 2823 result[0] = ret; 2824 result[1] = Long.valueOf(nitzReceiveTime); 2825 2826 boolean ignoreNitz = SystemProperties.getBoolean( 2827 TelephonyProperties.PROPERTY_IGNORE_NITZ, false); 2828 2829 if (ignoreNitz) { 2830 if (RILJ_LOGD) riljLog("ignoring UNSOL_NITZ_TIME_RECEIVED"); 2831 } else { 2832 if (mNITZTimeRegistrant != null) { 2833 2834 mNITZTimeRegistrant 2835 .notifyRegistrant(new AsyncResult (null, result, null)); 2836 } else { 2837 // in case NITZ time registrant isnt registered yet 2838 mLastNITZTimeInfo = result; 2839 } 2840 } 2841 break; 2842 2843 case RIL_UNSOL_SIGNAL_STRENGTH: 2844 // Note this is set to "verbose" because it happens 2845 // frequently 2846 if (RILJ_LOGV) unsljLogvRet(response, ret); 2847 2848 if (mSignalStrengthRegistrant != null) { 2849 mSignalStrengthRegistrant.notifyRegistrant( 2850 new AsyncResult (null, ret, null)); 2851 } 2852 break; 2853 case RIL_UNSOL_DATA_CALL_LIST_CHANGED: 2854 if (RILJ_LOGD) unsljLogRet(response, ret); 2855 2856 mDataNetworkStateRegistrants.notifyRegistrants(new AsyncResult(null, ret, null)); 2857 break; 2858 2859 case RIL_UNSOL_SUPP_SVC_NOTIFICATION: 2860 if (RILJ_LOGD) unsljLogRet(response, ret); 2861 2862 if (mSsnRegistrant != null) { 2863 mSsnRegistrant.notifyRegistrant( 2864 new AsyncResult (null, ret, null)); 2865 } 2866 break; 2867 2868 case RIL_UNSOL_STK_SESSION_END: 2869 if (RILJ_LOGD) unsljLog(response); 2870 2871 if (mCatSessionEndRegistrant != null) { 2872 mCatSessionEndRegistrant.notifyRegistrant( 2873 new AsyncResult (null, ret, null)); 2874 } 2875 break; 2876 2877 case RIL_UNSOL_STK_PROACTIVE_COMMAND: 2878 if (RILJ_LOGD) unsljLogRet(response, ret); 2879 2880 if (mCatProCmdRegistrant != null) { 2881 mCatProCmdRegistrant.notifyRegistrant( 2882 new AsyncResult (null, ret, null)); 2883 } 2884 break; 2885 2886 case RIL_UNSOL_STK_EVENT_NOTIFY: 2887 if (RILJ_LOGD) unsljLogRet(response, ret); 2888 2889 if (mCatEventRegistrant != null) { 2890 mCatEventRegistrant.notifyRegistrant( 2891 new AsyncResult (null, ret, null)); 2892 } 2893 break; 2894 2895 case RIL_UNSOL_STK_CALL_SETUP: 2896 if (RILJ_LOGD) unsljLogRet(response, ret); 2897 2898 if (mCatCallSetUpRegistrant != null) { 2899 mCatCallSetUpRegistrant.notifyRegistrant( 2900 new AsyncResult (null, ret, null)); 2901 } 2902 break; 2903 2904 case RIL_UNSOL_SIM_SMS_STORAGE_FULL: 2905 if (RILJ_LOGD) unsljLog(response); 2906 2907 if (mIccSmsFullRegistrant != null) { 2908 mIccSmsFullRegistrant.notifyRegistrant(); 2909 } 2910 break; 2911 2912 case RIL_UNSOL_SIM_REFRESH: 2913 if (RILJ_LOGD) unsljLogRet(response, ret); 2914 2915 if (mIccRefreshRegistrants != null) { 2916 mIccRefreshRegistrants.notifyRegistrants( 2917 new AsyncResult (null, ret, null)); 2918 } 2919 break; 2920 2921 case RIL_UNSOL_CALL_RING: 2922 if (RILJ_LOGD) unsljLogRet(response, ret); 2923 2924 if (mRingRegistrant != null) { 2925 mRingRegistrant.notifyRegistrant( 2926 new AsyncResult (null, ret, null)); 2927 } 2928 break; 2929 2930 case RIL_UNSOL_RESTRICTED_STATE_CHANGED: 2931 if (RILJ_LOGD) unsljLogvRet(response, ret); 2932 if (mRestrictedStateRegistrant != null) { 2933 mRestrictedStateRegistrant.notifyRegistrant( 2934 new AsyncResult (null, ret, null)); 2935 } 2936 break; 2937 2938 case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: 2939 if (RILJ_LOGD) unsljLog(response); 2940 2941 if (mIccStatusChangedRegistrants != null) { 2942 mIccStatusChangedRegistrants.notifyRegistrants(); 2943 } 2944 break; 2945 2946 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: 2947 if (RILJ_LOGD) unsljLog(response); 2948 2949 SmsMessage sms = (SmsMessage) ret; 2950 2951 if (mCdmaSmsRegistrant != null) { 2952 mCdmaSmsRegistrant 2953 .notifyRegistrant(new AsyncResult(null, sms, null)); 2954 } 2955 break; 2956 2957 case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: 2958 if (RILJ_LOGD) unsljLog(response); 2959 2960 if (mGsmBroadcastSmsRegistrant != null) { 2961 mGsmBroadcastSmsRegistrant 2962 .notifyRegistrant(new AsyncResult(null, ret, null)); 2963 } 2964 break; 2965 2966 case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: 2967 if (RILJ_LOGD) unsljLog(response); 2968 2969 if (mIccSmsFullRegistrant != null) { 2970 mIccSmsFullRegistrant.notifyRegistrant(); 2971 } 2972 break; 2973 2974 case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: 2975 if (RILJ_LOGD) unsljLog(response); 2976 2977 if (mEmergencyCallbackModeRegistrant != null) { 2978 mEmergencyCallbackModeRegistrant.notifyRegistrant(); 2979 } 2980 break; 2981 2982 case RIL_UNSOL_CDMA_CALL_WAITING: 2983 if (RILJ_LOGD) unsljLogRet(response, ret); 2984 2985 if (mCallWaitingInfoRegistrants != null) { 2986 mCallWaitingInfoRegistrants.notifyRegistrants( 2987 new AsyncResult (null, ret, null)); 2988 } 2989 break; 2990 2991 case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: 2992 if (RILJ_LOGD) unsljLogRet(response, ret); 2993 2994 if (mOtaProvisionRegistrants != null) { 2995 mOtaProvisionRegistrants.notifyRegistrants( 2996 new AsyncResult (null, ret, null)); 2997 } 2998 break; 2999 3000 case RIL_UNSOL_CDMA_INFO_REC: 3001 ArrayList<CdmaInformationRecords> listInfoRecs; 3002 3003 try { 3004 listInfoRecs = (ArrayList<CdmaInformationRecords>)ret; 3005 } catch (ClassCastException e) { 3006 Rlog.e(RILJ_LOG_TAG, "Unexpected exception casting to listInfoRecs", e); 3007 break; 3008 } 3009 3010 for (CdmaInformationRecords rec : listInfoRecs) { 3011 if (RILJ_LOGD) unsljLogRet(response, rec); 3012 notifyRegistrantsCdmaInfoRec(rec); 3013 } 3014 break; 3015 3016 case RIL_UNSOL_OEM_HOOK_RAW: 3017 if (RILJ_LOGD) unsljLogvRet(response, IccUtils.bytesToHexString((byte[])ret)); 3018 if (mUnsolOemHookRawRegistrant != null) { 3019 mUnsolOemHookRawRegistrant.notifyRegistrant(new AsyncResult(null, ret, null)); 3020 } 3021 break; 3022 3023 case RIL_UNSOL_RINGBACK_TONE: 3024 if (RILJ_LOGD) unsljLogvRet(response, ret); 3025 if (mRingbackToneRegistrants != null) { 3026 boolean playtone = (((int[])ret)[0] == 1); 3027 mRingbackToneRegistrants.notifyRegistrants( 3028 new AsyncResult (null, playtone, null)); 3029 } 3030 break; 3031 3032 case RIL_UNSOL_RESEND_INCALL_MUTE: 3033 if (RILJ_LOGD) unsljLogRet(response, ret); 3034 3035 if (mResendIncallMuteRegistrants != null) { 3036 mResendIncallMuteRegistrants.notifyRegistrants( 3037 new AsyncResult (null, ret, null)); 3038 } 3039 break; 3040 3041 case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: 3042 if (RILJ_LOGD) unsljLogRet(response, ret); 3043 3044 if (mVoiceRadioTechChangedRegistrants != null) { 3045 mVoiceRadioTechChangedRegistrants.notifyRegistrants( 3046 new AsyncResult(null, ret, null)); 3047 } 3048 break; 3049 3050 case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: 3051 if (RILJ_LOGD) unsljLogRet(response, ret); 3052 3053 if (mCdmaSubscriptionChangedRegistrants != null) { 3054 mCdmaSubscriptionChangedRegistrants.notifyRegistrants( 3055 new AsyncResult (null, ret, null)); 3056 } 3057 break; 3058 3059 case RIL_UNSOl_CDMA_PRL_CHANGED: 3060 if (RILJ_LOGD) unsljLogRet(response, ret); 3061 3062 if (mCdmaPrlChangedRegistrants != null) { 3063 mCdmaPrlChangedRegistrants.notifyRegistrants( 3064 new AsyncResult (null, ret, null)); 3065 } 3066 break; 3067 3068 case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: 3069 if (RILJ_LOGD) unsljLogRet(response, ret); 3070 3071 if (mExitEmergencyCallbackModeRegistrants != null) { 3072 mExitEmergencyCallbackModeRegistrants.notifyRegistrants( 3073 new AsyncResult (null, null, null)); 3074 } 3075 break; 3076 3077 case RIL_UNSOL_RIL_CONNECTED: { 3078 if (RILJ_LOGD) unsljLogRet(response, ret); 3079 3080 // Initial conditions 3081 setRadioPower(false, null); 3082 setPreferredNetworkType(mPreferredNetworkType, null); 3083 setCdmaSubscriptionSource(mCdmaSubscription, null); 3084 setCellInfoListRate(Integer.MAX_VALUE, null); 3085 notifyRegistrantsRilConnectionChanged(((int[])ret)[0]); 3086 break; 3087 } 3088 case RIL_UNSOL_CELL_INFO_LIST: { 3089 if (RILJ_LOGD) unsljLogRet(response, ret); 3090 3091 if (mRilCellInfoListRegistrants != null) { 3092 mRilCellInfoListRegistrants.notifyRegistrants( 3093 new AsyncResult (null, ret, null)); 3094 } 3095 break; 3096 } 3097 case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: { 3098 if (RILJ_LOGD) unsljLogRet(response, ret); 3099 3100 if (mSubscriptionStatusRegistrants != null) { 3101 mSubscriptionStatusRegistrants.notifyRegistrants( 3102 new AsyncResult (null, ret, null)); 3103 } 3104 break; 3105 } 3106 case RIL_UNSOL_SRVCC_STATE_NOTIFY: { 3107 if (RILJ_LOGD) unsljLogRet(response, ret); 3108 3109 if (mSrvccStateRegistrants != null) { 3110 mSrvccStateRegistrants 3111 .notifyRegistrants(new AsyncResult(null, ret, null)); 3112 } 3113 break; 3114 } 3115 case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: 3116 if (RILJ_LOGD) unsljLogRet(response, ret); 3117 3118 if (mHardwareConfigChangeRegistrants != null) { 3119 mHardwareConfigChangeRegistrants.notifyRegistrants( 3120 new AsyncResult (null, ret, null)); 3121 } 3122 break; 3123 } 3124 } 3125 3126 /** 3127 * Notifiy all registrants that the ril has connected or disconnected. 3128 * 3129 * @param rilVer is the version of the ril or -1 if disconnected. 3130 */ 3131 private void notifyRegistrantsRilConnectionChanged(int rilVer) { 3132 mRilVersion = rilVer; 3133 if (mRilConnectedRegistrants != null) { 3134 mRilConnectedRegistrants.notifyRegistrants( 3135 new AsyncResult (null, new Integer(rilVer), null)); 3136 } 3137 } 3138 3139 private Object 3140 responseInts(Parcel p) { 3141 int numInts; 3142 int response[]; 3143 3144 numInts = p.readInt(); 3145 3146 response = new int[numInts]; 3147 3148 for (int i = 0 ; i < numInts ; i++) { 3149 response[i] = p.readInt(); 3150 } 3151 3152 return response; 3153 } 3154 3155 3156 private Object 3157 responseVoid(Parcel p) { 3158 return null; 3159 } 3160 3161 private Object 3162 responseCallForward(Parcel p) { 3163 int numInfos; 3164 CallForwardInfo infos[]; 3165 3166 numInfos = p.readInt(); 3167 3168 infos = new CallForwardInfo[numInfos]; 3169 3170 for (int i = 0 ; i < numInfos ; i++) { 3171 infos[i] = new CallForwardInfo(); 3172 3173 infos[i].status = p.readInt(); 3174 infos[i].reason = p.readInt(); 3175 infos[i].serviceClass = p.readInt(); 3176 infos[i].toa = p.readInt(); 3177 infos[i].number = p.readString(); 3178 infos[i].timeSeconds = p.readInt(); 3179 } 3180 3181 return infos; 3182 } 3183 3184 private Object 3185 responseSuppServiceNotification(Parcel p) { 3186 SuppServiceNotification notification = new SuppServiceNotification(); 3187 3188 notification.notificationType = p.readInt(); 3189 notification.code = p.readInt(); 3190 notification.index = p.readInt(); 3191 notification.type = p.readInt(); 3192 notification.number = p.readString(); 3193 3194 return notification; 3195 } 3196 3197 private Object 3198 responseCdmaSms(Parcel p) { 3199 SmsMessage sms; 3200 sms = SmsMessage.newFromParcel(p); 3201 3202 return sms; 3203 } 3204 3205 private Object 3206 responseString(Parcel p) { 3207 String response; 3208 3209 response = p.readString(); 3210 3211 return response; 3212 } 3213 3214 private Object 3215 responseStrings(Parcel p) { 3216 int num; 3217 String response[]; 3218 3219 response = p.readStringArray(); 3220 3221 return response; 3222 } 3223 3224 private Object 3225 responseRaw(Parcel p) { 3226 int num; 3227 byte response[]; 3228 3229 response = p.createByteArray(); 3230 3231 return response; 3232 } 3233 3234 private Object 3235 responseSMS(Parcel p) { 3236 int messageRef, errorCode; 3237 String ackPDU; 3238 3239 messageRef = p.readInt(); 3240 ackPDU = p.readString(); 3241 errorCode = p.readInt(); 3242 3243 SmsResponse response = new SmsResponse(messageRef, ackPDU, errorCode); 3244 3245 return response; 3246 } 3247 3248 3249 private Object 3250 responseICC_IO(Parcel p) { 3251 int sw1, sw2; 3252 Message ret; 3253 3254 sw1 = p.readInt(); 3255 sw2 = p.readInt(); 3256 3257 String s = p.readString(); 3258 3259 if (RILJ_LOGV) riljLog("< iccIO: " 3260 + " 0x" + Integer.toHexString(sw1) 3261 + " 0x" + Integer.toHexString(sw2) + " " 3262 + s); 3263 3264 return new IccIoResult(sw1, sw2, s); 3265 } 3266 3267 private Object 3268 responseICC_IOBase64(Parcel p) { 3269 int sw1, sw2; 3270 Message ret; 3271 3272 sw1 = p.readInt(); 3273 sw2 = p.readInt(); 3274 3275 String s = p.readString(); 3276 3277 if (RILJ_LOGV) riljLog("< iccIO: " 3278 + " 0x" + Integer.toHexString(sw1) 3279 + " 0x" + Integer.toHexString(sw2) + " " 3280 + s); 3281 3282 3283 return new IccIoResult(sw1, sw2, android.util.Base64.decode(s, android.util.Base64.DEFAULT)); 3284 } 3285 3286 private Object 3287 responseIccCardStatus(Parcel p) { 3288 IccCardApplicationStatus appStatus; 3289 3290 IccCardStatus cardStatus = new IccCardStatus(); 3291 cardStatus.setCardState(p.readInt()); 3292 cardStatus.setUniversalPinState(p.readInt()); 3293 cardStatus.mGsmUmtsSubscriptionAppIndex = p.readInt(); 3294 cardStatus.mCdmaSubscriptionAppIndex = p.readInt(); 3295 cardStatus.mImsSubscriptionAppIndex = p.readInt(); 3296 int numApplications = p.readInt(); 3297 3298 // limit to maximum allowed applications 3299 if (numApplications > IccCardStatus.CARD_MAX_APPS) { 3300 numApplications = IccCardStatus.CARD_MAX_APPS; 3301 } 3302 cardStatus.mApplications = new IccCardApplicationStatus[numApplications]; 3303 for (int i = 0 ; i < numApplications ; i++) { 3304 appStatus = new IccCardApplicationStatus(); 3305 appStatus.app_type = appStatus.AppTypeFromRILInt(p.readInt()); 3306 appStatus.app_state = appStatus.AppStateFromRILInt(p.readInt()); 3307 appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(p.readInt()); 3308 appStatus.aid = p.readString(); 3309 appStatus.app_label = p.readString(); 3310 appStatus.pin1_replaced = p.readInt(); 3311 appStatus.pin1 = appStatus.PinStateFromRILInt(p.readInt()); 3312 appStatus.pin2 = appStatus.PinStateFromRILInt(p.readInt()); 3313 cardStatus.mApplications[i] = appStatus; 3314 } 3315 return cardStatus; 3316 } 3317 3318 private Object 3319 responseSimRefresh(Parcel p) { 3320 IccRefreshResponse response = new IccRefreshResponse(); 3321 3322 response.refreshResult = p.readInt(); 3323 response.efId = p.readInt(); 3324 response.aid = p.readString(); 3325 return response; 3326 } 3327 3328 private Object 3329 responseCallList(Parcel p) { 3330 int num; 3331 int voiceSettings; 3332 ArrayList<DriverCall> response; 3333 DriverCall dc; 3334 3335 num = p.readInt(); 3336 response = new ArrayList<DriverCall>(num); 3337 3338 if (RILJ_LOGV) { 3339 riljLog("responseCallList: num=" + num + 3340 " mEmergencyCallbackModeRegistrant=" + mEmergencyCallbackModeRegistrant + 3341 " mTestingEmergencyCall=" + mTestingEmergencyCall.get()); 3342 } 3343 for (int i = 0 ; i < num ; i++) { 3344 dc = new DriverCall(); 3345 3346 dc.state = DriverCall.stateFromCLCC(p.readInt()); 3347 dc.index = p.readInt(); 3348 dc.TOA = p.readInt(); 3349 dc.isMpty = (0 != p.readInt()); 3350 dc.isMT = (0 != p.readInt()); 3351 dc.als = p.readInt(); 3352 voiceSettings = p.readInt(); 3353 dc.isVoice = (0 == voiceSettings) ? false : true; 3354 dc.isVoicePrivacy = (0 != p.readInt()); 3355 dc.number = p.readString(); 3356 int np = p.readInt(); 3357 dc.numberPresentation = DriverCall.presentationFromCLIP(np); 3358 dc.name = p.readString(); 3359 // according to ril.h, namePresentation should be handled as numberPresentation; 3360 dc.namePresentation = DriverCall.presentationFromCLIP(p.readInt()); 3361 int uusInfoPresent = p.readInt(); 3362 if (uusInfoPresent == 1) { 3363 dc.uusInfo = new UUSInfo(); 3364 dc.uusInfo.setType(p.readInt()); 3365 dc.uusInfo.setDcs(p.readInt()); 3366 byte[] userData = p.createByteArray(); 3367 dc.uusInfo.setUserData(userData); 3368 riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d", 3369 dc.uusInfo.getType(), dc.uusInfo.getDcs(), 3370 dc.uusInfo.getUserData().length)); 3371 riljLogv("Incoming UUS : data (string)=" 3372 + new String(dc.uusInfo.getUserData())); 3373 riljLogv("Incoming UUS : data (hex): " 3374 + IccUtils.bytesToHexString(dc.uusInfo.getUserData())); 3375 } else { 3376 riljLogv("Incoming UUS : NOT present!"); 3377 } 3378 3379 // Make sure there's a leading + on addresses with a TOA of 145 3380 dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); 3381 3382 response.add(dc); 3383 3384 if (dc.isVoicePrivacy) { 3385 mVoicePrivacyOnRegistrants.notifyRegistrants(); 3386 riljLog("InCall VoicePrivacy is enabled"); 3387 } else { 3388 mVoicePrivacyOffRegistrants.notifyRegistrants(); 3389 riljLog("InCall VoicePrivacy is disabled"); 3390 } 3391 } 3392 3393 Collections.sort(response); 3394 3395 if ((num == 0) && mTestingEmergencyCall.getAndSet(false)) { 3396 if (mEmergencyCallbackModeRegistrant != null) { 3397 riljLog("responseCallList: call ended, testing emergency call," + 3398 " notify ECM Registrants"); 3399 mEmergencyCallbackModeRegistrant.notifyRegistrant(); 3400 } 3401 } 3402 3403 return response; 3404 } 3405 3406 private DataCallResponse getDataCallResponse(Parcel p, int version) { 3407 DataCallResponse dataCall = new DataCallResponse(); 3408 3409 dataCall.version = version; 3410 if (version < 5) { 3411 dataCall.cid = p.readInt(); 3412 dataCall.active = p.readInt(); 3413 dataCall.type = p.readString(); 3414 String addresses = p.readString(); 3415 if (!TextUtils.isEmpty(addresses)) { 3416 dataCall.addresses = addresses.split(" "); 3417 } 3418 } else { 3419 dataCall.status = p.readInt(); 3420 dataCall.suggestedRetryTime = p.readInt(); 3421 dataCall.cid = p.readInt(); 3422 dataCall.active = p.readInt(); 3423 dataCall.type = p.readString(); 3424 dataCall.ifname = p.readString(); 3425 if ((dataCall.status == DcFailCause.NONE.getErrorCode()) && 3426 TextUtils.isEmpty(dataCall.ifname)) { 3427 throw new RuntimeException("getDataCallResponse, no ifname"); 3428 } 3429 String addresses = p.readString(); 3430 if (!TextUtils.isEmpty(addresses)) { 3431 dataCall.addresses = addresses.split(" "); 3432 } 3433 String dnses = p.readString(); 3434 if (!TextUtils.isEmpty(dnses)) { 3435 dataCall.dnses = dnses.split(" "); 3436 } 3437 String gateways = p.readString(); 3438 if (!TextUtils.isEmpty(gateways)) { 3439 dataCall.gateways = gateways.split(" "); 3440 } 3441 if (version >= 10) { 3442 String pcscf = p.readString(); 3443 if (!TextUtils.isEmpty(pcscf)) { 3444 dataCall.pcscf = pcscf.split(" "); 3445 } 3446 } 3447 if (version >= 11) { 3448 dataCall.mtu = p.readInt(); 3449 } 3450 } 3451 return dataCall; 3452 } 3453 3454 private Object 3455 responseDataCallList(Parcel p) { 3456 ArrayList<DataCallResponse> response; 3457 3458 int ver = p.readInt(); 3459 int num = p.readInt(); 3460 riljLog("responseDataCallList ver=" + ver + " num=" + num); 3461 3462 response = new ArrayList<DataCallResponse>(num); 3463 for (int i = 0; i < num; i++) { 3464 response.add(getDataCallResponse(p, ver)); 3465 } 3466 3467 return response; 3468 } 3469 3470 private Object 3471 responseSetupDataCall(Parcel p) { 3472 int ver = p.readInt(); 3473 int num = p.readInt(); 3474 if (RILJ_LOGV) riljLog("responseSetupDataCall ver=" + ver + " num=" + num); 3475 3476 DataCallResponse dataCall; 3477 3478 if (ver < 5) { 3479 dataCall = new DataCallResponse(); 3480 dataCall.version = ver; 3481 dataCall.cid = Integer.parseInt(p.readString()); 3482 dataCall.ifname = p.readString(); 3483 if (TextUtils.isEmpty(dataCall.ifname)) { 3484 throw new RuntimeException( 3485 "RIL_REQUEST_SETUP_DATA_CALL response, no ifname"); 3486 } 3487 String addresses = p.readString(); 3488 if (!TextUtils.isEmpty(addresses)) { 3489 dataCall.addresses = addresses.split(" "); 3490 } 3491 if (num >= 4) { 3492 String dnses = p.readString(); 3493 if (RILJ_LOGD) riljLog("responseSetupDataCall got dnses=" + dnses); 3494 if (!TextUtils.isEmpty(dnses)) { 3495 dataCall.dnses = dnses.split(" "); 3496 } 3497 } 3498 if (num >= 5) { 3499 String gateways = p.readString(); 3500 if (RILJ_LOGD) riljLog("responseSetupDataCall got gateways=" + gateways); 3501 if (!TextUtils.isEmpty(gateways)) { 3502 dataCall.gateways = gateways.split(" "); 3503 } 3504 } 3505 if (num >= 6) { 3506 String pcscf = p.readString(); 3507 if (RILJ_LOGD) riljLog("responseSetupDataCall got pcscf=" + pcscf); 3508 if (!TextUtils.isEmpty(pcscf)) { 3509 dataCall.pcscf = pcscf.split(" "); 3510 } 3511 } 3512 } else { 3513 if (num != 1) { 3514 throw new RuntimeException( 3515 "RIL_REQUEST_SETUP_DATA_CALL response expecting 1 RIL_Data_Call_response_v5" 3516 + " got " + num); 3517 } 3518 dataCall = getDataCallResponse(p, ver); 3519 } 3520 3521 return dataCall; 3522 } 3523 3524 private Object 3525 responseOperatorInfos(Parcel p) { 3526 String strings[] = (String [])responseStrings(p); 3527 ArrayList<OperatorInfo> ret; 3528 3529 if (strings.length % 4 != 0) { 3530 throw new RuntimeException( 3531 "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got " 3532 + strings.length + " strings, expected multible of 4"); 3533 } 3534 3535 ret = new ArrayList<OperatorInfo>(strings.length / 4); 3536 3537 for (int i = 0 ; i < strings.length ; i += 4) { 3538 ret.add ( 3539 new OperatorInfo( 3540 strings[i+0], 3541 strings[i+1], 3542 strings[i+2], 3543 strings[i+3])); 3544 } 3545 3546 return ret; 3547 } 3548 3549 private Object 3550 responseCellList(Parcel p) { 3551 int num, rssi; 3552 String location; 3553 ArrayList<NeighboringCellInfo> response; 3554 NeighboringCellInfo cell; 3555 3556 num = p.readInt(); 3557 response = new ArrayList<NeighboringCellInfo>(); 3558 3559 // Determine the radio access type 3560 String radioString = SystemProperties.get( 3561 TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, "unknown"); 3562 int radioType; 3563 if (radioString.equals("GPRS")) { 3564 radioType = NETWORK_TYPE_GPRS; 3565 } else if (radioString.equals("EDGE")) { 3566 radioType = NETWORK_TYPE_EDGE; 3567 } else if (radioString.equals("UMTS")) { 3568 radioType = NETWORK_TYPE_UMTS; 3569 } else if (radioString.equals("HSDPA")) { 3570 radioType = NETWORK_TYPE_HSDPA; 3571 } else if (radioString.equals("HSUPA")) { 3572 radioType = NETWORK_TYPE_HSUPA; 3573 } else if (radioString.equals("HSPA")) { 3574 radioType = NETWORK_TYPE_HSPA; 3575 } else { 3576 radioType = NETWORK_TYPE_UNKNOWN; 3577 } 3578 3579 // Interpret the location based on radio access type 3580 if (radioType != NETWORK_TYPE_UNKNOWN) { 3581 for (int i = 0 ; i < num ; i++) { 3582 rssi = p.readInt(); 3583 location = p.readString(); 3584 cell = new NeighboringCellInfo(rssi, location, radioType); 3585 response.add(cell); 3586 } 3587 } 3588 return response; 3589 } 3590 3591 private Object responseGetPreferredNetworkType(Parcel p) { 3592 int [] response = (int[]) responseInts(p); 3593 3594 if (response.length >= 1) { 3595 // Since this is the response for getPreferredNetworkType 3596 // we'll assume that it should be the value we want the 3597 // vendor ril to take if we reestablish a connection to it. 3598 mPreferredNetworkType = response[0]; 3599 } 3600 return response; 3601 } 3602 3603 private Object responseGmsBroadcastConfig(Parcel p) { 3604 int num; 3605 ArrayList<SmsBroadcastConfigInfo> response; 3606 SmsBroadcastConfigInfo info; 3607 3608 num = p.readInt(); 3609 response = new ArrayList<SmsBroadcastConfigInfo>(num); 3610 3611 for (int i = 0; i < num; i++) { 3612 int fromId = p.readInt(); 3613 int toId = p.readInt(); 3614 int fromScheme = p.readInt(); 3615 int toScheme = p.readInt(); 3616 boolean selected = (p.readInt() == 1); 3617 3618 info = new SmsBroadcastConfigInfo(fromId, toId, fromScheme, 3619 toScheme, selected); 3620 response.add(info); 3621 } 3622 return response; 3623 } 3624 3625 private Object 3626 responseCdmaBroadcastConfig(Parcel p) { 3627 int numServiceCategories; 3628 int response[]; 3629 3630 numServiceCategories = p.readInt(); 3631 3632 if (numServiceCategories == 0) { 3633 // TODO: The logic of providing default values should 3634 // not be done by this transport layer. And needs to 3635 // be done by the vendor ril or application logic. 3636 int numInts; 3637 numInts = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES * CDMA_BSI_NO_OF_INTS_STRUCT + 1; 3638 response = new int[numInts]; 3639 3640 // Faking a default record for all possible records. 3641 response[0] = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES; 3642 3643 // Loop over CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES set 'english' as 3644 // default language and selection status to false for all. 3645 for (int i = 1; i < numInts; i += CDMA_BSI_NO_OF_INTS_STRUCT ) { 3646 response[i + 0] = i / CDMA_BSI_NO_OF_INTS_STRUCT; 3647 response[i + 1] = 1; 3648 response[i + 2] = 0; 3649 } 3650 } else { 3651 int numInts; 3652 numInts = (numServiceCategories * CDMA_BSI_NO_OF_INTS_STRUCT) + 1; 3653 response = new int[numInts]; 3654 3655 response[0] = numServiceCategories; 3656 for (int i = 1 ; i < numInts; i++) { 3657 response[i] = p.readInt(); 3658 } 3659 } 3660 3661 return response; 3662 } 3663 3664 private Object 3665 responseSignalStrength(Parcel p) { 3666 // Assume this is gsm, but doesn't matter as ServiceStateTracker 3667 // sets the proper value. 3668 SignalStrength signalStrength = SignalStrength.makeSignalStrengthFromRilParcel(p); 3669 return signalStrength; 3670 } 3671 3672 private ArrayList<CdmaInformationRecords> 3673 responseCdmaInformationRecord(Parcel p) { 3674 int numberOfInfoRecs; 3675 ArrayList<CdmaInformationRecords> response; 3676 3677 /** 3678 * Loop through all of the information records unmarshalling them 3679 * and converting them to Java Objects. 3680 */ 3681 numberOfInfoRecs = p.readInt(); 3682 response = new ArrayList<CdmaInformationRecords>(numberOfInfoRecs); 3683 3684 for (int i = 0; i < numberOfInfoRecs; i++) { 3685 CdmaInformationRecords InfoRec = new CdmaInformationRecords(p); 3686 response.add(InfoRec); 3687 } 3688 3689 return response; 3690 } 3691 3692 private Object 3693 responseCdmaCallWaiting(Parcel p) { 3694 CdmaCallWaitingNotification notification = new CdmaCallWaitingNotification(); 3695 3696 notification.number = p.readString(); 3697 notification.numberPresentation = 3698 CdmaCallWaitingNotification.presentationFromCLIP(p.readInt()); 3699 notification.name = p.readString(); 3700 notification.namePresentation = notification.numberPresentation; 3701 notification.isPresent = p.readInt(); 3702 notification.signalType = p.readInt(); 3703 notification.alertPitch = p.readInt(); 3704 notification.signal = p.readInt(); 3705 notification.numberType = p.readInt(); 3706 notification.numberPlan = p.readInt(); 3707 3708 return notification; 3709 } 3710 3711 private Object 3712 responseCallRing(Parcel p){ 3713 char response[] = new char[4]; 3714 3715 response[0] = (char) p.readInt(); // isPresent 3716 response[1] = (char) p.readInt(); // signalType 3717 response[2] = (char) p.readInt(); // alertPitch 3718 response[3] = (char) p.readInt(); // signal 3719 3720 return response; 3721 } 3722 3723 private void 3724 notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) { 3725 int response = RIL_UNSOL_CDMA_INFO_REC; 3726 if (infoRec.record instanceof CdmaInformationRecords.CdmaDisplayInfoRec) { 3727 if (mDisplayInfoRegistrants != null) { 3728 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3729 mDisplayInfoRegistrants.notifyRegistrants( 3730 new AsyncResult (null, infoRec.record, null)); 3731 } 3732 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaSignalInfoRec) { 3733 if (mSignalInfoRegistrants != null) { 3734 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3735 mSignalInfoRegistrants.notifyRegistrants( 3736 new AsyncResult (null, infoRec.record, null)); 3737 } 3738 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaNumberInfoRec) { 3739 if (mNumberInfoRegistrants != null) { 3740 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3741 mNumberInfoRegistrants.notifyRegistrants( 3742 new AsyncResult (null, infoRec.record, null)); 3743 } 3744 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaRedirectingNumberInfoRec) { 3745 if (mRedirNumInfoRegistrants != null) { 3746 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3747 mRedirNumInfoRegistrants.notifyRegistrants( 3748 new AsyncResult (null, infoRec.record, null)); 3749 } 3750 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaLineControlInfoRec) { 3751 if (mLineControlInfoRegistrants != null) { 3752 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3753 mLineControlInfoRegistrants.notifyRegistrants( 3754 new AsyncResult (null, infoRec.record, null)); 3755 } 3756 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53ClirInfoRec) { 3757 if (mT53ClirInfoRegistrants != null) { 3758 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3759 mT53ClirInfoRegistrants.notifyRegistrants( 3760 new AsyncResult (null, infoRec.record, null)); 3761 } 3762 } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53AudioControlInfoRec) { 3763 if (mT53AudCntrlInfoRegistrants != null) { 3764 if (RILJ_LOGD) unsljLogRet(response, infoRec.record); 3765 mT53AudCntrlInfoRegistrants.notifyRegistrants( 3766 new AsyncResult (null, infoRec.record, null)); 3767 } 3768 } 3769 } 3770 3771 private ArrayList<CellInfo> responseCellInfoList(Parcel p) { 3772 int numberOfInfoRecs; 3773 ArrayList<CellInfo> response; 3774 3775 /** 3776 * Loop through all of the information records unmarshalling them 3777 * and converting them to Java Objects. 3778 */ 3779 numberOfInfoRecs = p.readInt(); 3780 response = new ArrayList<CellInfo>(numberOfInfoRecs); 3781 3782 for (int i = 0; i < numberOfInfoRecs; i++) { 3783 CellInfo InfoRec = CellInfo.CREATOR.createFromParcel(p); 3784 response.add(InfoRec); 3785 } 3786 3787 return response; 3788 } 3789 3790 private Object 3791 responseHardwareConfig(Parcel p) { 3792 int num; 3793 ArrayList<HardwareConfig> response; 3794 HardwareConfig hw; 3795 3796 num = p.readInt(); 3797 response = new ArrayList<HardwareConfig>(num); 3798 3799 if (RILJ_LOGV) { 3800 riljLog("responseHardwareConfig: num=" + num); 3801 } 3802 for (int i = 0 ; i < num ; i++) { 3803 int type = p.readInt(); 3804 switch(type) { 3805 case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: { 3806 hw = new HardwareConfig(type); 3807 hw.assignModem(p.readString(), p.readInt(), p.readInt(), 3808 p.readInt(), p.readInt(), p.readInt(), p.readInt()); 3809 break; 3810 } 3811 case HardwareConfig.DEV_HARDWARE_TYPE_SIM: { 3812 hw = new HardwareConfig(type); 3813 hw.assignSim(p.readString(), p.readInt(), p.readString()); 3814 break; 3815 } 3816 default: { 3817 throw new RuntimeException( 3818 "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardward type:" + type); 3819 } 3820 } 3821 3822 response.add(hw); 3823 } 3824 3825 return response; 3826 } 3827 3828 static String 3829 requestToString(int request) { 3830/* 3831 cat libs/telephony/ril_commands.h \ 3832 | egrep "^ *{RIL_" \ 3833 | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 3834*/ 3835 switch(request) { 3836 case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS"; 3837 case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN"; 3838 case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK"; 3839 case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2"; 3840 case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2"; 3841 case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN"; 3842 case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2"; 3843 case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION"; 3844 case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS"; 3845 case RIL_REQUEST_DIAL: return "DIAL"; 3846 case RIL_REQUEST_GET_IMSI: return "GET_IMSI"; 3847 case RIL_REQUEST_HANGUP: return "HANGUP"; 3848 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND"; 3849 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 3850 case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 3851 case RIL_REQUEST_CONFERENCE: return "CONFERENCE"; 3852 case RIL_REQUEST_UDUB: return "UDUB"; 3853 case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE"; 3854 case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; 3855 case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE"; 3856 case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE"; 3857 case RIL_REQUEST_OPERATOR: return "OPERATOR"; 3858 case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER"; 3859 case RIL_REQUEST_DTMF: return "DTMF"; 3860 case RIL_REQUEST_SEND_SMS: return "SEND_SMS"; 3861 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE"; 3862 case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL"; 3863 case RIL_REQUEST_SIM_IO: return "SIM_IO"; 3864 case RIL_REQUEST_SEND_USSD: return "SEND_USSD"; 3865 case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD"; 3866 case RIL_REQUEST_GET_CLIR: return "GET_CLIR"; 3867 case RIL_REQUEST_SET_CLIR: return "SET_CLIR"; 3868 case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS"; 3869 case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD"; 3870 case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING"; 3871 case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING"; 3872 case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE"; 3873 case RIL_REQUEST_GET_IMEI: return "GET_IMEI"; 3874 case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV"; 3875 case RIL_REQUEST_ANSWER: return "ANSWER"; 3876 case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL"; 3877 case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK"; 3878 case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK"; 3879 case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD"; 3880 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE"; 3881 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC"; 3882 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL"; 3883 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS "; 3884 case RIL_REQUEST_DTMF_START: return "DTMF_START"; 3885 case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP"; 3886 case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION"; 3887 case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION"; 3888 case RIL_REQUEST_SET_MUTE: return "SET_MUTE"; 3889 case RIL_REQUEST_GET_MUTE: return "GET_MUTE"; 3890 case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP"; 3891 case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE"; 3892 case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST"; 3893 case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO"; 3894 case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW"; 3895 case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS"; 3896 case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE"; 3897 case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "SET_SUPP_SVC_NOTIFICATION"; 3898 case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM"; 3899 case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM"; 3900 case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE"; 3901 case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE"; 3902 case RIL_REQUEST_STK_GET_PROFILE: return "REQUEST_STK_GET_PROFILE"; 3903 case RIL_REQUEST_STK_SET_PROFILE: return "REQUEST_STK_SET_PROFILE"; 3904 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "REQUEST_STK_SEND_ENVELOPE_COMMAND"; 3905 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "REQUEST_STK_SEND_TERMINAL_RESPONSE"; 3906 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 3907 case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "REQUEST_EXPLICIT_CALL_TRANSFER"; 3908 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "REQUEST_SET_PREFERRED_NETWORK_TYPE"; 3909 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "REQUEST_GET_PREFERRED_NETWORK_TYPE"; 3910 case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "REQUEST_GET_NEIGHBORING_CELL_IDS"; 3911 case RIL_REQUEST_SET_LOCATION_UPDATES: return "REQUEST_SET_LOCATION_UPDATES"; 3912 case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE"; 3913 case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE"; 3914 case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE"; 3915 case RIL_REQUEST_SET_TTY_MODE: return "RIL_REQUEST_SET_TTY_MODE"; 3916 case RIL_REQUEST_QUERY_TTY_MODE: return "RIL_REQUEST_QUERY_TTY_MODE"; 3917 case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; 3918 case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; 3919 case RIL_REQUEST_CDMA_FLASH: return "RIL_REQUEST_CDMA_FLASH"; 3920 case RIL_REQUEST_CDMA_BURST_DTMF: return "RIL_REQUEST_CDMA_BURST_DTMF"; 3921 case RIL_REQUEST_CDMA_SEND_SMS: return "RIL_REQUEST_CDMA_SEND_SMS"; 3922 case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: return "RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE"; 3923 case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_GET_BROADCAST_CONFIG"; 3924 case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_SET_BROADCAST_CONFIG"; 3925 case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG"; 3926 case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG"; 3927 case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: return "RIL_REQUEST_GSM_BROADCAST_ACTIVATION"; 3928 case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return "RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY"; 3929 case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: return "RIL_REQUEST_CDMA_BROADCAST_ACTIVATION"; 3930 case RIL_REQUEST_CDMA_SUBSCRIPTION: return "RIL_REQUEST_CDMA_SUBSCRIPTION"; 3931 case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM"; 3932 case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM"; 3933 case RIL_REQUEST_DEVICE_IDENTITY: return "RIL_REQUEST_DEVICE_IDENTITY"; 3934 case RIL_REQUEST_GET_SMSC_ADDRESS: return "RIL_REQUEST_GET_SMSC_ADDRESS"; 3935 case RIL_REQUEST_SET_SMSC_ADDRESS: return "RIL_REQUEST_SET_SMSC_ADDRESS"; 3936 case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "REQUEST_EXIT_EMERGENCY_CALLBACK_MODE"; 3937 case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "RIL_REQUEST_REPORT_SMS_MEMORY_STATUS"; 3938 case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING"; 3939 case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE"; 3940 case RIL_REQUEST_ISIM_AUTHENTICATION: return "RIL_REQUEST_ISIM_AUTHENTICATION"; 3941 case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU"; 3942 case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS"; 3943 case RIL_REQUEST_VOICE_RADIO_TECH: return "RIL_REQUEST_VOICE_RADIO_TECH"; 3944 case RIL_REQUEST_GET_CELL_INFO_LIST: return "RIL_REQUEST_GET_CELL_INFO_LIST"; 3945 case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return "RIL_REQUEST_SET_CELL_INFO_LIST_RATE"; 3946 case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN"; 3947 case RIL_REQUEST_SET_DATA_PROFILE: return "RIL_REQUEST_SET_DATA_PROFILE"; 3948 case RIL_REQUEST_IMS_REGISTRATION_STATE: return "RIL_REQUEST_IMS_REGISTRATION_STATE"; 3949 case RIL_REQUEST_IMS_SEND_SMS: return "RIL_REQUEST_IMS_SEND_SMS"; 3950 case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC"; 3951 case RIL_REQUEST_SIM_OPEN_CHANNEL: return "RIL_REQUEST_SIM_OPEN_CHANNEL"; 3952 case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "RIL_REQUEST_SIM_CLOSE_CHANNEL"; 3953 case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL"; 3954 case RIL_REQUEST_NV_READ_ITEM: return "RIL_REQUEST_NV_READ_ITEM"; 3955 case RIL_REQUEST_NV_WRITE_ITEM: return "RIL_REQUEST_NV_WRITE_ITEM"; 3956 case RIL_REQUEST_NV_WRITE_CDMA_PRL: return "RIL_REQUEST_NV_WRITE_CDMA_PRL"; 3957 case RIL_REQUEST_NV_RESET_CONFIG: return "RIL_REQUEST_NV_RESET_CONFIG"; 3958 case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "RIL_REQUEST_SET_UICC_SUBSCRIPTION"; 3959 case RIL_REQUEST_ALLOW_DATA: return "RIL_REQUEST_ALLOW_DATA"; 3960 case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG"; 3961 case RIL_REQUEST_SIM_AUTHENTICATION: return "RIL_REQUEST_SIM_AUTHENTICATION"; 3962 case RIL_REQUEST_SHUTDOWN: return "RIL_REQUEST_SHUTDOWN"; 3963 default: return "<unknown request>"; 3964 } 3965 } 3966 3967 static String 3968 responseToString(int request) 3969 { 3970/* 3971 cat libs/telephony/ril_unsol_commands.h \ 3972 | egrep "^ *{RIL_" \ 3973 | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 3974*/ 3975 switch(request) { 3976 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 3977 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 3978 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED"; 3979 case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS"; 3980 case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 3981 case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 3982 case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD"; 3983 case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST"; 3984 case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED"; 3985 case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH"; 3986 case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED"; 3987 case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION"; 3988 case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END"; 3989 case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND"; 3990 case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY"; 3991 case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP"; 3992 case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FULL"; 3993 case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH"; 3994 case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING"; 3995 case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; 3996 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_RESPONSE_CDMA_NEW_SMS"; 3997 case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_RESPONSE_NEW_BROADCAST_SMS"; 3998 case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; 3999 case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED"; 4000 case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; 4001 case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING"; 4002 case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS"; 4003 case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC"; 4004 case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW"; 4005 case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE"; 4006 case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE"; 4007 case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "CDMA_SUBSCRIPTION_SOURCE_CHANGED"; 4008 case RIL_UNSOl_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED"; 4009 case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; 4010 case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED"; 4011 case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED"; 4012 case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST"; 4013 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: 4014 return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED"; 4015 case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: 4016 return "RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED"; 4017 case RIL_UNSOL_SRVCC_STATE_NOTIFY: 4018 return "UNSOL_SRVCC_STATE_NOTIFY"; 4019 case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "RIL_UNSOL_HARDWARE_CONFIG_CHANGED"; 4020 default: return "<unknown response>"; 4021 } 4022 } 4023 4024 private void riljLog(String msg) { 4025 Rlog.d(RILJ_LOG_TAG, msg 4026 + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : "")); 4027 } 4028 4029 private void riljLogv(String msg) { 4030 Rlog.v(RILJ_LOG_TAG, msg 4031 + (mInstanceId != null ? (" [SUB" + mInstanceId + "]") : "")); 4032 } 4033 4034 private void unsljLog(int response) { 4035 riljLog("[UNSL]< " + responseToString(response)); 4036 } 4037 4038 private void unsljLogMore(int response, String more) { 4039 riljLog("[UNSL]< " + responseToString(response) + " " + more); 4040 } 4041 4042 private void unsljLogRet(int response, Object ret) { 4043 riljLog("[UNSL]< " + responseToString(response) + " " + retToString(response, ret)); 4044 } 4045 4046 private void unsljLogvRet(int response, Object ret) { 4047 riljLogv("[UNSL]< " + responseToString(response) + " " + retToString(response, ret)); 4048 } 4049 4050 4051 // ***** Methods for CDMA support 4052 @Override 4053 public void 4054 getDeviceIdentity(Message response) { 4055 RILRequest rr = RILRequest.obtain(RIL_REQUEST_DEVICE_IDENTITY, response); 4056 4057 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4058 4059 send(rr); 4060 } 4061 4062 @Override 4063 public void 4064 getCDMASubscription(Message response) { 4065 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SUBSCRIPTION, response); 4066 4067 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4068 4069 send(rr); 4070 } 4071 4072 @Override 4073 public void setPhoneType(int phoneType) { // Called by CDMAPhone and GSMPhone constructor 4074 if (RILJ_LOGD) riljLog("setPhoneType=" + phoneType + " old value=" + mPhoneType); 4075 mPhoneType = phoneType; 4076 } 4077 4078 /** 4079 * {@inheritDoc} 4080 */ 4081 @Override 4082 public void queryCdmaRoamingPreference(Message response) { 4083 RILRequest rr = RILRequest.obtain( 4084 RILConstants.RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, response); 4085 4086 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4087 4088 send(rr); 4089 } 4090 4091 /** 4092 * {@inheritDoc} 4093 */ 4094 @Override 4095 public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) { 4096 RILRequest rr = RILRequest.obtain( 4097 RILConstants.RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, response); 4098 4099 rr.mParcel.writeInt(1); 4100 rr.mParcel.writeInt(cdmaRoamingType); 4101 4102 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4103 + " : " + cdmaRoamingType); 4104 4105 send(rr); 4106 } 4107 4108 /** 4109 * {@inheritDoc} 4110 */ 4111 @Override 4112 public void setCdmaSubscriptionSource(int cdmaSubscription , Message response) { 4113 RILRequest rr = RILRequest.obtain( 4114 RILConstants.RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, response); 4115 4116 rr.mParcel.writeInt(1); 4117 rr.mParcel.writeInt(cdmaSubscription); 4118 4119 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4120 + " : " + cdmaSubscription); 4121 4122 send(rr); 4123 } 4124 4125 /** 4126 * {@inheritDoc} 4127 */ 4128 @Override 4129 public void getCdmaSubscriptionSource(Message response) { 4130 RILRequest rr = RILRequest.obtain( 4131 RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, response); 4132 4133 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4134 4135 send(rr); 4136 } 4137 4138 /** 4139 * {@inheritDoc} 4140 */ 4141 @Override 4142 public void queryTTYMode(Message response) { 4143 RILRequest rr = RILRequest.obtain( 4144 RILConstants.RIL_REQUEST_QUERY_TTY_MODE, response); 4145 4146 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4147 4148 send(rr); 4149 } 4150 4151 /** 4152 * {@inheritDoc} 4153 */ 4154 @Override 4155 public void setTTYMode(int ttyMode, Message response) { 4156 RILRequest rr = RILRequest.obtain( 4157 RILConstants.RIL_REQUEST_SET_TTY_MODE, response); 4158 4159 rr.mParcel.writeInt(1); 4160 rr.mParcel.writeInt(ttyMode); 4161 4162 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4163 + " : " + ttyMode); 4164 4165 send(rr); 4166 } 4167 4168 /** 4169 * {@inheritDoc} 4170 */ 4171 @Override 4172 public void 4173 sendCDMAFeatureCode(String FeatureCode, Message response) { 4174 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_FLASH, response); 4175 4176 rr.mParcel.writeString(FeatureCode); 4177 4178 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4179 + " : " + FeatureCode); 4180 4181 send(rr); 4182 } 4183 4184 @Override 4185 public void getCdmaBroadcastConfig(Message response) { 4186 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG, response); 4187 4188 send(rr); 4189 } 4190 4191 @Override 4192 public void setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs, Message response) { 4193 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG, response); 4194 4195 // Convert to 1 service category per config (the way RIL takes is) 4196 ArrayList<CdmaSmsBroadcastConfigInfo> processedConfigs = 4197 new ArrayList<CdmaSmsBroadcastConfigInfo>(); 4198 for (CdmaSmsBroadcastConfigInfo config : configs) { 4199 for (int i = config.getFromServiceCategory(); i <= config.getToServiceCategory(); i++) { 4200 processedConfigs.add(new CdmaSmsBroadcastConfigInfo(i, 4201 i, 4202 config.getLanguage(), 4203 config.isSelected())); 4204 } 4205 } 4206 4207 CdmaSmsBroadcastConfigInfo[] rilConfigs = processedConfigs.toArray(configs); 4208 rr.mParcel.writeInt(rilConfigs.length); 4209 for(int i = 0; i < rilConfigs.length; i++) { 4210 rr.mParcel.writeInt(rilConfigs[i].getFromServiceCategory()); 4211 rr.mParcel.writeInt(rilConfigs[i].getLanguage()); 4212 rr.mParcel.writeInt(rilConfigs[i].isSelected() ? 1 : 0); 4213 } 4214 4215 if (RILJ_LOGD) { 4216 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4217 + " with " + rilConfigs.length + " configs : "); 4218 for (int i = 0; i < rilConfigs.length; i++) { 4219 riljLog(rilConfigs[i].toString()); 4220 } 4221 } 4222 4223 send(rr); 4224 } 4225 4226 @Override 4227 public void setCdmaBroadcastActivation(boolean activate, Message response) { 4228 RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_BROADCAST_ACTIVATION, response); 4229 4230 rr.mParcel.writeInt(1); 4231 rr.mParcel.writeInt(activate ? 0 :1); 4232 4233 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4234 4235 send(rr); 4236 } 4237 4238 /** 4239 * {@inheritDoc} 4240 */ 4241 @Override 4242 public void exitEmergencyCallbackMode(Message response) { 4243 RILRequest rr = RILRequest.obtain(RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, response); 4244 4245 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4246 4247 send(rr); 4248 } 4249 4250 @Override 4251 public void requestIsimAuthentication(String nonce, Message response) { 4252 RILRequest rr = RILRequest.obtain(RIL_REQUEST_ISIM_AUTHENTICATION, response); 4253 4254 rr.mParcel.writeString(nonce); 4255 4256 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4257 4258 send(rr); 4259 } 4260 4261 @Override 4262 public void requestIccSimAuthentication(int authContext, String data, String aid, 4263 Message response) { 4264 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_AUTHENTICATION, response); 4265 4266 rr.mParcel.writeInt(authContext); 4267 rr.mParcel.writeString(data); 4268 rr.mParcel.writeString(aid); 4269 4270 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4271 4272 send(rr); 4273 } 4274 4275 /** 4276 * {@inheritDoc} 4277 */ 4278 @Override 4279 public void getCellInfoList(Message result) { 4280 RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CELL_INFO_LIST, result); 4281 4282 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4283 4284 send(rr); 4285 } 4286 4287 /** 4288 * {@inheritDoc} 4289 */ 4290 @Override 4291 public void setCellInfoListRate(int rateInMillis, Message response) { 4292 if (RILJ_LOGD) riljLog("setCellInfoListRate: " + rateInMillis); 4293 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, response); 4294 4295 rr.mParcel.writeInt(1); 4296 rr.mParcel.writeInt(rateInMillis); 4297 4298 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4299 4300 send(rr); 4301 } 4302 4303 public void setInitialAttachApn(String apn, String protocol, int authType, String username, 4304 String password, Message result) { 4305 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_INITIAL_ATTACH_APN, null); 4306 4307 if (RILJ_LOGD) riljLog("Set RIL_REQUEST_SET_INITIAL_ATTACH_APN"); 4308 4309 rr.mParcel.writeString(apn); 4310 rr.mParcel.writeString(protocol); 4311 rr.mParcel.writeInt(authType); 4312 rr.mParcel.writeString(username); 4313 rr.mParcel.writeString(password); 4314 4315 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4316 + ", apn:" + apn + ", protocol:" + protocol + ", authType:" + authType 4317 + ", username:" + username + ", password:" + password); 4318 4319 send(rr); 4320 } 4321 4322 public void setDataProfile(DataProfile[] dps, Message result) { 4323 if (RILJ_LOGD) riljLog("Set RIL_REQUEST_SET_DATA_PROFILE"); 4324 4325 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_DATA_PROFILE, null); 4326 DataProfile.toParcel(rr.mParcel, dps); 4327 4328 if (RILJ_LOGD) { 4329 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4330 + " with " + dps + " Data Profiles : "); 4331 for (int i = 0; i < dps.length; i++) { 4332 riljLog(dps[i].toString()); 4333 } 4334 } 4335 4336 send(rr); 4337 } 4338 4339 /* (non-Javadoc) 4340 * @see com.android.internal.telephony.BaseCommands#testingEmergencyCall() 4341 */ 4342 @Override 4343 public void testingEmergencyCall() { 4344 if (RILJ_LOGD) riljLog("testingEmergencyCall"); 4345 mTestingEmergencyCall.set(true); 4346 } 4347 4348 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 4349 pw.println("RIL: " + this); 4350 pw.println(" mSocket=" + mSocket); 4351 pw.println(" mSenderThread=" + mSenderThread); 4352 pw.println(" mSender=" + mSender); 4353 pw.println(" mReceiverThread=" + mReceiverThread); 4354 pw.println(" mReceiver=" + mReceiver); 4355 pw.println(" mWakeLock=" + mWakeLock); 4356 pw.println(" mWakeLockTimeout=" + mWakeLockTimeout); 4357 synchronized (mRequestList) { 4358 synchronized (mWakeLock) { 4359 pw.println(" mWakeLockCount=" + mWakeLockCount); 4360 } 4361 int count = mRequestList.size(); 4362 pw.println(" mRequestList count=" + count); 4363 for (int i = 0; i < count; i++) { 4364 RILRequest rr = mRequestList.valueAt(i); 4365 pw.println(" [" + rr.mSerial + "] " + requestToString(rr.mRequest)); 4366 } 4367 } 4368 pw.println(" mLastNITZTimeInfo=" + mLastNITZTimeInfo); 4369 pw.println(" mTestingEmergencyCall=" + mTestingEmergencyCall.get()); 4370 } 4371 4372 /** 4373 * {@inheritDoc} 4374 */ 4375 @Override 4376 public void iccOpenLogicalChannel(String AID, Message response) { 4377 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_OPEN_CHANNEL, response); 4378 rr.mParcel.writeString(AID); 4379 4380 if (RILJ_LOGD) 4381 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4382 4383 send(rr); 4384 } 4385 4386 /** 4387 * {@inheritDoc} 4388 */ 4389 @Override 4390 public void iccCloseLogicalChannel(int channel, Message response) { 4391 RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_CLOSE_CHANNEL, response); 4392 rr.mParcel.writeInt(1); 4393 rr.mParcel.writeInt(channel); 4394 4395 if (RILJ_LOGD) 4396 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4397 4398 send(rr); 4399 } 4400 4401 /** 4402 * {@inheritDoc} 4403 */ 4404 @Override 4405 public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction, 4406 int p1, int p2, int p3, String data, Message response) { 4407 if (channel <= 0) { 4408 throw new RuntimeException( 4409 "Invalid channel in iccTransmitApduLogicalChannel: " + channel); 4410 } 4411 4412 iccTransmitApduHelper(RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, channel, cla, 4413 instruction, p1, p2, p3, data, response); 4414 } 4415 4416 /** 4417 * {@inheritDoc} 4418 */ 4419 @Override 4420 public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2, 4421 int p3, String data, Message response) { 4422 iccTransmitApduHelper(RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, 0, cla, instruction, 4423 p1, p2, p3, data, response); 4424 } 4425 4426 /* 4427 * Helper function for the iccTransmitApdu* commands above. 4428 */ 4429 private void iccTransmitApduHelper(int rilCommand, int channel, int cla, 4430 int instruction, int p1, int p2, int p3, String data, Message response) { 4431 RILRequest rr = RILRequest.obtain(rilCommand, response); 4432 rr.mParcel.writeInt(channel); 4433 rr.mParcel.writeInt(cla); 4434 rr.mParcel.writeInt(instruction); 4435 rr.mParcel.writeInt(p1); 4436 rr.mParcel.writeInt(p2); 4437 rr.mParcel.writeInt(p3); 4438 rr.mParcel.writeString(data); 4439 4440 if (RILJ_LOGD) 4441 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 4442 4443 send(rr); 4444 } 4445 4446 @Override 4447 public void nvReadItem(int itemID, Message response) { 4448 RILRequest rr = RILRequest.obtain(RIL_REQUEST_NV_READ_ITEM, response); 4449 4450 rr.mParcel.writeInt(itemID); 4451 4452 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4453 + ' ' + itemID); 4454 4455 send(rr); 4456 } 4457 4458 @Override 4459 public void nvWriteItem(int itemID, String itemValue, Message response) { 4460 RILRequest rr = RILRequest.obtain(RIL_REQUEST_NV_WRITE_ITEM, response); 4461 4462 rr.mParcel.writeInt(itemID); 4463 rr.mParcel.writeString(itemValue); 4464 4465 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4466 + ' ' + itemID + ": " + itemValue); 4467 4468 send(rr); 4469 } 4470 4471 @Override 4472 public void nvWriteCdmaPrl(byte[] preferredRoamingList, Message response) { 4473 RILRequest rr = RILRequest.obtain(RIL_REQUEST_NV_WRITE_CDMA_PRL, response); 4474 4475 rr.mParcel.writeByteArray(preferredRoamingList); 4476 4477 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4478 + " (" + preferredRoamingList.length + " bytes)"); 4479 4480 send(rr); 4481 } 4482 4483 @Override 4484 public void nvResetConfig(int resetType, Message response) { 4485 RILRequest rr = RILRequest.obtain(RIL_REQUEST_NV_RESET_CONFIG, response); 4486 4487 rr.mParcel.writeInt(1); 4488 rr.mParcel.writeInt(resetType); 4489 4490 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) 4491 + ' ' + resetType); 4492 4493 send(rr); 4494 } 4495} 4496