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