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