ril.cpp revision af1298d72fd6a8b2d5bed7db15f6d181240fce83
100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp
200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project
400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License");
67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License.
77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at
800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville**     http://www.apache.org/licenses/LICENSE-2.0
1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software
127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS,
137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and
1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License.
1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC"
1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h>
2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h>
23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h>
2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h>
2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/record_stream.h>
2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h>
2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h>
2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h>
308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h>
3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h>
3400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h>
3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h>
3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h>
3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h>
3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h>
4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h>
4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h>
4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h>
4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h>
4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h>
4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h>
4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h>
4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h>
5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h>
5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h>
5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android {
5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio"
5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild"
5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug"
6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface"
6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java
6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024)
6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library
7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find
7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner.
7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1
7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])
7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#define MIN(a,b) ((a)<(b) ? (a) : (b))
77f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
7800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */
7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0
8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1
8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */
8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1
8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro
8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096
8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log
8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0
9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest           sprintf(printBuf, "(")
9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest           sprintf(printBuf, "%s)", printBuf)
9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)           \
9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGD("[%04d]> %s %s", token, requestToString(req), printBuf)
9600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse           sprintf(printBuf, "%s {", printBuf)
9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse           sprintf(printBuf, "%s}", printBuf)
9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printResponse           LOGD("%s", printBuf)
10000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf           printBuf[0] = 0
10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar          printBuf[strlen(printBuf)-1] = 0
10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)    sprintf(printBuf, x)
10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest
10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest
10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)
10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse
10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse
11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printResponse
11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf
11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar
11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)
11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL};
11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int(*responseFunction) (Parcel &p, void *response, size_t responselen);
12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo;
12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int (*responseFunction) (Parcel &p, void *response, size_t responselen);
12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    WakeType wakeType;
12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo;
12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo {
1317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    int32_t token;      //this is not RIL_Token
13200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    CommandInfo *pCI;
13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct RequestInfo *p_next;
13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char cancelled;
13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char local;         // responses to local commands do not go back to command process
13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo;
13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savilletypedef struct UserCallbackInfo {
13900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_TimedCallback p_callback;
14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *userParam;
14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ril_event event;
14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct UserCallbackInfo *p_next;
14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo;
14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1450d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
14600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0;
15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch;
15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader;
15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0;
15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdListen = -1;
15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdCommand = -1;
15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1;
15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead;
16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite;
16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event;
16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event;
16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event;
16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event;
16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event;
16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0};
17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_pendingRequests = NULL;
18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL;
18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL;
18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL;
18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL;
18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize;
18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    static char printBuf[PRINTBUF_SIZE];
19100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
19200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
19400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
19500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI);
19600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI);
19700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI);
19800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI);
19900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI);
20000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
20100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI);
20200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI);
20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
2044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI);
20500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
208a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
21100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen);
21200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen);
21300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen);
21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen);
21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen);
21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen);
21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen);
21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen);
219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen);
2204380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen);
22200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen);
223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen);
224a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
225a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen);
22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen);
2283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
2293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
2303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen);
2313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
2323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request);
23500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno);
23600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState);
23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState);
23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB
2407f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
24100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen);
24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2447f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback
2450d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    (RIL_TimedCallback callback, void *param,
2460d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn        const struct timeval *relativeTime);
24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */
24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = {
25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h"
25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = {
25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h"
25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char *
259f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) {
26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char16_t *s16;
2627f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = p.readString16Inplace(&stringlen);
2647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return strndup16to8(s16, stringlen);
26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
268f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) {
26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char16_t *s16;
27000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t s16_len;
27100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = strdup8to16(s, &s16_len);
27200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeString16(s16, s16_len);
27300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(s16);
27400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
27500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
278f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) {
27900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s != NULL) {
28000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (s, 0, strlen(s));
28100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
28200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
28300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    const size_t* objects, size_t objectsSize,
286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                        void* cookie) {
28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // do nothing -- the data reference lives longer than the Parcel object
28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
28900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
29100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread
29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response
2937f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process
29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
29500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) {
29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->local = 1;
30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = 0xffffffff;        // token is not used in this context
30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGD("C[locl]> %s", requestToString(request));
31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(request, data, len, pRI);
31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) {
32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t request;
32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t token;
32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.setData((uint8_t *) buffer, buflen);
33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // status checked at end
33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&request);
33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&token);
33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid request block");
33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("unsupported request code %d token %d", request, token);
34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // FIXME this should perhaps return a response
34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = token;
35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*    sLastDispatchedToken = token; */
36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pRI->pCI->dispatchFunction(p, pRI);
36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) {
3727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    LOGE("invalid command block for token %d request %s",
37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                pRI->token, requestToString(pRI->pCI->requestNumber));
37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */
3777f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
378f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) {
37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    clearPrintBuf;
38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */
38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
386f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) {
38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *string8 = NULL;
39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    string8 = strdupReadString(p);
39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, string8);
39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, string8,
40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       sizeof(char *), pRI);
40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(string8);
40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(string8);
40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */
41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
415f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) {
41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t countStrings;
41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **pStrings;
42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&countStrings);
42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (countStrings == 0) {
42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // just some non-null pointer
43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(sizeof(char *));
43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else if (((int)countStrings) == -1) {
43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = NULL;
43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = sizeof(char *) * countStrings;
4377f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(datalen);
43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            pStrings[i] = strdupReadString(p);
44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pStrings != NULL) {
45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            memsetString (pStrings[i]);
45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(pStrings[i]);
45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset(pStrings, 0, datalen);
46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
4637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */
47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
472f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) {
47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t count;
47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *pInts;
47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&count);
47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || count == 0) {
48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    datalen = sizeof(int) * count;
48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pInts = (int *)alloca(datalen);
48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < count ; i++) {
48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int32_t t;
49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        status = p.readInt32(&t);
49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pInts[i] = (int)t;
49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, t);
49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (status != NO_ERROR) {
49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            goto invalid;
49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   }
49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   removeLastChar;
50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   closeRequest;
50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   printRequest(pRI->token, pRI->pCI->requestNumber);
50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville   s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts),
50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       datalen, pRI);
50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(pInts, 0, datalen);
50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
5187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs *
51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t status
52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pdu
52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
524f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_WriteArgs args;
52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&args, 0, sizeof(args));
53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.status = (int)t;
53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.pdu = strdupReadString(p);
53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || args.pdu == NULL) {
53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.smsc = strdupReadString(p);
54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)args.pdu,  (char*)args.smsc);
54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
5477f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI);
54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (args.pdu);
55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (args.pdu);
5557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&args, 0, sizeof(args));
55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5667f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
5677f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial *
56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String address
57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t clir
57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
573f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) {
57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dial;
57574fa38884320698c1623764850e3131b9769dff0Wink Saville    RIL_UUS_Info uusInfo;
5767bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    int32_t sizeOfDial;
57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
57874fa38884320698c1623764850e3131b9769dff0Wink Saville    int32_t uusPresent;
57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&dial, 0, sizeof(dial));
58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.address = strdupReadString(p);
58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.clir = (int)t;
58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || dial.address == NULL) {
58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5923a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
59374fa38884320698c1623764850e3131b9769dff0Wink Saville        uusPresent = 0;
5947bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
59574fa38884320698c1623764850e3131b9769dff0Wink Saville    } else {
59674fa38884320698c1623764850e3131b9769dff0Wink Saville        status = p.readInt32(&uusPresent);
59774fa38884320698c1623764850e3131b9769dff0Wink Saville
59874fa38884320698c1623764850e3131b9769dff0Wink Saville        if (status != NO_ERROR) {
59974fa38884320698c1623764850e3131b9769dff0Wink Saville            goto invalid;
60074fa38884320698c1623764850e3131b9769dff0Wink Saville        }
60174fa38884320698c1623764850e3131b9769dff0Wink Saville
60274fa38884320698c1623764850e3131b9769dff0Wink Saville        if (uusPresent == 0) {
60374fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = NULL;
60474fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
60574fa38884320698c1623764850e3131b9769dff0Wink Saville            int32_t len;
60674fa38884320698c1623764850e3131b9769dff0Wink Saville
60774fa38884320698c1623764850e3131b9769dff0Wink Saville            memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
60874fa38884320698c1623764850e3131b9769dff0Wink Saville
60974fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
61074fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusType = (RIL_UUS_Type) t;
61174fa38884320698c1623764850e3131b9769dff0Wink Saville
61274fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
61374fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusDcs = (RIL_UUS_DCS) t;
61474fa38884320698c1623764850e3131b9769dff0Wink Saville
61574fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&len);
61674fa38884320698c1623764850e3131b9769dff0Wink Saville            if (status != NO_ERROR) {
61774fa38884320698c1623764850e3131b9769dff0Wink Saville                goto invalid;
61874fa38884320698c1623764850e3131b9769dff0Wink Saville            }
61974fa38884320698c1623764850e3131b9769dff0Wink Saville
62074fa38884320698c1623764850e3131b9769dff0Wink Saville            // The java code writes -1 for null arrays
62174fa38884320698c1623764850e3131b9769dff0Wink Saville            if (((int) len) == -1) {
62274fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = NULL;
62374fa38884320698c1623764850e3131b9769dff0Wink Saville                len = 0;
62474fa38884320698c1623764850e3131b9769dff0Wink Saville            } else {
62574fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = (char*) p.readInplace(len);
62674fa38884320698c1623764850e3131b9769dff0Wink Saville            }
62774fa38884320698c1623764850e3131b9769dff0Wink Saville
62874fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusLength = len;
62974fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = &uusInfo;
63074fa38884320698c1623764850e3131b9769dff0Wink Saville        }
6317bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial);
63274fa38884320698c1623764850e3131b9769dff0Wink Saville    }
63374fa38884320698c1623764850e3131b9769dff0Wink Saville
63400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
63500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
63674fa38884320698c1623764850e3131b9769dff0Wink Saville    if (uusPresent) {
63774fa38884320698c1623764850e3131b9769dff0Wink Saville        appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
63874fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusType, dial.uusInfo->uusDcs,
63974fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusLength);
64074fa38884320698c1623764850e3131b9769dff0Wink Saville    }
64100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
64200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
64300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6447bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI);
64500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
64700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (dial.address);
64800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
64900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (dial.address);
6517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
65200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
65374fa38884320698c1623764850e3131b9769dff0Wink Saville    memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
65400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&dial, 0, sizeof(dial));
65500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
65600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
65800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
65900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
66000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
6647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO *
66500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t command
66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t fileid
66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String path
66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t p1, p2, p3
6707f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String data
6717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String pin2
67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
674f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO simIO;
67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&simIO, 0, sizeof(simIO));
68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6817f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
6827f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.command = (int)t;
68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.fileid = (int)t;
68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.path = strdupReadString(p);
69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p1 = (int)t;
69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p2 = (int)t;
69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p3 = (int)t;
69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.data = strdupReadString(p);
70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.pin2 = strdupReadString(p);
70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s", printBuf,
70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        simIO.command, simIO.fileid, (char*)simIO.path,
70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        simIO.p1, simIO.p2, simIO.p3,
70700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)simIO.data,  (char*)simIO.pin2);
70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
70900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
7107f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
71400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project       s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, sizeof(simIO), pRI);
71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.path);
71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.data);
72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.pin2);
72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.path);
72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.data);
72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.pin2);
7267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&simIO, 0, sizeof(simIO));
72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
73400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo *
73900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
74000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t status/action
74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t reason
74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t serviceCode
74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t toa
74400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  String number  (0 length -> null)
74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t timeSeconds
74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
7477f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
748f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) {
74900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_CallForwardInfo cff;
75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&cff, 0, sizeof(cff));
75400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.status = (int)t;
7597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
76000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
76100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.reason = (int)t;
76200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.serviceClass = (int)t;
76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.toa = (int)t;
76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.number = strdupReadString(p);
77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.timeSeconds = (int)t;
77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // special case: number 0-length fields is null
77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (cff.number != NULL && strlen (cff.number) == 0) {
78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.number = NULL;
78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
78400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
78500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.status, cff.reason, cff.serviceClass, cff.toa,
78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)cff.number, cff.timeSeconds);
78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
78900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
79000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI);
79200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(cff.number);
79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
79600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (cff.number);
79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&cff, 0, sizeof(cff));
80100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8107f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
811f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) {
81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t len;
81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const void *data;
81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&len);
81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code writes -1 for null arrays
82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (((int)len) == -1) {
82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        data = NULL;
82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        len = 0;
8267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    }
82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    data = p.readInplace(len);
82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sraw_size=%d", printBuf, len);
83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI);
83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8437f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
844f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
845f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message rcsm;
846f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
847f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
849f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
850f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
8517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
852f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
853f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
854f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
855f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uTeleserviceID = (int) t;
856f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
857f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
858f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.bIsServicePresent = (uint8_t) ut;
859f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
860f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
861f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uServicecategory = (int) t;
862f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
863f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
864f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
865f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
866f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
867f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
868f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
869f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
870f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
871f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
872f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
873f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
874f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
875f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
876f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_of_digits= (uint8_t) ut;
877f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
878f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
879f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
880f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
881f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
882f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
883f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
8847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
885f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
886f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
8877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.read(&ut,sizeof(ut));
888f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.odd = (uint8_t) ut;
889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
892f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
8947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
8957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut,sizeof(ut));
896f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
8997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uBearerDataLen = (int) t;
901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
9037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
9047f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut, sizeof(ut));
905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.aBearerData[digitCount] = (uint8_t) ut;
906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
9141b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
9161b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
9187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
921f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI);
922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
924f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
932f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
9347f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Ack rcsa;
937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
940f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
941f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uSMSCauseCode = (int) t;
948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
950f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
951f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
953f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
9541b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
9551b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
957f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI);
961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
964f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
971f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
973a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
974a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
975a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
977a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
979a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
980a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
981a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
982a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
984a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
985a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
987a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    startRequest;
988a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
989a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBciPtrs[i] = &gsmBci[i];
990f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
991a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
992a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBci[i].fromServiceId = (int) t;
993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
994a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
995a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBci[i].toServiceId = (int) t;
996f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
997a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
998a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBci[i].fromCodeScheme = (int) t;
999f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1000a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
1001a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBci[i].toCodeScheme = (int) t;
1002a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1003a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
1004a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        gsmBci[i].selected = (uint8_t) t;
1005a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1006a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
1007a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
1008a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
1009a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
1010a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              gsmBci[i].selected);
1011a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1012f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1014a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1015a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1016a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1017f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1018a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber,
1019a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          gsmBciPtrs,
1020a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
1021a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          pRI);
1022f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1023f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1024a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
1025a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
1026f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1027f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1029f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1034f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1035a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1036f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1037a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1038f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1039a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1040f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1041a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1042a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1044a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1045a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1046a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1047a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
1048a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1049a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    startRequest;
1050a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
1051a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        cdmaBciPtrs[i] = &cdmaBci[i];
1052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1053a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
1054a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        cdmaBci[i].service_category = (int) t;
1055f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1056a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
1057a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        cdmaBci[i].language = (int) t;
1058f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1059a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.readInt32(&t);
1060a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        cdmaBci[i].selected = (uint8_t) t;
1061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1062a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: service_category=%d, language =%d, \
1063a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
1064a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              cdmaBci[i].language, cdmaBci[i].selected);
1065f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
1066a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeRequest;
1067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1071f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1072f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber,
1073a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          cdmaBciPtrs,
1074a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
1075f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                          pRI);
1076f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1077f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
1079a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
1080f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1081f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1082f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1083f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_WriteArgs rcsw;
1091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint32_t ut;
1093f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t  uct;
1094f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1095f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  digitCount;
1096f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1098f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1099f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1100f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.status = t;
1101a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1102f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1103f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uTeleserviceID = (int) t;
1104f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1106f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.bIsServicePresent = (uint8_t) uct;
1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1108f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1109f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uServicecategory = (int) t;
1110f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1112f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1113f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1119f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1121f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
1127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1130f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1131a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1132f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1133f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1134a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.read(&uct,sizeof(uct));
1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.odd = (uint8_t) uct;
1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
1141a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct,sizeof(uct));
1142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1145a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uBearerDataLen = (int) t;
1147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
1149a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct, sizeof(uct));
1150f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
11581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
11591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
11601b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_mode=%d, \
11611b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_type=%d, ",
1162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
11631b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
11641b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_mode,
11651b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_type);
1166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI);
1171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
11844f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
11854f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support
11864f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of
11874f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request.
11884f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
11894f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
11904f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    const int numParamsRilV3 = 6;
11914f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
11924f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // The first bytes of the RIL parcel contain the request number and the
11934f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // serial number - see processCommandBuffer(). Copy them over too.
11944f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int pos = p.dataPosition();
11954f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
11964f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int numParams = p.readInt32();
11974f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
11984f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      Parcel p2;
11994f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.appendFrom(&p, 0, pos);
12004f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.writeInt32(numParamsRilV3);
12014f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      for(int i = 0; i < numParamsRilV3; i++) {
12024f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti        p2.writeString16(p.readString16());
12034f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      }
12044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.setDataPosition(pos);
12054f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p2, pRI);
12064f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    } else {
120757ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti      p.setDataPosition(pos);
12084f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p, pRI);
12094f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    }
12104f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti}
12114f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
121200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) {
12147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    size_t writeOffset = 0;
121500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const uint8_t *toWrite;
121600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
121700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    toWrite = (const uint8_t *)buffer;
121800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
121900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (writeOffset < len) {
122000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ssize_t written;
122100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        do {
122200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            written = write (fd, toWrite + writeOffset,
122300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                len - writeOffset);
122400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } while (written < 0 && errno == EINTR);
122500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
122600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (written >= 0) {
122700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeOffset += written;
122800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {   // written < 0
122900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("RIL Response: unexpected error on write errno:%d", errno);
123000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(fd);
123100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return -1;
123200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
123300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
123400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
123500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
123600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
123700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
123800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) {
124000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int fd = s_fdCommand;
124100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
124200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    uint32_t header;
124300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
124400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0) {
124500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
124600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
124700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
124800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (dataSize > MAX_COMMAND_BYTES) {
124900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("RIL: packet larger than %u (%u)",
125000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                MAX_COMMAND_BYTES, (unsigned int )dataSize);
125100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
125200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
125300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
12547f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
125500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_writeMutex);
125600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
125700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    header = htonl(dataSize);
125800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
125900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = blockingWrite(fd, (void *)&header, sizeof(header));
126000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
126100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1262084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
126300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
126400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
126500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1266ee1fadc192a63724e416b05666844a62d1e75d38Kenny    ret = blockingWrite(fd, data, dataSize);
126700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
126800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
1269084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh        pthread_mutex_unlock(&s_writeMutex);
127000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
127100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
127200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
127300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_writeMutex);
127400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
127500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
127600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
127700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
127800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1279f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) {
128000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printResponse;
128100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return sendResponseRaw(p.data(), p.dataSize());
128200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
128300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
128400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/
12857f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
12867f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int
1287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) {
128800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numInts;
128900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
129000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
129100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
129200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
129300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
129400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(int) != 0) {
12957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        LOGE("invalid response length %d expected multiple of %d\n",
129600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(int));
129700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
129800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
129900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
130000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *p_int = (int *) response;
130100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
130200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    numInts = responselen / sizeof(int *);
130300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (numInts);
130400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
130500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* each int*/
130600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < numInts ; i++) {
130800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, p_int[i]);
130900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_int[i]);
131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
131300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
131400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
131500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
131600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
13174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s
13184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    The parcel will begin with the version */
13194380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
13204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(version);
13214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return responseStrings(p, response, responselen);
13224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
13234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
132400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */
1325f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) {
132600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numStrings;
13277f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
132800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
132900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
133000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
133100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
133200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(char *) != 0) {
13337f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        LOGE("invalid response length %d expected multiple of %d\n",
133400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(char *));
133500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
133600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
133700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
133800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
133900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (0);
134000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
134100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char **p_cur = (char **) response;
134200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
134300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        numStrings = responselen / sizeof(char *);
134400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (numStrings);
134500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
134600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each string*/
134700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        startResponse;
134800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < numStrings ; i++) {
134900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
135000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeStringToParcel (p, p_cur[i]);
135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
135200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        removeLastChar;
135300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        closeResponse;
135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
135700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
135800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
135900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
13607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted
136100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen
136200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
1363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) {
136400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* one string only */
136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, (char*)response);
136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, (const char *)response);
137000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) {
137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1380f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) {
138100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
138200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
138600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_Call *) != 0) {
13893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response length %d expected multiple of %d\n",
139000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_Call *));
139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
139500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_Call *);
139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_Call *p_cur = ((RIL_Call **) response)[i];
140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each call info */
140200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->state);
140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->index);
140400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMpty);
140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMT);
140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->als);
140800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isVoice);
14091b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoicePrivacy);
14101b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->number);
14111b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->numberPresentation);
14121b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->name);
14131b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->namePresentation);
14143a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville        // Remove when partners upgrade to version 3
141574fa38884320698c1623764850e3131b9769dff0Wink Saville        if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
141674fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(0); /* UUS Information is absent */
141774fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
141874fa38884320698c1623764850e3131b9769dff0Wink Saville            RIL_UUS_Info *uusInfo = p_cur->uusInfo;
141974fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(1); /* UUS Information is present */
142074fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusType);
142174fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusDcs);
142274fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusLength);
142374fa38884320698c1623764850e3131b9769dff0Wink Saville            p.write(uusInfo->uusData, uusInfo->uusLength);
142474fa38884320698c1623764850e3131b9769dff0Wink Saville        }
14253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,",
14261b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf,
14271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
14281b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            callStateToString(p_cur->state),
14293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->toa);
14303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
14313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
14321b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
14331b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMT)?"mt":"mo",
14341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->als,
14351b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoice)?"voc":"nonvoc",
14363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp");
14373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
14383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
14391b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
14401b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
14411b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
14421b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1450f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) {
145100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
145500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SMS_Response) ) {
14577f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        LOGE("invalid response length %d expected %d",
145800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SMS_Response));
145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->messageRef);
146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->ackPDU);
1466920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    p.writeInt32(p_cur->errorCode);
146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
1469920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
1470920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh        (char*)p_cur->ackPDU, p_cur->errorCode);
147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
147500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14764380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallListV3(Parcel &p, void *response, size_t responselen)
147700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
147900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14834380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (responselen % sizeof(RIL_Data_Call_Response_v3) != 0) {
14847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        LOGE("invalid response length %d expected multiple of %d",
14854380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (int)responselen, (int)sizeof(RIL_Data_Call_Response_v3));
148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14894380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    int num = responselen / sizeof(RIL_Data_Call_Response_v3);
149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
14924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    RIL_Data_Call_Response_v3 *p_cur = (RIL_Data_Call_Response_v3 *) response;
149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int i;
149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (i = 0; i < num; i++) {
149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].cid);
149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].active);
149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].type);
149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].apn);
150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].address);
150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%d,%s,%s,%s,%s],", printBuf,
150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur[i].cid,
150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur[i].active==0)?"down":"up",
150400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].type,
150500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].apn,
150600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].address);
150700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
150800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
150900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
151000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
151100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
151200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
151300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
15144380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen)
15154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
15164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    // Write version
15174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(s_callbacks.version);
15184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15194380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
15204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseDataCallListV3(p, response, responselen);
15214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
15224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        if (response == NULL && responselen != 0) {
15234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            LOGE("invalid response: NULL");
15244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
15254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
15264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        if (responselen % sizeof(RIL_Data_Call_Response_v5) != 0) {
15284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            LOGE("invalid response length %d expected multiple of %d",
15294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                    (int)responselen, (int)sizeof(RIL_Data_Call_Response_v5));
15304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
15314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
15324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        int num = responselen / sizeof(RIL_Data_Call_Response_v5);
15344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        p.writeInt32(num);
15354380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        RIL_Data_Call_Response_v5 *p_cur = (RIL_Data_Call_Response_v5 *) response;
15374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        startResponse;
15384380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        int i;
15394380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        for (i = 0; i < num; i++) {
15404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32((int)p_cur[i].status);
15414380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].cid);
15424380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].active);
1543af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner            writeStringToParcel(p, p_cur[i].type);
15444380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].ifname);
15454380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].addresses);
15464380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].dnses);
15474380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            appendPrintBuf("%s[status=%d,cid=%d,%s,%d,%s,%s,%s],", printBuf,
15484380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].status,
15494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].cid,
15504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (p_cur[i].active==0)?"down":"up",
15514380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].ifname,
15524380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].addresses,
15534380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].dnses);
15544380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
15554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        removeLastChar;
15564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        closeResponse;
15574380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
15584380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return 0;
15604380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
15614380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
15624380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
15634380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
15644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
15654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
15664380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
15674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseDataCallList(p, response, responselen);
15684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
15694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
15704380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
1571f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) {
157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL with responselen != 0");
157400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code reads -1 size as null byte array
157800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
15797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        p.writeInt32(-1);
158000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(responselen);
158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.write(response, responselen);
158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
158400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
158700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1589f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
159400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SIM_IO_Response) ) {
159600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length was %d expected %d",
159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw1);
160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw2);
160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->simResponse);
160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
160800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->simResponse);
160900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
161000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
161100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
161200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
161300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
161400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1615f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) {
161600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
16177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
161800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
161900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
162000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
162100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
162200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
162300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
16247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        LOGE("invalid response length %d expected multiple of %d",
162500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
162600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
162700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
162800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
162900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
163000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_CallForwardInfo *);
163100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
163200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
163300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
163400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
163500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
163600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
163700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->status);
163800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->reason);
163900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->serviceClass);
164000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
164100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur->number);
164200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->timeSeconds);
164300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
164400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->status==1)?"enable":"disable",
164500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->reason, p_cur->serviceClass, p_cur->toa,
164600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur->number,
164700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->timeSeconds);
164800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
164900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
165000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
16517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
165200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
165300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
165400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1655f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) {
165600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
165700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
165800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
165900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
166000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
166100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof(RIL_SuppSvcNotification)) {
166200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length was %d expected %d",
166300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
166400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
166500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
166600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
166700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
166800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->notificationType);
166900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->code);
167000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->index);
167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->type);
167200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->number);
167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (p_cur->notificationType==0)?"mo":"mt",
167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         p_cur->code, p_cur->index, p_cur->type,
167800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->number);
167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
16843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) {
168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
168800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
169000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d\n",
169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_NeighboringCell *));
169500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
16993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    /* number of records */
170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_NeighboringCell *);
170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->rssi);
170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->cid);
170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->cid, p_cur->rssi);
171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
171400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
171500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
171600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/**
17193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists.
17203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */
1721a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p,
1722a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
17233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.isPresent);
17243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signalType);
17253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.alertPitch);
17263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signal);
17273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
17283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1729a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p,
1730a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            void *response, size_t responselen) {
17313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    int num;
1732a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    char* string8 = NULL;
1733a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int buffer_lenght;
1734a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecord *infoRec;
17353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
17363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
17373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response: NULL");
17383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
17393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
17403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1741a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
1742a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        LOGE("invalid response length %d expected multiple of %d\n",
1743a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
17443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
17453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
17463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1747a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecords *p_cur =
1748a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                             (RIL_CDMA_InformationRecords *) response;
1749a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
17503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
17513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
1752a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
17533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1754a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++) {
1755a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        infoRec = &p_cur->infoRec[i];
1756a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(infoRec->name);
1757a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        switch (infoRec->name) {
17583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_DISPLAY_INFO_REC:
1759a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
1760a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.display.alpha_len >
1761a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                         CDMA_ALPHA_INFO_BUFFER_LENGTH) {
1762a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    LOGE("invalid display info response length %d \
1763a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1764a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.display.alpha_len,
1765a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_ALPHA_INFO_BUFFER_LENGTH);
1766a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
17673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
1768a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1)
1769a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
1770a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
1771a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.display.alpha_buf[i];
17723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
17734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.display.alpha_len] = '\0';
1774a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1775a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1776a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
17773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
1778a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
17793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
17803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
1781a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
1782a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    LOGE("invalid display info response length %d \
1783a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1784a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.number.len,
1785a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
1786a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
17873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
1788a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.number.len + 1)
1789a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
1790a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.number.len; i++) {
1791a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.number.buf[i];
1792a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
17934380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.number.len] = '\0';
1794a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1795a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1796a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
1797a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_type);
1798a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_plan);
1799a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.pi);
1800a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.si);
18013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
18023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_SIGNAL_INFO_REC:
1803a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.isPresent);
1804a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signalType);
1805a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.alertPitch);
1806a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signal);
1807a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1808a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%sisPresent=%X, signalType=%X, \
1809a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                alertPitch=%X, signal=%X, ",
1810a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   printBuf, (int)infoRec->rec.signal.isPresent,
1811a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signalType,
1812a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.alertPitch,
1813a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signal);
1814a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
18153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
18163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
1817a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.redir.redirectingNumber.len >
1818a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                              CDMA_NUMBER_INFO_BUFFER_LENGTH) {
1819a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    LOGE("invalid display info response length %d \
1820a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
1821a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.redir.redirectingNumber.len,
1822a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
1823a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
1824a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
1825a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber
1826a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                          .len + 1) * sizeof(char) );
1827a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0;
1828a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i < infoRec->rec.redir.redirectingNumber.len;
1829a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i++) {
1830a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
18313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
18324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
1833a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
1834a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
1835a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
1836a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
1837a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
1838a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
1839a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
1840a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingReason);
18413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
18423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_LINE_CONTROL_INFO_REC:
1843a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
1844a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
1845a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
1846a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
1847a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1848a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
1849a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlToggle=%d, lineCtrlReverse=%d, \
1850a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlPowerDenial=%d, ", printBuf,
1851a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
1852a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlToggle,
1853a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlReverse,
1854a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
1855a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
18563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
18573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_CLIR_INFO_REC:
1858a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32((int)(infoRec->rec.clir.cause));
18593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1860a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
1861a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
18623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
18633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
1864a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.upLink);
1865a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.downLink);
1866a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1867a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
1868a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.upLink,
1869a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.downLink);
1870a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
18713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
1872a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_T53_RELEASE_INFO_REC:
1873a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                // TODO(Moto): See David Krause, he has the answer:)
1874a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                LOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
1875a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
1876a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            default:
1877a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                LOGE("Incorrect name value");
1878a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
18793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        }
18803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
1881a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
18823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1883a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    return 0;
18843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
18853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1886a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p,
1887a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    void *response, size_t responselen) {
1888a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (response == NULL && responselen != 0) {
18893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response: NULL");
18903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
18913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
18923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1893a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (responselen == sizeof (RIL_SignalStrength)) {
18943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        // New RIL
18953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        RIL_SignalStrength *p_cur = ((RIL_SignalStrength *) response);
18963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
18973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
18983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
18993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
19003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
19013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
19023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
19033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
1904fdf825f9d0dc639787b8523638bb61874ed0b540johnwang
1905fdf825f9d0dc639787b8523638bb61874ed0b540johnwang        startResponse;
1906a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
1907a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                CDMA_SignalStrength.dbm=%d,CDMA_SignalStrength.ecio=%d,\
1908a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                EVDO_SignalStrength.dbm =%d,EVDO_SignalStrength.ecio=%d,\
1909a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                EVDO_SignalStrength.signalNoiseRatio=%d]",
1910a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf,
1911a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.signalStrength,
1912a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.bitErrorRate,
1913a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.dbm,
1914a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.ecio,
1915a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.dbm,
1916a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.ecio,
1917a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.signalNoiseRatio);
1918a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1919a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        closeResponse;
1920a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1921a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    } else if (responselen % sizeof (int) == 0) {
1922a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        // Old RIL deprecated
1923a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        int *p_cur = (int *) response;
1924a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1925a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        startResponse;
1926a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1927a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        // With the Old RIL we see one or 2 integers.
1928a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        size_t num = responselen / sizeof (int); // Number of integers from ril
1929a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        size_t totalIntegers = 7; // Number of integers in RIL_SignalStrength
1930a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        size_t i;
1931a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1932a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[", printBuf);
1933a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        for (i = 0; i < num; i++) {
1934a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            appendPrintBuf("%s %d", printBuf, *p_cur);
1935a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            p.writeInt32(*p_cur++);
1936a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        }
1937a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s]", printBuf);
1938a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1939a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        // Fill the remainder with zero's.
1940a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        for (; i < totalIntegers; i++) {
1941a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            p.writeInt32(0);
1942a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        }
1943a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1944fdf825f9d0dc639787b8523638bb61874ed0b540johnwang        closeResponse;
19453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
19463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response length");
19473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
19483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
19513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
19523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) {
19543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if ((response == NULL) || (responselen == 0)) {
19553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseVoid(p, response, responselen);
19563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
19573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseCdmaSignalInfoRecord(p, response, responselen);
19583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
19603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
19623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL || responselen == 0) {
19633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response: NULL");
19643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
19653d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
19683d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
19693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
19703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
19713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
19743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
19763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, *p_cur);
19773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
19793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              signal=%d]",
19803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              printBuf,
19813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->isPresent,
19823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signalType,
19833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->alertPitch,
19843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signal);
19853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
19873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
19883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
19893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
1990a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response,
1991a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            size_t responselen) {
19923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
19933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response: NULL");
19943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
19953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
19963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
19973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (responselen != sizeof(RIL_CDMA_CallWaiting)) {
19983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response length %d expected %d\n",
19993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (int)responselen, (int)sizeof(RIL_CDMA_CallWaiting));
20003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
20013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
20023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
20043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    RIL_CDMA_CallWaiting *p_cur = ((RIL_CDMA_CallWaiting *) response);
20053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    writeStringToParcel (p, p_cur->number);
20073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_cur->numberPresentation);
20083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    writeStringToParcel (p, p_cur->name);
20093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
20103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
20123d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
20133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            signal=%d]",
20143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
20153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->number,
20163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->numberPresentation,
20173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->name,
20183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.isPresent,
20193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.signalType,
20203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.alertPitch,
20213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.signal);
20223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
20243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
20263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
20273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
20283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() {
202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
203000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* trigger event loop to wakeup. No reason to do this,
203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         * if we're in the event loop thread */
203300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         do {
203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = write (s_fdWakeupWrite, " ", 1);
203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         } while (ret < 0 && errno == EINTR);
203600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
203700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
20393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) {
204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_add(ev);
204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
204300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2044f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) {
2045f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int i;
2046f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2047f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
2048f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
2049f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2050f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (responselen % sizeof (RIL_CardStatus *) != 0) {
20533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        LOGE("invalid response length %d expected multiple of %d\n",
2054f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            (int)responselen, (int)sizeof (RIL_CardStatus *));
2055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2056f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2057f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2058f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CardStatus *p_cur = ((RIL_CardStatus *) response);
2059f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2060f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->card_state);
2061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->universal_pin_state);
2062f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->gsm_umts_subscription_app_index);
2063f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->cdma_subscription_app_index);
2064f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->num_applications);
2065f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2066f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (i = 0; i < p_cur->num_applications; i++) {
2068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].app_type);
2069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].app_state);
2070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].perso_substate);
2071a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        writeStringToParcel(p, (const char*)(p_cur->applications[i].aid_ptr));
2072a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        writeStringToParcel(p, (const char*)
2073a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                      (p_cur->applications[i].app_label_ptr));
2074f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin1_replaced);
2075f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin1);
2076f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin2);
2077a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
2078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
2079f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                printBuf,
2080f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_type,
2081f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_state,
2082f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].perso_substate,
2083f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].aid_ptr,
2084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_label_ptr,
2085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin1_replaced,
2086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin1,
2087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin2);
2088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
20923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
2093f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2094a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2095a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
2096f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(num);
2097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2098f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2099a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo **p_cur =
2100a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                (RIL_GSM_BroadcastSmsConfigInfo **) response;
2101a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0; i < num; i++) {
2102a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromServiceId);
2103a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toServiceId);
2104a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromCodeScheme);
2105a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toCodeScheme);
2106a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2107a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2108a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
2109a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
2110a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
2111a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
2112a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->selected);
2113a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
2114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2119a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
2120a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
2121a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville               (RIL_CDMA_BroadcastSmsConfigInfo **) response;
2122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2123a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
2124a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
2125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2127a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
2128a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->service_category);
2129a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->language);
2130a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
2131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2132a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
2133a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              selected =%d], ",
2134a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
2135a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              p_cur[i]->selected);
2136f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
2137a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
2138f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
2143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
2144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitCount;
2145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
2146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t uct;
2147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    void* dest;
2148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2149f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    LOGD("Inside responseCdmaSms");
2150f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
2151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
2152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
2153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2156f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
2157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response length was %d expected %d",
2158f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
2159f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
2160f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2161f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
2163f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uTeleserviceID);
2164f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->bIsServicePresent),sizeof(uct));
2165f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uServicecategory);
2166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.digit_mode);
2167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_mode);
2168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_type);
2169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_plan);
2170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
2171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
2172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
2174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sSubAddress.subaddressType);
2177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
2178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
2179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
2180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
2182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
2185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uBearerDataLen);
2186f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
2187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville       p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
2188f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
2189f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2190f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
2191f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
21921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
2193f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
2194f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
2195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
2196f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
2197f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
2198f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
2199f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select()
220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the
220300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down
220400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
2205f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) {
220600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char buff[16];
220700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
220800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
220900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGV("processWakeupCallback");
221000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
221100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* empty our wakeup socket out */
221200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    do {
221300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = read(s_fdWakeupRead, &buff, sizeof(buff));
22147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    } while (ret > 0 || (ret < 0 && errno == EINTR));
221500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
221600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() {
221800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
221900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *p_cur;
222000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* mark pending requests as "cancelled" so we dont report responses */
222200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
222400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
222500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_cur = s_pendingRequests;
222700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
22287f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for (p_cur = s_pendingRequests
222900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur != NULL
223000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur  = p_cur->p_next
223100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
223200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p_cur->cancelled = 1;
223300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
223400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
223500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
223600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
223700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
223800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) {
224000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
224100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *p_record;
224200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t recordlen;
224300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
224400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert(fd == s_fdCommand);
224600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = (RecordStream *)param;
224800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (;;) {
225000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* loop until EAGAIN/EINTR, end of stream, or other error */
225100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
225200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
225300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret == 0 && p_record == NULL) {
225400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* end-of-stream */
225500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
225600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret < 0) {
225700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
225800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret == 0) { /* && p_record != NULL */
225900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            processCommandBuffer(p_record, recordlen);
226000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
226100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
226200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
226300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
226400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* fatal error or end-of-stream */
226500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret != 0) {
226600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE("error on reading command socket errno:%d\n", errno);
226700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
226800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGW("EOS.  Closing command socket.");
226900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
22707f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
227100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        close(s_fdCommand);
227200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_fdCommand = -1;
227300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ril_event_del(&s_commands_event);
227500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        record_stream_free(p_rs);
227700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
227900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
228000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
228100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        onCommandsSocketClosed();
228200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
228300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
228400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
228500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() {
228700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // implicit radio state changed
228800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
228900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    NULL, 0);
229000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Send last NITZ time data, in case it was missed
229200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_lastNITZTimeData != NULL) {
229300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize);
229400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        free(s_lastNITZTimeData);
229600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = NULL;
229700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
229800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Get version string
230000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_callbacks.getVersion != NULL) {
230100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const char *version;
230200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        version = s_callbacks.getVersion();
230300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGI("RIL Daemon version: %s\n", version);
23047f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
230500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, version);
230600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
230700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGI("RIL Daemon version: unavailable\n");
230800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, "unavailable");
230900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
231000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
231100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
231200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) {
231400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
231500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int err;
231600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int is_phone_socket;
231700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
231800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
231900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
232000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
232100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
232200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ucred creds;
232300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t szCreds = sizeof(creds);
232400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
232500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct passwd *pwd = NULL;
232600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
232700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (s_fdCommand < 0);
232800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (fd == s_fdListen);
23297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
233000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
233100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
233200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0 ) {
233300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Error on accept() errno:%d", errno);
233400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
233500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
2336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville	      return;
233700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
233800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
233900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* check the credential of the other side and only accept socket from
234000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     * phone process
23417f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville     */
234200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    errno = 0;
234300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    is_phone_socket = 0;
2344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
234500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
2346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
234700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (err == 0 && szCreds > 0) {
2348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        errno = 0;
2349f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        pwd = getpwuid(creds.uid);
2350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        if (pwd != NULL) {
2351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) {
2352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                is_phone_socket = 1;
2353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            } else {
2354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                LOGE("RILD can't accept socket from process %s", pwd->pw_name);
2355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            }
2356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        } else {
2357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGE("Error on getpwuid() errno: %d", errno);
2358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        }
235900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
2360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGD("Error on getsockopt() errno: %d", errno);
236100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
236200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
236300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ( !is_phone_socket ) {
236400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      LOGE("RILD must accept socket from %s", PHONE_PROCESS);
23657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
236600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      close(s_fdCommand);
236700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      s_fdCommand = -1;
236800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
236900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      onCommandsSocketClosed();
237000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
237100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      /* start listening for new connections again */
237200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      rilEventAddWakeup(&s_listen_event);
237300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
237400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      return;
237500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
237600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
237700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK);
237800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
237900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
238000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("Error setting O_NONBLOCK errno:%d", errno);
238100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
238200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
238300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGI("libril: new connection");
238400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
238500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES);
238600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_commands_event, s_fdCommand, 1,
238800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        processCommandsCallback, p_rs);
238900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_commands_event);
239100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    onNewCommandConnect();
239300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
239400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) {
239600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
239700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (args[i] != NULL) {
239800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(args[i]);
239900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
240000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(args);
240200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2404f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) {
240500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int acceptFD, option;
240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
240800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int data;
240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsigned int qxdm_data[6];
241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char *deactData[1] = {"1"};
241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *actData[1];
241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dialData;
241300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int hangupData[1] = {1};
241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int number;
241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **args;
241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
241800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (acceptFD < 0) {
242000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("error accepting on debug port: %d\n", errno);
242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
242500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("error reading on socket: number of Args: \n");
242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args = (char **) malloc(sizeof(char*) * number);
242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int len;
243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("error reading on socket: Len of Args: \n");
243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // +1 for null-term
243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        args[i] = (char *) malloc((sizeof(char) * len) + 1);
24397f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
24401b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            != (int)sizeof(char) * len) {
244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("error reading on socket: Args[%d] \n", i);
244200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
244400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char * buf = args[i];
244600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        buf[len] = 0;
244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
244800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (atoi(args[0])) {
245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 0:
245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Connection on debug port: issuing reset.");
245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
245300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 1:
245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Connection on debug port: issuing radio power off.");
245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 0;
245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Close the socket
245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(s_fdCommand);
246000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_fdCommand = -1;
246100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
246200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 2:
246300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: issuing unsolicited network change.");
246400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED,
246500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                      NULL, 0);
246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 3:
246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: QXDM log enable.");
2469d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[0] = 65536;     // head.func_tag
2470d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[1] = 16;        // head.len
2471d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 1;         // mode: 1 for 'start logging'
2472d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[3] = 32;        // log_file_size: 32megabytes
2473d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[4] = 0;         // log_mask
2474d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;         // log_max_fileindex
24757f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 4:
247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: QXDM log disable.");
248000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
2482d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
248300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
248400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
2485d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;
248600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 5:
249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Radio On");
249100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 1;
249200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            sleep(2);
249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Set network selection automatic.
249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0);
249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 6:
2498f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            actData[0] = args[1];
25007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(actData));
250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 7:
2504f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGI("Debug port: Deactivate Data Call");
25057f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(deactData));
250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
250800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 8:
250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Dial Call");
251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.clir = 0;
251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.address = args[1];
251200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData));
251300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 9:
251500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Answer Call");
251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0);
251700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 10:
251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: End Call");
25207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(hangupData));
252200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
252300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("Invalid request");
252500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
252700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    freeDebugCallbackArgs(number, args);
252800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    close(acceptFD);
252900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
253000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2532f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) {
253300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
253400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *)param;
253600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback(p_info->userParam);
253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME generalize this...there should be a cancel mechanism
254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info = NULL;
254300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
254400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(p_info);
254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
254700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *
2550f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) {
255100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
255200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int filedes[2];
255300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_init();
255500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
255700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 1;
255900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_cond_broadcast(&s_startupCond);
256000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
256200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pipe(filedes);
256400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
256600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Error in pipe() errno:%d", errno);
256700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return NULL;
256800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
256900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupRead = filedes[0];
257100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupWrite = filedes[1];
257200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
257400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
257600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                processWakeupCallback, NULL);
257700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_wakeupfd_event);
257900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
258000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Only returns on error
258100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_loop();
258200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGE ("error in event_loop_base errno:%d", errno);
258300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
258400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return NULL;
258500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
258600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25877f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
2588f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) {
258900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
259000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_t attr;
25917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
259200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* spin up eventLoop thread and wait for it to get started */
259300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 0;
259400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
259500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
259600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_init (&attr);
25977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
259800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
259900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
260000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (s_started == 0) {
260100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pthread_cond_wait(&s_startupCond, &s_startupMutex);
260200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
260300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
260400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
260500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
260600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
260700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to create dispatch thread errno:%d", errno);
260800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
260900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
261000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
261100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
261200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only.
261300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
261400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
261500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
261600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26177f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
2618f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) {
261900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
262000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int flags;
262100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks == NULL) {
26234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        LOGE("RIL_register: RIL_RadioFunctions * null");
262400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
262500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
26264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version < RIL_VERSION_MIN) {
26274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        LOGE("RIL_register: version %d is to old, min version is %d",
26284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION_MIN);
26294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
26304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
26314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version > RIL_VERSION) {
26324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        LOGE("RIL_register: version %d is too new, max version is %d",
26334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION);
26344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
26353a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    }
26364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    LOGE("RIL_register: RIL version %d", callbacks->version);
263700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
263800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled > 0) {
263900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("RIL_register has been called more than once. "
264000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                "Subsequent call ignored");
264100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
264200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
264300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
264400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
264500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
264600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_registerCalled = 1;
264700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
264800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Little self-check
264900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2650f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
265100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i == s_commands[i].requestNumber);
265200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
265300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2654f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
26557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        assert(i + RIL_UNSOL_RESPONSE_BASE
265600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                == s_unsolResponses[i].requestNumber);
265700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
265800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
265900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // New rild impl calls RIL_startEventLoop() first
266000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // old standalone impl wants it here.
266100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
266200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_started == 0) {
266300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_startEventLoop();
266400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
266500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
266600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start listen socket
266700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
266800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0
26697f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ret = socket_local_server (SOCKET_NAME_RIL,
267000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
267100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
267200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
267300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Unable to bind socket errno:%d", errno);
267400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit (-1);
267500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
267600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = ret;
267700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
267900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdListen < 0) {
268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to get socket '" SOCKET_NAME_RIL "'");
268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
268300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
268400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdListen, 4);
268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
268800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to listen on control socket '%d': %s",
268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdListen, strerror(errno));
269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
269300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
269400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
269500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* note: non-persistent so we can accept only one connection at a time */
26967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    ril_event_set (&s_listen_event, s_fdListen, false,
269700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                listenCallback, NULL);
269800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
269900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_listen_event);
270000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
270100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1
270200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start debug interface socket
270300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
270400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG);
270500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdDebug < 0) {
270600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno);
270700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
270800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
270900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdDebug, 4);
271100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
271300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to listen on ril debug socket '%d': %s",
271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdDebug, strerror(errno));
271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
271600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
271700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
271800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_debug_event, s_fdDebug, true,
271900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                debugCallback, NULL);
272000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_debug_event);
272200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
272300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
272500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
272600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
2727f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) {
272800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret = 0;
27297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
273000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI == NULL) {
273100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
273200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
273300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
273400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_pendingRequestsMutex);
273500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(RequestInfo **ppCur = &s_pendingRequests
27377f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        ; *ppCur != NULL
273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; ppCur = &((*ppCur)->p_next)
273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (pRI == *ppCur) {
274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = 1;
274200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            *ppCur = (*ppCur)->p_next;
274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
274500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_pendingRequestsMutex);
274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return ret;
275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
2755f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
275600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
275700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
275800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t errorOffset;
275900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)t;
276100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
276200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!checkAndDequeueRequestInfo(pRI)) {
276300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("RIL_onRequestComplete: invalid RIL_Token");
276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
276500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
276600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
276700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->local > 0) {
276800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Locally issued command...void only!
276900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // response does not go back up the command socket
277000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
277100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
277200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto done;
277300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
277400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
277500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[%04d]< %s",
277600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pRI->token, requestToString(pRI->pCI->requestNumber));
277700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
277800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->cancelled == 0) {
277900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        Parcel p;
278000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
278100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (RESPONSE_SOLICITED);
278200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (pRI->token);
278300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        errorOffset = p.dataPosition();
278400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
278500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (e);
278600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2787b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (response != NULL) {
2788b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            // there is a response payload, no matter success or not.
278900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = pRI->pCI->responseFunction(p, response, responselen);
279000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
279100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* if an error occurred, rewind and mark it */
279200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            if (ret != 0) {
279300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.setDataPosition(errorOffset);
279400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.writeInt32 (ret);
279500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            }
2796b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        }
2797b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang
2798b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (e != RIL_E_SUCCESS) {
2799b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
280000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
280100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
280200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_fdCommand < 0) {
280300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGD ("RIL onRequestComplete: Command channel closed");
280400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
280500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponse(p);
280600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
280700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
280800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone:
280900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(pRI);
281000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
281100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
281200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
281300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2814f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() {
281500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
281600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
281700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
281800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2819f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() {
282000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
282100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
282200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
282300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
282400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout
282500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
282600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2827f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) {
282800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // We're using "param != NULL" as a cancellation mechanism
282900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (param == NULL) {
283000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        //LOGD("wakeTimeout: releasing wake lock");
283100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
283200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
283300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
283400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        //LOGD("wakeTimeout: releasing wake lock CANCELLED");
283500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
283600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
283700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
283800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C"
283900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data,
284000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen)
284100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
284200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int unsolResponseIndex;
284300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
284400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int64_t timeReceived = 0;
284500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    bool shouldScheduleTimeout = false;
284600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
284700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled == 0) {
284800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Ignore RIL_onUnsolicitedResponse before RIL_register
284900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGW("RIL_onUnsolicitedResponse called before RIL_register");
285000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
285100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
28527f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
285300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
285400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
285500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ((unsolResponseIndex < 0)
285600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
285700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("unsupported unsolicited response code %d", unsolResponse);
285800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
285900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
286000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
286100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Grab a wake lock if needed for this reponse,
286200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // as we exit we'll either release it immediately
286300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // or set a timer to release it later.
286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (s_unsolResponses[unsolResponseIndex].wakeType) {
286500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case WAKE_PARTIAL:
286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            grabPartialWakeLock();
286700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = true;
286800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
286900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
287000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case DONT_WAKE:
287100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
287200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // No wake lock is grabed so don't set timeout
287300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = false;
287400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
287500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
287600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
287700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Mark the time this was received, doing this
287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // after grabing the wakelock incase getting
287900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // the elapsedRealTime might cause us to goto
288000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // sleep.
288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        timeReceived = elapsedRealtime();
288300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
288400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (RESPONSE_UNSOLICITED);
289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (unsolResponse);
289100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = s_unsolResponses[unsolResponseIndex]
289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                .responseFunction(p, data, datalen);
289400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0) {
289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Problem with the response. Don't continue;
289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto error_exit;
289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
289900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // some things get more payload
290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(unsolResponse) {
290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
290200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt32(s_callbacks.onStateRequest());
290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s {%s}", printBuf,
290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                radioStateToString(s_callbacks.onStateRequest()));
290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
290600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
290800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED:
290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Store the time that this was received so the
291000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // handler of this message can account for
291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // the time it takes to arrive and process. In
291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // particular the system has been known to sleep
291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // before this message can be processed.
291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt64(timeReceived);
291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
291700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
291800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = sendResponse(p);
291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Unfortunately, NITZ time is not poll/update like everything
292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // else in the system. So, if the upstream client isn't connected,
292300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // keep a copy of the last NITZ response (with receive time noted
292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // above) around so we can deliver it when it is connected
292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_lastNITZTimeData != NULL) {
292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free (s_lastNITZTimeData);
292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_lastNITZTimeData = NULL;
292900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = malloc(p.dataSize());
293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeDataSize = p.dataSize();
293300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME The java code should handshake here to release wake lock
293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
293900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Cancel the previous request
294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_last_wake_timeout_info != NULL) {
294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_last_wake_timeout_info->userParam = (void *)1;
294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
294400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info
294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                            &TIMEVAL_WAKE_TIMEOUT);
294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
294900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Normal exit
295100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
295200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
295300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit:
295400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
295800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it
29607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    when the callback occurs
296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *
29637f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param,
29640d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn                                const struct timeval *relativeTime)
296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct timeval myRelativeTime;
296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
296800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
296900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
297000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    p_info->p_callback = callback;
297200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->userParam = param;
29730d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
297400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (relativeTime == NULL) {
297500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* treat null parameter as a 0 relative time */
297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (&myRelativeTime, 0, sizeof(myRelativeTime));
297700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
297800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* FIXME I think event_add's tv param is really const anyway */
297900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
298000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
298100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
298300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_timer_add(&(p_info->event), &myRelativeTime);
298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
298700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return p_info;
298800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
298900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29910d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void
29927f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
2993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                const struct timeval *relativeTime) {
29940d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    internalRequestTimedCallback (callback, param, relativeTime);
299500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
299700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
2998f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) {
299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(e) {
300000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SUCCESS: return "E_SUCCESS";
300100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE";
300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
300400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_CANCELLED: return "E_CANCELLED";
300800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
300900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
3011f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
30127553447d44bb3f494b00d573215d81398f61cfcdJohn Wang        case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
30137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID
3014f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
3015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
3016f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
301700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown error>";
301800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
301900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
302000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
302100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3022f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) {
302300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
302400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_OFF: return "RADIO_OFF";
302500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
302600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
302700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
302800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
3029f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
3030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
3031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
3032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
3033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
303400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
303500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
303600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
303700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
303800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3039f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) {
304000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
304100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ACTIVE : return "ACTIVE";
304200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_HOLDING: return "HOLDING";
304300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_DIALING: return "DIALING";
304400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ALERTING: return "ALERTING";
304500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_INCOMING: return "INCOMING";
304600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_WAITING: return "WAITING";
304700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
304800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
304900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
305000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
305100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
3052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) {
305300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*
305400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \
305500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
305600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
305700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
305800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
305900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \
306000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
306100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
306200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
306300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
306400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(request) {
306500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
306600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
306700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
306800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
306900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
307000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
307100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
307200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
307300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
307400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DIAL: return "DIAL";
307500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
307600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP: return "HANGUP";
307700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
307800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
307900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
308000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
308100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_UDUB: return "UDUB";
308200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
308300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
308400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_REGISTRATION_STATE: return "REGISTRATION_STATE";
308500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GPRS_REGISTRATION_STATE: return "GPRS_REGISTRATION_STATE";
308600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OPERATOR: return "OPERATOR";
308700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
308800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF: return "DTMF";
308900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
309000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
3091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
309200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIM_IO: return "SIM_IO";
309300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
309400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
309500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
309600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
309700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
309800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
309900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
310000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
310100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
310200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
310300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
310400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ANSWER: return "ANSWER";
3105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
310600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
310700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
310800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
310900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
311000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
311100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
311200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
311300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_START: return "DTMF_START";
311400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
311500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
311600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
311700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
311800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
311900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
312000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
312100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
312200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
3123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
3124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
312500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
312600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
312700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
3128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
3129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
313000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
313100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
313200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
313300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
313400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
313500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
313600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
3138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION:return"CDMA_SET_SUBSCRIPTION";
3139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
3140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
3141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
3142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
3143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
3144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
3145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
3146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
3147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
3148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
3149a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
3150a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
3151a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
3152a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
3153a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
315403c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
3155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
3156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
3157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
3158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
3159000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
3160000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
3161000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
316209a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
3163563fd7207da27322bf3f3587ef6000a944a617b7jsh        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
316600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED";
316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
316800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
317100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
317200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
317300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
317500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
317600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
317700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
3180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
3182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
3183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
3184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
3185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
31863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
31873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
31883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
31893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
31903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
3191af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
31925d621da539abea83309d77317ede40126f47d5f0John Wang        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
31935909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
319400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown request>";
319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */
3199