ril.cpp revision 18e4ab167c7d8549a360ab5ae1fadddcad8c0523
100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp
200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project
400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License");
67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License.
77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at
800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville**     http://www.apache.org/licenses/LICENSE-2.0
1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software
127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS,
137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and
1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License.
1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC"
1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h>
2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h>
23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h>
2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h>
2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/record_stream.h>
2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h>
2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h>
2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h>
308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h>
3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h>
3418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville#include <sys/limits.h>
3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h>
3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h>
3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h>
3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h>
4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h>
4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h>
4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h>
4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h>
4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h>
4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h>
4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h>
4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h>
4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h>
5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h>
5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h>
5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android {
5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio"
5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild"
6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug"
6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface"
6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java
6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024)
6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library
7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find
7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner.
7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1
7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])
7600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#define MIN(a,b) ((a)<(b) ? (a) : (b))
78f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */
8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0
8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1
8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */
8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1
8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro
8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096
8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log
9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0
9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest           sprintf(printBuf, "(")
9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest           sprintf(printBuf, "%s)", printBuf)
9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)           \
968eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("[%04d]> %s %s", token, requestToString(req), printBuf)
9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse           sprintf(printBuf, "%s {", printBuf)
9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse           sprintf(printBuf, "%s}", printBuf)
1008eb2a12cb7b525e74736300962a5f3848427275aWink Saville    #define printResponse           RLOGD("%s", printBuf)
10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf           printBuf[0] = 0
10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar          printBuf[strlen(printBuf)-1] = 0
10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)    sprintf(printBuf, x)
10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest
10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest
10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)
10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse
11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse
11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printResponse
11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf
11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar
11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)
11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL};
11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int(*responseFunction) (Parcel &p, void *response, size_t responselen);
12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo;
12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int (*responseFunction) (Parcel &p, void *response, size_t responselen);
12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    WakeType wakeType;
12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo;
13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo {
1327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    int32_t token;      //this is not RIL_Token
13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    CommandInfo *pCI;
13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct RequestInfo *p_next;
13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char cancelled;
13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char local;         // responses to local commands do not go back to command process
13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo;
13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savilletypedef struct UserCallbackInfo {
14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_TimedCallback p_callback;
14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *userParam;
14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ril_event event;
14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct UserCallbackInfo *p_next;
14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo;
14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1460d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0;
15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch;
15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader;
15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0;
15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdListen = -1;
15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdCommand = -1;
15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1;
15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead;
16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite;
16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event;
16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event;
16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event;
16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event;
16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event;
16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0};
17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_pendingRequests = NULL;
18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL;
18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL;
18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL;
18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL;
18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize;
18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
19100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    static char printBuf[PRINTBUF_SIZE];
19200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
19300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
19500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI);
19700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI);
19800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI);
19900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI);
20000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI);
20100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
20200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI);
20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI);
20400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
2054f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI);
2062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI);
2072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI);
20800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
211a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
212f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen);
21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen);
21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen);
21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen);
21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen);
21900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen);
22000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen);
22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen);
222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen);
2234380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen);
22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen);
226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen);
227a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
228a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
229f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen);
23000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen);
2313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
2323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
2333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen);
2343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
2353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
23645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen);
23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeVoiceRadioTechnology (RIL_RadioState radioState);
2392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
2402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState processRadioState(RIL_RadioState newRadioState);
2412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request);
24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno);
24400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState);
24500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState);
24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB
2487f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen);
25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2527f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback
2530d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    (RIL_TimedCallback callback, void *param,
2540d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn        const struct timeval *relativeTime);
25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */
25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = {
25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h"
25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = {
26200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h"
26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and
2662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from
2672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   radio state message and store it. Every time there is a change in Radio State
2682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if voice radio tech changes and notify telephony
2692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint voiceRadioTech = -1;
2712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
2722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE
2732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription
2742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   source from radio state and store it. Every time there is a change in Radio State
2752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if subscription source changed and notify telephony
2762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint cdmaSubscriptionSource = -1;
2782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
2792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the
2802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   SIM/RUIM state from radio state and store it. Every time there is a change in Radio State,
2812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if SIM/RUIM status changed and notify telephony
2822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint simRuimStatus = -1;
28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char *
286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) {
28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char16_t *s16;
2897f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = p.readString16Inplace(&stringlen);
2917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return strndup16to8(s16, stringlen);
29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) {
29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char16_t *s16;
29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t s16_len;
29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = strdup8to16(s, &s16_len);
29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeString16(s16, s16_len);
30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(s16);
30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) {
30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s != NULL) {
30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (s, 0, strlen(s));
30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    const size_t* objects, size_t objectsSize,
313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                        void* cookie) {
31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // do nothing -- the data reference lives longer than the Parcel object
31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread
31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response
3207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process
32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) {
32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->local = 1;
33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = 0xffffffff;        // token is not used in this context
33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3428eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("C[locl]> %s", requestToString(request));
34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(request, data, len, pRI);
34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) {
35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t request;
35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t token;
35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.setData((uint8_t *) buffer, buflen);
35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // status checked at end
36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&request);
36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&token);
36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
3658eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid request block");
36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
3708eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported request code %d token %d", request, token);
37100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // FIXME this should perhaps return a response
37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = token;
37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*    sLastDispatchedToken = token; */
39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3927f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pRI->pCI->dispatchFunction(p, pRI);
39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
398f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) {
3998eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("invalid command block for token %d request %s",
40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                pRI->token, requestToString(pRI->pCI->requestNumber));
40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */
4047f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
405f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) {
40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    clearPrintBuf;
40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */
41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
413f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) {
41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *string8 = NULL;
41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    string8 = strdupReadString(p);
42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, string8);
42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, string8,
42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       sizeof(char *), pRI);
42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(string8);
43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(string8);
43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */
44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
442f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) {
44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t countStrings;
44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **pStrings;
44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&countStrings);
44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (countStrings == 0) {
45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // just some non-null pointer
45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(sizeof(char *));
45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else if (((int)countStrings) == -1) {
46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = NULL;
46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = sizeof(char *) * countStrings;
4647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(datalen);
46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            pStrings[i] = strdupReadString(p);
46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pStrings != NULL) {
47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            memsetString (pStrings[i]);
48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(pStrings[i]);
48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset(pStrings, 0, datalen);
48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
4907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */
49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
499f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) {
50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t count;
50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *pInts;
50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&count);
50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || count == 0) {
50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    datalen = sizeof(int) * count;
51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pInts = (int *)alloca(datalen);
51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < count ; i++) {
51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int32_t t;
51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        status = p.readInt32(&t);
51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pInts[i] = (int)t;
52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, t);
52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (status != NO_ERROR) {
52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            goto invalid;
52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   }
52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   removeLastChar;
52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   closeRequest;
52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   printRequest(pRI->token, pRI->pCI->requestNumber);
52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5307f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville   s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts),
53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       datalen, pRI);
53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(pInts, 0, datalen);
53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
5457f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs *
54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
54700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t status
54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pdu
54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
551f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_WriteArgs args;
55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&args, 0, sizeof(args));
55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.status = (int)t;
56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.pdu = strdupReadString(p);
56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || args.pdu == NULL) {
56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.smsc = strdupReadString(p);
56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)args.pdu,  (char*)args.smsc);
57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
5747f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI);
57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (args.pdu);
57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (args.pdu);
5827f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&args, 0, sizeof(args));
58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5937f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
5947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial *
59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String address
59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t clir
59800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
600f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) {
60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dial;
60274fa38884320698c1623764850e3131b9769dff0Wink Saville    RIL_UUS_Info uusInfo;
6037bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    int32_t sizeOfDial;
60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
60574fa38884320698c1623764850e3131b9769dff0Wink Saville    int32_t uusPresent;
60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&dial, 0, sizeof(dial));
60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.address = strdupReadString(p);
61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.clir = (int)t;
61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || dial.address == NULL) {
61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6193a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
62074fa38884320698c1623764850e3131b9769dff0Wink Saville        uusPresent = 0;
6217bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
62274fa38884320698c1623764850e3131b9769dff0Wink Saville    } else {
62374fa38884320698c1623764850e3131b9769dff0Wink Saville        status = p.readInt32(&uusPresent);
62474fa38884320698c1623764850e3131b9769dff0Wink Saville
62574fa38884320698c1623764850e3131b9769dff0Wink Saville        if (status != NO_ERROR) {
62674fa38884320698c1623764850e3131b9769dff0Wink Saville            goto invalid;
62774fa38884320698c1623764850e3131b9769dff0Wink Saville        }
62874fa38884320698c1623764850e3131b9769dff0Wink Saville
62974fa38884320698c1623764850e3131b9769dff0Wink Saville        if (uusPresent == 0) {
63074fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = NULL;
63174fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
63274fa38884320698c1623764850e3131b9769dff0Wink Saville            int32_t len;
63374fa38884320698c1623764850e3131b9769dff0Wink Saville
63474fa38884320698c1623764850e3131b9769dff0Wink Saville            memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
63574fa38884320698c1623764850e3131b9769dff0Wink Saville
63674fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
63774fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusType = (RIL_UUS_Type) t;
63874fa38884320698c1623764850e3131b9769dff0Wink Saville
63974fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
64074fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusDcs = (RIL_UUS_DCS) t;
64174fa38884320698c1623764850e3131b9769dff0Wink Saville
64274fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&len);
64374fa38884320698c1623764850e3131b9769dff0Wink Saville            if (status != NO_ERROR) {
64474fa38884320698c1623764850e3131b9769dff0Wink Saville                goto invalid;
64574fa38884320698c1623764850e3131b9769dff0Wink Saville            }
64674fa38884320698c1623764850e3131b9769dff0Wink Saville
64774fa38884320698c1623764850e3131b9769dff0Wink Saville            // The java code writes -1 for null arrays
64874fa38884320698c1623764850e3131b9769dff0Wink Saville            if (((int) len) == -1) {
64974fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = NULL;
65074fa38884320698c1623764850e3131b9769dff0Wink Saville                len = 0;
65174fa38884320698c1623764850e3131b9769dff0Wink Saville            } else {
65274fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = (char*) p.readInplace(len);
65374fa38884320698c1623764850e3131b9769dff0Wink Saville            }
65474fa38884320698c1623764850e3131b9769dff0Wink Saville
65574fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusLength = len;
65674fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = &uusInfo;
65774fa38884320698c1623764850e3131b9769dff0Wink Saville        }
6587bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial);
65974fa38884320698c1623764850e3131b9769dff0Wink Saville    }
66074fa38884320698c1623764850e3131b9769dff0Wink Saville
66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
66374fa38884320698c1623764850e3131b9769dff0Wink Saville    if (uusPresent) {
66474fa38884320698c1623764850e3131b9769dff0Wink Saville        appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
66574fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusType, dial.uusInfo->uusDcs,
66674fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusLength);
66774fa38884320698c1623764850e3131b9769dff0Wink Saville    }
66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6717bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI);
67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (dial.address);
67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (dial.address);
6787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
68074fa38884320698c1623764850e3131b9769dff0Wink Saville    memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&dial, 0, sizeof(dial));
68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
6917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO *
69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t command
69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t fileid
69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String path
69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t p1, p2, p3
6977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String data
6987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String pin2
699c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville *   String aidPtr
70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
702f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
703c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    union RIL_SIM_IO {
704c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v6 v6;
705c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v5 v5;
706c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } simIO;
707c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
709c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int size;
71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&simIO, 0, sizeof(simIO));
71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
7157f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
717c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.command = (int)t;
71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
720c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.fileid = (int)t;
72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
722c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.path = strdupReadString(p);
72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
725c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p1 = (int)t;
72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
728c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p2 = (int)t;
72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
731c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p3 = (int)t;
73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
733c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.data = strdupReadString(p);
734c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.pin2 = strdupReadString(p);
735c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.aidPtr = strdupReadString(p);
73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
738c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
739c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
740c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
741c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        (char*)simIO.v6.data,  (char*)simIO.v6.pin2, simIO.v6.aidPtr);
74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
7447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
749c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
750c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, size, pRI);
75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
753c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.path);
754c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.data);
755c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.pin2);
756c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.aidPtr);
75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
759c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.path);
760c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.data);
761c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.pin2);
762c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.aidPtr);
7637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&simIO, 0, sizeof(simIO));
76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo *
77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t status/action
77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t reason
77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t serviceCode
78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t toa
78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  String number  (0 length -> null)
78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t timeSeconds
78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
7847f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) {
78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_CallForwardInfo cff;
78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
78900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&cff, 0, sizeof(cff));
79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7927f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.status = (int)t;
7967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
79700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.reason = (int)t;
79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
80100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.serviceClass = (int)t;
80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.toa = (int)t;
80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.number = strdupReadString(p);
80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.timeSeconds = (int)t;
81000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // special case: number 0-length fields is null
81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (cff.number != NULL && strlen (cff.number) == 0) {
81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.number = NULL;
81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.status, cff.reason, cff.serviceClass, cff.toa,
82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)cff.number, cff.timeSeconds);
82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
82600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI);
82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(cff.number);
83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (cff.number);
83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&cff, 0, sizeof(cff));
83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
84300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
84400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
84500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
84600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8477f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) {
84900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t len;
85000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
85100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const void *data;
85200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
85300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&len);
85400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
85600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
85900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code writes -1 for null arrays
86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (((int)len) == -1) {
86100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        data = NULL;
86200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        len = 0;
8637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    }
86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
86500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    data = p.readInplace(len);
86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
86700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
86800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sraw_size=%d", printBuf, len);
86900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
87200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI);
87300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
87400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
87500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
87800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8807f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
881f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
882f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message rcsm;
883f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
884f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
885f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
886f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
887f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
8887f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
892f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uTeleserviceID = (int) t;
893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
894f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
895f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.bIsServicePresent = (uint8_t) ut;
896f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uServicecategory = (int) t;
899f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
903f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
904f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_of_digits= (uint8_t) ut;
914f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
916f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
918f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9217f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.read(&ut,sizeof(ut));
925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.odd = (uint8_t) ut;
926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
9317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
9327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut,sizeof(ut));
933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
934f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uBearerDataLen = (int) t;
938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
9407f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
9417f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut, sizeof(ut));
942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.aBearerData[digitCount] = (uint8_t) ut;
943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
950f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
9511b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
9531b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
954f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
9557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
957f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI);
959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
964f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9717f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
973f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Ack rcsa;
974f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
975f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
977f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
979f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
980f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
981f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
982f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
984f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uSMSCauseCode = (int) t;
985f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
987f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
988f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
989f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
990f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
9911b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
9921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
994f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
995f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
996f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
997f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI);
998f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
999f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1000f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
1001f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1002f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1003f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1004f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1005f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1006f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1007f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1008f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1009f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1010a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1011a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1012a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1014a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1016a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1017a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1018a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1019a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1020f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
102196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
102296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
102396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
1024f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
102596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
102696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
102796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBciPtrs[i] = &gsmBci[i];
1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
102996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
103096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromServiceId = (int) t;
1031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
103296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
103396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toServiceId = (int) t;
1034f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
103596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
103696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromCodeScheme = (int) t;
1037f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
103896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
103996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toCodeScheme = (int) t;
1040a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
104196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
104296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].selected = (uint8_t) t;
1043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
104496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
104596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
104696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
104796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
104896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].selected);
104996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
105096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
105296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
105396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
105496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
105696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        s_callbacks.onRequest(pRI->pCI->requestNumber,
105796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              gsmBciPtrs,
105896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
105996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              pRI);
1060f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
106296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
106396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
1064f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
106596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1066f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1071f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1072f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1073f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1074a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1075f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1076a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1077f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1079f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1080a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1081a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1082a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1083a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1084a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
108596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
108696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
108796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
1088a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
108996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
109096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
109196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBciPtrs[i] = &cdmaBci[i];
1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
109396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
109496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].service_category = (int) t;
1095f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
109696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
109796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].language = (int) t;
1098f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
109996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
110096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].selected = (uint8_t) t;
1101f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
110296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: service_category=%d, language =%d, \
110396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
110496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  cdmaBci[i].language, cdmaBci[i].selected);
110596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
110696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
110896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
110996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
111096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
111296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        s_callbacks.onRequest(pRI->pCI->requestNumber,
111396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              cdmaBciPtrs,
111496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
111596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              pRI);
1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
111896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
111996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
112196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1130f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_WriteArgs rcsw;
1132f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1133f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint32_t ut;
1134f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t  uct;
1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  digitCount;
1137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.status = t;
1142a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uTeleserviceID = (int) t;
1145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.bIsServicePresent = (uint8_t) uct;
1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1149f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1150f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uServicecategory = (int) t;
1151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1159f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1160f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1161f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1163f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1164f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1165f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
1168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1172a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1175a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.read(&uct,sizeof(uct));
1176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.odd = (uint8_t) uct;
1177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
1182a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct,sizeof(uct));
1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1186a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uBearerDataLen = (int) t;
1188f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1189f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
1190a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct, sizeof(uct));
1191f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1192f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1193f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1194f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1196f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1197f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1198f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
11991b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
12001b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
12011b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_mode=%d, \
12021b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_type=%d, ",
1203f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
12041b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
12051b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_mode,
12061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_type);
1207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1208f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1211f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI);
1212f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1215f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1216f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1220f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1221f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1224f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
12254f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
12264f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support
12274f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of
12284f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request.
12294f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
12304f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
12314f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    const int numParamsRilV3 = 6;
12324f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
12334f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // The first bytes of the RIL parcel contain the request number and the
12344f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // serial number - see processCommandBuffer(). Copy them over too.
12354f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int pos = p.dataPosition();
12364f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
12374f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int numParams = p.readInt32();
12384f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
12394f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      Parcel p2;
12404f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.appendFrom(&p, 0, pos);
12414f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.writeInt32(numParamsRilV3);
12424f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      for(int i = 0; i < numParamsRilV3; i++) {
12434f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti        p2.writeString16(p.readString16());
12444f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      }
12454f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.setDataPosition(pos);
12464f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p2, pRI);
12474f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    } else {
124857ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti      p.setDataPosition(pos);
12494f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p, pRI);
12504f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    }
12514f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti}
12524f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
12532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH.
12542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
12552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
12562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
12572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState state = s_callbacks.onStateRequest();
12582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
12602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
12612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
12622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
12642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
12652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
12662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
12672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
12682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
12702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode Voice Radio Technology
12712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
12722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    voiceRadioTech = decodeVoiceRadioTechnology(state);
12732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (voiceRadioTech < 0)
12752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
12762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
12772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int));
12782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
12792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:.
12812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
12822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
12832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) {
12842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState state = s_callbacks.onStateRequest();
12852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
12872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
12882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
12892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
12912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
12922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
12932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
12942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
12952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
12962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
12972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode CDMA Subscription Source
12982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
12992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state);
13002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
13012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (cdmaSubscriptionSource < 0)
13022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
13032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
13042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int));
13052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
13062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1308f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) {
13097f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    size_t writeOffset = 0;
131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const uint8_t *toWrite;
131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    toWrite = (const uint8_t *)buffer;
131300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
131400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (writeOffset < len) {
131500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ssize_t written;
131600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        do {
131700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            written = write (fd, toWrite + writeOffset,
131800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                len - writeOffset);
1319388849057a8cc91dbc3fff357d2df524ffec9a4dBanavathu, Srinivas Naik        } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
132000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
132100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (written >= 0) {
132200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeOffset += written;
132300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {   // written < 0
13248eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
132500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(fd);
132600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return -1;
132700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
132800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
132900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
133000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
133100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
133200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
133300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1334f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) {
133500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int fd = s_fdCommand;
133600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
133700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    uint32_t header;
133800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
133900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0) {
134000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
134100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
134200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
134300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (dataSize > MAX_COMMAND_BYTES) {
13448eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL: packet larger than %u (%u)",
134500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                MAX_COMMAND_BYTES, (unsigned int )dataSize);
134600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
134700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
134800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
13497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
135000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_writeMutex);
135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
135200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    header = htonl(dataSize);
135300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = blockingWrite(fd, (void *)&header, sizeof(header));
135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1357084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
135800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
135900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
136000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1361ee1fadc192a63724e416b05666844a62d1e75d38Kenny    ret = blockingWrite(fd, data, dataSize);
136200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
136300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1364084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_writeMutex);
136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
137000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) {
137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printResponse;
137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return sendResponseRaw(p.data(), p.dataSize());
137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/
13807f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
13817f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int
1382f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) {
138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numInts;
138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
13868eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
138900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(int) != 0) {
13908eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(int));
139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
139500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *p_int = (int *) response;
139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    numInts = responselen / sizeof(int *);
139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (numInts);
139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* each int*/
140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
140200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < numInts ; i++) {
140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, p_int[i]);
140400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_int[i]);
140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
140800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
140900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
141000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
141100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s
14134380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    The parcel will begin with the version */
14144380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
14154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(version);
14164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return responseStrings(p, response, responselen);
14174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
14184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
141900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */
1420f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) {
142100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numStrings;
14227f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
142300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
14248eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
142500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
142600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
142700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(char *) != 0) {
14288eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
142900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(char *));
143000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
143100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
143200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
143300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
143400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (0);
143500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
143600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char **p_cur = (char **) response;
143700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
143800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        numStrings = responselen / sizeof(char *);
143900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (numStrings);
144000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
144100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each string*/
144200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        startResponse;
144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < numStrings ; i++) {
144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeStringToParcel (p, p_cur[i]);
144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        removeLastChar;
144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        closeResponse;
144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
145000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
145100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
14557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted
145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen
145700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
1458f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) {
145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* one string only */
146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, (char*)response);
146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, (const char *)response);
146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1469f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) {
147000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1475f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) {
147600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
147700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
14798eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
148300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_Call *) != 0) {
14848eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
148500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_Call *));
148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
148900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_Call *);
149200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_Call *p_cur = ((RIL_Call **) response)[i];
149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each call info */
149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->state);
149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->index);
149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMpty);
150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMT);
150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->als);
150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isVoice);
15041b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoicePrivacy);
15051b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->number);
15061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->numberPresentation);
15071b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->name);
15081b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->namePresentation);
15093a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville        // Remove when partners upgrade to version 3
151074fa38884320698c1623764850e3131b9769dff0Wink Saville        if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
151174fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(0); /* UUS Information is absent */
151274fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
151374fa38884320698c1623764850e3131b9769dff0Wink Saville            RIL_UUS_Info *uusInfo = p_cur->uusInfo;
151474fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(1); /* UUS Information is present */
151574fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusType);
151674fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusDcs);
151774fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusLength);
151874fa38884320698c1623764850e3131b9769dff0Wink Saville            p.write(uusInfo->uusData, uusInfo->uusLength);
151974fa38884320698c1623764850e3131b9769dff0Wink Saville        }
15203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,",
15211b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf,
15221b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
15231b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            callStateToString(p_cur->state),
15243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->toa);
15253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
15263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
15271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
15281b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMT)?"mt":"mo",
15291b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->als,
15301b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoice)?"voc":"nonvoc",
15313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp");
15323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
15333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
15341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
15351b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
15361b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
15371b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
153800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
153900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
154000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
154100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
154200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
154300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
154400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1545f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) {
154600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
15478eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
154800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
154900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
155000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
155100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SMS_Response) ) {
15528eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected %d",
155300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SMS_Response));
155400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
155500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
155600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
155700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
155800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
155900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->messageRef);
156000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->ackPDU);
1561920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    p.writeInt32(p_cur->errorCode);
156200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
156300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
1564920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
1565920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh        (char*)p_cur->ackPDU, p_cur->errorCode);
156600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
156700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
156800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
156900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
157000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1571c0114b325877907fcdf7a5baa24e54a752e7e58bWink Savillestatic int responseDataCallListV4(Parcel &p, void *response, size_t responselen)
157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
15748eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1578c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) {
15798eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d",
1580c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4));
158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1584c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int num = responselen / sizeof(RIL_Data_Call_Response_v4);
158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1587c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response;
158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
158900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int i;
159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (i = 0; i < num; i++) {
159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].cid);
159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].active);
159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].type);
1594c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        // apn is not used, so don't send.
159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].address);
1596c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf,
159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur[i].cid,
159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur[i].active==0)?"down":"up",
159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].type,
160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].address);
160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16084380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen)
16094380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
16104380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    // Write version
16114380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(s_callbacks.version);
16124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
16134380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
1614c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        return responseDataCallListV4(p, response, responselen);
16154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
16164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        if (response == NULL && responselen != 0) {
16178eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("invalid response: NULL");
16184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
16194380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
16204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1621c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) {
16228eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("invalid response length %d expected multiple of %d",
1623c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                    (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6));
16244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
16254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
16264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1627c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        int num = responselen / sizeof(RIL_Data_Call_Response_v6);
16284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        p.writeInt32(num);
16294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1630c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response;
16314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        startResponse;
16324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        int i;
16334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        for (i = 0; i < num; i++) {
16344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32((int)p_cur[i].status);
1635beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo            p.writeInt32(p_cur[i].suggestedRetryTime);
16364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].cid);
16374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].active);
1638af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner            writeStringToParcel(p, p_cur[i].type);
16394380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].ifname);
16404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].addresses);
16414380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].dnses);
1642c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            writeStringToParcel(p, p_cur[i].gateways);
164356384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla            appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf,
16444380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].status,
1645beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo                p_cur[i].suggestedRetryTime,
16464380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].cid,
16474380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (p_cur[i].active==0)?"down":"up",
164856384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla                (char*)p_cur[i].type,
16494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].ifname,
16504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].addresses,
1651c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (char*)p_cur[i].dnses,
1652c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (char*)p_cur[i].gateways);
16534380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
16544380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        removeLastChar;
16554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        closeResponse;
16564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
16574380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
16584380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return 0;
16594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
16604380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
16614380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
16624380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
16634380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
16644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
16654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
16664380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseDataCallList(p, response, responselen);
16674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
16684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
16694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1670f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) {
167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
16728eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL with responselen != 0");
167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code reads -1 size as null byte array
167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
16787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        p.writeInt32(-1);
167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(responselen);
168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.write(response, responselen);
168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
168400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1688f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
16908eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SIM_IO_Response) ) {
16958eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
169900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw1);
170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw2);
170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->simResponse);
170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->simResponse);
170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1714f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) {
171500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
17167f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
17188eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
171900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
172000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
172100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
172200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
17238eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d",
172400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
172500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
172600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
172700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
172800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
172900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_CallForwardInfo *);
173000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
173100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
173200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
173300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
173400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
173500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
173600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->status);
173700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->reason);
173800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->serviceClass);
173900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
174000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur->number);
174100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->timeSeconds);
174200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
174300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->status==1)?"enable":"disable",
174400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->reason, p_cur->serviceClass, p_cur->toa,
174500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur->number,
174600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->timeSeconds);
174700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
174800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
174900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
17507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
175100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
175200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
175300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) {
175500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
17568eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
175700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
175800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
175900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
176000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof(RIL_SuppSvcNotification)) {
17618eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
176200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
176300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
176400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
176500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
176600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
176700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->notificationType);
176800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->code);
176900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->index);
177000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->type);
177100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->number);
177200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
177300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
177400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
177500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (p_cur->notificationType==0)?"mo":"mt",
177600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         p_cur->code, p_cur->index, p_cur->type,
177700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->number);
177800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
177900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
178000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
178100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
178200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) {
178400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
178500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
178600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
17878eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
178800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
178900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
179000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
17928eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
179300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_NeighboringCell *));
179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
179600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
17983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    /* number of records */
179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_NeighboringCell *);
180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
180300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
180400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
180500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->rssi);
180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->cid);
180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->cid, p_cur->rssi);
181000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
181100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
181200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
181300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
181500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
181600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/**
18183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists.
18193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */
1820a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p,
1821a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
18223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.isPresent);
18233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signalType);
18243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.alertPitch);
18253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signal);
18263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
18273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1828a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p,
1829a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            void *response, size_t responselen) {
18303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    int num;
1831a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    char* string8 = NULL;
1832a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int buffer_lenght;
1833a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecord *infoRec;
18343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
18353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
18368eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
18373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
18383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
18393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1840a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
18418eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
1842a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
18433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
18443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
18453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1846a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecords *p_cur =
1847a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                             (RIL_CDMA_InformationRecords *) response;
1848a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
18493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
18503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
1851a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
18523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1853a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++) {
1854a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        infoRec = &p_cur->infoRec[i];
1855a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(infoRec->name);
1856a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        switch (infoRec->name) {
18573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_DISPLAY_INFO_REC:
1858a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
1859a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.display.alpha_len >
1860a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                         CDMA_ALPHA_INFO_BUFFER_LENGTH) {
18618eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
1862a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1863a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.display.alpha_len,
1864a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_ALPHA_INFO_BUFFER_LENGTH);
1865a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
18663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
1867a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1)
1868a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
1869a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
1870a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.display.alpha_buf[i];
18713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
18724380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.display.alpha_len] = '\0';
1873a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1874a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1875a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
18763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
1877a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
18783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
18793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
1880a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
18818eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
1882a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1883a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.number.len,
1884a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
1885a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
18863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
1887a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.number.len + 1)
1888a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
1889a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.number.len; i++) {
1890a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.number.buf[i];
1891a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
18924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.number.len] = '\0';
1893a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1894a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1895a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
1896a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_type);
1897a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_plan);
1898a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.pi);
1899a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.si);
19003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
19013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_SIGNAL_INFO_REC:
1902a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.isPresent);
1903a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signalType);
1904a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.alertPitch);
1905a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signal);
1906a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1907a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%sisPresent=%X, signalType=%X, \
1908a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                alertPitch=%X, signal=%X, ",
1909a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   printBuf, (int)infoRec->rec.signal.isPresent,
1910a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signalType,
1911a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.alertPitch,
1912a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signal);
1913a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
19143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
19153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
1916a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.redir.redirectingNumber.len >
1917a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                              CDMA_NUMBER_INFO_BUFFER_LENGTH) {
19188eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
1919a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1920a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.redir.redirectingNumber.len,
1921a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
1922a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
1923a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
1924a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber
1925a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                          .len + 1) * sizeof(char) );
1926a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0;
1927a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i < infoRec->rec.redir.redirectingNumber.len;
1928a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i++) {
1929a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
19303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
19314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
1932a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1933a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1934a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
1935a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
1936a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
1937a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
1938a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
1939a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingReason);
19403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
19413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_LINE_CONTROL_INFO_REC:
1942a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
1943a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
1944a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
1945a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
1946a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1947a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
1948a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlToggle=%d, lineCtrlReverse=%d, \
1949a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlPowerDenial=%d, ", printBuf,
1950a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
1951a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlToggle,
1952a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlReverse,
1953a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
1954a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
19553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
19563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_CLIR_INFO_REC:
1957a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32((int)(infoRec->rec.clir.cause));
19583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1959a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
1960a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
19613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
19623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
1963a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.upLink);
1964a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.downLink);
1965a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1966a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
1967a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.upLink,
1968a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.downLink);
1969a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
19703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
1971a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_T53_RELEASE_INFO_REC:
1972a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                // TODO(Moto): See David Krause, he has the answer:)
19738eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
1974a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
1975a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            default:
19768eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("Incorrect name value");
1977a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
19783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        }
19793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
1980a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
19813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1982a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    return 0;
19833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
19843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1985a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p,
1986a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    void *response, size_t responselen) {
1987a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (response == NULL && responselen != 0) {
19888eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
19893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
19903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1992c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof (RIL_SignalStrength_v5)) {
1993c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SignalStrength_v6 *p_cur = ((RIL_SignalStrength_v6 *) response);
19943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
19963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
19973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
19983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
19993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
20003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
20013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
2002c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        if (responselen >= sizeof (RIL_SignalStrength_v6)) {
20039efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam            /*
200418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville             * Fixup LTE for backwards compatibility
20059efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam             */
200618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            if (s_callbacks.version <= 6) {
200718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // signalStrength: -1 -> 99
200818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.signalStrength == -1) {
200918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.signalStrength = 99;
201018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
201118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrp: -1 -> INT_MAX all other negative value to positive.
201218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // So remap here
201318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrp == -1) {
201418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = INT_MAX;
201518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
201618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
201718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
201818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrq: -1 -> INT_MAX
201918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrq == -1) {
202018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrq = INT_MAX;
202118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
202218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // Not remapping rssnr is already using INT_MAX
20239efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam
202418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // cqi: -1 -> INT_MAX
202518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.cqi == -1) {
202618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.cqi = INT_MAX;
202718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
202818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            }
202918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
2030c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
2031c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
2032c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
2033c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.cqi);
2034c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        } else {
203518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(99);
203618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
203718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
203818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
203918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
2040c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        }
2041fdf825f9d0dc639787b8523638bb61874ed0b540johnwang
2042fdf825f9d0dc639787b8523638bb61874ed0b540johnwang        startResponse;
2043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
2044c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
2045c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
2046c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.signalNoiseRatio=%d,\
2047c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
2048c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                LTE_SS.rssnr=%d,LTE_SS.cqi=%d]",
2049a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf,
2050a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.signalStrength,
2051a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.bitErrorRate,
2052a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.dbm,
2053a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.ecio,
2054a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.dbm,
2055a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.ecio,
2056c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->EVDO_SignalStrength.signalNoiseRatio,
2057c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.signalStrength,
2058c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrp,
2059c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrq,
2060c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rssnr,
2061c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.cqi);
2062a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        closeResponse;
2063a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
20643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
20658eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length");
20663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
20673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
20683d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
20703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
20713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) {
20733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if ((response == NULL) || (responselen == 0)) {
20743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseVoid(p, response, responselen);
20753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
20763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseCdmaSignalInfoRecord(p, response, responselen);
20773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
20783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
20793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
20813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL || responselen == 0) {
20828eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
20833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
20843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
20853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
20878eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
20883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
20893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
20903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
20913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
20933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
20953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, *p_cur);
20963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
20983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              signal=%d]",
20993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              printBuf,
21003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->isPresent,
21013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signalType,
21023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->alertPitch,
21033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signal);
21043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
21053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
21063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
21073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
21083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2109a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response,
2110a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            size_t responselen) {
21113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
21128eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
21133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
21143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
21153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2116c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
21178eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
21183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
21193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2120c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
21213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2122c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->number);
21233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_cur->numberPresentation);
2124c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->name);
21253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
21263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2127c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
2128c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_type);
2129c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_plan);
2130c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } else {
2131c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2132c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2133c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    }
2134c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
2135c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    startResponse;
21363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
21373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
2138c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            signal=%d,number_type=%d,number_plan=%d]",
21393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
21403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->number,
21413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->numberPresentation,
21423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->name,
21433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.isPresent,
21443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.signalType,
21453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.alertPitch,
2146c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->signalInfoRecord.signal,
2147c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_type,
2148c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_plan);
21493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
21503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
21513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
21523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
21533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
215445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen) {
215545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (response == NULL && responselen != 0) {
21568eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimRefresh: invalid response: NULL");
215745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        return RIL_ERRNO_INVALID_RESPONSE;
215845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
215945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
216045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    startResponse;
216145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (s_callbacks.version == 7) {
216245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
216345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->result);
216445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->ef_id);
216545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, p_cur->aid);
216645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
216745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
216845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
216945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->result,
217045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->ef_id,
217145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->aid);
217245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    } else {
217345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        int *p_cur = ((int *) response);
217445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[0]);
217545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[1]);
217645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, NULL);
217745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
217845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d",
217945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
218045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[0],
218145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[1]);
218245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
218345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    closeResponse;
218445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
218545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    return 0;
218645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka}
218745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
21883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() {
218900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
219000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
219100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* trigger event loop to wakeup. No reason to do this,
219200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         * if we're in the event loop thread */
219300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         do {
219400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = write (s_fdWakeupWrite, " ", 1);
219500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         } while (ret < 0 && errno == EINTR);
219600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
219700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
219800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
21993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) {
220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_add(ev);
220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
220300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2204fd7293711394c422711ff07d15a357955ff2194fWink Savillestatic void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) {
2205fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(num_apps);
2206fd7293711394c422711ff07d15a357955ff2194fWink Saville        startResponse;
2207fd7293711394c422711ff07d15a357955ff2194fWink Saville        for (int i = 0; i < num_apps; i++) {
2208fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_type);
2209fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_state);
2210fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].perso_substate);
2211fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr));
2212fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)
2213fd7293711394c422711ff07d15a357955ff2194fWink Saville                                          (appStatus[i].app_label_ptr));
2214fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1_replaced);
2215fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1);
2216fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin2);
2217fd7293711394c422711ff07d15a357955ff2194fWink Saville            appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
2218fd7293711394c422711ff07d15a357955ff2194fWink Saville                    aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
2219fd7293711394c422711ff07d15a357955ff2194fWink Saville                    printBuf,
2220fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_type,
2221fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_state,
2222fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].perso_substate,
2223fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].aid_ptr,
2224fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_label_ptr,
2225fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1_replaced,
2226fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1,
2227fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin2);
2228fd7293711394c422711ff07d15a357955ff2194fWink Saville        }
2229fd7293711394c422711ff07d15a357955ff2194fWink Saville        closeResponse;
2230fd7293711394c422711ff07d15a357955ff2194fWink Saville}
2231fd7293711394c422711ff07d15a357955ff2194fWink Saville
2232f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) {
2233f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int i;
2234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2235f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
22368eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
2237f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2238f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
22402c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    if (responselen == sizeof (RIL_CardStatus_v6)) {
2241fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2242fd7293711394c422711ff07d15a357955ff2194fWink Saville
2243fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
2244fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
2245fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
2246fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
2247c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->ims_subscription_app_index);
2248fd7293711394c422711ff07d15a357955ff2194fWink Saville
2249fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
22502c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else if (responselen == sizeof (RIL_CardStatus_v5)) {
2251fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response);
2252fd7293711394c422711ff07d15a357955ff2194fWink Saville
2253fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
2254fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
2255fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
2256fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
2257c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(-1);
2258f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2259fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
22602c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else {
22618eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n");
22622c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2263f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2264f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2265f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
22663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
2267f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2268a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2269a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
2270f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(num);
2271f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2272f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2273a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo **p_cur =
2274a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                (RIL_GSM_BroadcastSmsConfigInfo **) response;
2275a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0; i < num; i++) {
2276a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromServiceId);
2277a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toServiceId);
2278a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromCodeScheme);
2279a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toCodeScheme);
2280a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2281a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2282a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
2283a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
2284a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
2285a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
2286a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->selected);
2287a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
2288f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2289f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2290f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2291f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2293a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2294a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
2295a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville               (RIL_CDMA_BroadcastSmsConfigInfo **) response;
2296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2297a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
2298a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
2299f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2301a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
2302a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->service_category);
2303a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->language);
2304a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2306a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
2307a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              selected =%d], ",
2308a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
2309a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              p_cur[i]->selected);
2310f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
2311a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
2312f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2315f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
2317f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
2318f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitCount;
2319f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
2320f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t uct;
2321f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    void* dest;
2322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
23238eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("Inside responseCdmaSms");
2324f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2325f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
23268eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
2327f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2328f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2330f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
23318eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
2332f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
2333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2334f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
2337f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uTeleserviceID);
2338f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->bIsServicePresent),sizeof(uct));
2339f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uServicecategory);
2340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.digit_mode);
2341f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_mode);
2342f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_type);
2343f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_plan);
2344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
2345f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
2346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2347f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
2348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2349f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sSubAddress.subaddressType);
2351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
2352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
2353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
2354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
2356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
2359f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uBearerDataLen);
2360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2361f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville       p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
2362f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2364f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2365f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
23661b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
2367f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
2368f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
2369f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2372f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2373f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
237400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
237500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select()
237600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the
237700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down
237800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
2379f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) {
238000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char buff[16];
238100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
238200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23838eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGV("processWakeupCallback");
238400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
238500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* empty our wakeup socket out */
238600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    do {
238700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = read(s_fdWakeupRead, &buff, sizeof(buff));
23887f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    } while (ret > 0 || (ret < 0 && errno == EINTR));
238900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
239000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2391f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() {
239200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
239300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *p_cur;
239400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* mark pending requests as "cancelled" so we dont report responses */
239600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
239800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
239900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
240000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_cur = s_pendingRequests;
240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24027f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for (p_cur = s_pendingRequests
240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur != NULL
240400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur  = p_cur->p_next
240500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p_cur->cancelled = 1;
240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
240800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2413f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) {
241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *p_record;
241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t recordlen;
241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
241800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert(fd == s_fdCommand);
242000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = (RecordStream *)param;
242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (;;) {
242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* loop until EAGAIN/EINTR, end of stream, or other error */
242500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret == 0 && p_record == NULL) {
242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* end-of-stream */
242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
243000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret < 0) {
243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret == 0) { /* && p_record != NULL */
243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            processCommandBuffer(p_record, recordlen);
243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* fatal error or end-of-stream */
243900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret != 0) {
24408eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("error on reading command socket errno:%d\n", errno);
244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
24428eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGW("EOS.  Closing command socket.");
244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
24447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        close(s_fdCommand);
244600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_fdCommand = -1;
244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
244800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ril_event_del(&s_commands_event);
244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        record_stream_free(p_rs);
245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
245300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        onCommandsSocketClosed();
245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2460f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() {
24615b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville    // Inform we are connected and the ril version
2462a9c18d17769ee475cf4fd5e76e18ddfa4070c7cdJake Hamby    int rilVer = s_callbacks.version;
24635b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville    RIL_onUnsolicitedResponse(RIL_UNSOL_RIL_CONNECTED,
24645b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville                                    &rilVer, sizeof(rilVer));
24655b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville
246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // implicit radio state changed
246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    NULL, 0);
246900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
247000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Send last NITZ time data, in case it was missed
247100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_lastNITZTimeData != NULL) {
247200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize);
247300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
247400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        free(s_lastNITZTimeData);
247500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = NULL;
247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Get version string
247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_callbacks.getVersion != NULL) {
248000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const char *version;
248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        version = s_callbacks.getVersion();
24828eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: %s\n", version);
24837f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
248400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, version);
248500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
24868eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: unavailable\n");
248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, "unavailable");
248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
249100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2492f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) {
249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int err;
249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int is_phone_socket;
249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
250000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ucred creds;
250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t szCreds = sizeof(creds);
250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct passwd *pwd = NULL;
250500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (s_fdCommand < 0);
250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (fd == s_fdListen);
25087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0 ) {
25128eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error on accept() errno:%d", errno);
251300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
2515f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville	      return;
251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
251700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* check the credential of the other side and only accept socket from
251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     * phone process
25207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville     */
252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    errno = 0;
252200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    is_phone_socket = 0;
2523f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
2525f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (err == 0 && szCreds > 0) {
2527f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        errno = 0;
2528f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        pwd = getpwuid(creds.uid);
2529f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        if (pwd != NULL) {
2530f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) {
2531f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                is_phone_socket = 1;
2532f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            } else {
25338eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
2534f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            }
2535f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        } else {
25368eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("Error on getpwuid() errno: %d", errno);
2537f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        }
253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
25398eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("Error on getsockopt() errno: %d", errno);
254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ( !is_phone_socket ) {
25438eb2a12cb7b525e74736300962a5f3848427275aWink Saville      RLOGE("RILD must accept socket from %s", PHONE_PROCESS);
25447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      close(s_fdCommand);
254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      s_fdCommand = -1;
254700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      onCommandsSocketClosed();
254900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      /* start listening for new connections again */
255100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      rilEventAddWakeup(&s_listen_event);
255200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      return;
255400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
255500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK);
255700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
25598eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
256000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
256100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25628eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGI("libril: new connection");
256300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES);
256500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25667f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_commands_event, s_fdCommand, 1,
256700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        processCommandsCallback, p_rs);
256800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_commands_event);
257000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    onNewCommandConnect();
257200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
257300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) {
257500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
257600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (args[i] != NULL) {
257700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(args[i]);
257800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
257900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
258000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(args);
258100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
258200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2583f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) {
258400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int acceptFD, option;
258500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
258600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
258700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int data;
258800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsigned int qxdm_data[6];
258900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char *deactData[1] = {"1"};
259000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *actData[1];
259100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dialData;
259200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int hangupData[1] = {1};
259300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int number;
259400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **args;
259500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
259600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
259700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
259800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (acceptFD < 0) {
25998eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error accepting on debug port: %d\n", errno);
260000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
260100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
260200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
260300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
26048eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error reading on socket: number of Args: \n");
260500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
260600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
260700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args = (char **) malloc(sizeof(char*) * number);
260800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
260900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
261000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int len;
261100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
26128eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Len of Args: \n");
261300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
261400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
261500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
261600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // +1 for null-term
261700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        args[i] = (char *) malloc((sizeof(char) * len) + 1);
26187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
26191b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            != (int)sizeof(char) * len) {
26208eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Args[%d] \n", i);
262100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
262200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
262300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
262400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char * buf = args[i];
262500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        buf[len] = 0;
262600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
262700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
262800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (atoi(args[0])) {
262900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 0:
26308eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing reset.");
263100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
263200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
263300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 1:
26348eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing radio power off.");
263500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 0;
263600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
263700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Close the socket
263800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(s_fdCommand);
263900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_fdCommand = -1;
264000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
264100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 2:
26428eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: issuing unsolicited voice network change.");
2643c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,
264400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                      NULL, 0);
264500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
264600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 3:
26478eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log enable.");
2648d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[0] = 65536;     // head.func_tag
2649d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[1] = 16;        // head.len
2650d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 1;         // mode: 1 for 'start logging'
2651d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[3] = 32;        // log_file_size: 32megabytes
2652d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[4] = 0;         // log_mask
2653d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;         // log_max_fileindex
26547f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
265500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
265600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
265700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 4:
26588eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log disable.");
265900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
266000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
2661d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
266200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
266300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
2664d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;
266500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
266600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
266700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
266800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 5:
26698eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Radio On");
267000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 1;
267100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
267200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            sleep(2);
267300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Set network selection automatic.
267400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0);
267500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
267600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 6:
26778eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            actData[0] = args[1];
26797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(actData));
268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 7:
26838eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Deactivate Data Call");
26847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(deactData));
268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 8:
26888eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Dial Call");
268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.clir = 0;
269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.address = args[1];
269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData));
269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
269300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 9:
26948eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Answer Call");
269500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0);
269600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
269700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 10:
26988eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: End Call");
26997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
270000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(hangupData));
270100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
270200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
27038eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("Invalid request");
270400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
270500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
270600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    freeDebugCallbackArgs(number, args);
270700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    close(acceptFD);
270800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
270900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2711f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) {
271200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
271300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *)param;
271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback(p_info->userParam);
271700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME generalize this...there should be a cancel mechanism
272000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
272100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info = NULL;
272200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
272300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(p_info);
272500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
272600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *
2729f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) {
273000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
273100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int filedes[2];
273200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
273300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_init();
273400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
273500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
273600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
273700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 1;
273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_cond_broadcast(&s_startupCond);
273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pipe(filedes);
274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
27458eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error in pipe() errno:%d", errno);
274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return NULL;
274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupRead = filedes[0];
275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupWrite = filedes[1];
275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
275300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
275500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                processWakeupCallback, NULL);
275600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_wakeupfd_event);
275800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Only returns on error
276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_loop();
27618eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE ("error in event_loop_base errno:%d", errno);
27625cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    // kill self to restart on error
27635cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    kill(0, SIGKILL);
276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
276500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return NULL;
276600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
276700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27687f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
2769f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) {
277000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
277100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_t attr;
27727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
277300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* spin up eventLoop thread and wait for it to get started */
277400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 0;
277500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
277600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
277700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_init (&attr);
27787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
277900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
278000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
278100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (s_started == 0) {
278200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pthread_cond_wait(&s_startupCond, &s_startupMutex);
278300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
278400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
278500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
278600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
278700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
27888eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to create dispatch thread errno:%d", errno);
278900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
279000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
279100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
279200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
279300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only.
279400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
279500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
279600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
279700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27987f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
2799f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) {
280000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
280100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int flags;
280200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28034380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks == NULL) {
28048eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: RIL_RadioFunctions * null");
280500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
280600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
28074380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version < RIL_VERSION_MIN) {
28088eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is to old, min version is %d",
28094380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION_MIN);
28104380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
28114380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
28124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version > RIL_VERSION) {
28138eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is too new, max version is %d",
28144380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION);
28154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
28163a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    }
28178eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("RIL_register: RIL version %d", callbacks->version);
281800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
281900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled > 0) {
28208eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register has been called more than once. "
282100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                "Subsequent call ignored");
282200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
282300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
282400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
282500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
282600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
282700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_registerCalled = 1;
282800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
282900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Little self-check
283000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2831f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
283200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i == s_commands[i].requestNumber);
283300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
283400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2835f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
28367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        assert(i + RIL_UNSOL_RESPONSE_BASE
283700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                == s_unsolResponses[i].requestNumber);
283800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
283900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
284000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // New rild impl calls RIL_startEventLoop() first
284100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // old standalone impl wants it here.
284200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
284300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_started == 0) {
284400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_startEventLoop();
284500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
284600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
284700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start listen socket
284800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
284900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0
28507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ret = socket_local_server (SOCKET_NAME_RIL,
285100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
285200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
285300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
28548eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Unable to bind socket errno:%d", errno);
285500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit (-1);
285600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
285700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = ret;
285800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
285900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
286000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
286100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdListen < 0) {
28628eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to get socket '" SOCKET_NAME_RIL "'");
286300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
286500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdListen, 4);
286700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
286800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
28698eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to listen on control socket '%d': %s",
287000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdListen, strerror(errno));
287100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
287200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
287300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
287400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
287500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
287600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* note: non-persistent so we can accept only one connection at a time */
28777f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_listen_event, s_fdListen, false,
287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                listenCallback, NULL);
287900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_listen_event);
288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1
288300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start debug interface socket
288400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG);
288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdDebug < 0) {
28878eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno);
288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdDebug, 4);
289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
28948eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to listen on ril debug socket '%d': %s",
289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdDebug, strerror(errno));
289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_debug_event, s_fdDebug, true,
290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                debugCallback, NULL);
290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_debug_event);
290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
290600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
2908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) {
290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret = 0;
29107f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI == NULL) {
291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_pendingRequestsMutex);
291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(RequestInfo **ppCur = &s_pendingRequests
29187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        ; *ppCur != NULL
291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; ppCur = &((*ppCur)->p_next)
292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (pRI == *ppCur) {
292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = 1;
292300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            *ppCur = (*ppCur)->p_next;
292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
292900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_pendingRequestsMutex);
293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return ret;
293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
293300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
2936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
293900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t errorOffset;
294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)t;
294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!checkAndDequeueRequestInfo(pRI)) {
29448eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->local > 0) {
294900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Locally issued command...void only!
295000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // response does not go back up the command socket
29518eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
295200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto done;
295400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[%04d]< %s",
295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pRI->token, requestToString(pRI->pCI->requestNumber));
295800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->cancelled == 0) {
296000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        Parcel p;
296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (RESPONSE_SOLICITED);
296300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (pRI->token);
296400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        errorOffset = p.dataPosition();
296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (e);
296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2968b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (response != NULL) {
2969b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            // there is a response payload, no matter success or not.
297000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = pRI->pCI->responseFunction(p, response, responselen);
297100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
297200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* if an error occurred, rewind and mark it */
297300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            if (ret != 0) {
297400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.setDataPosition(errorOffset);
297500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.writeInt32 (ret);
297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            }
2977b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        }
2978b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang
2979b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (e != RIL_E_SUCCESS) {
2980b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
298100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
298200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_fdCommand < 0) {
29848eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD ("RIL onRequestComplete: Command channel closed");
298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponse(p);
298700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
298800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone:
299000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(pRI);
299100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
299200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2995f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() {
299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
299700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
299800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
3000f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() {
300100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
300400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout
300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
3008f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) {
300900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // We're using "param != NULL" as a cancellation mechanism
301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (param == NULL) {
30118eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock");
301200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
301300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
301400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
30158eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock CANCELLED");
301600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
301700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
301800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
30202bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeVoiceRadioTechnology (RIL_RadioState radioState) {
30212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
30222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
30232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
30242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
30252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_UMTS;
30262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
30282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
30292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
30302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
30312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
30322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_1xRTT;
30332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
30358eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState");
30362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
30372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
30382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
30392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
30412bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeCdmaSubscriptionSource (RIL_RadioState radioState) {
30422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
30432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
30442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
30452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
30462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
30472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
30482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
30492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM;
30502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
30522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
30532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_NV;
30542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
30568eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState");
30572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
30582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
30592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
30602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
30622bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeSimStatus (RIL_RadioState radioState) {
30632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   switch (radioState) {
30642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_NOT_READY:
30652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_NOT_READY:
30662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_NOT_READY:
30672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_READY:
30682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
30692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
30702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_READY:
30712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_READY:
30722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
30732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return radioState;
30742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       default:
30758eb2a12cb7b525e74736300962a5f3848427275aWink Saville           RLOGD("decodeSimStatus: Invoked with incorrect RadioState");
30762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
30772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   }
30782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
30792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic bool is3gpp2(int radioTech) {
30812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioTech) {
30822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95A:
30832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95B:
30842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_1xRTT:
30852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_0:
30862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_A:
30872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_B:
30882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EHRPD:
30892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return true;
30902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
30912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return false;
30922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
30932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
30942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
30952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* If RIL sends SIM states or RUIM states, store the voice radio
30962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * technology and subscription source information so that they can be
30972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * returned when telephony framework requests them
30982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
30992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState
31002bc78d614e349574426d198c37e51ccb7455b5bbNaveen KallaprocessRadioState(RIL_RadioState newRadioState) {
31012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
31022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) {
31032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newVoiceRadioTech;
31042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newCdmaSubscriptionSource;
31052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newSimStatus;
31062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
31072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* This is old RIL. Decode Subscription source and Voice Radio Technology
31082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           from Radio State and send change notifications if there has been a change */
31092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState);
31102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newVoiceRadioTech != voiceRadioTech) {
31112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            voiceRadioTech = newVoiceRadioTech;
31122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            RIL_onUnsolicitedResponse (RIL_UNSOL_VOICE_RADIO_TECH_CHANGED,
31132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                        &voiceRadioTech, sizeof(voiceRadioTech));
31142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
31152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(is3gpp2(newVoiceRadioTech)) {
31162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState);
31172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            if(newCdmaSubscriptionSource != cdmaSubscriptionSource) {
31182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                cdmaSubscriptionSource = newCdmaSubscriptionSource;
31192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                RIL_onUnsolicitedResponse (RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED,
31202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                        &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource));
31212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            }
31222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
31232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newSimStatus = decodeSimStatus(newRadioState);
31242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newSimStatus != simRuimStatus) {
31252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            simRuimStatus = newSimStatus;
31262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0);
31272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
31282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
31292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* Send RADIO_ON to telephony */
31302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newRadioState = RADIO_STATE_ON;
31312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
31322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
31332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    return newRadioState;
31342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
31352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
313600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C"
313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data,
313800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen)
313900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
314000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int unsolResponseIndex;
314100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
314200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int64_t timeReceived = 0;
314300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    bool shouldScheduleTimeout = false;
31442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState newState;
314500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
314600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled == 0) {
314700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Ignore RIL_onUnsolicitedResponse before RIL_register
31488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
314900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
315000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
31517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
315200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
315300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
315400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ((unsolResponseIndex < 0)
315500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
31568eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported unsolicited response code %d", unsolResponse);
315700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
315800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
315900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
316000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Grab a wake lock if needed for this reponse,
316100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // as we exit we'll either release it immediately
316200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // or set a timer to release it later.
316300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (s_unsolResponses[unsolResponseIndex].wakeType) {
316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case WAKE_PARTIAL:
316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            grabPartialWakeLock();
316600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = true;
316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
316800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case DONT_WAKE:
317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
317100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // No wake lock is grabed so don't set timeout
317200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = false;
317300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
317500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
317600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Mark the time this was received, doing this
317700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // after grabing the wakelock incase getting
317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // the elapsedRealTime might cause us to goto
317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // sleep.
318000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        timeReceived = elapsedRealtime();
318200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
318300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
318400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
318500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
318600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
318700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
318800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (RESPONSE_UNSOLICITED);
318900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (unsolResponse);
319000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
319100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = s_unsolResponses[unsolResponseIndex]
319200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                .responseFunction(p, data, datalen);
319300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0) {
319400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Problem with the response. Don't continue;
319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto error_exit;
319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // some things get more payload
319900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(unsolResponse) {
320000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
32012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            newState = processRadioState(s_callbacks.onStateRequest());
32022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            p.writeInt32(newState);
320300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s {%s}", printBuf,
320400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                radioStateToString(s_callbacks.onStateRequest()));
320500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
320600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED:
320900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Store the time that this was received so the
321000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // handler of this message can account for
321100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // the time it takes to arrive and process. In
321200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // particular the system has been known to sleep
321300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // before this message can be processed.
321400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt64(timeReceived);
321500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
321600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
321700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
321800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = sendResponse(p);
321900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
322000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Unfortunately, NITZ time is not poll/update like everything
322200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // else in the system. So, if the upstream client isn't connected,
322300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // keep a copy of the last NITZ response (with receive time noted
322400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // above) around so we can deliver it when it is connected
322500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_lastNITZTimeData != NULL) {
322700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free (s_lastNITZTimeData);
322800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_lastNITZTimeData = NULL;
322900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
323000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = malloc(p.dataSize());
323200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeDataSize = p.dataSize();
323300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
323400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
323500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
323700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME The java code should handshake here to release wake lock
323800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
324000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Cancel the previous request
324100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_last_wake_timeout_info != NULL) {
324200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_last_wake_timeout_info->userParam = (void *)1;
324300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
324400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
324500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info
324600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
324700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                            &TIMEVAL_WAKE_TIMEOUT);
324800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
324900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
325000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Normal exit
325100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
325200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
325300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit:
325400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
325500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
325600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
325700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
325800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it
32607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    when the callback occurs
326100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
326200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *
32637f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param,
32640d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn                                const struct timeval *relativeTime)
326500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
326600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct timeval myRelativeTime;
326700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
326800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
326900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
327000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    p_info->p_callback = callback;
327200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->userParam = param;
32730d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
327400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (relativeTime == NULL) {
327500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* treat null parameter as a 0 relative time */
327600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (&myRelativeTime, 0, sizeof(myRelativeTime));
327700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
327800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* FIXME I think event_add's tv param is really const anyway */
327900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
328000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
328100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
328200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
328300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
328400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_timer_add(&(p_info->event), &myRelativeTime);
328500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
328600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
328700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return p_info;
328800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
328900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
329000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32910d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void
32927f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
3293f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                const struct timeval *relativeTime) {
32940d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    internalRequestTimedCallback (callback, param, relativeTime);
329500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
329600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
329700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3298f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) {
329900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(e) {
330000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SUCCESS: return "E_SUCCESS";
330100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE";
330200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
330300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
330400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
330500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
330600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
330700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_CANCELLED: return "E_CANCELLED";
330800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
330900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
331000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
3311f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
33127553447d44bb3f494b00d573215d81398f61cfcdJohn Wang        case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
33137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID
3314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
3315f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
3316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
331700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown error>";
331800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
331900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
332000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
332100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) {
332300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
332400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_OFF: return "RADIO_OFF";
332500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
332600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
332700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
332800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
3329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
3330f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
3331f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
3332f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
3333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
33342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_ON:return"RADIO_ON";
333500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
333600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
333700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
333800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
333900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) {
334100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
334200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ACTIVE : return "ACTIVE";
334300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_HOLDING: return "HOLDING";
334400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_DIALING: return "DIALING";
334500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ALERTING: return "ALERTING";
334600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_INCOMING: return "INCOMING";
334700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_WAITING: return "WAITING";
334800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
334900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
335000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
335100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
335200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) {
335400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*
335500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \
335600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
335700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
335800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
335900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
336000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \
336100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
336200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
336300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
336400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
336500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(request) {
336600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
336700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
336800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
336900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
337000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
337100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
337200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
337300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
337400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
337500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DIAL: return "DIAL";
337600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
337700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP: return "HANGUP";
337800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
337900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
338000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
338100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
338200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_UDUB: return "UDUB";
338300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
338400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
3385c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
3386c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
338700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OPERATOR: return "OPERATOR";
338800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
338900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF: return "DTMF";
339000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
339100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
3392f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
339300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIM_IO: return "SIM_IO";
339400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
339500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
339600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
339700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
339800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
339900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
340000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
340100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
340200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
340300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
340400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
340500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ANSWER: return "ANSWER";
3406f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
340700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
340800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
340900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
341000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
341100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
341200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
341300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
341400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_START: return "DTMF_START";
341500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
341600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
341700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
341800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
341900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
342000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
342100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
342200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
342300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
3424f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
3425f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
342600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
342700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
342800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
3429f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
3430f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
343100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
343200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
343300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
343400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
343500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
343600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
343700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
343800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
3439c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
3440f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
3441f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
3442f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
3443f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
3444f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
3445f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
3446f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
3447f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
3448f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
3449f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
3450a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
3451a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
3452a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
3453a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
3454a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
345503c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
3456f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
3457f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
3458f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
3459f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
3460000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
3461000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
3462000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
346309a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
3464563fd7207da27322bf3f3587ef6000a944a617b7jsh        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
3465c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
3466fa8d584ca7984bf7d73ff37c7c2bc1e0dfa5fb71Jake Hamby        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
3467300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
3468300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
34692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
347000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
347100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
3472c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
347300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
347400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
347500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
347600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
347700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
347800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
347900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
348000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
348100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
348200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
348300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
348400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
348500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
3486f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
348700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
3488f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
3489f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
3490f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
3491f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
34923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
34933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
34943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
34953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
34963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
3497af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
34985d621da539abea83309d77317ede40126f47d5f0John Wang        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
34995909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
3500ee2745825fae9561c5f83fcf179bbbfa111e5224Wink Saville        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
3501c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
3502c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
35035b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
35042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
350500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown request>";
350600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
350700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
350800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
350900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */
3510