ril.cpp revision 74f7e667381fae533f70843ea952db04bd2adc36
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>
26622bf2bf79849127cbedd1f56631615bf58aaf78Dima Zavin#include <telephony/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);
2022458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalstatic void dispatchSIM_APDU (Parcel& p, RequestInfo *pRI);
20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI);
20400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI);
20500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
2064f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI);
2072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI);
20875697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI);
2092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI);
21000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
211f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
212a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsSms(Parcel &p, RequestInfo *pRI);
213a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
214a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
215f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
216a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
2198a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVReadItem(Parcel &p, RequestInfo *pRI);
2208a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI);
2218a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
22200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen);
22300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen);
22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen);
22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen);
22600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen);
22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen);
22800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen);
22900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen);
230f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen);
2314380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
23200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen);
23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen);
234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen);
235a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
236a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
237f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen);
23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen);
2393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
2403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
2413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen);
2423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
2433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
24445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen);
2458a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen);
24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeVoiceRadioTechnology (RIL_RadioState radioState);
2482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
2492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState processRadioState(RIL_RadioState newRadioState);
2502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request);
25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno);
25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState);
25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState);
25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB
2577f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen);
25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2617f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback
2620d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    (RIL_TimedCallback callback, void *param,
2630d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn        const struct timeval *relativeTime);
26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */
26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = {
26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h"
26800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = {
27100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h"
27200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
27300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and
2752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from
2762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   radio state message and store it. Every time there is a change in Radio State
2772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if voice radio tech changes and notify telephony
2782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint voiceRadioTech = -1;
2802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
2812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE
2822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription
2832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   source from radio state and store it. Every time there is a change in Radio State
2842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if subscription source changed and notify telephony
2852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint cdmaSubscriptionSource = -1;
2872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
2882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the
2892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   SIM/RUIM state from radio state and store it. Every time there is a change in Radio State,
2902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if SIM/RUIM status changed and notify telephony
2912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
2922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint simRuimStatus = -1;
29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char *
295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) {
29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char16_t *s16;
2987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = p.readString16Inplace(&stringlen);
3007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return strndup16to8(s16, stringlen);
30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
304f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) {
30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char16_t *s16;
30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t s16_len;
30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = strdup8to16(s, &s16_len);
30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeString16(s16, s16_len);
30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(s16);
31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) {
31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s != NULL) {
31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (s, 0, strlen(s));
31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    const size_t* objects, size_t objectsSize,
322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                        void* cookie) {
32300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // do nothing -- the data reference lives longer than the Parcel object
32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread
32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response
3297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process
33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
332f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) {
33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->local = 1;
33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = 0xffffffff;        // token is not used in this context
34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3518eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("C[locl]> %s", requestToString(request));
35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(request, data, len, pRI);
35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
359f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) {
36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t request;
36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t token;
36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
36500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.setData((uint8_t *) buffer, buflen);
36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // status checked at end
37000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&request);
37100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&token);
37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
3748eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid request block");
37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
3798eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported request code %d token %d", request, token);
38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // FIXME this should perhaps return a response
38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = token;
38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*    sLastDispatchedToken = token; */
40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4017f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pRI->pCI->dispatchFunction(p, pRI);
40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
407f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) {
4088eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("invalid command block for token %d request %s",
40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                pRI->token, requestToString(pRI->pCI->requestNumber));
41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */
4137f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
414f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) {
41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    clearPrintBuf;
41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */
42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
422f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) {
42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *string8 = NULL;
42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    string8 = strdupReadString(p);
42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, string8);
43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, string8,
43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       sizeof(char *), pRI);
43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(string8);
44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(string8);
44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */
45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
451f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) {
45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t countStrings;
45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **pStrings;
45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&countStrings);
45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (countStrings == 0) {
46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // just some non-null pointer
46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(sizeof(char *));
46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else if (((int)countStrings) == -1) {
46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = NULL;
47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = sizeof(char *) * countStrings;
4737f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(datalen);
47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            pStrings[i] = strdupReadString(p);
47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pStrings != NULL) {
48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            memsetString (pStrings[i]);
49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(pStrings[i]);
49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset(pStrings, 0, datalen);
49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
4997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */
50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
508f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) {
50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t count;
51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *pInts;
51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&count);
51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || count == 0) {
51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
51800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    datalen = sizeof(int) * count;
52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pInts = (int *)alloca(datalen);
52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < count ; i++) {
52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int32_t t;
52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        status = p.readInt32(&t);
52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pInts[i] = (int)t;
52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, t);
53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (status != NO_ERROR) {
53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            goto invalid;
53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   }
53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   removeLastChar;
53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   closeRequest;
53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   printRequest(pRI->token, pRI->pCI->requestNumber);
53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5397f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville   s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts),
54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       datalen, pRI);
54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(pInts, 0, datalen);
54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
54700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5537f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
5547f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs *
55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t status
55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pdu
55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
560f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_WriteArgs args;
56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&args, 0, sizeof(args));
56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.status = (int)t;
56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.pdu = strdupReadString(p);
57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || args.pdu == NULL) {
57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.smsc = strdupReadString(p);
57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)args.pdu,  (char*)args.smsc);
58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
5837f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI);
58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (args.pdu);
58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (args.pdu);
5917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
59300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&args, 0, sizeof(args));
59400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
59800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
60000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6027f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
6037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial *
60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
60500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String address
60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t clir
60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
609f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) {
61000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dial;
61174fa38884320698c1623764850e3131b9769dff0Wink Saville    RIL_UUS_Info uusInfo;
6127bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    int32_t sizeOfDial;
61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
61474fa38884320698c1623764850e3131b9769dff0Wink Saville    int32_t uusPresent;
61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&dial, 0, sizeof(dial));
61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.address = strdupReadString(p);
62000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
62200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.clir = (int)t;
62300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || dial.address == NULL) {
62500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
62600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
62700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6283a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
62974fa38884320698c1623764850e3131b9769dff0Wink Saville        uusPresent = 0;
6307bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
63174fa38884320698c1623764850e3131b9769dff0Wink Saville    } else {
63274fa38884320698c1623764850e3131b9769dff0Wink Saville        status = p.readInt32(&uusPresent);
63374fa38884320698c1623764850e3131b9769dff0Wink Saville
63474fa38884320698c1623764850e3131b9769dff0Wink Saville        if (status != NO_ERROR) {
63574fa38884320698c1623764850e3131b9769dff0Wink Saville            goto invalid;
63674fa38884320698c1623764850e3131b9769dff0Wink Saville        }
63774fa38884320698c1623764850e3131b9769dff0Wink Saville
63874fa38884320698c1623764850e3131b9769dff0Wink Saville        if (uusPresent == 0) {
63974fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = NULL;
64074fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
64174fa38884320698c1623764850e3131b9769dff0Wink Saville            int32_t len;
64274fa38884320698c1623764850e3131b9769dff0Wink Saville
64374fa38884320698c1623764850e3131b9769dff0Wink Saville            memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
64474fa38884320698c1623764850e3131b9769dff0Wink Saville
64574fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
64674fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusType = (RIL_UUS_Type) t;
64774fa38884320698c1623764850e3131b9769dff0Wink Saville
64874fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
64974fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusDcs = (RIL_UUS_DCS) t;
65074fa38884320698c1623764850e3131b9769dff0Wink Saville
65174fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&len);
65274fa38884320698c1623764850e3131b9769dff0Wink Saville            if (status != NO_ERROR) {
65374fa38884320698c1623764850e3131b9769dff0Wink Saville                goto invalid;
65474fa38884320698c1623764850e3131b9769dff0Wink Saville            }
65574fa38884320698c1623764850e3131b9769dff0Wink Saville
65674fa38884320698c1623764850e3131b9769dff0Wink Saville            // The java code writes -1 for null arrays
65774fa38884320698c1623764850e3131b9769dff0Wink Saville            if (((int) len) == -1) {
65874fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = NULL;
65974fa38884320698c1623764850e3131b9769dff0Wink Saville                len = 0;
66074fa38884320698c1623764850e3131b9769dff0Wink Saville            } else {
66174fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = (char*) p.readInplace(len);
66274fa38884320698c1623764850e3131b9769dff0Wink Saville            }
66374fa38884320698c1623764850e3131b9769dff0Wink Saville
66474fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusLength = len;
66574fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = &uusInfo;
66674fa38884320698c1623764850e3131b9769dff0Wink Saville        }
6677bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial);
66874fa38884320698c1623764850e3131b9769dff0Wink Saville    }
66974fa38884320698c1623764850e3131b9769dff0Wink Saville
67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
67100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
67274fa38884320698c1623764850e3131b9769dff0Wink Saville    if (uusPresent) {
67374fa38884320698c1623764850e3131b9769dff0Wink Saville        appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
67474fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusType, dial.uusInfo->uusDcs,
67574fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusLength);
67674fa38884320698c1623764850e3131b9769dff0Wink Saville    }
67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6807bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI);
68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (dial.address);
68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (dial.address);
6877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
68974fa38884320698c1623764850e3131b9769dff0Wink Saville    memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&dial, 0, sizeof(dial));
69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
7007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO *
70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t command
70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t fileid
70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String path
70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t p1, p2, p3
7067f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String data
7077f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String pin2
708c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville *   String aidPtr
70900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
711f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
712c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    union RIL_SIM_IO {
713c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v6 v6;
714c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v5 v5;
715c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } simIO;
716c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
718c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int size;
71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&simIO, 0, sizeof(simIO));
72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7237f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
7247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
726c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.command = (int)t;
72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
729c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.fileid = (int)t;
73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
731c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.path = strdupReadString(p);
73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
734c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p1 = (int)t;
73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
737c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p2 = (int)t;
73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
740c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p3 = (int)t;
74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
742c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.data = strdupReadString(p);
743c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.pin2 = strdupReadString(p);
744c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.aidPtr = strdupReadString(p);
74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
747c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
748c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
749c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
750c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        (char*)simIO.v6.data,  (char*)simIO.v6.pin2, simIO.v6.aidPtr);
75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
7537f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
75400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
75500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
758c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
759c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, size, pRI);
76000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
762c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.path);
763c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.data);
764c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.pin2);
765c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.aidPtr);
76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
768c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.path);
769c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.data);
770c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.pin2);
771c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.aidPtr);
7727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&simIO, 0, sizeof(simIO));
77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
7842458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal * Callee expects const RIL_SIM_APDU *
7852458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal * Payload is:
7862458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t sessionid
7872458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t cla
7882458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t instruction
7892458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t p1, p2, p3
7902458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   String data
7912458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal */
7922458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalstatic void
7932458d8d1e56faae7b00511ceeab19730572c22d9Shishir AgrawaldispatchSIM_APDU (Parcel &p, RequestInfo *pRI) {
7942458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    int32_t t;
7952458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status_t status;
7962458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    RIL_SIM_APDU apdu;
7972458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
7982458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memset (&apdu, 0, sizeof(RIL_SIM_APDU));
7992458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8002458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    // Note we only check status at the end. Any single failure leads to
8012458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    // subsequent reads filing.
8022458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8032458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.sessionid = (int)t;
8042458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8052458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8062458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.cla = (int)t;
8072458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8082458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8092458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.instruction = (int)t;
8102458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8112458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8122458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p1 = (int)t;
8132458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8142458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8152458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p2 = (int)t;
8162458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8172458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
8182458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p3 = (int)t;
8192458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8202458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.data = strdupReadString(p);
8212458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8222458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    startRequest;
8232458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    appendPrintBuf("%ssessionid=%d,cla=%d,ins=%d,p1=%d,p2=%d,p3=%d,data=%s",
8242458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        printBuf, apdu.sessionid, apdu.cla, apdu.instruction, apdu.p1, apdu.p2,
8252458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        apdu.p3, (char*)apdu.data);
8262458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    closeRequest;
8272458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    printRequest(pRI->token, pRI->pCI->requestNumber);
8282458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8292458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    if (status != NO_ERROR) {
8302458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        goto invalid;
8312458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    }
8322458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8332458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    s_callbacks.onRequest(pRI->pCI->requestNumber, &apdu, sizeof(RIL_SIM_APDU), pRI);
8342458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8352458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#ifdef MEMSET_FREED
8362458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memsetString(apdu.data);
8372458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#endif
8382458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    free(apdu.data);
8392458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8402458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#ifdef MEMSET_FREED
8412458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memset(&apdu, 0, sizeof(RIL_SIM_APDU));
8422458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#endif
8432458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8442458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    return;
8452458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalinvalid:
8462458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    invalidCommandBlock(pRI);
8472458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    return;
8482458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal}
8492458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8502458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
8512458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal/**
85200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo *
85300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
85400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t status/action
85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t reason
85600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t serviceCode
85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t toa
85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  String number  (0 length -> null)
85900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t timeSeconds
86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
8617f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
862f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) {
86300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_CallForwardInfo cff;
86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
86500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
86700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&cff, 0, sizeof(cff));
86800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8697f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
87200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.status = (int)t;
8737f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
87400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
87500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.reason = (int)t;
87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
87800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.serviceClass = (int)t;
87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
88000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
88100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.toa = (int)t;
88200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
88300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.number = strdupReadString(p);
88400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
88500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
88600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.timeSeconds = (int)t;
88700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
88800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
88900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
89000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
89100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
89200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // special case: number 0-length fields is null
89300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
89400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (cff.number != NULL && strlen (cff.number) == 0) {
89500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.number = NULL;
89600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
89700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
89800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
89900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
90000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.status, cff.reason, cff.serviceClass, cff.toa,
90100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)cff.number, cff.timeSeconds);
90200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
90300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
90400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
90500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI);
90600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
90700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
90800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(cff.number);
90900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
91000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
91100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (cff.number);
91200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
91300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
91400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&cff, 0, sizeof(cff));
91500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
91600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
91700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
91800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
91900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
92000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
92100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
92200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
92300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9247f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) {
92600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t len;
92700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
92800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const void *data;
92900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
93000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&len);
93100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
93200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
93300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
93400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
93500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
93600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code writes -1 for null arrays
93700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (((int)len) == -1) {
93800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        data = NULL;
93900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        len = 0;
9407f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    }
94100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
94200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    data = p.readInplace(len);
94300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
94400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
94500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sraw_size=%d", printBuf, len);
94600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
94700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
94800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
94900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI);
95000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
95100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
95200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
95300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
95400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
95500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
95600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
957a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic status_t
958a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowaconstructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) {
959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
9647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uTeleserviceID = (int) t;
969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
971f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.bIsServicePresent = (uint8_t) ut;
972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
973f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
974f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uServicecategory = (int) t;
975f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
977f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
979f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
980f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
981f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
982f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
984f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
985f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
987f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
988f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
989f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_of_digits= (uint8_t) ut;
990f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
991f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
992f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
994f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
995f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
996f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
998f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
999f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
10007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.read(&ut,sizeof(ut));
1001f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.odd = (uint8_t) ut;
1002f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1003f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
1004f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
1005f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1006f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
10077f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
10087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut,sizeof(ut));
1009f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
1010f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1011f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
10127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uBearerDataLen = (int) t;
1014f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
10167f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
10177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut, sizeof(ut));
1018f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.aBearerData[digitCount] = (uint8_t) ut;
1019f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1020f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1021f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1022a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        return status;
1023f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1024f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1025f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
1026f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
10271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
10291b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
1030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
10317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
1032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1034a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return status;
1035a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1036a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1037a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1038a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
1039a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_CDMA_SMS_Message rcsm;
1040a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1041a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchCdmaSms");
1042a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1043a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1044a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1045a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1046f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI);
1047f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1048f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1049f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
1050f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1053f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1054f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1056f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1057f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1058f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
10597f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
1060a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1061a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_IMS_SMS_Message rism;
1062a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_CDMA_SMS_Message rcsm;
1063a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1064a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef);
1065a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1066a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1067a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1068a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1069a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1070a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.tech = RADIO_TECH_3GPP2;
1071a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.retry = retry;
1072a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.messageRef = messageRef;
1073a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.message.cdmaMessage = &rcsm;
1074a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1075a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    s_callbacks.onRequest(pRI->pCI->requestNumber, &rism,
1076a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
1077a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            +sizeof(rcsm),pRI);
1078a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1079a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1080a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rcsm, 0, sizeof(rcsm));
1081a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1082a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1083a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1084a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1085a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1086a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1087a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1088a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1089a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1090a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1091a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1092a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1093a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_IMS_SMS_Message rism;
1094a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t countStrings;
1095a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status_t status;
1096a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    size_t datalen;
1097a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    char **pStrings;
1098a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef);
1099a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1100a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.readInt32 (&countStrings);
1101a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1102a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1103a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1104a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1105a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1106a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1107a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.tech = RADIO_TECH_3GPP;
1108a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.retry = retry;
1109a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.messageRef = messageRef;
1110a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1111a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    startRequest;
11125d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen    appendPrintBuf("%stech=%d, retry=%d, messageRef=%d, ", printBuf,
11135d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen                    (int)rism.tech, (int)rism.retry, rism.messageRef);
1114a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (countStrings == 0) {
1115a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        // just some non-null pointer
1116a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = (char **)alloca(sizeof(char *));
1117a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = 0;
1118a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else if (((int)countStrings) == -1) {
1119a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = NULL;
1120a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = 0;
1121a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else {
1122a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = sizeof(char *) * countStrings;
1123a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1124a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = (char **)alloca(datalen);
1125a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1126a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        for (int i = 0 ; i < countStrings ; i++) {
1127a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            pStrings[i] = strdupReadString(p);
1128a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
1129a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        }
1130a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1131a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    removeLastChar;
1132a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    closeRequest;
1133a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    printRequest(pRI->token, pRI->pCI->requestNumber);
1134a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1135a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.message.gsmMessage = pStrings;
1136a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    s_callbacks.onRequest(pRI->pCI->requestNumber, &rism,
1137a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
1138a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            +datalen, pRI);
1139a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1140a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (pStrings != NULL) {
1141a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        for (int i = 0 ; i < countStrings ; i++) {
1142a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1143a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            memsetString (pStrings[i]);
1144a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1145a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            free(pStrings[i]);
1146a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        }
1147a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1148a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1149a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        memset(pStrings, 0, datalen);
1150a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1151a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1152a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1153a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1154a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1155a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1156a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1157a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1158a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGE("dispatchImsGsmSms invalid block");
1159a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1160a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1161a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1162a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1163a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1164a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsSms(Parcel &p, RequestInfo *pRI) {
1165a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t  t;
1166a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status_t status = p.readInt32(&t);
1167a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_RadioTechnologyFamily format;
1168a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    uint8_t retry;
1169a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t messageRef;
1170a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1171a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsSms");
1172a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1173a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1174a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1175a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    format = (RIL_RadioTechnologyFamily) t;
1176a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1177a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    // read retry field
1178a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.read(&retry,sizeof(retry));
1179a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1180a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1181a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1182a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    // read messageRef field
1183a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.read(&messageRef,sizeof(messageRef));
1184a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1185a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1186a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1187a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1188a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (RADIO_TECH_3GPP == format) {
1189a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        dispatchImsGsmSms(p, pRI, retry, messageRef);
1190a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else if (RADIO_TECH_3GPP2 == format) {
1191a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        dispatchImsCdmaSms(p, pRI, retry, messageRef);
1192a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else {
1193a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        ALOGE("requestImsSendSMS invalid format value =%d", format);
1194a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1195a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1196a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1197a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1198a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1199a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1200a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1201a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1202a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1203a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1204f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
1205f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Ack rcsa;
1206f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1208f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
1209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
1211f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1212f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
1214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1215f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1216f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uSMSCauseCode = (int) t;
1217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1220f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1221f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
12231b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
12241b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
1225f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1227f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1228f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1229f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI);
1230f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1231f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1232f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
1233f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1235f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1236f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1237f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1238f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1240f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1241f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1242a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1243a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1244a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1245f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1246a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1247f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1248a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1249a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1250a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1251a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1252f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
125396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
125496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
125596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
1256f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
125796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
125896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
125996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBciPtrs[i] = &gsmBci[i];
1260f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
126196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
126296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromServiceId = (int) t;
1263f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
126496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
126596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toServiceId = (int) t;
1266f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
126796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
126896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromCodeScheme = (int) t;
1269f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
127096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
127196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toCodeScheme = (int) t;
1272a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
127396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
127496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].selected = (uint8_t) t;
1275a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
127696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
127796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
127896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
127996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
128096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].selected);
128196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
128296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1283f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
128496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
128596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
128696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
128896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        s_callbacks.onRequest(pRI->pCI->requestNumber,
128996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              gsmBciPtrs,
129096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
129196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              pRI);
1292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1293f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
129496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
129596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
1296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
129796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1298f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1299f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1301f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1302f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1303f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1304f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1306a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1307f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1308a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1309f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1310a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1311f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1312a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1313a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1314a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1315a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1316a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
131796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
131896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
131996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
1320a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
132196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
132296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
132396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBciPtrs[i] = &cdmaBci[i];
1324f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
132596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
132696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].service_category = (int) t;
1327f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
132896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
132996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].language = (int) t;
1330f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
133196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
133296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].selected = (uint8_t) t;
1333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
133496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: service_category=%d, language =%d, \
133596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
133696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  cdmaBci[i].language, cdmaBci[i].selected);
133796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
133896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1339f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
134096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
134196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
134296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1343f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
134496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        s_callbacks.onRequest(pRI->pCI->requestNumber,
134596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              cdmaBciPtrs,
134696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
134796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              pRI);
1348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1349f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
135096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
135196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
1352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
135396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1359f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1361f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1362f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_WriteArgs rcsw;
1364f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1365f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint32_t ut;
1366f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t  uct;
1367f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1368f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  digitCount;
1369f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1372f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1373f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.status = t;
1374a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1375f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1376f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uTeleserviceID = (int) t;
1377f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1378f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1379f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.bIsServicePresent = (uint8_t) uct;
1380f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1381f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1382f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uServicecategory = (int) t;
1383f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1384f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1385f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1386f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1387f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1388f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1389f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1390f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1391f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1392f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1393f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1394f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1395f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1396f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1397f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1398f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1399f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
1400f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1401f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1402f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1403f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1404a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1405f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1406f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1407a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.read(&uct,sizeof(uct));
1408f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.odd = (uint8_t) uct;
1409f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1410f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1411f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1412f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1413f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
1414a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct,sizeof(uct));
1415f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1416f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1417f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1418a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1419f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uBearerDataLen = (int) t;
1420f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1421f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
1422a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct, sizeof(uct));
1423f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1424f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1425f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1426f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1427f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1428f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1429f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1430f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
14311b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
14321b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
14331b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_mode=%d, \
14341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_type=%d, ",
1435f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
14361b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
14371b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_mode,
14381b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_type);
1439f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1440f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1441f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1442f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1443f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI);
1444f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1445f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1446f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1447f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1448f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1449f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1450f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1451f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1452f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1453f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1454f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1455f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1456f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
14574f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
14584f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support
14594f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of
14604f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request.
14614f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
14624f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
14634f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    const int numParamsRilV3 = 6;
14644f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
14654f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // The first bytes of the RIL parcel contain the request number and the
14664f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // serial number - see processCommandBuffer(). Copy them over too.
14674f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int pos = p.dataPosition();
14684f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
14694f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int numParams = p.readInt32();
14704f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
14714f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      Parcel p2;
14724f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.appendFrom(&p, 0, pos);
14734f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.writeInt32(numParamsRilV3);
14744f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      for(int i = 0; i < numParamsRilV3; i++) {
14754f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti        p2.writeString16(p.readString16());
14764f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      }
14774f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.setDataPosition(pos);
14784f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p2, pRI);
14794f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    } else {
148057ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti      p.setDataPosition(pos);
14814f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p, pRI);
14824f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    }
14834f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti}
14844f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
14852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH.
14862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
14872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
14882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
14892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState state = s_callbacks.onStateRequest();
14902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
14912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
14922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
14932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
14942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
14952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
14962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
14972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
14982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
14992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
15002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
15022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode Voice Radio Technology
15032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
15042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    voiceRadioTech = decodeVoiceRadioTechnology(state);
15052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (voiceRadioTech < 0)
15072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
15082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
15092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int));
15102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
15112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:.
15132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
15142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
15152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) {
15162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState state = s_callbacks.onStateRequest();
15172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
15192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
15202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
15212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
15232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
15242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
15252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
15262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
15272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
15292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode CDMA Subscription Source
15302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
15312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state);
15322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
15332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (cdmaSubscriptionSource < 0)
15342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
15352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
15362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int));
15372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
15382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
153975697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
154075697538e485ea2981960dcd4878bfdd032731acSungmin Choi{
154175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    RIL_InitialAttachApn pf;
154275697538e485ea2981960dcd4878bfdd032731acSungmin Choi    int32_t  t;
154375697538e485ea2981960dcd4878bfdd032731acSungmin Choi    status_t status;
154475697538e485ea2981960dcd4878bfdd032731acSungmin Choi
154575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memset(&pf, 0, sizeof(pf));
154675697538e485ea2981960dcd4878bfdd032731acSungmin Choi
154775697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.apn = strdupReadString(p);
154875697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.protocol = strdupReadString(p);
154975697538e485ea2981960dcd4878bfdd032731acSungmin Choi
155075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    status = p.readInt32(&t);
155175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.authtype = (int) t;
155275697538e485ea2981960dcd4878bfdd032731acSungmin Choi
155375697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.username = strdupReadString(p);
155475697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.password = strdupReadString(p);
155575697538e485ea2981960dcd4878bfdd032731acSungmin Choi
155675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    startRequest;
15575d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen    appendPrintBuf("%sapn=%s, protocol=%s, authtype=%d, username=%s, password=%s",
15585d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen            printBuf, pf.apn, pf.protocol, pf.authtype, pf.username, pf.password);
155975697538e485ea2981960dcd4878bfdd032731acSungmin Choi    closeRequest;
156075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    printRequest(pRI->token, pRI->pCI->requestNumber);
156175697538e485ea2981960dcd4878bfdd032731acSungmin Choi
156275697538e485ea2981960dcd4878bfdd032731acSungmin Choi    if (status != NO_ERROR) {
156375697538e485ea2981960dcd4878bfdd032731acSungmin Choi        goto invalid;
156475697538e485ea2981960dcd4878bfdd032731acSungmin Choi    }
156575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    s_callbacks.onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
156675697538e485ea2981960dcd4878bfdd032731acSungmin Choi
156775697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED
156875697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.apn);
156975697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.protocol);
157075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.username);
157175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.password);
157275697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif
157375697538e485ea2981960dcd4878bfdd032731acSungmin Choi
157475697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.apn);
157575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.protocol);
157675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.username);
157775697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.password);
157875697538e485ea2981960dcd4878bfdd032731acSungmin Choi
157975697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED
158075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memset(&pf, 0, sizeof(pf));
158175697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif
158275697538e485ea2981960dcd4878bfdd032731acSungmin Choi
158375697538e485ea2981960dcd4878bfdd032731acSungmin Choi    return;
158475697538e485ea2981960dcd4878bfdd032731acSungmin Choiinvalid:
158575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    invalidCommandBlock(pRI);
158675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    return;
158775697538e485ea2981960dcd4878bfdd032731acSungmin Choi}
158875697538e485ea2981960dcd4878bfdd032731acSungmin Choi
15898a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVReadItem(Parcel &p, RequestInfo *pRI) {
15908a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    RIL_NV_ReadItem nvri;
15918a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    int32_t  t;
15928a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status_t status;
15938a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
15948a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvri, 0, sizeof(nvri));
15958a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
15968a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status = p.readInt32(&t);
15978a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvri.itemID = (RIL_NV_Item) t;
15988a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
15998a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    if (status != NO_ERROR) {
16008a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby        goto invalid;
16018a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    }
16028a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16038a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    startRequest;
16048a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    appendPrintBuf("%snvri.itemID=%d, ", printBuf, nvri.itemID);
16058a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    closeRequest;
16068a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16078a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    printRequest(pRI->token, pRI->pCI->requestNumber);
16088a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16098a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    s_callbacks.onRequest(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI);
16108a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16118a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
16128a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvri, 0, sizeof(nvri));
16138a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
16148a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16158a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
16168a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16178a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambyinvalid:
16188a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    invalidCommandBlock(pRI);
16198a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
16208a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby}
16218a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16228a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI) {
16238a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    RIL_NV_WriteItem nvwi;
16248a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    int32_t  t;
16258a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status_t status;
16268a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16278a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvwi, 0, sizeof(nvwi));
16288a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16298a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status = p.readInt32(&t);
16308a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvwi.itemID = (RIL_NV_Item) t;
16318a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16328a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvwi.value = strdupReadString(p);
16338a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16348a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    if (status != NO_ERROR || nvwi.value == NULL) {
16358a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby        goto invalid;
16368a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    }
16378a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16388a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    startRequest;
16398a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    appendPrintBuf("%snvwi.itemID=%d, value=%s, ", printBuf, nvwi.itemID,
16408a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby            nvwi.value);
16418a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    closeRequest;
16428a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16438a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    printRequest(pRI->token, pRI->pCI->requestNumber);
16448a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16458a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    s_callbacks.onRequest(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI);
16468a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16478a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
16488a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memsetString(nvwi.value);
16498a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
16508a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16518a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    free(nvwi.value);
16528a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16538a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
16548a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvwi, 0, sizeof(nvwi));
16558a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
16568a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16578a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
16588a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16598a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambyinvalid:
16608a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    invalidCommandBlock(pRI);
16618a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
16628a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby}
16638a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
16648a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
166500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1666f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) {
16677f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    size_t writeOffset = 0;
166800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const uint8_t *toWrite;
166900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
167000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    toWrite = (const uint8_t *)buffer;
167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
167200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (writeOffset < len) {
167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ssize_t written;
167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        do {
167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            written = write (fd, toWrite + writeOffset,
167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                len - writeOffset);
1677388849057a8cc91dbc3fff357d2df524ffec9a4dBanavathu, Srinivas Naik        } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
167800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (written >= 0) {
168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeOffset += written;
168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {   // written < 0
16828eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(fd);
168400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return -1;
168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
168800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
169000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1692f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) {
169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int fd = s_fdCommand;
169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
169500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    uint32_t header;
169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0) {
169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
169900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (dataSize > MAX_COMMAND_BYTES) {
17028eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL: packet larger than %u (%u)",
170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                MAX_COMMAND_BYTES, (unsigned int )dataSize);
170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
17077f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_writeMutex);
170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    header = htonl(dataSize);
171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = blockingWrite(fd, (void *)&header, sizeof(header));
171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1715084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
171600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
171800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1719ee1fadc192a63724e416b05666844a62d1e75d38Kenny    ret = blockingWrite(fd, data, dataSize);
172000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
172100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1722084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
172300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
172400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
172500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
172600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_writeMutex);
172700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
172800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
172900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
173000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
173100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1732f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) {
173300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printResponse;
173400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return sendResponseRaw(p.data(), p.dataSize());
173500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
173600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
173774f7e667381fae533f70843ea952db04bd2adc36Mohamad Ayyash/** response is an int* pointing to an array of ints */
17387f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
17397f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int
1740f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) {
174100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numInts;
174200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
174300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
17448eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
174500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
174600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
174700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(int) != 0) {
17488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
174900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(int));
175000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
175100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
175200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
175300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *p_int = (int *) response;
175400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
175574f7e667381fae533f70843ea952db04bd2adc36Mohamad Ayyash    numInts = responselen / sizeof(int);
175600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (numInts);
175700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
175800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* each int*/
175900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
176000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < numInts ; i++) {
176100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, p_int[i]);
176200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_int[i]);
176300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
176400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
176500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
176600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
176700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
176800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
176900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17704380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s
17714380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    The parcel will begin with the version */
17724380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
17734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(version);
17744380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return responseStrings(p, response, responselen);
17754380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
17764380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
177700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */
1778f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) {
177900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numStrings;
17807f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
178100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
17828eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
178300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
178400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
178500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(char *) != 0) {
17868eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
178700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(char *));
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 (response == NULL) {
179200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (0);
179300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char **p_cur = (char **) response;
179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        numStrings = responselen / sizeof(char *);
179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (numStrings);
179800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each string*/
180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        startResponse;
180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < numStrings ; i++) {
180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
180300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeStringToParcel (p, p_cur[i]);
180400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
180500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        removeLastChar;
180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        closeResponse;
180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
181000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
18137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted
181400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen
181500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
1816f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) {
181700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* one string only */
181800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
181900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, (char*)response);
182000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
182100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
182200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, (const char *)response);
182300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
182400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
182500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
182600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1827f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) {
182800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
182900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
183000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
183100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
183200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1833f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) {
183400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
183500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
183600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
18378eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
183800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
183900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
184000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
184100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_Call *) != 0) {
18428eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
184300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_Call *));
184400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
184500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
184600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
184700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
184800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
184900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_Call *);
185000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
185100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
185200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
185300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_Call *p_cur = ((RIL_Call **) response)[i];
185400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each call info */
185500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->state);
185600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->index);
185700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
185800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMpty);
185900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMT);
186000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->als);
186100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isVoice);
18621b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoicePrivacy);
18631b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->number);
18641b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->numberPresentation);
18651b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->name);
18661b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->namePresentation);
18673a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville        // Remove when partners upgrade to version 3
186874fa38884320698c1623764850e3131b9769dff0Wink Saville        if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
186974fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(0); /* UUS Information is absent */
187074fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
187174fa38884320698c1623764850e3131b9769dff0Wink Saville            RIL_UUS_Info *uusInfo = p_cur->uusInfo;
187274fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(1); /* UUS Information is present */
187374fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusType);
187474fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusDcs);
187574fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusLength);
187674fa38884320698c1623764850e3131b9769dff0Wink Saville            p.write(uusInfo->uusData, uusInfo->uusLength);
187774fa38884320698c1623764850e3131b9769dff0Wink Saville        }
18783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,",
18791b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf,
18801b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
18811b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            callStateToString(p_cur->state),
18823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->toa);
18833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
18843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
18851b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
18861b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMT)?"mt":"mo",
18871b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->als,
18881b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoice)?"voc":"nonvoc",
18893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp");
18903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
18913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
18921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
18931b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
18941b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
18951b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
189600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
189700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
189800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
189900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
190000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
190100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
190200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1903f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) {
190400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
19058eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
190600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
190700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
190800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
190900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SMS_Response) ) {
19108eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected %d",
191100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SMS_Response));
191200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
191300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
191400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
191600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->messageRef);
191800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->ackPDU);
1919920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    p.writeInt32(p_cur->errorCode);
192000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
192100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
1922920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
1923920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh        (char*)p_cur->ackPDU, p_cur->errorCode);
192400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
192500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
192600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
192700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
192800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1929c0114b325877907fcdf7a5baa24e54a752e7e58bWink Savillestatic int responseDataCallListV4(Parcel &p, void *response, size_t responselen)
193000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
193100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
19328eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
193300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
193400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
193500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1936c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) {
19378eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d",
1938c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4));
193900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
194000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
194100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1942c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int num = responselen / sizeof(RIL_Data_Call_Response_v4);
194300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
194400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1945c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response;
194600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
194700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int i;
194800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (i = 0; i < num; i++) {
194900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].cid);
195000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].active);
195100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].type);
1952c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        // apn is not used, so don't send.
195300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].address);
1954c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf,
195500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur[i].cid,
195600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur[i].active==0)?"down":"up",
195700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].type,
195800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].address);
195900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
196000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
196100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
196200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
196400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
196500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19664380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen)
19674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
19684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    // Write version
19694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(s_callbacks.version);
19704380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
19714380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
1972c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        return responseDataCallListV4(p, response, responselen);
19734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
19744380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        if (response == NULL && responselen != 0) {
19758eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("invalid response: NULL");
19764380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
19774380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
19784380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1979c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) {
19808eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("invalid response length %d expected multiple of %d",
1981c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                    (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6));
19824380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
19834380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
19844380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1985c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        int num = responselen / sizeof(RIL_Data_Call_Response_v6);
19864380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        p.writeInt32(num);
19874380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1988c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response;
19894380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        startResponse;
19904380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        int i;
19914380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        for (i = 0; i < num; i++) {
19924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32((int)p_cur[i].status);
1993beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo            p.writeInt32(p_cur[i].suggestedRetryTime);
19944380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].cid);
19954380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].active);
1996af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner            writeStringToParcel(p, p_cur[i].type);
19974380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].ifname);
19984380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].addresses);
19994380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].dnses);
2000c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            writeStringToParcel(p, p_cur[i].gateways);
200156384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla            appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf,
20024380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].status,
2003beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo                p_cur[i].suggestedRetryTime,
20044380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].cid,
20054380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (p_cur[i].active==0)?"down":"up",
200656384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla                (char*)p_cur[i].type,
20074380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].ifname,
20084380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].addresses,
2009c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (char*)p_cur[i].dnses,
2010c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (char*)p_cur[i].gateways);
20114380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
20124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        removeLastChar;
20134380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        closeResponse;
20144380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
20154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
20164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return 0;
20174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
20184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
20194380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
20204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
20214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
20224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
20234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
20244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseDataCallList(p, response, responselen);
20254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
20264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
20274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
2028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) {
202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
20308eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL with responselen != 0");
203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
203300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code reads -1 size as null byte array
203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
20367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        p.writeInt32(-1);
203700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(responselen);
203900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.write(response, responselen);
204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
204300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
204400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
204500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2046f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
204700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
20488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
204900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
205000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
205100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
205200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SIM_IO_Response) ) {
20538eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
205400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
205500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
205600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
205700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
205800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
205900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw1);
206000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw2);
206100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->simResponse);
206200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
206400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
206500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->simResponse);
206600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
206700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
207000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
207100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2072f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) {
207300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
20747f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
207500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
20768eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
207700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
207800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
207900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
208000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
20818eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d",
208200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
208300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
208400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
208500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
208600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
208700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_CallForwardInfo *);
208800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
208900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
209000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
209100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
209200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
209300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
209400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->status);
209500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->reason);
209600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->serviceClass);
209700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
209800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur->number);
209900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->timeSeconds);
210000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
210100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->status==1)?"enable":"disable",
210200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->reason, p_cur->serviceClass, p_cur->toa,
210300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur->number,
210400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->timeSeconds);
210500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
210600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
210700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
21087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
210900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
211000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
211100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2112f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) {
211300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
21148eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
211500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
211600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
211700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
211800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof(RIL_SuppSvcNotification)) {
21198eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
212000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
212100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
212200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
212300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
212500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->notificationType);
212600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->code);
212700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->index);
212800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->type);
212900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->number);
213000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
213200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
213300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (p_cur->notificationType==0)?"mo":"mt",
213400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         p_cur->code, p_cur->index, p_cur->type,
213500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->number);
213600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
213700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
213900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
214000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
21413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) {
214200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
214300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
21458eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
214600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
214700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
214800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
21508eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
215100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_NeighboringCell *));
215200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
215300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
215400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
21563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    /* number of records */
215700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_NeighboringCell *);
215800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
215900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
216100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
216200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->rssi);
216400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->cid);
216500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
216700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->cid, p_cur->rssi);
216800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
216900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
217000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
217100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
217200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
217300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
217400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
21753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/**
21763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists.
21773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */
2178a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p,
2179a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
21803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.isPresent);
21813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signalType);
21823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.alertPitch);
21833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signal);
21843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
21853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2186a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p,
2187a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            void *response, size_t responselen) {
21883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    int num;
2189a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    char* string8 = NULL;
2190a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int buffer_lenght;
2191a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecord *infoRec;
21923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
21933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
21948eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
21953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
21963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
21973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2198a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
21998eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected multiple of %d\n",
2200a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
22013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
22023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
22033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2204a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecords *p_cur =
2205a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                             (RIL_CDMA_InformationRecords *) response;
2206a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
22073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
22083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
2209a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
22103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2211a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++) {
2212a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        infoRec = &p_cur->infoRec[i];
2213a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(infoRec->name);
2214a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        switch (infoRec->name) {
22153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_DISPLAY_INFO_REC:
2216a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
2217a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.display.alpha_len >
2218a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                         CDMA_ALPHA_INFO_BUFFER_LENGTH) {
22198eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2220a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2221a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.display.alpha_len,
2222a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_ALPHA_INFO_BUFFER_LENGTH);
2223a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
22243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
2225a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1)
2226a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
2227a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
2228a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.display.alpha_buf[i];
22293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
22304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.display.alpha_len] = '\0';
2231a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2232a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2233a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
22343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
2235a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
22363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
22373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
2238a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
22398eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2240a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2241a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.number.len,
2242a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
2243a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
22443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
2245a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.number.len + 1)
2246a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
2247a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.number.len; i++) {
2248a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.number.buf[i];
2249a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
22504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.number.len] = '\0';
2251a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2252a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2253a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
2254a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_type);
2255a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_plan);
2256a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.pi);
2257a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.si);
22583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
22593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_SIGNAL_INFO_REC:
2260a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.isPresent);
2261a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signalType);
2262a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.alertPitch);
2263a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signal);
2264a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2265a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%sisPresent=%X, signalType=%X, \
2266a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                alertPitch=%X, signal=%X, ",
2267a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   printBuf, (int)infoRec->rec.signal.isPresent,
2268a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signalType,
2269a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.alertPitch,
2270a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signal);
2271a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
22723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
22733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
2274a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.redir.redirectingNumber.len >
2275a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                              CDMA_NUMBER_INFO_BUFFER_LENGTH) {
22768eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2277a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2278a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.redir.redirectingNumber.len,
2279a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
2280a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
2281a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
2282a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber
2283a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                          .len + 1) * sizeof(char) );
2284a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0;
2285a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i < infoRec->rec.redir.redirectingNumber.len;
2286a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i++) {
2287a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
22883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
22894380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
2290a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2291a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2292a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
2293a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
2294a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
2295a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
2296a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
2297a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingReason);
22983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
22993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_LINE_CONTROL_INFO_REC:
2300a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
2301a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
2302a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
2303a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2304a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2305a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
2306a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlToggle=%d, lineCtrlReverse=%d, \
2307a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlPowerDenial=%d, ", printBuf,
2308a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
2309a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlToggle,
2310a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlReverse,
2311a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2312a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
23133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
23143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_CLIR_INFO_REC:
2315a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32((int)(infoRec->rec.clir.cause));
23163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2317a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
2318a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
23193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
23203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
2321a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.upLink);
2322a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.downLink);
2323a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2324a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
2325a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.upLink,
2326a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.downLink);
2327a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
23283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
2329a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_T53_RELEASE_INFO_REC:
2330a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                // TODO(Moto): See David Krause, he has the answer:)
23318eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
2332a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
2333a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            default:
23348eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("Incorrect name value");
2335a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
23363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        }
23373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
2338a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
23393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2340a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    return 0;
23413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
23423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2343a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p,
2344a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    void *response, size_t responselen) {
2345a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (response == NULL && responselen != 0) {
23468eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
23473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
23483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
23493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2350c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof (RIL_SignalStrength_v5)) {
2351c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SignalStrength_v6 *p_cur = ((RIL_SignalStrength_v6 *) response);
23523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
23533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
23543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
23553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
23563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
23573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
23583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
23593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
2360c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        if (responselen >= sizeof (RIL_SignalStrength_v6)) {
23619efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam            /*
236218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville             * Fixup LTE for backwards compatibility
23639efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam             */
236418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            if (s_callbacks.version <= 6) {
236518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // signalStrength: -1 -> 99
236618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.signalStrength == -1) {
236718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.signalStrength = 99;
236818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
236918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrp: -1 -> INT_MAX all other negative value to positive.
237018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // So remap here
237118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrp == -1) {
237218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = INT_MAX;
237318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
237418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
237518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
237618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrq: -1 -> INT_MAX
237718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrq == -1) {
237818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrq = INT_MAX;
237918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
238018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // Not remapping rssnr is already using INT_MAX
23819efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam
238218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // cqi: -1 -> INT_MAX
238318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.cqi == -1) {
238418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.cqi = INT_MAX;
238518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
238618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            }
238718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
2388c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
2389c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
2390c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
2391c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.cqi);
2392c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        } else {
239318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(99);
239418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
239518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
239618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
239718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
2398c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        }
2399fdf825f9d0dc639787b8523638bb61874ed0b540johnwang
2400fdf825f9d0dc639787b8523638bb61874ed0b540johnwang        startResponse;
2401a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
2402c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
2403c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
2404c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.signalNoiseRatio=%d,\
2405c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
2406c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                LTE_SS.rssnr=%d,LTE_SS.cqi=%d]",
2407a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf,
2408a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.signalStrength,
2409a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.bitErrorRate,
2410a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.dbm,
2411a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.ecio,
2412a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.dbm,
2413a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.ecio,
2414c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->EVDO_SignalStrength.signalNoiseRatio,
2415c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.signalStrength,
2416c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrp,
2417c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrq,
2418c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rssnr,
2419c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.cqi);
2420a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        closeResponse;
2421a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
24223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
24238eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length");
24243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
24253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
24283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
24293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) {
24313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if ((response == NULL) || (responselen == 0)) {
24323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseVoid(p, response, responselen);
24333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
24343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseCdmaSignalInfoRecord(p, response, responselen);
24353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
24373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
24393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL || responselen == 0) {
24408eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
24413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
24423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
24458eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
24463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
24473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
24483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
24513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
24533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, *p_cur);
24543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
24563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              signal=%d]",
24573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              printBuf,
24583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->isPresent,
24593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signalType,
24603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->alertPitch,
24613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signal);
24623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
24633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
24643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
24653d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
24663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2467a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response,
2468a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            size_t responselen) {
24693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
24708eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
24713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
24723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2474c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
24758eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
24763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
24773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2478c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
24793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2480c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->number);
24813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_cur->numberPresentation);
2482c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->name);
24833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
24843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2485c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
2486c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_type);
2487c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_plan);
2488c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } else {
2489c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2490c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2491c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    }
2492c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
2493c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    startResponse;
24943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
24953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
2496c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            signal=%d,number_type=%d,number_plan=%d]",
24973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
24983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->number,
24993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->numberPresentation,
25003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->name,
25013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.isPresent,
25023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.signalType,
25033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.alertPitch,
2504c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->signalInfoRecord.signal,
2505c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_type,
2506c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_plan);
25073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
25083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
25093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
25103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
25113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
251245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen) {
251345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (response == NULL && responselen != 0) {
25148eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimRefresh: invalid response: NULL");
251545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        return RIL_ERRNO_INVALID_RESPONSE;
251645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
251745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
251845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    startResponse;
251945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (s_callbacks.version == 7) {
252045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
252145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->result);
252245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->ef_id);
252345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, p_cur->aid);
252445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
252545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
252645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
252745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->result,
252845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->ef_id,
252945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->aid);
253045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    } else {
253145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        int *p_cur = ((int *) response);
253245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[0]);
253345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[1]);
253445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, NULL);
253545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
253645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d",
253745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
253845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[0],
253945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[1]);
254045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
254145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    closeResponse;
254245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
254345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    return 0;
254445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka}
254545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
25468a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen)
25478a9e02161271505de274db0c3a88087056dd5dfcWink Saville{
25488a9e02161271505de274db0c3a88087056dd5dfcWink Saville    if (response == NULL && responselen != 0) {
25498a9e02161271505de274db0c3a88087056dd5dfcWink Saville        RLOGE("invalid response: NULL");
25508a9e02161271505de274db0c3a88087056dd5dfcWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
25518a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
25528a9e02161271505de274db0c3a88087056dd5dfcWink Saville
25538a9e02161271505de274db0c3a88087056dd5dfcWink Saville    if (responselen % sizeof(RIL_CellInfo) != 0) {
25548a9e02161271505de274db0c3a88087056dd5dfcWink Saville        RLOGE("invalid response length %d expected multiple of %d",
25558a9e02161271505de274db0c3a88087056dd5dfcWink Saville                (int)responselen, (int)sizeof(RIL_CellInfo));
25568a9e02161271505de274db0c3a88087056dd5dfcWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
25578a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
25588a9e02161271505de274db0c3a88087056dd5dfcWink Saville
25598a9e02161271505de274db0c3a88087056dd5dfcWink Saville    int num = responselen / sizeof(RIL_CellInfo);
25608a9e02161271505de274db0c3a88087056dd5dfcWink Saville    p.writeInt32(num);
25618a9e02161271505de274db0c3a88087056dd5dfcWink Saville
25628a9e02161271505de274db0c3a88087056dd5dfcWink Saville    RIL_CellInfo *p_cur = (RIL_CellInfo *) response;
25638a9e02161271505de274db0c3a88087056dd5dfcWink Saville    startResponse;
25648a9e02161271505de274db0c3a88087056dd5dfcWink Saville    int i;
25658a9e02161271505de274db0c3a88087056dd5dfcWink Saville    for (i = 0; i < num; i++) {
25668a9e02161271505de274db0c3a88087056dd5dfcWink Saville        appendPrintBuf("%s[%d: type=%d,registered=%d,timeStampType=%d,timeStamp=%lld", printBuf, i,
25678a9e02161271505de274db0c3a88087056dd5dfcWink Saville            p_cur->cellInfoType, p_cur->registered, p_cur->timeStampType, p_cur->timeStamp);
25688a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32((int)p_cur->cellInfoType);
25698a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32(p_cur->registered);
25708a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32(p_cur->timeStampType);
25718a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt64(p_cur->timeStamp);
25728a9e02161271505de274db0c3a88087056dd5dfcWink Saville        switch(p_cur->cellInfoType) {
25738a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_GSM: {
2574c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s GSM id: mcc=%d,mnc=%d,lac=%d,cid=%d,", printBuf,
25758a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.mcc,
25768a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.mnc,
25778a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.lac,
2578c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.cid);
2579c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s gsmSS: ss=%d,ber=%d],", printBuf,
25808a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength,
25818a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
25828a9e02161271505de274db0c3a88087056dd5dfcWink Saville
25838a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
25848a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
25858a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
25868a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
25878a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
25888a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
25898a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
25908a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
2591c57b3eb525db241bd3e6092453f48388bc880447Wink Saville            case RIL_CELL_INFO_TYPE_WCDMA: {
2592c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s WCDMA id: mcc=%d,mnc=%d,lac=%d,cid=%d,psc=%d,", printBuf,
2593c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc,
2594c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc,
2595c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.lac,
2596c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.cid,
2597c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
2598c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s wcdmaSS: ss=%d,ber=%d],", printBuf,
2599c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength,
2600c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
2601c57b3eb525db241bd3e6092453f48388bc880447Wink Saville
2602c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
2603c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
2604c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
2605c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
2606c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
2607c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
2608c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
2609c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                break;
2610c57b3eb525db241bd3e6092453f48388bc880447Wink Saville            }
26118a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_CDMA: {
26128a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s CDMA id: nId=%d,sId=%d,bsId=%d,long=%d,lat=%d", printBuf,
26138a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.networkId,
26148a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.systemId,
26158a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.basestationId,
26168a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.longitude,
26178a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
26188a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26198a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
26208a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
26218a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
26228a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
26238a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
26248a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26258a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s cdmaSS: dbm=%d ecio=%d evdoSS: dbm=%d,ecio=%d,snr=%d", printBuf,
26268a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthCdma.dbm,
26278a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthCdma.ecio,
26288a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.dbm,
26298a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.ecio,
26308a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
26318a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26328a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
26338a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
26348a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
26358a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
26368a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
26378a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
26388a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
26398a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_LTE: {
26408a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s LTE id: mcc=%d,mnc=%d,ci=%d,pci=%d,tac=%d", printBuf,
26418a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.mcc,
26428a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.mnc,
26438a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.ci,
26448a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.pci,
26458a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.tac);
26468a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26478a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
26488a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
26498a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
26508a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
26518a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
26528a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26538a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s lteSS: ss=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,ta=%d", printBuf,
26548a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.signalStrength,
26558a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rsrp,
26568a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rsrq,
26578a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rssnr,
26588a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.cqi,
26598a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
26608a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
26618a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
26628a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
26638a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
26648a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
26658a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
26668a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
26678a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
26688a9e02161271505de274db0c3a88087056dd5dfcWink Saville        }
26698a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p_cur += 1;
26708a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
26718a9e02161271505de274db0c3a88087056dd5dfcWink Saville    removeLastChar;
26728a9e02161271505de274db0c3a88087056dd5dfcWink Saville    closeResponse;
26738a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26748a9e02161271505de274db0c3a88087056dd5dfcWink Saville    return 0;
26758a9e02161271505de274db0c3a88087056dd5dfcWink Saville}
26768a9e02161271505de274db0c3a88087056dd5dfcWink Saville
26773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() {
267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
267900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* trigger event loop to wakeup. No reason to do this,
268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         * if we're in the event loop thread */
268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         do {
268300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = write (s_fdWakeupWrite, " ", 1);
268400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         } while (ret < 0 && errno == EINTR);
268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) {
268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_add(ev);
269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2693fd7293711394c422711ff07d15a357955ff2194fWink Savillestatic void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) {
2694fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(num_apps);
2695fd7293711394c422711ff07d15a357955ff2194fWink Saville        startResponse;
2696fd7293711394c422711ff07d15a357955ff2194fWink Saville        for (int i = 0; i < num_apps; i++) {
2697fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_type);
2698fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_state);
2699fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].perso_substate);
2700fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr));
2701fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)
2702fd7293711394c422711ff07d15a357955ff2194fWink Saville                                          (appStatus[i].app_label_ptr));
2703fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1_replaced);
2704fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1);
2705fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin2);
2706fd7293711394c422711ff07d15a357955ff2194fWink Saville            appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
2707fd7293711394c422711ff07d15a357955ff2194fWink Saville                    aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
2708fd7293711394c422711ff07d15a357955ff2194fWink Saville                    printBuf,
2709fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_type,
2710fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_state,
2711fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].perso_substate,
2712fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].aid_ptr,
2713fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_label_ptr,
2714fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1_replaced,
2715fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1,
2716fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin2);
2717fd7293711394c422711ff07d15a357955ff2194fWink Saville        }
2718fd7293711394c422711ff07d15a357955ff2194fWink Saville        closeResponse;
2719fd7293711394c422711ff07d15a357955ff2194fWink Saville}
2720fd7293711394c422711ff07d15a357955ff2194fWink Saville
2721f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) {
2722f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int i;
2723f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2724f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
27258eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
2726f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2727f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2728f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
27292c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    if (responselen == sizeof (RIL_CardStatus_v6)) {
2730fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2731fd7293711394c422711ff07d15a357955ff2194fWink Saville
2732fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
2733fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
2734fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
2735fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
2736c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->ims_subscription_app_index);
2737fd7293711394c422711ff07d15a357955ff2194fWink Saville
2738fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
27392c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else if (responselen == sizeof (RIL_CardStatus_v5)) {
2740fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response);
2741fd7293711394c422711ff07d15a357955ff2194fWink Saville
2742fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
2743fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
2744fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
2745fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
2746c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(-1);
2747f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2748fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
27492c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else {
27508eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n");
27512c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2752f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2753f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
27553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
2756f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2757a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2758a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
2759f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(num);
2760f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2761f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2762a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo **p_cur =
2763a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                (RIL_GSM_BroadcastSmsConfigInfo **) response;
2764a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0; i < num; i++) {
2765a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromServiceId);
2766a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toServiceId);
2767a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromCodeScheme);
2768a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toCodeScheme);
2769a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2770a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2771a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
2772a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
2773a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
2774a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
2775a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->selected);
2776a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
2777f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2778f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2779f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2780f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2781f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2782a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2783a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
2784a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville               (RIL_CDMA_BroadcastSmsConfigInfo **) response;
2785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2786a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
2787a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
2788f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2789f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2790a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
2791a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->service_category);
2792a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->language);
2793a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2794f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2795a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
2796a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              selected =%d], ",
2797a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
2798a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              p_cur[i]->selected);
2799f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
2800a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
2801f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2802f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2803f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2804f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2805f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
2806f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
2807f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitCount;
2808f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
2809f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t uct;
2810f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    void* dest;
2811f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
28128eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("Inside responseCdmaSms");
2813f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2814f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
28158eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
2816f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2817f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2818f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2819f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
28208eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
2821f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
2822f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2823f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2824f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2825f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
2826f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uTeleserviceID);
2827f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->bIsServicePresent),sizeof(uct));
2828f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uServicecategory);
2829f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.digit_mode);
2830f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_mode);
2831f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_type);
2832f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_plan);
2833f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
2834f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
2835f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2836f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
2837f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2838f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2839f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sSubAddress.subaddressType);
2840f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
2841f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
2842f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
2843f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2844f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
2845f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2846f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2847f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
2848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uBearerDataLen);
2849f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2850f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville       p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
2851f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2852f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2853f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2854f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
28551b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
2856f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
2857f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
2858f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2859f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2860f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2861f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2862f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
286300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select()
286500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the
286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down
286700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
2868f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) {
286900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char buff[16];
287000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
287100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28728eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGV("processWakeupCallback");
287300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
287400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* empty our wakeup socket out */
287500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    do {
287600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = read(s_fdWakeupRead, &buff, sizeof(buff));
28777f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    } while (ret > 0 || (ret < 0 && errno == EINTR));
287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
287900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2880f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() {
288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *p_cur;
288300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* mark pending requests as "cancelled" so we dont report responses */
288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
288700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_cur = s_pendingRequests;
289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for (p_cur = s_pendingRequests
289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur != NULL
289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur  = p_cur->p_next
289400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p_cur->cancelled = 1;
289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
289900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) {
290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *p_record;
290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t recordlen;
290600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert(fd == s_fdCommand);
290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
291000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = (RecordStream *)param;
291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (;;) {
291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* loop until EAGAIN/EINTR, end of stream, or other error */
291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret == 0 && p_record == NULL) {
291700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* end-of-stream */
291800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret < 0) {
292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret == 0) { /* && p_record != NULL */
292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            processCommandBuffer(p_record, recordlen);
292300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* fatal error or end-of-stream */
292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret != 0) {
29298eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("error on reading command socket errno:%d\n", errno);
293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
29318eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGW("EOS.  Closing command socket.");
293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
29337f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        close(s_fdCommand);
293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_fdCommand = -1;
293600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ril_event_del(&s_commands_event);
293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        record_stream_free(p_rs);
294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        onCommandsSocketClosed();
294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() {
29505b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville    // Inform we are connected and the ril version
2951a9c18d17769ee475cf4fd5e76e18ddfa4070c7cdJake Hamby    int rilVer = s_callbacks.version;
29525b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville    RIL_onUnsolicitedResponse(RIL_UNSOL_RIL_CONNECTED,
29535b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville                                    &rilVer, sizeof(rilVer));
29545b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville
295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // implicit radio state changed
295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    NULL, 0);
295800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Send last NITZ time data, in case it was missed
296000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_lastNITZTimeData != NULL) {
296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize);
296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
296300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        free(s_lastNITZTimeData);
296400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = NULL;
296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Get version string
296800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_callbacks.getVersion != NULL) {
296900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const char *version;
297000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        version = s_callbacks.getVersion();
29718eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: %s\n", version);
29727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
297300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, version);
297400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
29758eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: unavailable\n");
297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, "unavailable");
297700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
297800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
297900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
298000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2981f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) {
298200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
298300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int err;
298400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int is_phone_socket;
298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
298800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
298900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ucred creds;
299100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t szCreds = sizeof(creds);
299200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct passwd *pwd = NULL;
299400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (s_fdCommand < 0);
299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (fd == s_fdListen);
29977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
299800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
300000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0 ) {
30018eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error on accept() errno:%d", errno);
300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
3004f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville	      return;
300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* check the credential of the other side and only accept socket from
300800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     * phone process
30097f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville     */
301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    errno = 0;
301100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    is_phone_socket = 0;
3012f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
301300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
3014f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
301500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (err == 0 && szCreds > 0) {
3016f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        errno = 0;
3017f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        pwd = getpwuid(creds.uid);
3018f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        if (pwd != NULL) {
3019f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) {
3020f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                is_phone_socket = 1;
3021f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            } else {
30228eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
3023f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            }
3024f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        } else {
30258eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("Error on getpwuid() errno: %d", errno);
3026f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        }
302700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
30288eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("Error on getsockopt() errno: %d", errno);
302900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
303000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
303100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ( !is_phone_socket ) {
30328eb2a12cb7b525e74736300962a5f3848427275aWink Saville      RLOGE("RILD must accept socket from %s", PHONE_PROCESS);
30337f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
303400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      close(s_fdCommand);
303500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      s_fdCommand = -1;
303600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
303700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      onCommandsSocketClosed();
303800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
303900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      /* start listening for new connections again */
304000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      rilEventAddWakeup(&s_listen_event);
304100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
304200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      return;
304300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
304400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
304500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK);
304600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
304700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
30488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
304900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
305000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30518eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGI("libril: new connection");
305200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
305300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES);
305400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_commands_event, s_fdCommand, 1,
305600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        processCommandsCallback, p_rs);
305700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
305800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_commands_event);
305900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
306000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    onNewCommandConnect();
306100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
306200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
306300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) {
306400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
306500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (args[i] != NULL) {
306600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(args[i]);
306700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
306800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
306900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(args);
307000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
307100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3072f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) {
307300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int acceptFD, option;
307400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
307500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
307600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int data;
307700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsigned int qxdm_data[6];
307800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char *deactData[1] = {"1"};
307900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *actData[1];
308000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dialData;
308100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int hangupData[1] = {1};
308200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int number;
308300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **args;
308400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
308500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
308600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
308700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (acceptFD < 0) {
30888eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error accepting on debug port: %d\n", errno);
308900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
309000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
309100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
309200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
30938eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error reading on socket: number of Args: \n");
309400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
309500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
309600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args = (char **) malloc(sizeof(char*) * number);
309700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
309800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
309900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int len;
310000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
31018eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Len of Args: \n");
310200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
310300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
310400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
310500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // +1 for null-term
310600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        args[i] = (char *) malloc((sizeof(char) * len) + 1);
31077f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
31081b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            != (int)sizeof(char) * len) {
31098eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Args[%d] \n", i);
311000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
311100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
311200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
311300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char * buf = args[i];
311400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        buf[len] = 0;
311500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
311600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
311700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (atoi(args[0])) {
311800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 0:
31198eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing reset.");
312000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
312100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
312200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 1:
31238eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing radio power off.");
312400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 0;
312500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
312600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Close the socket
312700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(s_fdCommand);
312800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_fdCommand = -1;
312900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
313000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 2:
31318eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: issuing unsolicited voice network change.");
3132c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,
313300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                      NULL, 0);
313400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
313500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 3:
31368eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log enable.");
3137d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[0] = 65536;     // head.func_tag
3138d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[1] = 16;        // head.len
3139d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 1;         // mode: 1 for 'start logging'
3140d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[3] = 32;        // log_file_size: 32megabytes
3141d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[4] = 0;         // log_mask
3142d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;         // log_max_fileindex
31437f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
314400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
314500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
314600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 4:
31478eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log disable.");
314800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
314900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
3150d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
315100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
315200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
3153d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;
315400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
315500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
315600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
315700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 5:
31588eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Radio On");
315900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 1;
316000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
316100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            sleep(2);
316200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Set network selection automatic.
316300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0);
316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 6:
31668eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            actData[0] = args[1];
31687f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(actData));
317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
317100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 7:
31728eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Deactivate Data Call");
31737f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(deactData));
317500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
317600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 8:
31778eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Dial Call");
317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.clir = 0;
317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.address = args[1];
318000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData));
318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
318200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 9:
31838eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Answer Call");
318400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0);
318500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
318600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 10:
31878eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: End Call");
31887f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
318900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(hangupData));
319000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
319100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
31928eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("Invalid request");
319300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
319400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    freeDebugCallbackArgs(number, args);
319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    close(acceptFD);
319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
319900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3200f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) {
320100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
320200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *)param;
320400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback(p_info->userParam);
320600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
320800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME generalize this...there should be a cancel mechanism
320900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
321000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info = NULL;
321100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
321200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
321300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(p_info);
321400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
321500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
321600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
321700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *
3218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) {
321900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
322000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int filedes[2];
322100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_init();
322300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
322500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 1;
322700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_cond_broadcast(&s_startupCond);
322800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
322900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
323000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pipe(filedes);
323200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
32348eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error in pipe() errno:%d", errno);
323500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return NULL;
323600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
323700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
323800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupRead = filedes[0];
323900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupWrite = filedes[1];
324000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
324100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
324200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
324300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
324400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                processWakeupCallback, NULL);
324500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
324600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_wakeupfd_event);
324700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
324800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Only returns on error
324900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_loop();
32508eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE ("error in event_loop_base errno:%d", errno);
32515cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    // kill self to restart on error
32525cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    kill(0, SIGKILL);
325300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
325400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return NULL;
325500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
325600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32577f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
3258f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) {
325900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* spin up eventLoop thread and wait for it to get started */
326000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 0;
326100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
326200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3263c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    pthread_attr_t attr;
3264c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    pthread_attr_init(&attr);
32657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
3266c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes
3267fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes    int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
3268fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes    if (result != 0) {
3269fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes        RLOGE("Failed to create dispatch thread: %s", strerror(result));
3270c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes        goto done;
3271c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    }
327200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
327300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (s_started == 0) {
327400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pthread_cond_wait(&s_startupCond, &s_startupMutex);
327500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
327600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3277c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughesdone:
327800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
327900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
328000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
328100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only.
328200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
328300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
328400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
328500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32867f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
3287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) {
328800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
328900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int flags;
329000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32914380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks == NULL) {
32928eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: RIL_RadioFunctions * null");
329300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
329400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
32954380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version < RIL_VERSION_MIN) {
32968eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is to old, min version is %d",
32974380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION_MIN);
32984380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
32994380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
33004380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version > RIL_VERSION) {
33018eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is too new, max version is %d",
33024380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION);
33034380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
33043a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    }
33058eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("RIL_register: RIL version %d", callbacks->version);
330600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
330700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled > 0) {
33088eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register has been called more than once. "
330900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                "Subsequent call ignored");
331000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
331100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
331200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
331300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
331400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
331500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_registerCalled = 1;
331600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
331700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Little self-check
331800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3319f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
332000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i == s_commands[i].requestNumber);
332100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
332200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
33247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        assert(i + RIL_UNSOL_RESPONSE_BASE
332500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                == s_unsolResponses[i].requestNumber);
332600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
332700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
332800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // New rild impl calls RIL_startEventLoop() first
332900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // old standalone impl wants it here.
333000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
333100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_started == 0) {
333200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_startEventLoop();
333300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
333400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
333500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start listen socket
333600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
333700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0
33387f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ret = socket_local_server (SOCKET_NAME_RIL,
333900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
334000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
334100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
33428eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Unable to bind socket errno:%d", errno);
334300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit (-1);
334400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
334500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = ret;
334600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
334700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
334800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
334900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdListen < 0) {
33508eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to get socket '" SOCKET_NAME_RIL "'");
335100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
335200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
335300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
335400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdListen, 4);
335500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
335600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
33578eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to listen on control socket '%d': %s",
335800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdListen, strerror(errno));
335900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
336000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
336100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
336200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
336300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
336400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* note: non-persistent so we can accept only one connection at a time */
33657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_listen_event, s_fdListen, false,
336600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                listenCallback, NULL);
336700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
336800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_listen_event);
336900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
337000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1
337100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start debug interface socket
337200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
337300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG);
337400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdDebug < 0) {
33758eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno);
337600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
337700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
337800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
337900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdDebug, 4);
338000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
338100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
33828eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to listen on ril debug socket '%d': %s",
338300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdDebug, strerror(errno));
338400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
338500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
338600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
338700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_debug_event, s_fdDebug, true,
338800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                debugCallback, NULL);
338900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
339000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_debug_event);
339100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
339200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
339300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
339400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
339500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
3396f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) {
339700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret = 0;
33987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
339900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI == NULL) {
340000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
340100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
340200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
340300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_pendingRequestsMutex);
340400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34057f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(RequestInfo **ppCur = &s_pendingRequests
34067f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        ; *ppCur != NULL
340700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; ppCur = &((*ppCur)->p_next)
340800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
340900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (pRI == *ppCur) {
341000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = 1;
341100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
341200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            *ppCur = (*ppCur)->p_next;
341300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
341400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
341500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
341600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
341700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_pendingRequestsMutex);
341800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
341900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return ret;
342000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
342100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
342200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
342300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
3424f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
342500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
342600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
342700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t errorOffset;
342800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
342900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)t;
343000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
343100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!checkAndDequeueRequestInfo(pRI)) {
34328eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
343300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
343400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
343500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
343600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->local > 0) {
343700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Locally issued command...void only!
343800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // response does not go back up the command socket
34398eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
344000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
344100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto done;
344200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
344300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
344400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[%04d]< %s",
344500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pRI->token, requestToString(pRI->pCI->requestNumber));
344600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
344700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->cancelled == 0) {
344800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        Parcel p;
344900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
345000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (RESPONSE_SOLICITED);
345100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (pRI->token);
345200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        errorOffset = p.dataPosition();
345300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
345400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (e);
345500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3456b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (response != NULL) {
3457b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            // there is a response payload, no matter success or not.
345800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = pRI->pCI->responseFunction(p, response, responselen);
345900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
346000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* if an error occurred, rewind and mark it */
346100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            if (ret != 0) {
346200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.setDataPosition(errorOffset);
346300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.writeInt32 (ret);
346400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            }
3465b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        }
3466b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang
3467b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (e != RIL_E_SUCCESS) {
3468b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
346900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
347000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
347100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_fdCommand < 0) {
34728eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD ("RIL onRequestComplete: Command channel closed");
347300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
347400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponse(p);
347500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
347600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
347700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone:
347800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(pRI);
347900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
348000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
3483f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() {
348400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
348500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
348600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
3488f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() {
348900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
349000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
349100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
349200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
349300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout
349400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
349500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
3496f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) {
349700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // We're using "param != NULL" as a cancellation mechanism
349800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (param == NULL) {
34998eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock");
350000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
350100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
350200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
35038eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock CANCELLED");
350400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
350500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
350600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
35082bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeVoiceRadioTechnology (RIL_RadioState radioState) {
35092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
35102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
35112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
35122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
35132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_UMTS;
35142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
35162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
35172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
35182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
35192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
35202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_1xRTT;
35212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
35238eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState");
35242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
35252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
35262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
35272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
35292bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeCdmaSubscriptionSource (RIL_RadioState radioState) {
35302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
35312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
35322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
35332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
35342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
35352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
35362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
35372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM;
35382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
35402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
35412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_NV;
35422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
35448eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState");
35452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
35462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
35472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
35482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
35502bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeSimStatus (RIL_RadioState radioState) {
35512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   switch (radioState) {
35522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_NOT_READY:
35532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_NOT_READY:
35542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_NOT_READY:
35552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_READY:
35562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
35572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
35582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_READY:
35592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_READY:
35602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
35612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return radioState;
35622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       default:
35638eb2a12cb7b525e74736300962a5f3848427275aWink Saville           RLOGD("decodeSimStatus: Invoked with incorrect RadioState");
35642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
35652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   }
35662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
35672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic bool is3gpp2(int radioTech) {
35692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioTech) {
35702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95A:
35712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95B:
35722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_1xRTT:
35732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_0:
35742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_A:
35752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_B:
35762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EHRPD:
35772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return true;
35782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
35792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return false;
35802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
35812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
35822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* If RIL sends SIM states or RUIM states, store the voice radio
35842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * technology and subscription source information so that they can be
35852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * returned when telephony framework requests them
35862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
35872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState
35882bc78d614e349574426d198c37e51ccb7455b5bbNaveen KallaprocessRadioState(RIL_RadioState newRadioState) {
35892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) {
35912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newVoiceRadioTech;
35922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newCdmaSubscriptionSource;
35932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newSimStatus;
35942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
35952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* This is old RIL. Decode Subscription source and Voice Radio Technology
35962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           from Radio State and send change notifications if there has been a change */
35972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState);
35982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newVoiceRadioTech != voiceRadioTech) {
35992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            voiceRadioTech = newVoiceRadioTech;
36002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            RIL_onUnsolicitedResponse (RIL_UNSOL_VOICE_RADIO_TECH_CHANGED,
36012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                        &voiceRadioTech, sizeof(voiceRadioTech));
36022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
36032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(is3gpp2(newVoiceRadioTech)) {
36042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState);
36052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            if(newCdmaSubscriptionSource != cdmaSubscriptionSource) {
36062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                cdmaSubscriptionSource = newCdmaSubscriptionSource;
36072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                RIL_onUnsolicitedResponse (RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED,
36082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                        &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource));
36092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            }
36102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
36112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newSimStatus = decodeSimStatus(newRadioState);
36122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newSimStatus != simRuimStatus) {
36132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            simRuimStatus = newSimStatus;
36142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0);
36152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
36162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
36172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* Send RADIO_ON to telephony */
36182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newRadioState = RADIO_STATE_ON;
36192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
36202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
36212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    return newRadioState;
36222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
36232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
362400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C"
36256e7c1966c6a41b6e7c0431dcc6bf65678438c79eBernhard Rosenkränzervoid RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
362600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen)
362700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
362800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int unsolResponseIndex;
362900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
363000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int64_t timeReceived = 0;
363100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    bool shouldScheduleTimeout = false;
36322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState newState;
363300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
363400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled == 0) {
363500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Ignore RIL_onUnsolicitedResponse before RIL_register
36368eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
363700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
363800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
36397f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
364000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
364100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
364200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ((unsolResponseIndex < 0)
364300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
36448eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported unsolicited response code %d", unsolResponse);
364500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
364600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
364700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
364800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Grab a wake lock if needed for this reponse,
364900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // as we exit we'll either release it immediately
365000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // or set a timer to release it later.
365100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (s_unsolResponses[unsolResponseIndex].wakeType) {
365200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case WAKE_PARTIAL:
365300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            grabPartialWakeLock();
365400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = true;
365500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
365600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
365700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case DONT_WAKE:
365800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
365900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // No wake lock is grabed so don't set timeout
366000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = false;
366100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
366200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
366300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
366400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Mark the time this was received, doing this
366500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // after grabing the wakelock incase getting
366600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // the elapsedRealTime might cause us to goto
366700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // sleep.
366800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
366900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        timeReceived = elapsedRealtime();
367000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
367100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
367200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
367300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
367400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
367500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
367600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (RESPONSE_UNSOLICITED);
367700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (unsolResponse);
367800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
367900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = s_unsolResponses[unsolResponseIndex]
36806e7c1966c6a41b6e7c0431dcc6bf65678438c79eBernhard Rosenkränzer                .responseFunction(p, const_cast<void*>(data), datalen);
368100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0) {
368200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Problem with the response. Don't continue;
368300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto error_exit;
368400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
368500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
368600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // some things get more payload
368700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(unsolResponse) {
368800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
36892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            newState = processRadioState(s_callbacks.onStateRequest());
36902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            p.writeInt32(newState);
369100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s {%s}", printBuf,
369200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                radioStateToString(s_callbacks.onStateRequest()));
369300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
369400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
369500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
369600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED:
369700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Store the time that this was received so the
369800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // handler of this message can account for
369900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // the time it takes to arrive and process. In
370000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // particular the system has been known to sleep
370100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // before this message can be processed.
370200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt64(timeReceived);
370300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
370400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
370500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
370600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = sendResponse(p);
370700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
370800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
370900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Unfortunately, NITZ time is not poll/update like everything
371000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // else in the system. So, if the upstream client isn't connected,
371100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // keep a copy of the last NITZ response (with receive time noted
371200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // above) around so we can deliver it when it is connected
371300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
371400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_lastNITZTimeData != NULL) {
371500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free (s_lastNITZTimeData);
371600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_lastNITZTimeData = NULL;
371700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
371800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
371900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = malloc(p.dataSize());
372000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeDataSize = p.dataSize();
372100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
372200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
372300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
372400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
372500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME The java code should handshake here to release wake lock
372600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
372700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
372800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Cancel the previous request
372900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_last_wake_timeout_info != NULL) {
373000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_last_wake_timeout_info->userParam = (void *)1;
373100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
373200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
373300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info
373400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
373500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                            &TIMEVAL_WAKE_TIMEOUT);
373600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
373700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
373800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Normal exit
373900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
374000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
374100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit:
374200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
374300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
374400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
374500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
374600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37477f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it
37487f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    when the callback occurs
374900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
375000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *
37517f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param,
37520d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn                                const struct timeval *relativeTime)
375300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
375400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct timeval myRelativeTime;
375500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
375600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
375700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
375800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    p_info->p_callback = callback;
376000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->userParam = param;
37610d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
376200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (relativeTime == NULL) {
376300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* treat null parameter as a 0 relative time */
376400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (&myRelativeTime, 0, sizeof(myRelativeTime));
376500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
376600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* FIXME I think event_add's tv param is really const anyway */
376700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
376800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
376900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
377100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_timer_add(&(p_info->event), &myRelativeTime);
377300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
377500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return p_info;
377600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
377700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37790d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void
37807f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
3781f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                const struct timeval *relativeTime) {
37820d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    internalRequestTimedCallback (callback, param, relativeTime);
378300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
378400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
378500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3786f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) {
378700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(e) {
378800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SUCCESS: return "E_SUCCESS";
37892126ab2f05c1033fdca7542f38372dffd1468e1cRobert Greenwalt        case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE";
379000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
379100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
379200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
379300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
379400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
379500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_CANCELLED: return "E_CANCELLED";
379600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
379700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
379800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
3799f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
38007553447d44bb3f494b00d573215d81398f61cfcdJohn Wang        case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
38017f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID
3802f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
3803f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
3804f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
380500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown error>";
380600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
380700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
380800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
380900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3810f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) {
381100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
381200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_OFF: return "RADIO_OFF";
381300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
381400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
381500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
381600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
3817f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
3818f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
3819f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
3820f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
3821f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
38222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_ON:return"RADIO_ON";
382300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
382400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
382500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
382600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
382700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3828f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) {
382900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
383000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ACTIVE : return "ACTIVE";
383100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_HOLDING: return "HOLDING";
383200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_DIALING: return "DIALING";
383300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ALERTING: return "ALERTING";
383400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_INCOMING: return "INCOMING";
383500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_WAITING: return "WAITING";
383600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
383700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
383800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
383900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
384000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3841f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) {
384200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*
384300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \
384400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
384500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
384600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
384700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
384800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \
384900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
385000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
385100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
385200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
385300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(request) {
385400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
385500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
385600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
385700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
385800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
385900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
386000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
386100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
386200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
386300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DIAL: return "DIAL";
386400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
386500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP: return "HANGUP";
386600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
386700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
386800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
386900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
387000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_UDUB: return "UDUB";
387100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
387200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
3873c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
3874c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
387500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OPERATOR: return "OPERATOR";
387600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
387700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF: return "DTMF";
387800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
387900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
3880f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
388100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIM_IO: return "SIM_IO";
388200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
388300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
388400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
388500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
388600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
388700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
388800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
388900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
389000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
389100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
389200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
389300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ANSWER: return "ANSWER";
3894f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
389500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
389600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
389700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
389800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
389900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
390000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
390100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
390200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_START: return "DTMF_START";
390300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
390400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
390500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
390600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
390700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
390800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
390900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
391000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
391100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
3912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
3913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
391400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
391500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
391600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
3917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
3918f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
391900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
392000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
392100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
392200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
392300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
392400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
392500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
392600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
3927c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
3928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
3929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
3930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
3931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
3932f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
3933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
3934f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
3935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
3936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
3937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
3938a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
3939a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
3940a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
3941a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
3942a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
394303c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
3944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
3945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
3946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
3947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
3948000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
3949000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
3950000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
395109a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
3952563fd7207da27322bf3f3587ef6000a944a617b7jsh        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
3953c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
3954fa8d584ca7984bf7d73ff37c7c2bc1e0dfa5fb71Jake Hamby        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
3955300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
3956300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
39572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
39588a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
39598a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
396075697538e485ea2981960dcd4878bfdd032731acSungmin Choi        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
3961a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
3962a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
39632458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
39642458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
39652458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
39662458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
396700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
396800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
3969c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
397000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
397100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
397200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
397300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
397400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
397500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
397600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
397700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
397800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
397900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
398000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
398100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
398200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
3983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
398400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
3985f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
3986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
3987f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
3988f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
39893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
39903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
39913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
39923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
39933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
3994af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
39955d621da539abea83309d77317ede40126f47d5f0John Wang        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
39965909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
3997ee2745825fae9561c5f83fcf179bbbfa111e5224Wink Saville        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
3998c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
3999c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
40005b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
40012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
40028a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
4003a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
400400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown request>";
400500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
400600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
400700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
400800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */
4009