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