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