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