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