ril.cpp revision f5903dfd25c2ef104b3e9267b53f6ee3e7588063
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**
500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** you may not use this file except in compliance with the License.
700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** You may obtain a copy of the License at
800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
1100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 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>
3000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/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 {
13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    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
13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef 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
14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
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);
20400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
205f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
206f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchBrSmsCnf(Parcel &p, RequestInfo *pRI);
208f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
21000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen);
21100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen);
21200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen);
21300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen);
21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen);
21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen);
21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen);
21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen);
218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen);
21900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen);
22000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen);
221f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen);
222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseBrSmsCnf(Parcel &p, void *response, size_t responselen);
223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaBrCnf(Parcel &p, void *response, size_t responselen);
224f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen);
22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen);
22600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request);
22800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno);
22900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState);
23000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState);
23100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB
23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen);
23500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
23600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * internalRequestTimedCallback
23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    (RIL_TimedCallback callback, void *param,
23900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const struct timeval *relativeTime);
24000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */
24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = {
24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h"
24400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
24500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = {
24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h"
24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char *
252f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) {
25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char16_t *s16;
25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = p.readString16Inplace(&stringlen);
25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return strndup16to8(s16, stringlen);
25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
261f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) {
26200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char16_t *s16;
26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t s16_len;
26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = strdup8to16(s, &s16_len);
26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeString16(s16, s16_len);
26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(s16);
26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
26800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
271f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) {
27200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s != NULL) {
27300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (s, 0, strlen(s));
27400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
27500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
27600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
27700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
27800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    const size_t* objects, size_t objectsSize,
279f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                        void* cookie) {
28000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // do nothing -- the data reference lives longer than the Parcel object
28100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
28200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
28300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread
28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response
28600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * is not sent back up to the command process
28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
289f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) {
29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
29100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->local = 1;
29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = 0xffffffff;        // token is not used in this context
29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGD("C[locl]> %s", requestToString(request));
30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(request, data, len, pRI);
31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) {
31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t request;
32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t token;
32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
32300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.setData((uint8_t *) buffer, buflen);
32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // status checked at end
32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&request);
32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&token);
32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid request block");
33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("unsupported request code %d token %d", request, token);
33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // FIXME this should perhaps return a response
33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = token;
34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->p_next = s_pendingRequests;
35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_pendingRequests = pRI;
35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*    sLastDispatchedToken = token; */
35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI->dispatchFunction(p, pRI);
35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
364f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) {
36500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGE("invalid command block for token %d request %s",
36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                pRI->token, requestToString(pRI->pCI->requestNumber));
36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */
37000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) {
37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    clearPrintBuf;
37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */
37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
379f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) {
38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *string8 = NULL;
38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    string8 = strdupReadString(p);
38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, string8);
38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, string8,
39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       sizeof(char *), pRI);
39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(string8);
39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(string8);
40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */
40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
408f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) {
40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t countStrings;
41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **pStrings;
41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&countStrings);
41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (countStrings == 0) {
42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // just some non-null pointer
42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(sizeof(char *));
42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else if (((int)countStrings) == -1) {
42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = NULL;
42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = sizeof(char *) * countStrings;
43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(datalen);
43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            pStrings[i] = strdupReadString(p);
43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pStrings != NULL) {
44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            memsetString (pStrings[i]);
44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(pStrings[i]);
45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset(pStrings, 0, datalen);
45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */
46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
465f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) {
46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t count;
46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *pInts;
47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&count);
47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || count == 0) {
47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    datalen = sizeof(int) * count;
47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pInts = (int *)alloca(datalen);
47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < count ; i++) {
48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int32_t t;
48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        status = p.readInt32(&t);
48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pInts[i] = (int)t;
48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, t);
48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (status != NO_ERROR) {
48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            goto invalid;
49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   }
49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   removeLastChar;
49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   closeRequest;
49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   printRequest(pRI->token, pRI->pCI->requestNumber);
49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts),
49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                       datalen, pRI);
49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(pInts, 0, datalen);
50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_SMS_WriteArgs *
51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t status
51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pdu
51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
51800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_WriteArgs args;
51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&args, 0, sizeof(args));
52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.status = (int)t;
52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.pdu = strdupReadString(p);
52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || args.pdu == NULL) {
53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.smsc = strdupReadString(p);
53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)args.pdu,  (char*)args.smsc);
53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI);
54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (args.pdu);
54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (args.pdu);
54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&args, 0, sizeof(args));
55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_Dial *
56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String address
56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t clir
56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
566f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) {
56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dial;
56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&dial, 0, sizeof(dial));
57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.address = strdupReadString(p);
57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.clir = (int)t;
57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || dial.address == NULL) {
57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeof(dial), pRI);
58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (dial.address);
59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
59300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (dial.address);
59400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&dial, 0, sizeof(dial));
59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
59800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
60000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
60200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
60300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
60500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_SIM_IO *
60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t command
60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t fileid
61000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String path
61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t p1, p2, p3
61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String data
61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pin2
61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
616f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO simIO;
61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
61900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
62000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&simIO, 0, sizeof(simIO));
62200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // note we only check status at the end
62400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
62600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.command = (int)t;
62700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
62900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.fileid = (int)t;
63000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.path = strdupReadString(p);
63200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
63400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p1 = (int)t;
63500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
63700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p2 = (int)t;
63800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
64000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.p3 = (int)t;
64100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.data = strdupReadString(p);
64300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    simIO.pin2 = strdupReadString(p);
64400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
64600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s", printBuf,
64700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        simIO.command, simIO.fileid, (char*)simIO.path,
64800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        simIO.p1, simIO.p2, simIO.p3,
64900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)simIO.data,  (char*)simIO.pin2);
65000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
65100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
65200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
65400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
65500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
65600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project       s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, sizeof(simIO), pRI);
65800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
66000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.path);
66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.data);
66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (simIO.pin2);
66300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
66400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
66500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.path);
66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.data);
66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (simIO.pin2);
66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&simIO, 0, sizeof(simIO));
67100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo *
68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t status/action
68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t reason
68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t serviceCode
68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t toa
68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  String number  (0 length -> null)
68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t timeSeconds
68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
690f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) {
69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_CallForwardInfo cff;
69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&cff, 0, sizeof(cff));
69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // note we only check status at the end
69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.status = (int)t;
70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.reason = (int)t;
70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.serviceClass = (int)t;
70700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
70900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.toa = (int)t;
71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.number = strdupReadString(p);
71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
71400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.timeSeconds = (int)t;
71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // special case: number 0-length fields is null
72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (cff.number != NULL && strlen (cff.number) == 0) {
72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.number = NULL;
72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.status, cff.reason, cff.serviceClass, cff.toa,
72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)cff.number, cff.timeSeconds);
73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI);
73400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(cff.number);
73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
73900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (cff.number);
74000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&cff, 0, sizeof(cff));
74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
74400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
74900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
753f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) {
75400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t len;
75500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const void *data;
75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&len);
75900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
76100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
76200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
76300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code writes -1 for null arrays
76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (((int)len) == -1) {
76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        data = NULL;
76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        len = 0;
76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    data = p.readInplace(len);
77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sraw_size=%d", printBuf, len);
77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI);
77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
78400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void
786f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
787f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message rcsm;
788f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
789f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
790f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
791f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
792f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
793f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
794f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
795f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
796f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
797f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uTeleserviceID = (int) t;
798f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
799f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
800f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.bIsServicePresent = (uint8_t) ut;
801f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
802f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
803f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uServicecategory = (int) t;
804f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
805f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
806f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
807f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
808f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
809f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
810f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
811f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
812f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
813f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
814f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
815f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
816f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
817f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
818f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_of_digits= (uint8_t) ut;
819f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
820f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
821f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
822f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
823f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
824f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
825f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
826f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
827f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
828f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
829f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
830f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.odd = (uint8_t) ut;
831f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
832f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
833f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
834f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
835f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
836f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
837f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
838f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
839f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
840f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
841f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
842f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uBearerDataLen = (int) t;
843f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
844f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
845f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
846f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut, sizeof(ut));
847f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.aBearerData[digitCount] = (uint8_t) ut;
848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
849f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
850f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
851f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
852f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
853f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
854f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
855f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
8561b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
857f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
8581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
859f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
860f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
861f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
862f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
863f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI);
864f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
865f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
866f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
867f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
868f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
869f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
870f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
871f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
872f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
873f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
874f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
875f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
876f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void
877f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
878f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Ack rcsa;
879f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
880f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
881f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
882f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
883f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
884f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
885f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
886f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
887f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
888f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uSMSCauseCode = (int) t;
890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
892f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
894f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
895f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
8961b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
8971b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
899f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI);
903f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
904f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
914f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void
916f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchBrSmsCnf(Parcel &p, RequestInfo *pRI) {
917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_BroadcastSMSConfig rbsc;
918f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
921f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rbsc, 0, sizeof(rbsc));
924f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rbsc.size = (int) t;
927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rbsc.entries->uFromServiceID = (int) t;
930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
932f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rbsc.entries->uToserviceID = (int) t;
933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
934f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    //usage of read function on assumption that it reads any length given as 2nd argument
935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rbsc.entries->bSelected = (uint8_t) ut;
937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
940f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
941f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
9431b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%ssize=%d, entries.uFromServiceID=%d, \
944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            entries.uToserviceID=%d, entries.bSelected =%d, ", printBuf,
945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            rbsc.size,rbsc.entries->uFromServiceID, rbsc.entries->uToserviceID,
946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            rbsc.entries->bSelected);
947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
950f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
951f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rbsc, sizeof(rbsc),pRI);
952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
953f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
954f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rbsc, 0, sizeof(rbsc));
955f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
957f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
964f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void
966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_BroadcastSMSConfig rcbsc;
968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
971f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
973f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
974f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcbsc.size = (int) t;
975f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
976f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    LOGE("RIL_CPP: dispatchCdmaBrSmsCnf(), isize=%d", rcbsc.size);
977f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
978f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (rcbsc.size != 0) {
979f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        RIL_CDMA_BroadcastServiceInfo cdmaBsi[rcbsc.size];
980f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        for (int i = 0 ; i < rcbsc.size ; i++ ) {
981f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            status = p.readInt32(&t);
982f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            cdmaBsi[i].uServiceCategory = (int) t;
983f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
984f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            status = p.readInt32(&t);
985f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            cdmaBsi[i].uLanguage = (int) t;
986f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
987f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            status = p.readInt32(&t);
988f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            cdmaBsi[i].bSelected = (uint8_t) t;
989f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
990f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            startRequest;
991f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            appendPrintBuf("%sentries.uServicecategory=%d, entries.uLanguage =%d, \
992f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                entries.bSelected =%d, ", printBuf, cdmaBsi[i].uServiceCategory,
993f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                cdmaBsi[i].uLanguage, cdmaBsi[i].bSelected);
994f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            closeRequest;
995f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        }
996f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        rcbsc.entries = (RIL_CDMA_BroadcastServiceInfo *)calloc(rcbsc.size,
997f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                sizeof(RIL_CDMA_BroadcastServiceInfo));
998f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        memcpy(rcbsc.entries, cdmaBsi, (sizeof(RIL_CDMA_BroadcastServiceInfo) * rcbsc.size));
999f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    } else {
1000f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        rcbsc.entries = NULL;
1001f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
1002f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1003f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1004f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1005f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1006f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1007f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber,
1008f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                          &rcbsc,
1009f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                          (sizeof(RIL_CDMA_BroadcastServiceInfo) * rcbsc.size) + sizeof(int),
1010f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                          pRI);
1011f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1012f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcbsc, 0, sizeof(rcbsc));
1014f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1016f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1017f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1018f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1019f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1020f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1021f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1022f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1023f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1024f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1025f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_WriteArgs rcsw;
1026f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1027f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint32_t ut;
1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t  uct;
1029f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  digitCount;
1031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1034f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1035f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.status = t;
1036f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1037f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1038f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uTeleserviceID = (int) t;
1039f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1040f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1041f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.bIsServicePresent = (uint8_t) uct;
1042f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1043f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1044f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uServicecategory = (int) t;
1045f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1046f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1047f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1048f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1049f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1050f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1053f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1054f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1056f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1057f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1058f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1059f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1060f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
1062f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1063f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1064f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1065f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1066f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.odd = (uint8_t) uct;
1071f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1072f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1073f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1074f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1075f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
1076f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1077f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1078f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1079f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1080f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1081f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uBearerDataLen = (int) t;
1082f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1083f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
1084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct, sizeof(uct));
1085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
10931b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
10941b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
10951b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_mode=%d, \
10961b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_type=%d, ",
1097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
10981b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
10991b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_mode,
11001b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_type);
1101f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1102f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1103f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1104f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI);
1106f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1108f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1109f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1110f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1112f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1113f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
111900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) {
112100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t writeOffset = 0;
112200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const uint8_t *toWrite;
112300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
112400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    toWrite = (const uint8_t *)buffer;
112500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
112600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (writeOffset < len) {
112700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ssize_t written;
112800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        do {
112900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            written = write (fd, toWrite + writeOffset,
113000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                len - writeOffset);
113100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } while (written < 0 && errno == EINTR);
113200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
113300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (written >= 0) {
113400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeOffset += written;
113500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {   // written < 0
113600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("RIL Response: unexpected error on write errno:%d", errno);
113700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(fd);
113800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return -1;
113900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
114000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
114100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
114200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
114300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
114400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
114500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) {
114700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int fd = s_fdCommand;
114800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
114900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    uint32_t header;
115000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
115100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0) {
115200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
115300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
115400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
115500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (dataSize > MAX_COMMAND_BYTES) {
115600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("RIL: packet larger than %u (%u)",
115700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                MAX_COMMAND_BYTES, (unsigned int )dataSize);
115800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
115900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
116000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
116100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
116200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
116300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME is blocking here ok? issue #550970
116400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
116500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_writeMutex);
116600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
116700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    header = htonl(dataSize);
116800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
116900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = blockingWrite(fd, (void *)&header, sizeof(header));
117000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
117100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
117200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
117300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
117400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
117500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    blockingWrite(fd, data, dataSize);
117600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
117700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
117800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
117900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
118000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
118100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_writeMutex);
118200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
118300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
118400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
118500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
118600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) {
118800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printResponse;
118900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return sendResponseRaw(p.data(), p.dataSize());
119000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
119100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
119200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/
119300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
119400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) {
119600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numInts;
119700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
119800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
119900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
120000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
120100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
120200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(int) != 0) {
120300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d\n",
120400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(int));
120500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
120600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
120700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
120800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *p_int = (int *) response;
120900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
121000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    numInts = responselen / sizeof(int *);
121100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (numInts);
121200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
121300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* each int*/
121400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
121500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < numInts ; i++) {
121600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, p_int[i]);
121700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_int[i]);
121800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
121900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
122000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
122100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
122200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
122300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
122400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
122500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */
1226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) {
122700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numStrings;
122800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
122900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
123000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
123100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
123200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
123300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(char *) != 0) {
123400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d\n",
123500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(char *));
123600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
123700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
123800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
123900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
124000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (0);
124100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
124200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char **p_cur = (char **) response;
124300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
124400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        numStrings = responselen / sizeof(char *);
124500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (numStrings);
124600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
124700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each string*/
124800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        startResponse;
124900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < numStrings ; i++) {
125000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
125100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeStringToParcel (p, p_cur[i]);
125200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
125300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        removeLastChar;
125400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        closeResponse;
125500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
125600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
125700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
125800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
125900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
126000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
126100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * NULL strings are accepted
126200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen
126300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
1264f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) {
126500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* one string only */
126600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
126700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, (char*)response);
126800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
126900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
127000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, (const char *)response);
127100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
127200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
127300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
127400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1275f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) {
127600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
127700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
127800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
127900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
128000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1281f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) {
128200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
128300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
128400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
128500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
128600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
128700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
128800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
128900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_Call *) != 0) {
129000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d\n",
129100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_Call *));
129200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
129300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
129400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
129500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
129600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
129700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_Call *);
129800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
129900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
130000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
13011b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    /* NEWRIL:TODO Remove this conditional and the else clause when we have the new ril */
13021b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville#if NEWRIL
13031b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        LOGD("Compilied for NEWRIL"); // NEWRIL:TODO remove when we have the new ril
130400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_Call *p_cur = ((RIL_Call **) response)[i];
130500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each call info */
130600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->state);
130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->index);
130800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
130900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMpty);
131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMT);
131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->als);
131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isVoice);
13131b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoicePrivacy);
13141b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->number);
13151b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->numberPresentation);
13161b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->name);
13171b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->namePresentation);
13181b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
13191b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf,
13201b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
13211b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            callStateToString(p_cur->state),
13221b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->toa,
13231b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
13241b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMT)?"mt":"mo",
13251b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->als,
13261b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoice)?"voc":"nonvoc",
13271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp",
13281b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
13291b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
13301b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
13311b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
13321b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville#else
13331b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        LOGD("Old RIL");
13341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        RIL_CallOld *p_cur = ((RIL_CallOld **) response)[i];
13351b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        /* each call info */
13361b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->state);
13371b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->index);
13381b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->toa);
13391b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isMpty);
13401b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isMT);
13411b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->als);
13421b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoice);
13431b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(0); // p_cur->isVoicePrivacy);
134400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->number);
1345ff36874070b246c40f2ecfcbd584a2d663fa493dJohn Wang        p.writeInt32(p_cur->numberPresentation);
13461b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel (p, "a-person");
13471b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(2); // p_cur->namePresentation);
13481b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
1349ff36874070b246c40f2ecfcbd584a2d663fa493dJohn Wang            printBuf,
13501b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            callStateToString(p_cur->state),
13521b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->toa,
13531b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->isMT)?"mt":"mo",
135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->als,
135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->isVoice)?"voc":"nonvoc",
13571b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp",
13581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
13591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
13601b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
13611b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
13621b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville#endif
136300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
136400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) {
137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
137400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SMS_Response) ) {
137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected %d",
137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SMS_Response));
137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
138000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
138100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->messageRef);
138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->ackPDU);
138600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s", printBuf, p_cur->messageRef,
138900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->ackPDU);
139000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1395f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen)
139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1402f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (responselen % sizeof(RIL_Data_Call_Response) != 0) {
140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d",
1404f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                (int)responselen, (int)sizeof(RIL_Data_Call_Response));
140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1408f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num = responselen / sizeof(RIL_Data_Call_Response);
140900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
141000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1411f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_Data_Call_Response *p_cur = (RIL_Data_Call_Response *) response;
141200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
141300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int i;
141400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (i = 0; i < num; i++) {
141500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].cid);
141600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].active);
141700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].type);
141800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].apn);
141900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].address);
142000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%d,%s,%s,%s,%s],", printBuf,
142100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur[i].cid,
142200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur[i].active==0)?"down":"up",
142300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].type,
142400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].apn,
142500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].address);
142600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
142700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
142800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
142900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
143000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
143100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
143200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1433f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) {
143400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
143500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL with responselen != 0");
143600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
143700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
143800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
143900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code reads -1 size as null byte array
144000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
144100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(-1);
144200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(responselen);
144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.write(response, responselen);
144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
145000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1451f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
145500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
145700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SIM_IO_Response) ) {
145800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length was %d expected %d",
145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw1);
146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw2);
146600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->simResponse);
146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
146900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
147000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->simResponse);
147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
147500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
147600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1477f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) {
147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
147900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
148400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
148500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d",
148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
148900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
149200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_CallForwardInfo *);
149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->status);
150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->reason);
150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->serviceClass);
150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur->number);
150400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->timeSeconds);
150500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
150600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->status==1)?"enable":"disable",
150700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->reason, p_cur->serviceClass, p_cur->toa,
150800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur->number,
150900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->timeSeconds);
151000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
151100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
151200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
151300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
151400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
151500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
151600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) {
151800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
151900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
152000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
152100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
152200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
152300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof(RIL_SuppSvcNotification)) {
152400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length was %d expected %d",
152500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
152600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
152700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
152800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
152900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
153000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->notificationType);
153100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->code);
153200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->index);
153300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->type);
153400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->number);
153500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
153600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
153700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
153800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (p_cur->notificationType==0)?"mo":"mt",
153900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         p_cur->code, p_cur->index, p_cur->type,
154000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->number);
154100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
154200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
154300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
154400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
154500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
154600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen)
154700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
154800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
154900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
155000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
155100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response: NULL");
155200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
155300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
155400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
155500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
155600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("invalid response length %d expected multiple of %d\n",
155700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_NeighboringCell *));
155800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
155900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
156000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
156100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
156200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of cell info's */
156300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_NeighboringCell *);
156400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
156500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
156600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
156700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
156800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
156900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each cell info */
157000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->rssi);
157100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->cid);
157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
157400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->cid, p_cur->rssi);
157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
157800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
157900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
158000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void triggerEvLoop()
158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
158400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* trigger event loop to wakeup. No reason to do this,
158700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         * if we're in the event loop thread */
158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         do {
158900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = write (s_fdWakeupWrite, " ", 1);
159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         } while (ret < 0 && errno == EINTR);
159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
159400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void rilEventAddWakeup(struct ril_event *ev)
159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
159600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_add(ev);
159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1600f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) {
1601f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int i;
1602f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1603f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
1604f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
1605f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1606f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1607f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1608f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (responselen % sizeof (RIL_CardStatus *) != 0) {
1609f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response length %d expected multiple of %d\n",
1610f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            (int)responselen, (int)sizeof (RIL_CardStatus *));
1611f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1612f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1613f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1614f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CardStatus *p_cur = ((RIL_CardStatus *) response);
1615f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1616f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->card_state);
1617f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->universal_pin_state);
1618f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->gsm_umts_subscription_app_index);
1619f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->cdma_subscription_app_index);
1620f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->num_applications);
1621f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1622f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
1623f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (i = 0; i < p_cur->num_applications; i++) {
1624f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].app_type);
1625f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].app_state);
1626f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].perso_substate);
1627f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        writeStringToParcel (p, (const char*)(p_cur->applications[i].aid_ptr));
1628f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        writeStringToParcel (p, (const char*)(p_cur->applications[i].app_label_ptr));
1629f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin1_replaced);
1630f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin1);
1631f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.writeInt32(p_cur->applications[i].pin2);
1632f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,aid_ptr=%s,\
1633f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
1634f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                printBuf,
1635f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_type,
1636f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_state,
1637f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].perso_substate,
1638f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].aid_ptr,
1639f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].app_label_ptr,
1640f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin1_replaced,
1641f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin1,
1642f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                p_cur->applications[i].pin2);
1643f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1644f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
1645f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1646f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
1647f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1648f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1649f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseBrSmsCnf(Parcel &p, void *response, size_t responselen) {
1650f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
1651f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1652f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
1653f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
1654f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1655f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1656f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1657f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen % sizeof(RIL_BroadcastSMSConfig) != 0) {
1658f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response length %d expected multiple of %d",
1659f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_BroadcastSMSConfig));
1660f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1661f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1662f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1663f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    /* number of call info's */
1664f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    num = responselen / sizeof(RIL_BroadcastSMSConfig *);
1665f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(num);
1666f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1667f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_BroadcastSMSConfig *p_cur = (RIL_BroadcastSMSConfig *) response;
1668f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->size);
1669f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->entries->uFromServiceID);
1670f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->entries->uToserviceID);
1671f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->entries->bSelected),sizeof(p_cur->entries->bSelected));
1672f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1673f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
16741b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%s size=%d, entries.uFromServiceID=%d, \
1675f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            entries.uToserviceID=%d, entries.bSelected =%d, ",
1676f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->size,p_cur->entries->uFromServiceID,
16771b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->entries->uToserviceID, p_cur->entries->bSelected);
1678f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
1679f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1680f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
1681f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1682f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1683f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaBrCnf(Parcel &p, void *response, size_t responselen) {
1684f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    int numServiceCategories;
1685f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1686f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
1687f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
1688f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1689f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1690f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1691f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen == 0) {
1692f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        LOGE("invalid response length %d expected >= of %d",
1693f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_BroadcastSMSConfig));
1694f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1695f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1696f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1697f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    RIL_CDMA_BroadcastSMSConfig *p_cur = (RIL_CDMA_BroadcastSMSConfig *) response;
1698f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1699f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    numServiceCategories = p_cur->size;
1700f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->size);
1701f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1702f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
1703f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    appendPrintBuf("%ssize=%d ", printBuf,p_cur->size);
1704f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
1705f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1706f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (numServiceCategories != 0) {
1707f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        RIL_CDMA_BroadcastServiceInfo cdmaBsi[numServiceCategories];
1708f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        memcpy(cdmaBsi, p_cur->entries,
1709f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                 sizeof(RIL_CDMA_BroadcastServiceInfo) * numServiceCategories);
1710f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1711f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        for (int i = 0 ; i < numServiceCategories ; i++ ) {
1712f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            p.writeInt32(cdmaBsi[i].uServiceCategory);
1713f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            p.writeInt32(cdmaBsi[i].uLanguage);
1714f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            p.writeInt32(cdmaBsi[i].bSelected);
1715f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1716f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            startResponse;
1717f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            appendPrintBuf("%sentries[%d].uServicecategory=%d, entries[%d].uLanguage =%d, \
1718f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                entries[%d].bSelected =%d, ", printBuf, i, cdmaBsi[i].uServiceCategory, i,
1719f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                cdmaBsi[i].uLanguage, i, cdmaBsi[i].bSelected);
1720f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville            closeResponse;
1721f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        }
1722f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    } else {
1723f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville        p.writeInt32(NULL);
1724f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
1725f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1726f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
1727f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1728f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1729f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
1730f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
1731f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitCount;
1732f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
1733f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t uct;
1734f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    void* dest;
1735f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1736f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    LOGD("Inside responseCdmaSms");
1737f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
1738f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
1739f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response: NULL");
1740f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1741f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1742f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1743f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
1744f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGE("invalid response length was %d expected %d",
1745f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
1746f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
1747f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1748f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1749f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
1750f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uTeleserviceID);
1751f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->bIsServicePresent),sizeof(uct));
1752f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uServicecategory);
1753f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.digit_mode);
1754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_mode);
1755f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_type);
1756f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_plan);
1757f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
1758f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1759f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1760f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
1761f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1762f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1763f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sSubAddress.subaddressType);
1764f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
1765f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
1766f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1767f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1768f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
1769f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1770f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1771f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1772f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uBearerDataLen);
1773f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1774f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville       p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
1775f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1776f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1777f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
1778f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
17791b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
1780f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
1781f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
1782f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
1783f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1784f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
1785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1786f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
178700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
178800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select()
178900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the
179000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down
179100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
1792f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) {
179300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char buff[16];
179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGV("processWakeupCallback");
179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
179800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* empty our wakeup socket out */
179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    do {
180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = read(s_fdWakeupRead, &buff, sizeof(buff));
180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } while (ret > 0 || (ret < 0 && errno == EINTR));
180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
180300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1804f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() {
180500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *p_cur;
180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* mark pending requests as "cancelled" so we dont report responses */
180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_lock(&s_pendingRequestsMutex);
181100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
181200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_cur = s_pendingRequests;
181400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
181500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (p_cur = s_pendingRequests
181600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur != NULL
181700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur  = p_cur->p_next
181800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
181900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p_cur->cancelled = 1;
182000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
182100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
182200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
182300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
182400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
182500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1826f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) {
182700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
182800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *p_record;
182900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t recordlen;
183000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
183100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
183200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert(fd == s_fdCommand);
183300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
183400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = (RecordStream *)param;
183500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
183600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (;;) {
183700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* loop until EAGAIN/EINTR, end of stream, or other error */
183800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
183900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
184000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret == 0 && p_record == NULL) {
184100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* end-of-stream */
184200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
184300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret < 0) {
184400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
184500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret == 0) { /* && p_record != NULL */
184600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            processCommandBuffer(p_record, recordlen);
184700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
184800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
184900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
185000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
185100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* fatal error or end-of-stream */
185200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret != 0) {
185300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE("error on reading command socket errno:%d\n", errno);
185400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
185500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGW("EOS.  Closing command socket.");
185600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
185700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
185800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        close(s_fdCommand);
185900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_fdCommand = -1;
186000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
186100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ril_event_del(&s_commands_event);
186200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
186300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        record_stream_free(p_rs);
186400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
186500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
186600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
186700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
186800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        onCommandsSocketClosed();
186900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
187000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
187100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
187200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1873f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() {
187400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // implicit radio state changed
187500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
187600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    NULL, 0);
187700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
187800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Send last NITZ time data, in case it was missed
187900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_lastNITZTimeData != NULL) {
188000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize);
188100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
188200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        free(s_lastNITZTimeData);
188300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = NULL;
188400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
188500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
188600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Get version string
188700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_callbacks.getVersion != NULL) {
188800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const char *version;
188900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        version = s_callbacks.getVersion();
189000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGI("RIL Daemon version: %s\n", version);
189100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
189200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, version);
189300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
189400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGI("RIL Daemon version: unavailable\n");
189500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, "unavailable");
189600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
189700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
189800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
189900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) {
190100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
190200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int err;
190300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int is_phone_socket;
190400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
190500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
190600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
190700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
190800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
190900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ucred creds;
191000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t szCreds = sizeof(creds);
191100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct passwd *pwd = NULL;
191300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (s_fdCommand < 0);
191500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (fd == s_fdListen);
191600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
191800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
191900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdCommand < 0 ) {
192000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Error on accept() errno:%d", errno);
192100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
192200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
1923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville	      return;
192400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
192500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
192600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* check the credential of the other side and only accept socket from
192700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     * phone process
192800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     */
192900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    errno = 0;
193000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    is_phone_socket = 0;
1931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
193200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
1933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
193400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (err == 0 && szCreds > 0) {
1935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        errno = 0;
1936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        pwd = getpwuid(creds.uid);
1937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        if (pwd != NULL) {
1938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) {
1939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                is_phone_socket = 1;
1940f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            } else {
1941f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                LOGE("RILD can't accept socket from process %s", pwd->pw_name);
1942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            }
1943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        } else {
1944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGE("Error on getpwuid() errno: %d", errno);
1945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        }
194600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
1947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        LOGD("Error on getsockopt() errno: %d", errno);
194800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
194900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
195000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ( !is_phone_socket ) {
195100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      LOGE("RILD must accept socket from %s", PHONE_PROCESS);
195200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
195300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      close(s_fdCommand);
195400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      s_fdCommand = -1;
195500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
195600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      onCommandsSocketClosed();
195700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
195800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      /* start listening for new connections again */
195900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      rilEventAddWakeup(&s_listen_event);
196000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      return;
196200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
196300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK);
196500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
196700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("Error setting O_NONBLOCK errno:%d", errno);
196800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
196900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGI("libril: new connection");
197100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES);
197300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_commands_event, s_fdCommand, 1,
197500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        processCommandsCallback, p_rs);
197600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_commands_event);
197800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    onNewCommandConnect();
198000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
198100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
198200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) {
198300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
198400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (args[i] != NULL) {
198500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(args[i]);
198600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
198700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
198800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(args);
198900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
199000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1991f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) {
199200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int acceptFD, option;
199300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
199400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
199500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int data;
199600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsigned int qxdm_data[6];
199700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char *deactData[1] = {"1"};
199800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *actData[1];
199900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dialData;
200000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int hangupData[1] = {1};
200100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int number;
200200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **args;
200300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
200400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
200500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
200600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (acceptFD < 0) {
200700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("error accepting on debug port: %d\n", errno);
200800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
200900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
201000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
201100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
201200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("error reading on socket: number of Args: \n");
201300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
201400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
201500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args = (char **) malloc(sizeof(char*) * number);
201600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
201700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
201800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int len;
201900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
202000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("error reading on socket: Len of Args: \n");
202100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
202200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
202300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
202400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // +1 for null-term
202500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        args[i] = (char *) malloc((sizeof(char) * len) + 1);
202600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
20271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            != (int)sizeof(char) * len) {
202800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("error reading on socket: Args[%d] \n", i);
202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
203000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char * buf = args[i];
203300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        buf[len] = 0;
203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
203600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (atoi(args[0])) {
203700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 0:
203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Connection on debug port: issuing reset.");
203900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 1:
204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Connection on debug port: issuing radio power off.");
204300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 0;
204400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
204500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Close the socket
204600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(s_fdCommand);
204700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_fdCommand = -1;
204800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
204900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 2:
205000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: issuing unsolicited network change.");
205100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED,
205200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                      NULL, 0);
205300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
205400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 3:
205500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: QXDM log enable.");
205600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
205700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
205800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[2] = 1;
205900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
206000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
206100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 8;
206200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
206300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
206400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
206500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 4:
206600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI ("Debug port: QXDM log disable.");
206700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
206800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
206900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[2] = 0;
207000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
207100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
207200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 8;
207300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
207400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              6 * sizeof(int));
207500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
207600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 5:
207700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Radio On");
207800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 1;
207900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
208000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            sleep(2);
208100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Set network selection automatic.
208200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0);
208300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
208400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 6:
2085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
208600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            actData[0] = args[1];
2087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
208800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(actData));
208900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
209000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 7:
2091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            LOGI("Debug port: Deactivate Data Call");
2092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
209300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(deactData));
209400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
209500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 8:
209600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Dial Call");
209700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.clir = 0;
209800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.address = args[1];
209900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData));
210000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
210100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 9:
210200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: Answer Call");
210300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0);
210400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
210500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 10:
210600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGI("Debug port: End Call");
210700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
210800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                              sizeof(hangupData));
210900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
211000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
211100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGE ("Invalid request");
211200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
211300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
211400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    freeDebugCallbackArgs(number, args);
211500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    close(acceptFD);
211600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
211700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
211800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2119f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) {
212000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
212100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *)param;
212300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback(p_info->userParam);
212500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME generalize this...there should be a cancel mechanism
212800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
212900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info = NULL;
213000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
213100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(p_info);
213300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
213400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *
2137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) {
213800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
213900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int filedes[2];
214000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_init();
214200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
214400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 1;
214600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_cond_broadcast(&s_startupCond);
214700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
214900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pipe(filedes);
215100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
215300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Error in pipe() errno:%d", errno);
215400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return NULL;
215500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
215600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupRead = filedes[0];
215800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupWrite = filedes[1];
215900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
216100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
216300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                processWakeupCallback, NULL);
216400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_wakeupfd_event);
216600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Only returns on error
216800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_loop();
216900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    LOGE ("error in event_loop_base errno:%d", errno);
217000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
217100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return NULL;
217200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
217300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
217400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
2175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) {
217600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
217700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_t attr;
217800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
217900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* spin up eventLoop thread and wait for it to get started */
218000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 0;
218100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
218200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
218300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_init (&attr);
218400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
218500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
218600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
218700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (s_started == 0) {
218800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pthread_cond_wait(&s_startupCond, &s_startupMutex);
218900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
219000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
219100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
219200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
219300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
219400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to create dispatch thread errno:%d", errno);
219500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
219600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
219700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
219800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
219900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only.
220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
220300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
220400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
2205f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) {
220600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
220700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int flags;
220800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
220900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (callbacks == NULL
221000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || ! (callbacks->version == RIL_VERSION || callbacks->version == 1)
221100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
221200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE(
221300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            "RIL_register: RIL_RadioFunctions * null or invalid version"
221400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            " (expected %d)", RIL_VERSION);
221500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
221600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
221700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
221800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled > 0) {
221900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("RIL_register has been called more than once. "
222000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                "Subsequent call ignored");
222100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
222200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
222300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
222500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_registerCalled = 1;
222700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Little self-check
222900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2230f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
223100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i == s_commands[i].requestNumber);
223200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
223300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
223500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i + RIL_UNSOL_RESPONSE_BASE
223600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                == s_unsolResponses[i].requestNumber);
223700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
223800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
223900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // New rild impl calls RIL_startEventLoop() first
224000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // old standalone impl wants it here.
224100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_started == 0) {
224300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_startEventLoop();
224400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
224500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start listen socket
224700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
224800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0
224900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = socket_local_server (SOCKET_NAME_RIL,
225000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
225100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
225200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
225300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Unable to bind socket errno:%d", errno);
225400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit (-1);
225500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
225600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = ret;
225700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
225800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
225900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
226000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdListen < 0) {
226100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to get socket '" SOCKET_NAME_RIL "'");
226200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
226300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
226400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
226500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdListen, 4);
226600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
226700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
226800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to listen on control socket '%d': %s",
226900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdListen, strerror(errno));
227000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
227100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
227200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
227300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* note: non-persistent so we can accept only one connection at a time */
227600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_listen_event, s_fdListen, false,
227700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                listenCallback, NULL);
227800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_listen_event);
228000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
228100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1
228200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start debug interface socket
228300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
228400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG);
228500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdDebug < 0) {
228600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno);
228700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
228800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
228900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdDebug, 4);
229100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
229300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("Failed to listen on ril debug socket '%d': %s",
229400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdDebug, strerror(errno));
229500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
229600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
229700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
229800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_debug_event, s_fdDebug, true,
229900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                debugCallback, NULL);
230000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
230100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_debug_event);
230200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
230300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
230400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
230500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
230600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
2307f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) {
230800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret = 0;
230900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
231000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI == NULL) {
231100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
231200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
231300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
231400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_pendingRequestsMutex);
231500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
231600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for(RequestInfo **ppCur = &s_pendingRequests
231700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; *ppCur != NULL
231800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; ppCur = &((*ppCur)->p_next)
231900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
232000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (pRI == *ppCur) {
232100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = 1;
232200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
232300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            *ppCur = (*ppCur)->p_next;
232400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
232500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
232600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
232700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
232800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_pendingRequestsMutex);
232900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
233000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return ret;
233100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
233200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
233300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
233400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
2335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
233600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
233700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
233800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t errorOffset;
233900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
234000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)t;
234100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
234200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!checkAndDequeueRequestInfo(pRI)) {
234300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE ("RIL_onRequestComplete: invalid RIL_Token");
234400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
234500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
234600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
234700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->local > 0) {
234800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Locally issued command...void only!
234900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // response does not go back up the command socket
235000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
235100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
235200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto done;
235300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
235400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
235500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[%04d]< %s",
235600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pRI->token, requestToString(pRI->pCI->requestNumber));
235700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
235800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->cancelled == 0) {
235900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        Parcel p;
236000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
236100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (RESPONSE_SOLICITED);
236200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (pRI->token);
236300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        errorOffset = p.dataPosition();
236400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
236500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (e);
236600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
236700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (e == RIL_E_SUCCESS) {
236800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* process response on success */
236900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = pRI->pCI->responseFunction(p, response, responselen);
237000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
237100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* if an error occurred, rewind and mark it */
237200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            if (ret != 0) {
237300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.setDataPosition(errorOffset);
237400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.writeInt32 (ret);
237500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            }
237600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
237700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s returns %s", printBuf, failCauseToString(e));
237800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
237900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
238000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_fdCommand < 0) {
238100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            LOGD ("RIL onRequestComplete: Command channel closed");
238200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
238300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        sendResponse(p);
238400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
238500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
238600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone:
238700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(pRI);
238800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
238900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2392f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() {
239300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
239400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
239500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
239600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2397f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() {
239800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
239900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
240000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
240200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout
240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
240400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
2405f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) {
240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // We're using "param != NULL" as a cancellation mechanism
240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (param == NULL) {
240800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        //LOGD("wakeTimeout: releasing wake lock");
240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        //LOGD("wakeTimeout: releasing wake lock CANCELLED");
241300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C"
241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data,
241800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen)
241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
242000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int unsolResponseIndex;
242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int64_t timeReceived = 0;
242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    bool shouldScheduleTimeout = false;
242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled == 0) {
242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Ignore RIL_onUnsolicitedResponse before RIL_register
242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGW("RIL_onUnsolicitedResponse called before RIL_register");
242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
243034a5108969fbfc6cf8140513b7246da805902b7aThe Android Open Source Project
243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ((unsolResponseIndex < 0)
243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        LOGE("unsupported unsolicited response code %d", unsolResponse);
243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Grab a wake lock if needed for this reponse,
244000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // as we exit we'll either release it immediately
244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // or set a timer to release it later.
244200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (s_unsolResponses[unsolResponseIndex].wakeType) {
244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case WAKE_PARTIAL:
244400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            grabPartialWakeLock();
244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = true;
244600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
244800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case DONT_WAKE:
244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // No wake lock is grabed so don't set timeout
245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = false;
245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
245300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Mark the time this was received, doing this
245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // after grabing the wakelock incase getting
245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // the elapsedRealTime might cause us to goto
245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // sleep.
245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
246000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        timeReceived = elapsedRealtime();
246100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
246200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
246300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
246400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
246500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (RESPONSE_UNSOLICITED);
246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (unsolResponse);
246900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
247000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = s_unsolResponses[unsolResponseIndex]
247100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                .responseFunction(p, data, datalen);
247200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0) {
247300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Problem with the response. Don't continue;
247400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto error_exit;
247500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // some things get more payload
247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(unsolResponse) {
247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
248000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt32(s_callbacks.onStateRequest());
248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s {%s}", printBuf,
248200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                radioStateToString(s_callbacks.onStateRequest()));
248300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
248400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
248500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
248600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED:
248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Store the time that this was received so the
248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // handler of this message can account for
248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // the time it takes to arrive and process. In
249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // particular the system has been known to sleep
249100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // before this message can be processed.
249200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt64(timeReceived);
249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = sendResponse(p);
249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
249800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Unfortunately, NITZ time is not poll/update like everything
250000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // else in the system. So, if the upstream client isn't connected,
250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // keep a copy of the last NITZ response (with receive time noted
250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // above) around so we can deliver it when it is connected
250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_lastNITZTimeData != NULL) {
250500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free (s_lastNITZTimeData);
250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_lastNITZTimeData = NULL;
250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
250800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = malloc(p.dataSize());
251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeDataSize = p.dataSize();
251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
251200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
251300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
251500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME The java code should handshake here to release wake lock
251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Cancel the previous request
251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_last_wake_timeout_info != NULL) {
252000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_last_wake_timeout_info->userParam = (void *)1;
252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
252200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
252300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info
252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
252500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                            &TIMEVAL_WAKE_TIMEOUT);
252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
252700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
252800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Normal exit
252900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
253000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit:
253200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // There was an error and we've got the wake lock so release it.
253300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
253400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
253500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
253600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
253700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** FIXME generalize this if you track UserCAllbackInfo, clear it
253900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    when the callback occurs
254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *
254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectinternalRequestTimedCallback (RIL_TimedCallback callback, void *param,
254300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                const struct timeval *relativeTime)
254400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct timeval myRelativeTime;
254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
254700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
254900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback = callback;
255100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->userParam = param;
255200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
255300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (relativeTime == NULL) {
255400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* treat null parameter as a 0 relative time */
255500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (&myRelativeTime, 0, sizeof(myRelativeTime));
255600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
255700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* FIXME I think event_add's tv param is really const anyway */
255800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
255900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
256000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
256200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_timer_add(&(p_info->event), &myRelativeTime);
256400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
256600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return p_info;
256700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
256800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
256900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
257100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
2572f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                const struct timeval *relativeTime) {
257300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    internalRequestTimedCallback (callback, param, relativeTime);
257400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
257500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
257600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
2577f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) {
257800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(e) {
257900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SUCCESS: return "E_SUCCESS";
258000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE";
258100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
258200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
258300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
258400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
258500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
258600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_CANCELLED: return "E_CANCELLED";
258700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
258800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
258900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
2590f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
2591f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef FEATURE_MULTIMODE_ANDROID
2592f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
2593f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
2594f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
259500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown error>";
259600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
259700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
259800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
259900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
2600f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) {
260100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
260200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_OFF: return "RADIO_OFF";
260300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
260400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
260500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
260600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
2607f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
2608f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
2609f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
2610f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
2611f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
261200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
261300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
261400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
261500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
261600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
2617f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) {
261800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
261900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ACTIVE : return "ACTIVE";
262000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_HOLDING: return "HOLDING";
262100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_DIALING: return "DIALING";
262200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ALERTING: return "ALERTING";
262300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_INCOMING: return "INCOMING";
262400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_WAITING: return "WAITING";
262500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
262600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
262700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
262800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
262900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
2630f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) {
263100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*
263200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \
263300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
263400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
263500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
263600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
263700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \
263800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
263900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
264000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
264100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
264200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(request) {
264300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
264400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
264500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
264600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
264700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
264800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
264900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
265000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
265100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
265200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DIAL: return "DIAL";
265300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
265400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP: return "HANGUP";
265500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
265600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
265700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
265800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
265900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_UDUB: return "UDUB";
266000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
266100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
266200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_REGISTRATION_STATE: return "REGISTRATION_STATE";
266300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GPRS_REGISTRATION_STATE: return "GPRS_REGISTRATION_STATE";
266400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OPERATOR: return "OPERATOR";
266500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
266600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF: return "DTMF";
266700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
266800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
2669f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
267000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIM_IO: return "SIM_IO";
267100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
267200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
267300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
267400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
267500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
267600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
267700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
267900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ANSWER: return "ANSWER";
2683f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
268400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
268800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_START: return "DTMF_START";
269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
269300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
269400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
269500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
269600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
269700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
269800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
269900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
270000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
2701f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
2702f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
270300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
270400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
270500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
2706f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
2707f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
270800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
270900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
271000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
271100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
271200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
271300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
2716f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION:return"CDMA_SET_SUBSCRIPTION";
2717f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
2718f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
2719f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
2720f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
2721f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
2722f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
2723f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
2724f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
2725f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
2726f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
2727f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_GET_BROADCAST_CONFIG:return"GET_BROADCAST_CONFIG";
2728f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BROADCAST_CONFIG:return"SET_BROADCAST_CONFIG";
2729f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG:return "CDMA_GET_BROADCAST_CONFIG";
2730f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG:return "SET_CDMA_BROADCAST_CONFIG";
2731f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_BROADCAST_ACTIVATION:return "BROADCAST_ACTIVATION";
2732f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_VALIDATE_AKEY: return"CDMA_VALIDATE_AKEY";
2733f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
2734f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
2735f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
2736f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
273700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED";
274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
274200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
274500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
2753f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
275534a5108969fbfc6cf8140513b7246da805902b7aThe Android Open Source Project        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
2756f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
2757f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
2758f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
2759f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown request>";
276100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
276200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
276300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */
2765