100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp
200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project
400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License");
67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License.
77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at
800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville**     http://www.apache.org/licenses/LICENSE-2.0
1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project**
117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software
127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS,
137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and
1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License.
1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC"
1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h>
2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h>
23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h>
2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h>
2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
26622bf2bf79849127cbedd1f56631615bf58aaf78Dima Zavin#include <telephony/record_stream.h>
2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h>
2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h>
2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h>
308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h>
3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h>
3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h>
3418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville#include <sys/limits.h>
3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h>
3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h>
3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h>
3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h>
4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h>
4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h>
4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h>
4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h>
4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h>
4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h>
4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h>
4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h>
4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h>
5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h>
5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h>
5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h>
5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android {
5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio"
5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild"
60d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define SOCKET2_NAME_RIL "rild2"
61d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define SOCKET3_NAME_RIL "rild3"
62d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define SOCKET4_NAME_RIL "rild4"
63d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug"
6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface"
6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java
7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024)
7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library
7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find
7600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner.
7700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1
7800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])
8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#define MIN(a,b) ((a)<(b) ? (a) : (b))
82f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */
8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0
8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1
8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */
8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1
8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro
9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096
9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log
9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0
9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest           sprintf(printBuf, "(")
9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest           sprintf(printBuf, "%s)", printBuf)
9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)           \
1008eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("[%04d]> %s %s", token, requestToString(req), printBuf)
10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse           sprintf(printBuf, "%s {", printBuf)
10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse           sprintf(printBuf, "%s}", printBuf)
1048eb2a12cb7b525e74736300962a5f3848427275aWink Saville    #define printResponse           RLOGD("%s", printBuf)
10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf           printBuf[0] = 0
10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar          printBuf[strlen(printBuf)-1] = 0
10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)    sprintf(printBuf, x)
10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else
11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startRequest
11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeRequest
11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printRequest(token, req)
11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define startResponse
11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define closeResponse
11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define printResponse
11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define clearPrintBuf
11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define removeLastChar
11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    #define appendPrintBuf(x...)
11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL};
12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int(*responseFunction) (Parcel &p, void *response, size_t responselen);
12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo;
12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct {
13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int requestNumber;
13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int (*responseFunction) (Parcel &p, void *response, size_t responselen);
13200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    WakeType wakeType;
13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo;
13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo {
1367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    int32_t token;      //this is not RIL_Token
13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    CommandInfo *pCI;
13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct RequestInfo *p_next;
13900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char cancelled;
14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char local;         // responses to local commands do not go back to command process
141d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SOCKET_ID socket_id;
14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo;
14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savilletypedef struct UserCallbackInfo {
14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_TimedCallback p_callback;
14600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *userParam;
14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ril_event event;
14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct UserCallbackInfo *p_next;
14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo;
15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
151d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohentypedef struct SocketListenParam {
152d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SOCKET_ID socket_id;
153d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fdListen;
154d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fdCommand;
155d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    char* processName;
156d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    struct ril_event* commands_event;
157d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    struct ril_event* listen_event;
158d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    void (*processCommandsCallback)(int fd, short flags, void *param);
159d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RecordStream *p_rs;
160d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen} SocketListenParam;
161d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
162d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" const char * requestToString(int request);
163d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" const char * failCauseToString(RIL_Errno);
164d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" const char * callStateToString(RIL_CallState);
165d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" const char * radioStateToString(RIL_RadioState);
166d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
1670d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
168d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C"
169d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenchar rild[MAX_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL;
17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0;
17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch;
17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader;
17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0;
17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1;
180d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic int s_fdDebug_socket2 = -1;
18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead;
18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite;
18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event;
18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event;
18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event;
188d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic SocketListenParam s_ril_param_socket;
189d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
190d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
191d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
192d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic RequestInfo *s_pendingRequests = NULL;
193d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
194d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
195d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_commands_event_socket2;
196d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_listen_event_socket2;
197d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic SocketListenParam s_ril_param_socket2;
198d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
199d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_pendingRequestsMutex_socket2  = PTHREAD_MUTEX_INITIALIZER;
200d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_writeMutex_socket2            = PTHREAD_MUTEX_INITIALIZER;
201d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic RequestInfo *s_pendingRequests_socket2          = NULL;
202d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
203d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
204d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
205d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_commands_event_socket3;
206d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_listen_event_socket3;
207d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic SocketListenParam s_ril_param_socket3;
208d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
209d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_pendingRequestsMutex_socket3  = PTHREAD_MUTEX_INITIALIZER;
210d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_writeMutex_socket3            = PTHREAD_MUTEX_INITIALIZER;
211d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic RequestInfo *s_pendingRequests_socket3          = NULL;
212d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
213d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
214d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
215d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_commands_event_socket4;
216d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic struct ril_event s_listen_event_socket4;
217d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic SocketListenParam s_ril_param_socket4;
218d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
219d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_pendingRequestsMutex_socket4  = PTHREAD_MUTEX_INITIALIZER;
220d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic pthread_mutex_t s_writeMutex_socket4            = PTHREAD_MUTEX_INITIALIZER;
221d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic RequestInfo *s_pendingRequests_socket4          = NULL;
222d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
223d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event;
22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event;
22600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
22800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0};
22900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
230d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
23100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
23200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
23500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
23600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL;
23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL;
23900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL;
24100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL;
24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize;
24400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG
24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    static char printBuf[PRINTBUF_SIZE];
24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/
250d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic int sendResponse (Parcel &p, RIL_SOCKET_ID socket_id);
25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI);
25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI);
25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI);
25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI);
25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI);
25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
2582458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalstatic void dispatchSIM_APDU (Parcel& p, RequestInfo *pRI);
25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI);
26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI);
26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
2624f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI);
2632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI);
26475697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI);
2652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI);
26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
267f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
268a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsSms(Parcel &p, RequestInfo *pRI);
269a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
270a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
271f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
272a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
273f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
274f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
2758a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVReadItem(Parcel &p, RequestInfo *pRI);
2768a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI);
277d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI);
27890530a6e86001facba8a34541d2f038f24562cc3Amit Mahajanstatic void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI);
279c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajanstatic void dispatchDataProfile(Parcel &p, RequestInfo *pRI);
28000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen);
28100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen);
28200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen);
28300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen);
28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen);
28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen);
28600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen);
28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen);
288f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen);
2894380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen);
29100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen);
292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen);
293a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
294a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen);
29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen);
2973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
2983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
2993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen);
3003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
3013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
30245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen);
3038a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen);
304d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic int responseHardwareConfig(Parcel &p, void *response, size_t responselen);
305c29360a92ad603fcec008c098cbbed47e3399dc8Wink Savillestatic int responseDcRtInfo(Parcel &p, void *response, size_t responselen);
30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeVoiceRadioTechnology (RIL_RadioState radioState);
3082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
3092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState processRadioState(RIL_RadioState newRadioState);
3102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB
312d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if defined(ANDROID_MULTI_SIM)
313d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
314d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                                size_t datalen, RIL_SOCKET_ID socket_id);
315d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#else
3167f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen);
31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
319d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
320d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
321d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if defined(ANDROID_MULTI_SIM)
322d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c), (d))
323d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
324d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest(a)
325d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#else
326d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c))
327d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d))
328d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest()
329d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3317f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback
3320d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    (RIL_TimedCallback callback, void *param,
3330d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn        const struct timeval *relativeTime);
33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */
33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = {
33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h"
33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = {
34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h"
34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project};
34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and
3452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from
3462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   radio state message and store it. Every time there is a change in Radio State
3472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if voice radio tech changes and notify telephony
3482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
3492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint voiceRadioTech = -1;
3502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
3512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE
3522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription
3532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   source from radio state and store it. Every time there is a change in Radio State
3542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if subscription source changed and notify telephony
3552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
3562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint cdmaSubscriptionSource = -1;
3572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
3582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the
3592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   SIM/RUIM state from radio state and store it. Every time there is a change in Radio State,
3602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   check to see if SIM/RUIM status changed and notify telephony
3612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
3622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint simRuimStatus = -1;
36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
364d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic char * RIL_getRilSocketName() {
365d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    return rild;
366d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
367d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
368d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C"
369d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenvoid RIL_setRilSocketName(char * s) {
370d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    strncpy(rild, s, MAX_SOCKET_NAME_LENGTH);
371d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
372d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char *
374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) {
37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char16_t *s16;
3777f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = p.readString16Inplace(&stringlen);
3797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return strndup16to8(s16, stringlen);
38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
383f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) {
38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char16_t *s16;
38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t s16_len;
38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s16 = strdup8to16(s, &s16_len);
38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeString16(s16, s16_len);
38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(s16);
38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
393f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) {
39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s != NULL) {
39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (s, 0, strlen(s));
39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                    const size_t* objects, size_t objectsSize,
401f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                        void* cookie) {
40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // do nothing -- the data reference lives longer than the Parcel object
40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4057f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread
40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response
4087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process
40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
411d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohenissueLocalRequest(int request, void *data, int len, RIL_SOCKET_ID socket_id) {
41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
414d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* Hook for current context */
415d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
416d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
417d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsHook refer to &s_pendingRequests */
418d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RequestInfo**    pendingRequestsHook = &s_pendingRequests;
419d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
420d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT == 2)
421d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_2) {
422d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
423d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket2;
424d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
425d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->local = 1;
43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = 0xffffffff;        // token is not used in this context
43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
432d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pRI->socket_id = socket_id;
43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
434d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_lock(pendingRequestsMutexHook);
43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
437d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pRI->p_next = *pendingRequestsHook;
438d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    *pendingRequestsHook = pRI;
43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
440d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_unlock(pendingRequestsMutexHook);
44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4438eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("C[locl]> %s", requestToString(request));
44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
445d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(request, data, len, pRI, pRI->socket_id);
44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
451d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohenprocessCommandBuffer(void *buffer, size_t buflen, RIL_SOCKET_ID socket_id) {
45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t request;
45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t token;
45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
458d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* Hook for current context */
459d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
460d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
461d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsHook refer to &s_pendingRequests */
462d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RequestInfo**    pendingRequestsHook = &s_pendingRequests;
46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.setData((uint8_t *) buffer, buflen);
46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // status checked at end
46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&request);
46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&token);
46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
470d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGD("SOCKET %s REQUEST: %s length:%d", rilSocketIdToString(socket_id), requestToString(request), buflen);
471d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
472d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
473d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_2) {
474d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
475d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket2;
476d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
477d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
478d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_3) {
479d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
480d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket3;
481d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
482d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
483d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
484d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_4) {
485d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
486d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket4;
487d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
488d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
489d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
490d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
4928eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid request block");
49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
497d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        Parcel pErr;
4988eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported request code %d token %d", request, token);
49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // FIXME this should perhaps return a response
500d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pErr.writeInt32 (RESPONSE_SOLICITED);
501d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pErr.writeInt32 (token);
502d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pErr.writeInt32 (RIL_E_GENERIC_FAILURE);
503d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
504d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        sendResponse(pErr, socket_id);
50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->token = token;
51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI->pCI = &(s_commands[request]);
513d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pRI->socket_id = socket_id;
51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
515d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_lock(pendingRequestsMutexHook);
51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
518d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pRI->p_next = *pendingRequestsHook;
519d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    *pendingRequestsHook = pRI;
52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
521d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_unlock(pendingRequestsMutexHook);
52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*    sLastDispatchedToken = token; */
52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
5267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pRI->pCI->dispatchFunction(p, pRI);
52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
532f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) {
5338eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("invalid command block for token %d request %s",
53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                pRI->token, requestToString(pRI->pCI->requestNumber));
53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */
5387f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
539f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) {
54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    clearPrintBuf;
54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
542d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, NULL, 0, pRI, pRI->socket_id);
54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */
54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
547f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) {
54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t stringlen;
55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *string8 = NULL;
55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    string8 = strdupReadString(p);
55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, string8);
55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
560d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, string8,
561d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                       sizeof(char *), pRI, pRI->socket_id);
56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(string8);
56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(string8);
56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */
57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
576f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) {
57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t countStrings;
57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **pStrings;
58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&countStrings);
58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (countStrings == 0) {
59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // just some non-null pointer
59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(sizeof(char *));
59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
59300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else if (((int)countStrings) == -1) {
59400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = NULL;
59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = 0;
59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        datalen = sizeof(char *) * countStrings;
5987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pStrings = (char **)alloca(datalen);
60000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
60200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            pStrings[i] = strdupReadString(p);
60300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
60500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
610d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, pStrings, datalen, pRI, pRI->socket_id);
61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pStrings != NULL) {
61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < countStrings ; i++) {
61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            memsetString (pStrings[i]);
61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(pStrings[i]);
61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
61900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
62000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
62100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset(pStrings, 0, datalen);
62200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
62300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
6247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
62500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
62600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
62700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
62800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
62900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
63000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */
63200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
633f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) {
63400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t count;
63500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
63600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t datalen;
63700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *pInts;
63800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
63900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32 (&count);
64000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || count == 0) {
64200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
64300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
64400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    datalen = sizeof(int) * count;
64600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pInts = (int *)alloca(datalen);
64700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
64800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
64900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < count ; i++) {
65000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int32_t t;
65100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        status = p.readInt32(&t);
65300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pInts[i] = (int)t;
65400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, t);
65500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
65600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (status != NO_ERROR) {
65700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            goto invalid;
65800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
65900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   }
66000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   removeLastChar;
66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   closeRequest;
66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project   printRequest(pRI->token, pRI->pCI->requestNumber);
66300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
664d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<int *>(pInts),
665d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                       datalen, pRI, pRI->socket_id);
66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(pInts, 0, datalen);
66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
6787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
6797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs *
68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t status
68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String pdu
68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
685f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_WriteArgs args;
68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&args, 0, sizeof(args));
69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.status = (int)t;
69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.pdu = strdupReadString(p);
69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || args.pdu == NULL) {
69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args.smsc = strdupReadString(p);
70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)args.pdu,  (char*)args.smsc);
70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
70700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
7087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
709d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &args, sizeof(args), pRI, pRI->socket_id);
71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (args.pdu);
71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
71400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (args.pdu);
7167f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&args, 0, sizeof(args));
71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7277f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
7287f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial *
72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String address
73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t clir
73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
734f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) {
73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dial;
73674fa38884320698c1623764850e3131b9769dff0Wink Saville    RIL_UUS_Info uusInfo;
7377bce082edcee07339ebb06a35970b4b218ab8288Wink Saville    int32_t sizeOfDial;
73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
73974fa38884320698c1623764850e3131b9769dff0Wink Saville    int32_t uusPresent;
74000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&dial, 0, sizeof(dial));
74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.address = strdupReadString(p);
74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    dial.clir = (int)t;
74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
74900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR || dial.address == NULL) {
75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
7533a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
75474fa38884320698c1623764850e3131b9769dff0Wink Saville        uusPresent = 0;
7557bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
75674fa38884320698c1623764850e3131b9769dff0Wink Saville    } else {
75774fa38884320698c1623764850e3131b9769dff0Wink Saville        status = p.readInt32(&uusPresent);
75874fa38884320698c1623764850e3131b9769dff0Wink Saville
75974fa38884320698c1623764850e3131b9769dff0Wink Saville        if (status != NO_ERROR) {
76074fa38884320698c1623764850e3131b9769dff0Wink Saville            goto invalid;
76174fa38884320698c1623764850e3131b9769dff0Wink Saville        }
76274fa38884320698c1623764850e3131b9769dff0Wink Saville
76374fa38884320698c1623764850e3131b9769dff0Wink Saville        if (uusPresent == 0) {
76474fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = NULL;
76574fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
76674fa38884320698c1623764850e3131b9769dff0Wink Saville            int32_t len;
76774fa38884320698c1623764850e3131b9769dff0Wink Saville
76874fa38884320698c1623764850e3131b9769dff0Wink Saville            memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
76974fa38884320698c1623764850e3131b9769dff0Wink Saville
77074fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
77174fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusType = (RIL_UUS_Type) t;
77274fa38884320698c1623764850e3131b9769dff0Wink Saville
77374fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&t);
77474fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusDcs = (RIL_UUS_DCS) t;
77574fa38884320698c1623764850e3131b9769dff0Wink Saville
77674fa38884320698c1623764850e3131b9769dff0Wink Saville            status = p.readInt32(&len);
77774fa38884320698c1623764850e3131b9769dff0Wink Saville            if (status != NO_ERROR) {
77874fa38884320698c1623764850e3131b9769dff0Wink Saville                goto invalid;
77974fa38884320698c1623764850e3131b9769dff0Wink Saville            }
78074fa38884320698c1623764850e3131b9769dff0Wink Saville
78174fa38884320698c1623764850e3131b9769dff0Wink Saville            // The java code writes -1 for null arrays
78274fa38884320698c1623764850e3131b9769dff0Wink Saville            if (((int) len) == -1) {
78374fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = NULL;
78474fa38884320698c1623764850e3131b9769dff0Wink Saville                len = 0;
78574fa38884320698c1623764850e3131b9769dff0Wink Saville            } else {
78674fa38884320698c1623764850e3131b9769dff0Wink Saville                uusInfo.uusData = (char*) p.readInplace(len);
78774fa38884320698c1623764850e3131b9769dff0Wink Saville            }
78874fa38884320698c1623764850e3131b9769dff0Wink Saville
78974fa38884320698c1623764850e3131b9769dff0Wink Saville            uusInfo.uusLength = len;
79074fa38884320698c1623764850e3131b9769dff0Wink Saville            dial.uusInfo = &uusInfo;
79174fa38884320698c1623764850e3131b9769dff0Wink Saville        }
7927bce082edcee07339ebb06a35970b4b218ab8288Wink Saville        sizeOfDial = sizeof(dial);
79374fa38884320698c1623764850e3131b9769dff0Wink Saville    }
79474fa38884320698c1623764850e3131b9769dff0Wink Saville
79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
79600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
79774fa38884320698c1623764850e3131b9769dff0Wink Saville    if (uusPresent) {
79874fa38884320698c1623764850e3131b9769dff0Wink Saville        appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
79974fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusType, dial.uusInfo->uusDcs,
80074fa38884320698c1623764850e3131b9769dff0Wink Saville                dial.uusInfo->uusLength);
80174fa38884320698c1623764850e3131b9769dff0Wink Saville    }
80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
805d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI, pRI->socket_id);
80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString (dial.address);
80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
81000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (dial.address);
8127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
81474fa38884320698c1623764850e3131b9769dff0Wink Saville    memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&dial, 0, sizeof(dial));
81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/**
8257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO *
82600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t command
82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t fileid
82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   String path
83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *   int32_t p1, p2, p3
8317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String data
8327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville *   String pin2
833c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville *   String aidPtr
83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
836f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
837c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    union RIL_SIM_IO {
838c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v6 v6;
839c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        RIL_SIM_IO_v5 v5;
840c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } simIO;
841c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
843c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int size;
84400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
84500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
84600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&simIO, 0, sizeof(simIO));
84700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
8487f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
8497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
85000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
851c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.command = (int)t;
85200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
85300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
854c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.fileid = (int)t;
85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
856c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.path = strdupReadString(p);
85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
859c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p1 = (int)t;
86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
86100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
862c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p2 = (int)t;
86300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
865c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.p3 = (int)t;
86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
867c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.data = strdupReadString(p);
868c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.pin2 = strdupReadString(p);
869c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    simIO.v6.aidPtr = strdupReadString(p);
87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
872c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
873c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
874c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
875c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        (char*)simIO.v6.data,  (char*)simIO.v6.pin2, simIO.v6.aidPtr);
87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
8787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
88000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
88100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
88200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
883c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
884d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &simIO, size, pRI, pRI->socket_id);
88500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
88600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
887c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.path);
888c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.data);
889c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.pin2);
890c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    memsetString (simIO.v6.aidPtr);
89100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
89200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
893c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.path);
894c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.data);
895c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.pin2);
896c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    free (simIO.v6.aidPtr);
8977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
89800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
89900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&simIO, 0, sizeof(simIO));
90000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
90100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
90200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
90300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
90400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
90500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
90600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
90700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
90800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
9092458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal * Callee expects const RIL_SIM_APDU *
9102458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal * Payload is:
9112458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t sessionid
9122458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t cla
9132458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t instruction
9142458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   int32_t p1, p2, p3
9152458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal *   String data
9162458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal */
9172458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalstatic void
9182458d8d1e56faae7b00511ceeab19730572c22d9Shishir AgrawaldispatchSIM_APDU (Parcel &p, RequestInfo *pRI) {
9192458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    int32_t t;
9202458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status_t status;
9212458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    RIL_SIM_APDU apdu;
9222458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9232458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memset (&apdu, 0, sizeof(RIL_SIM_APDU));
9242458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9252458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    // Note we only check status at the end. Any single failure leads to
9262458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    // subsequent reads filing.
9272458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9282458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.sessionid = (int)t;
9292458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9302458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9312458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.cla = (int)t;
9322458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9332458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9342458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.instruction = (int)t;
9352458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9362458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9372458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p1 = (int)t;
9382458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9392458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9402458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p2 = (int)t;
9412458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9422458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    status = p.readInt32(&t);
9432458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.p3 = (int)t;
9442458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9452458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    apdu.data = strdupReadString(p);
9462458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9472458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    startRequest;
9482458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    appendPrintBuf("%ssessionid=%d,cla=%d,ins=%d,p1=%d,p2=%d,p3=%d,data=%s",
9492458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        printBuf, apdu.sessionid, apdu.cla, apdu.instruction, apdu.p1, apdu.p2,
9502458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        apdu.p3, (char*)apdu.data);
9512458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    closeRequest;
9522458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    printRequest(pRI->token, pRI->pCI->requestNumber);
9532458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9542458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    if (status != NO_ERROR) {
9552458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        goto invalid;
9562458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    }
9572458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
958d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &apdu, sizeof(RIL_SIM_APDU), pRI, pRI->socket_id);
9592458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9602458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#ifdef MEMSET_FREED
9612458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memsetString(apdu.data);
9622458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#endif
9632458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    free(apdu.data);
9642458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9652458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#ifdef MEMSET_FREED
9662458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    memset(&apdu, 0, sizeof(RIL_SIM_APDU));
9672458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal#endif
9682458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9692458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    return;
9702458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawalinvalid:
9712458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    invalidCommandBlock(pRI);
9722458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal    return;
9732458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal}
9742458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9752458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal
9762458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal/**
97700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo *
97800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is:
97900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t status/action
98000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t reason
98100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t serviceCode
98200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t toa
98300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  String number  (0 length -> null)
98400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *  int32_t timeSeconds
98500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
9867f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
987f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) {
98800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_CallForwardInfo cff;
98900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t t;
99000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
99100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
99200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset (&cff, 0, sizeof(cff));
99300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
9947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    // note we only check status at the end
99500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
99600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
99700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.status = (int)t;
9987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
99900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
100000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.reason = (int)t;
100100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
100200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
100300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.serviceClass = (int)t;
100400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
100500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
100600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.toa = (int)t;
100700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
100800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.number = strdupReadString(p);
100900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
101000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&t);
101100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    cff.timeSeconds = (int)t;
101200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
101300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
101400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
101500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
101600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
101700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // special case: number 0-length fields is null
101800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
101900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (cff.number != NULL && strlen (cff.number) == 0) {
102000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.number = NULL;
102100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
102200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
102300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
102400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
102500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        cff.status, cff.reason, cff.serviceClass, cff.toa,
102600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)cff.number, cff.timeSeconds);
102700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
102800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
102900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1030d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI, pRI->socket_id);
103100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
103200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
103300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memsetString(cff.number);
103400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
103500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
103600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free (cff.number);
103700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
103800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED
103900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memset(&cff, 0, sizeof(cff));
104000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
104100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
104200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
104300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
104400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
104500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
104600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
104700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
104800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
10497f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
1050f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) {
105100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int32_t len;
105200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status_t status;
105300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const void *data;
105400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
105500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    status = p.readInt32(&len);
105600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
105700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (status != NO_ERROR) {
105800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto invalid;
105900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
106000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
106100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code writes -1 for null arrays
106200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (((int)len) == -1) {
106300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        data = NULL;
106400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        len = 0;
10657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    }
106600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
106700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    data = p.readInplace(len);
106800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
106900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startRequest;
107000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%sraw_size=%d", printBuf, len);
107100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeRequest;
107200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printRequest(pRI->token, pRI->pCI->requestNumber);
107300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1074d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI, pRI->socket_id);
107500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
107600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
107700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid:
107800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    invalidCommandBlock(pRI);
107900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
108000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
108100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1082a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic status_t
1083a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowaconstructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) {
1084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t ut;
1086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
1088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
10897f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
1090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
1091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1093f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uTeleserviceID = (int) t;
1094f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1095f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
1096f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.bIsServicePresent = (uint8_t) ut;
1097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1098f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1099f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uServicecategory = (int) t;
1100f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1101f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1102f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1103f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1104f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1106f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1108f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1109f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1110f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1112f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1113f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
1114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sAddress.number_of_digits= (uint8_t) ut;
1115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
1118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&ut,sizeof(ut));
1119f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1121f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
11227f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
1123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
11257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.read(&ut,sizeof(ut));
1126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.odd = (uint8_t) ut;
1127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&ut,sizeof(ut));
1129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
1130f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
11327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
11337f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut,sizeof(ut));
1134f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
11377f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    status = p.readInt32(&t);
1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsm.uBearerDataLen = (int) t;
1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
11417f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
11427f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        status = p.read(&ut, sizeof(ut));
1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsm.aBearerData[digitCount] = (uint8_t) ut;
1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1147a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        return status;
1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1149f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1150f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
1151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
11521b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
11541b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
11567f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1159a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return status;
1160a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1161a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1162a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1163a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
1164a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_CDMA_SMS_Message rcsm;
1165a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1166a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchCdmaSms");
1167a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1168a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1169a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1170a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1171d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI, pRI->socket_id);
1172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsm, 0, sizeof(rcsm));
1175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
11847f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void
1185a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1186a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_IMS_SMS_Message rism;
1187a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_CDMA_SMS_Message rcsm;
1188a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1189a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef);
1190a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1191a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
1192a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1193a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1194a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1195a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.tech = RADIO_TECH_3GPP2;
1196a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.retry = retry;
1197a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.messageRef = messageRef;
1198a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.message.cdmaMessage = &rcsm;
1199a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1200d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
1201a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
1202d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            +sizeof(rcsm),pRI, pRI->socket_id);
1203a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1204a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1205a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rcsm, 0, sizeof(rcsm));
1206a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1207a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1208a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1209a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1210a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1211a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1212a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1213a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1214a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1215a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1216a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1217a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
1218a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_IMS_SMS_Message rism;
1219a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t countStrings;
1220a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status_t status;
1221a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    size_t datalen;
1222a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    char **pStrings;
1223a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef);
1224a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1225a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.readInt32 (&countStrings);
1226a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1227a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1228a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1229a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1230a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1231a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1232a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.tech = RADIO_TECH_3GPP;
1233a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.retry = retry;
1234a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.messageRef = messageRef;
1235a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1236a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    startRequest;
12375d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen    appendPrintBuf("%stech=%d, retry=%d, messageRef=%d, ", printBuf,
12385d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen                    (int)rism.tech, (int)rism.retry, rism.messageRef);
1239a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (countStrings == 0) {
1240a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        // just some non-null pointer
1241a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = (char **)alloca(sizeof(char *));
1242a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = 0;
1243a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else if (((int)countStrings) == -1) {
1244a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = NULL;
1245a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = 0;
1246a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else {
1247a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        datalen = sizeof(char *) * countStrings;
1248a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1249a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        pStrings = (char **)alloca(datalen);
1250a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1251a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        for (int i = 0 ; i < countStrings ; i++) {
1252a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            pStrings[i] = strdupReadString(p);
1253a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            appendPrintBuf("%s%s,", printBuf, pStrings[i]);
1254a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        }
1255a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1256a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    removeLastChar;
1257a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    closeRequest;
1258a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    printRequest(pRI->token, pRI->pCI->requestNumber);
1259a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1260a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    rism.message.gsmMessage = pStrings;
1261d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
1262a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
1263d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            +datalen, pRI, pRI->socket_id);
1264a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1265a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (pStrings != NULL) {
1266a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        for (int i = 0 ; i < countStrings ; i++) {
1267a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1268a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            memsetString (pStrings[i]);
1269a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1270a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa            free(pStrings[i]);
1271a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        }
1272a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1273a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1274a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        memset(pStrings, 0, datalen);
1275a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1276a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1277a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1278a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED
1279a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    memset(&rism, 0, sizeof(rism));
1280a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif
1281a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1282a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1283a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGE("dispatchImsGsmSms invalid block");
1284a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1285a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1286a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1287a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1288a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1289a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsSms(Parcel &p, RequestInfo *pRI) {
1290a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t  t;
1291a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status_t status = p.readInt32(&t);
1292a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    RIL_RadioTechnologyFamily format;
1293a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    uint8_t retry;
1294a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    int32_t messageRef;
1295a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1296a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    ALOGD("dispatchImsSms");
1297a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1298a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1299a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1300a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    format = (RIL_RadioTechnologyFamily) t;
1301a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1302a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    // read retry field
1303a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.read(&retry,sizeof(retry));
1304a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1305a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1306a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1307a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    // read messageRef field
1308a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    status = p.read(&messageRef,sizeof(messageRef));
1309a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (status != NO_ERROR) {
1310a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        goto invalid;
1311a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1312a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1313a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    if (RADIO_TECH_3GPP == format) {
1314a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        dispatchImsGsmSms(p, pRI, retry, messageRef);
1315a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else if (RADIO_TECH_3GPP2 == format) {
1316a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        dispatchImsCdmaSms(p, pRI, retry, messageRef);
1317a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    } else {
1318a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        ALOGE("requestImsSendSMS invalid format value =%d", format);
1319a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    }
1320a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1321a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1322a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1323a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid:
1324a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    invalidCommandBlock(pRI);
1325a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa    return;
1326a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa}
1327a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa
1328a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void
1329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
1330f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Ack rcsa;
1331f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1332f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t digitCount;
1334f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
1336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1337f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1338f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
1339f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1341f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsa.uSMSCauseCode = (int) t;
1342f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1343f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1345f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1347f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
13481b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
13491b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
1350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1354d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI, pRI->socket_id);
1355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsa, 0, sizeof(rcsa));
1358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1359f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1361f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1362f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1364f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1365f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1366f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1367a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1368a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1369a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1371a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1372f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1373a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1374a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1375a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1376a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1377f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
137896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
137996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
138096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
1381f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
138296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
138396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
138496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBciPtrs[i] = &gsmBci[i];
1385f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
138696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
138796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromServiceId = (int) t;
1388f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
138996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
139096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toServiceId = (int) t;
1391f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
139296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
139396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].fromCodeScheme = (int) t;
1394f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
139596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
139696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].toCodeScheme = (int) t;
1397a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
139896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
139996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            gsmBci[i].selected = (uint8_t) t;
1400a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
140196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
140296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
140396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
140496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
140596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  gsmBci[i].selected);
140696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
140796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1408f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
140996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
141096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
141196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1412f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1413d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        CALL_ONREQUEST(pRI->pCI->requestNumber,
141496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              gsmBciPtrs,
141596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
1416d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              pRI, pRI->socket_id);
1417f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1418f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
141996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
142096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
1421f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
142296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1423f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1424f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1425f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1426f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1427f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1428f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1429f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1430f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1431a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void
1432f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
1433a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t t;
1434f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1435a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int32_t num;
1436f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1437a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&num);
1438a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (status != NO_ERROR) {
1439a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        goto invalid;
1440a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
1441a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
144296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    {
144396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
144496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
1445a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
144696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        startRequest;
144796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        for (int i = 0 ; i < num ; i++ ) {
144896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBciPtrs[i] = &cdmaBci[i];
1449f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
145096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
145196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].service_category = (int) t;
1452f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
145396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
145496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].language = (int) t;
1455f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
145696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            status = p.readInt32(&t);
145796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            cdmaBci[i].selected = (uint8_t) t;
1458f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
145996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            appendPrintBuf("%s [%d: service_category=%d, language =%d, \
146096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
146196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                  cdmaBci[i].language, cdmaBci[i].selected);
146296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
146396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        closeRequest;
1464f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
146596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        if (status != NO_ERROR) {
146696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel            goto invalid;
146796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        }
1468f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1469d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        CALL_ONREQUEST(pRI->pCI->requestNumber,
147096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              cdmaBciPtrs,
147196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel                              num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
1472d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              pRI, pRI->socket_id);
1473f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1474f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
147596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
147696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel        memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
1477f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
147896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel    }
1479f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1480f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1481f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1482f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1483f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1484f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1485f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1486f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1487f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
1488f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_WriteArgs rcsw;
1489f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  t;
1490f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint32_t ut;
1491f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t  uct;
1492f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status_t status;
1493f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int32_t  digitCount;
1494f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1495f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1496f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1497f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1498f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.status = t;
1499a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
1500f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1501f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uTeleserviceID = (int) t;
1502f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1503f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1504f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.bIsServicePresent = (uint8_t) uct;
1505f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1506f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1507f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uServicecategory = (int) t;
1508f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1509f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1510f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
1511f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1512f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1513f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
1514f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1515f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1516f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
1517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1518f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.readInt32(&t);
1519f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
1520f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1521f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1522f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
1523f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1524f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
1525f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        status = p.read(&uct,sizeof(uct));
1526f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
1527f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1528f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1529a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1530f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
1531f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1532a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.read(&uct,sizeof(uct));
1533f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.odd = (uint8_t) uct;
1534f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1535f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    status = p.read(&uct,sizeof(uct));
1536f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
1537f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1538f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
1539a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct,sizeof(uct));
1540f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
1541f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1542f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1543a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    status = p.readInt32(&t);
1544f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    rcsw.message.uBearerDataLen = (int) t;
1545f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1546f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
1547a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        status = p.read(&uct, sizeof(uct));
1548f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
1549f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1550f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1551f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (status != NO_ERROR) {
1552f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        goto invalid;
1553f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
1554f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1555f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startRequest;
15561b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville    appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
15571b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
15581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_mode=%d, \
15591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            message.sAddress.number_type=%d, ",
1560f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
15611b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
15621b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_mode,
15631b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            rcsw.message.sAddress.number_type);
1564f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeRequest;
1565f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1566f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    printRequest(pRI->token, pRI->pCI->requestNumber);
1567f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1568d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI, pRI->socket_id);
1569f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1570f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED
1571f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    memset(&rcsw, 0, sizeof(rcsw));
1572f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
1573f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1574f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1575f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1576f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid:
1577f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    invalidCommandBlock(pRI);
1578f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return;
1579f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
1580f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
1581f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
15824f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
15834f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support
15844f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of
15854f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request.
15864f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
15874f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
15884f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    const int numParamsRilV3 = 6;
15894f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
15904f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // The first bytes of the RIL parcel contain the request number and the
15914f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    // serial number - see processCommandBuffer(). Copy them over too.
15924f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int pos = p.dataPosition();
15934f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
15944f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    int numParams = p.readInt32();
15954f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
15964f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      Parcel p2;
15974f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.appendFrom(&p, 0, pos);
15984f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.writeInt32(numParamsRilV3);
15994f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      for(int i = 0; i < numParamsRilV3; i++) {
16004f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti        p2.writeString16(p.readString16());
16014f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      }
16024f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      p2.setDataPosition(pos);
16034f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p2, pRI);
16044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    } else {
160557ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti      p.setDataPosition(pos);
16064f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti      dispatchStrings(p, pRI);
16074f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti    }
16084f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti}
16094f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti
16102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH.
16112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
16122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
16132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
1614d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
16152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
16172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
16182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
16192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
16212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
16222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
16232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
16242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
16252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
16272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode Voice Radio Technology
16282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
16292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    voiceRadioTech = decodeVoiceRadioTechnology(state);
16302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (voiceRadioTech < 0)
16322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
16332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
16342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int));
16352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
16362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:.
16382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and
16392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid.
16402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) {
1641d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
16422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
16442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
16452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
16462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // RILs that support RADIO_STATE_ON should support this request.
16482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (RADIO_STATE_ON == state) {
16492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        dispatchVoid(p, pRI);
16502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        return;
16512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
16522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // For Older RILs, that do not support RADIO_STATE_ON, assume that they
16542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // will not support this new request either and decode CDMA Subscription Source
16552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    // from Radio State
16562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state);
16572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
16582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if (cdmaSubscriptionSource < 0)
16592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
16602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    else
16612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int));
16622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
16632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
166475697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
166575697538e485ea2981960dcd4878bfdd032731acSungmin Choi{
166675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    RIL_InitialAttachApn pf;
166775697538e485ea2981960dcd4878bfdd032731acSungmin Choi    int32_t  t;
166875697538e485ea2981960dcd4878bfdd032731acSungmin Choi    status_t status;
166975697538e485ea2981960dcd4878bfdd032731acSungmin Choi
167075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memset(&pf, 0, sizeof(pf));
167175697538e485ea2981960dcd4878bfdd032731acSungmin Choi
167275697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.apn = strdupReadString(p);
167375697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.protocol = strdupReadString(p);
167475697538e485ea2981960dcd4878bfdd032731acSungmin Choi
167575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    status = p.readInt32(&t);
167675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.authtype = (int) t;
167775697538e485ea2981960dcd4878bfdd032731acSungmin Choi
167875697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.username = strdupReadString(p);
167975697538e485ea2981960dcd4878bfdd032731acSungmin Choi    pf.password = strdupReadString(p);
168075697538e485ea2981960dcd4878bfdd032731acSungmin Choi
168175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    startRequest;
16825d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen    appendPrintBuf("%sapn=%s, protocol=%s, authtype=%d, username=%s, password=%s",
16835d891b7991dd22c105e97180e0fb02d4b42911ebEtan Cohen            printBuf, pf.apn, pf.protocol, pf.authtype, pf.username, pf.password);
168475697538e485ea2981960dcd4878bfdd032731acSungmin Choi    closeRequest;
168575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    printRequest(pRI->token, pRI->pCI->requestNumber);
168675697538e485ea2981960dcd4878bfdd032731acSungmin Choi
168775697538e485ea2981960dcd4878bfdd032731acSungmin Choi    if (status != NO_ERROR) {
168875697538e485ea2981960dcd4878bfdd032731acSungmin Choi        goto invalid;
168975697538e485ea2981960dcd4878bfdd032731acSungmin Choi    }
1690d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
169175697538e485ea2981960dcd4878bfdd032731acSungmin Choi
169275697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED
169375697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.apn);
169475697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.protocol);
169575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.username);
169675697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memsetString(pf.password);
169775697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif
169875697538e485ea2981960dcd4878bfdd032731acSungmin Choi
169975697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.apn);
170075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.protocol);
170175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.username);
170275697538e485ea2981960dcd4878bfdd032731acSungmin Choi    free(pf.password);
170375697538e485ea2981960dcd4878bfdd032731acSungmin Choi
170475697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED
170575697538e485ea2981960dcd4878bfdd032731acSungmin Choi    memset(&pf, 0, sizeof(pf));
170675697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif
170775697538e485ea2981960dcd4878bfdd032731acSungmin Choi
170875697538e485ea2981960dcd4878bfdd032731acSungmin Choi    return;
170975697538e485ea2981960dcd4878bfdd032731acSungmin Choiinvalid:
171075697538e485ea2981960dcd4878bfdd032731acSungmin Choi    invalidCommandBlock(pRI);
171175697538e485ea2981960dcd4878bfdd032731acSungmin Choi    return;
171275697538e485ea2981960dcd4878bfdd032731acSungmin Choi}
171375697538e485ea2981960dcd4878bfdd032731acSungmin Choi
17148a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVReadItem(Parcel &p, RequestInfo *pRI) {
17158a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    RIL_NV_ReadItem nvri;
17168a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    int32_t  t;
17178a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status_t status;
17188a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17198a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvri, 0, sizeof(nvri));
17208a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17218a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status = p.readInt32(&t);
17228a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvri.itemID = (RIL_NV_Item) t;
17238a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17248a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    if (status != NO_ERROR) {
17258a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby        goto invalid;
17268a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    }
17278a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17288a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    startRequest;
17298a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    appendPrintBuf("%snvri.itemID=%d, ", printBuf, nvri.itemID);
17308a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    closeRequest;
17318a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17328a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    printRequest(pRI->token, pRI->pCI->requestNumber);
17338a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
1734d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, pRI->socket_id);
17358a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17368a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
17378a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvri, 0, sizeof(nvri));
17388a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
17398a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17408a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
17418a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17428a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambyinvalid:
17438a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    invalidCommandBlock(pRI);
17448a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
17458a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby}
17468a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17478a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambystatic void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI) {
17488a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    RIL_NV_WriteItem nvwi;
17498a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    int32_t  t;
17508a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status_t status;
17518a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17528a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvwi, 0, sizeof(nvwi));
17538a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17548a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    status = p.readInt32(&t);
17558a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvwi.itemID = (RIL_NV_Item) t;
17568a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17578a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    nvwi.value = strdupReadString(p);
17588a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17598a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    if (status != NO_ERROR || nvwi.value == NULL) {
17608a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby        goto invalid;
17618a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    }
17628a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17638a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    startRequest;
17648a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    appendPrintBuf("%snvwi.itemID=%d, value=%s, ", printBuf, nvwi.itemID,
17658a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby            nvwi.value);
17668a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    closeRequest;
17678a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17688a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    printRequest(pRI->token, pRI->pCI->requestNumber);
17698a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
1770d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, pRI->socket_id);
17718a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17728a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
17738a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memsetString(nvwi.value);
17748a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
17758a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17768a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    free(nvwi.value);
17778a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17788a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#ifdef MEMSET_FREED
17798a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    memset(&nvwi, 0, sizeof(nvwi));
17808a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby#endif
17818a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17828a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
17838a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17848a4a233bb9503eddee83569e647c25099a8e15b3Jake Hambyinvalid:
17858a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    invalidCommandBlock(pRI);
17868a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby    return;
17878a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby}
17888a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
17898a4a233bb9503eddee83569e647c25099a8e15b3Jake Hamby
1790d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI) {
1791d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SelectUiccSub uicc_sub;
1792d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    status_t status;
1793d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int32_t  t;
1794d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    memset(&uicc_sub, 0, sizeof(uicc_sub));
1795d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1796d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    status = p.readInt32(&t);
1797d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (status != NO_ERROR) {
1798d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        goto invalid;
1799d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
1800d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    uicc_sub.slot = (int) t;
1801d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1802d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    status = p.readInt32(&t);
1803d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (status != NO_ERROR) {
1804d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        goto invalid;
1805d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
1806d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    uicc_sub.app_index = (int) t;
1807d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1808d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    status = p.readInt32(&t);
1809d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (status != NO_ERROR) {
1810d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        goto invalid;
1811d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
1812d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    uicc_sub.sub_type = (RIL_SubscriptionType) t;
1813d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1814d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    status = p.readInt32(&t);
1815d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (status != NO_ERROR) {
1816d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        goto invalid;
1817d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
1818d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    uicc_sub.act_status = (RIL_UiccSubActStatus) t;
1819d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1820d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startRequest;
1821d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    appendPrintBuf("slot=%d, app_index=%d, act_status = %d", uicc_sub.slot, uicc_sub.app_index,
1822d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            uicc_sub.act_status);
1823d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGD("dispatchUiccSubscription, slot=%d, app_index=%d, act_status = %d", uicc_sub.slot,
1824d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            uicc_sub.app_index, uicc_sub.act_status);
1825d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    closeRequest;
1826d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    printRequest(pRI->token, pRI->pCI->requestNumber);
1827d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1828d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    CALL_ONREQUEST(pRI->pCI->requestNumber, &uicc_sub, sizeof(uicc_sub), pRI, pRI->socket_id);
1829d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1830d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#ifdef MEMSET_FREED
1831d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    memset(&uicc_sub, 0, sizeof(uicc_sub));
1832d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
1833d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    return;
1834d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1835d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Coheninvalid:
1836d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    invalidCommandBlock(pRI);
1837d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    return;
1838d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
1839d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
184090530a6e86001facba8a34541d2f038f24562cc3Amit Mahajanstatic void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI)
184190530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan{
184290530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    RIL_SimAuthentication pf;
184390530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    int32_t  t;
184490530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    status_t status;
184590530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
184690530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    memset(&pf, 0, sizeof(pf));
184790530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
184890530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    status = p.readInt32(&t);
184990530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    pf.authContext = (int) t;
185090530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    pf.authData = strdupReadString(p);
185190530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    pf.aid = strdupReadString(p);
185290530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
185390530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    startRequest;
185490530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    appendPrintBuf("authContext=%s, authData=%s, aid=%s", pf.authContext, pf.authData, pf.aid);
185590530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    closeRequest;
185690530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    printRequest(pRI->token, pRI->pCI->requestNumber);
185790530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
185890530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    if (status != NO_ERROR) {
185990530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan        goto invalid;
186090530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    }
186190530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
186290530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
186390530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan#ifdef MEMSET_FREED
186490530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    memsetString(pf.authData);
186590530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    memsetString(pf.aid);
186690530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan#endif
186790530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
186890530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    free(pf.authData);
186990530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    free(pf.aid);
187090530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
187190530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan#ifdef MEMSET_FREED
187290530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    memset(&pf, 0, sizeof(pf));
187390530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan#endif
187490530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
187590530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    return;
187690530a6e86001facba8a34541d2f038f24562cc3Amit Mahajaninvalid:
187790530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    invalidCommandBlock(pRI);
187890530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan    return;
187990530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan}
188090530a6e86001facba8a34541d2f038f24562cc3Amit Mahajan
1881c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajanstatic void dispatchDataProfile(Parcel &p, RequestInfo *pRI) {
1882c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    int32_t t;
1883c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    status_t status;
1884c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    int32_t num;
1885c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1886c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    status = p.readInt32(&num);
1887c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    if (status != NO_ERROR) {
1888c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        goto invalid;
1889c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    }
1890c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1891c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    {
1892c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        RIL_DataProfileInfo dataProfiles[num];
1893c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        RIL_DataProfileInfo *dataProfilePtrs[num];
1894c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1895c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        startRequest;
1896c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        for (int i = 0 ; i < num ; i++ ) {
1897c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfilePtrs[i] = &dataProfiles[i];
1898c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1899c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1900c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].profileId = (int) t;
1901c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1902c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].apn = strdupReadString(p);
1903c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].protocol = strdupReadString(p);
1904c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1905c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].authType = (int) t;
1906c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1907c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].user = strdupReadString(p);
1908c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].password = strdupReadString(p);
1909c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1910c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1911c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].type = (int) t;
1912c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1913c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1914c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].maxConnsTime = (int) t;
1915c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1916c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].maxConns = (int) t;
1917c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1918c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].waitTime = (int) t;
1919c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1920c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            status = p.readInt32(&t);
1921c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            dataProfiles[i].enabled = (int) t;
1922c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1923c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            appendPrintBuf("%s [%d: profileId=%d, apn =%s, protocol =%s, authType =%d, \
1924c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  user =%s, password =%s, type =%d, maxConnsTime =%d, maxConns =%d, \
1925c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  waitTime =%d, enabled =%d]", printBuf, i, dataProfiles[i].profileId,
1926c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  dataProfiles[i].apn, dataProfiles[i].protocol, dataProfiles[i].authType,
1927c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  dataProfiles[i].user, dataProfiles[i].password, dataProfiles[i].type,
1928c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  dataProfiles[i].maxConnsTime, dataProfiles[i].maxConns,
1929c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                  dataProfiles[i].waitTime, dataProfiles[i].enabled);
1930c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        }
1931c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        closeRequest;
1932c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        printRequest(pRI->token, pRI->pCI->requestNumber);
1933c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1934c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        if (status != NO_ERROR) {
1935c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan            goto invalid;
1936c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        }
1937c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        CALL_ONREQUEST(pRI->pCI->requestNumber,
1938c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                              dataProfilePtrs,
1939c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                              num * sizeof(RIL_DataProfileInfo *),
1940c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan                              pRI, pRI->socket_id);
1941c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1942c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan#ifdef MEMSET_FREED
1943c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        memset(dataProfiles, 0, num * sizeof(RIL_DataProfileInfo));
1944c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        memset(dataProfilePtrs, 0, num * sizeof(RIL_DataProfileInfo *));
1945c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan#endif
1946c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    }
1947c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1948c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    return;
1949c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
1950c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajaninvalid:
1951c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    invalidCommandBlock(pRI);
1952c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan    return;
1953c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan}
1954c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan
195500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) {
19577f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    size_t writeOffset = 0;
195800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const uint8_t *toWrite;
195900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    toWrite = (const uint8_t *)buffer;
196100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (writeOffset < len) {
196300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ssize_t written;
196400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        do {
196500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            written = write (fd, toWrite + writeOffset,
196600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                len - writeOffset);
1967388849057a8cc91dbc3fff357d2df524ffec9a4dBanavathu, Srinivas Naik        } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
196800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
196900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (written >= 0) {
197000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeOffset += written;
197100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {   // written < 0
19728eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
197300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            close(fd);
197400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return -1;
197500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
197600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
197700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
197800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
197900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
198000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
198100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
1982d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohensendResponseRaw (const void *data, size_t dataSize, RIL_SOCKET_ID socket_id) {
1983d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fd = s_ril_param_socket.fdCommand;
198400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
198500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    uint32_t header;
1986d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_t * writeMutexHook = &s_writeMutex;
1987d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
1988d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGE("Send Response to %s", rilSocketIdToString(socket_id));
198900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
1990d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
1991d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_2) {
1992d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        fd = s_ril_param_socket2.fdCommand;
1993d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeMutexHook = &s_writeMutex_socket2;
1994d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
1995d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
1996d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_3) {
1997d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        fd = s_ril_param_socket3.fdCommand;
1998d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeMutexHook = &s_writeMutex_socket3;
1999d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
2000d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
2001d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
2002d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_4) {
2003d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        fd = s_ril_param_socket4.fdCommand;
2004d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeMutexHook = &s_writeMutex_socket4;
2005d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
2006d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
2007d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
2008d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (fd < 0) {
200900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
201000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
201100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
201200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (dataSize > MAX_COMMAND_BYTES) {
20138eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL: packet larger than %u (%u)",
201400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                MAX_COMMAND_BYTES, (unsigned int )dataSize);
201500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
201600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return -1;
201700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
20187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
2019d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_lock(writeMutexHook);
202000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
202100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    header = htonl(dataSize);
202200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
202300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = blockingWrite(fd, (void *)&header, sizeof(header));
202400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
202500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
2026d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pthread_mutex_unlock(writeMutexHook);
202700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
202800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2030ee1fadc192a63724e416b05666844a62d1e75d38Kenny    ret = blockingWrite(fd, data, dataSize);
203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
2033d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pthread_mutex_unlock(writeMutexHook);
203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return ret;
203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
203600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2037d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_unlock(writeMutexHook);
203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
203900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
2043d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohensendResponse (Parcel &p, RIL_SOCKET_ID socket_id) {
204400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    printResponse;
2045d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    return sendResponseRaw(p.data(), p.dataSize(), socket_id);
204600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
204700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
204874f7e667381fae533f70843ea952db04bd2adc36Mohamad Ayyash/** response is an int* pointing to an array of ints */
20497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
20507f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int
2051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) {
205200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numInts;
205300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
205400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
20558eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
205600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
205700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
205800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(int) != 0) {
205952500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseInts: invalid response length %d expected multiple of %d\n",
206000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(int));
206100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
206200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
206300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int *p_int = (int *) response;
206500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206674f7e667381fae533f70843ea952db04bd2adc36Mohamad Ayyash    numInts = responselen / sizeof(int);
206700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (numInts);
206800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
206900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* each int*/
207000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
207100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < numInts ; i++) {
207200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s%d,", printBuf, p_int[i]);
207300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_int[i]);
207400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
207500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
207600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
207700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
207800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
207900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
208000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
20814380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s
20824380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    The parcel will begin with the version */
20834380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
20844380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    p.writeInt32(version);
20854380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return responseStrings(p, response, responselen);
20864380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
20874380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
208800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */
2089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) {
209000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int numStrings;
20917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
209200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
20938eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
209400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
209500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
209600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(char *) != 0) {
209752500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseStrings: invalid response length %d expected multiple of %d\n",
209800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof(char *));
209900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
210000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
210100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
210200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
210300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (0);
210400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
210500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char **p_cur = (char **) response;
210600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
210700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        numStrings = responselen / sizeof(char *);
210800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (numStrings);
210900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
211000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each string*/
211100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        startResponse;
211200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        for (int i = 0 ; i < numStrings ; i++) {
211300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
211400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            writeStringToParcel (p, p_cur[i]);
211500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
211600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        removeLastChar;
211700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        closeResponse;
211800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
211900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
212000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
212100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
212300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
21247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted
212500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen
212600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
2127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) {
212800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* one string only */
212900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
213000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s", printBuf, (char*)response);
213100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
213200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, (const char *)response);
213400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
213500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
213600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
213700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) {
213900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
214000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
214100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
214200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
214300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) {
214500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
214600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
214700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
21488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
214900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
215000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
215100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_Call *) != 0) {
215352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseCallList: invalid response length %d expected multiple of %d\n",
215400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_Call *));
215500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
215600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
215700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
215800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
215900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
216000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_Call *);
216100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
216200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
216300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
216400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_Call *p_cur = ((RIL_Call **) response)[i];
216500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* each call info */
216600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->state);
216700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->index);
216800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
216900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMpty);
217000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isMT);
217100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->als);
217200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->isVoice);
21731b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->isVoicePrivacy);
21741b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->number);
21751b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->numberPresentation);
21761b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        writeStringToParcel(p, p_cur->name);
21771b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville        p.writeInt32(p_cur->namePresentation);
21783a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville        // Remove when partners upgrade to version 3
217974fa38884320698c1623764850e3131b9769dff0Wink Saville        if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
218074fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(0); /* UUS Information is absent */
218174fa38884320698c1623764850e3131b9769dff0Wink Saville        } else {
218274fa38884320698c1623764850e3131b9769dff0Wink Saville            RIL_UUS_Info *uusInfo = p_cur->uusInfo;
218374fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(1); /* UUS Information is present */
218474fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusType);
218574fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusDcs);
218674fa38884320698c1623764850e3131b9769dff0Wink Saville            p.writeInt32(uusInfo->uusLength);
218774fa38884320698c1623764850e3131b9769dff0Wink Saville            p.write(uusInfo->uusData, uusInfo->uusLength);
218874fa38884320698c1623764850e3131b9769dff0Wink Saville        }
21893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s[id=%d,%s,toa=%d,",
21901b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            printBuf,
21911b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->index,
21921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            callStateToString(p_cur->state),
21933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->toa);
21943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
21953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
21961b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMpty)?"conf":"norm",
21971b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isMT)?"mt":"mo",
21981b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->als,
21991b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            (p_cur->isVoice)?"voc":"nonvoc",
22003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (p_cur->isVoicePrivacy)?"evp":"noevp");
22013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
22023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
22031b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->number,
22041b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->numberPresentation,
22051b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->name,
22061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            p_cur->namePresentation);
220700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
220800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
220900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
221000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
221100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
221200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
221300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) {
221500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
22168eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
221700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
221800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
221900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SMS_Response) ) {
22218eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected %d",
222200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SMS_Response));
222300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
222400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
222500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
222700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
222800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->messageRef);
222900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->ackPDU);
2230920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    p.writeInt32(p_cur->errorCode);
223100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
223200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
2233920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh    appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
2234920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh        (char*)p_cur->ackPDU, p_cur->errorCode);
223500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
223600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
223700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
223800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
223900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2240c0114b325877907fcdf7a5baa24e54a752e7e58bWink Savillestatic int responseDataCallListV4(Parcel &p, void *response, size_t responselen)
224100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
224200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
22438eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
224400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
224500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
224600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2247c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) {
224852500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseDataCallListV4: invalid response length %d expected multiple of %d",
2249c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4));
225000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
225100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
225200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
225352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan    // Write version
225452500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan    p.writeInt32(4);
225552500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan
2256c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    int num = responselen / sizeof(RIL_Data_Call_Response_v4);
225700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
225800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2259c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response;
226000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
226100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int i;
226200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (i = 0; i < num; i++) {
226300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].cid);
226400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur[i].active);
226500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].type);
2266c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        // apn is not used, so don't send.
226700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur[i].address);
2268c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf,
226900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur[i].cid,
227000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur[i].active==0)?"down":"up",
227100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].type,
227200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur[i].address);
227300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
227400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
227500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
227600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
227700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
227800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
227900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2280d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic int responseDataCallListV6(Parcel &p, void *response, size_t responselen)
2281d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen{
228252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan    if (response == NULL && responselen != 0) {
2283d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RLOGE("invalid response: NULL");
2284d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        return RIL_ERRNO_INVALID_RESPONSE;
2285d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
2286d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
2287d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) {
228852500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseDataCallListV6: invalid response length %d expected multiple of %d",
2289d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6));
2290d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        return RIL_ERRNO_INVALID_RESPONSE;
2291d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
2292d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
229352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan    // Write version
229452500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan    p.writeInt32(6);
229552500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan
2296d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int num = responselen / sizeof(RIL_Data_Call_Response_v6);
2297d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p.writeInt32(num);
2298d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
2299d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response;
2300d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startResponse;
2301d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int i;
2302d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    for (i = 0; i < num; i++) {
2303d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p.writeInt32((int)p_cur[i].status);
2304d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p.writeInt32(p_cur[i].suggestedRetryTime);
2305d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p.writeInt32(p_cur[i].cid);
2306d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p.writeInt32(p_cur[i].active);
2307d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeStringToParcel(p, p_cur[i].type);
2308d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeStringToParcel(p, p_cur[i].ifname);
2309d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeStringToParcel(p, p_cur[i].addresses);
2310d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeStringToParcel(p, p_cur[i].dnses);
2311d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        writeStringToParcel(p, p_cur[i].gateways);
2312d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf,
2313d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p_cur[i].status,
2314d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p_cur[i].suggestedRetryTime,
2315d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p_cur[i].cid,
2316d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (p_cur[i].active==0)?"down":"up",
2317d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (char*)p_cur[i].type,
2318d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (char*)p_cur[i].ifname,
2319d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (char*)p_cur[i].addresses,
2320d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (char*)p_cur[i].dnses,
2321d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            (char*)p_cur[i].gateways);
2322d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
2323d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    removeLastChar;
2324d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    closeResponse;
2325d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
2326d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    return 0;
2327d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
2328d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
23294380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen)
23304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
23314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
233252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGD("responseDataCallList: v4");
2333c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        return responseDataCallListV4(p, response, responselen);
23344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
23354380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        if (response == NULL && responselen != 0) {
23368eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("invalid response: NULL");
23374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
23384380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
23394380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
2340d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        // Support v6 or v9 with new rils
2341d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if (responselen % sizeof(RIL_Data_Call_Response_v6) == 0) {
234252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan            RLOGD("responseDataCallList: v6");
2343d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return responseDataCallListV6(p, response, responselen);
2344d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        }
2345d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
2346d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if (responselen % sizeof(RIL_Data_Call_Response_v9) != 0) {
234752500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan            RLOGE("responseDataCallList: invalid response length %d expected multiple of %d",
2348d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    (int)responselen, (int)sizeof(RIL_Data_Call_Response_v9));
23494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            return RIL_ERRNO_INVALID_RESPONSE;
23504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
23514380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
235252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        // Write version
235352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        p.writeInt32(10);
235452500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan
2355d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        int num = responselen / sizeof(RIL_Data_Call_Response_v9);
23564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        p.writeInt32(num);
23574380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
2358d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RIL_Data_Call_Response_v9 *p_cur = (RIL_Data_Call_Response_v9 *) response;
23594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        startResponse;
23604380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        int i;
23614380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        for (i = 0; i < num; i++) {
23624380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32((int)p_cur[i].status);
2363beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo            p.writeInt32(p_cur[i].suggestedRetryTime);
23644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].cid);
23654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            p.writeInt32(p_cur[i].active);
2366af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner            writeStringToParcel(p, p_cur[i].type);
23674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].ifname);
23684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].addresses);
23694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville            writeStringToParcel(p, p_cur[i].dnses);
2370c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            writeStringToParcel(p, p_cur[i].gateways);
2371d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            writeStringToParcel(p, p_cur[i].pcscf);
2372d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s,%s],", printBuf,
23734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].status,
2374beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo                p_cur[i].suggestedRetryTime,
23754380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                p_cur[i].cid,
23764380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (p_cur[i].active==0)?"down":"up",
237756384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla                (char*)p_cur[i].type,
23784380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].ifname,
23794380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                (char*)p_cur[i].addresses,
2380c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                (char*)p_cur[i].dnses,
2381d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                (char*)p_cur[i].gateways,
2382d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                (char*)p_cur[i].pcscf);
23834380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        }
23844380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        removeLastChar;
23854380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        closeResponse;
23864380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
23874380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
23884380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    return 0;
23894380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
23904380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
23914380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
23924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{
23934380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (s_callbacks.version < 5) {
23944380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
23954380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    } else {
23964380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return responseDataCallList(p, response, responselen);
23974380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
23984380897c6cdc99486a061b819943e3b290ebcf09Wink Saville}
23994380897c6cdc99486a061b819943e3b290ebcf09Wink Saville
2400f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) {
240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
24028eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL with responselen != 0");
240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
240400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
240500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // The java code reads -1 size as null byte array
240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
24087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        p.writeInt32(-1);
240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(responselen);
241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.write(response, responselen);
241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
241300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2418f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
24208eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof (RIL_SIM_IO_Response) ) {
24258eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw1);
243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->sw2);
243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->simResponse);
243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->simResponse);
243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
243900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
244000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
244200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2444f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) {
244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
24467f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
24488eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
245352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseCallForwards: invalid response length %d expected multiple of %d",
245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* number of call info's */
245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_CallForwardInfo *);
246000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
246100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
246200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
246300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
246400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
246500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->status);
246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->reason);
246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->serviceClass);
246900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->toa);
247000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel(p, p_cur->number);
247100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->timeSeconds);
247200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
247300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (p_cur->status==1)?"enable":"disable",
247400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->reason, p_cur->serviceClass, p_cur->toa,
247500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (char*)p_cur->number,
247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->timeSeconds);
247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
24807f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
248200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
248300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
2484f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) {
248500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL) {
24868eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen != sizeof(RIL_SuppSvcNotification)) {
24918eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
249200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->notificationType);
249800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->code);
249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->index);
250000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(p_cur->type);
250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    writeStringToParcel(p, p_cur->number);
250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
250400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
250500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (p_cur->notificationType==0)?"mo":"mt",
250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         p_cur->code, p_cur->index, p_cur->type,
250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        (char*)p_cur->number);
250800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
251200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) {
251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int num;
251500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (response == NULL && responselen != 0) {
25178eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
252000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
252252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseCellList: invalid response length %d expected multiple of %d\n",
252300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            (int)responselen, (int)sizeof (RIL_NeighboringCell *));
252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return RIL_ERRNO_INVALID_RESPONSE;
252500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
252700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    startResponse;
25283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    /* number of records */
252900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    num = responselen / sizeof(RIL_NeighboringCell *);
253000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32(num);
253100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0 ; i < num ; i++) {
253300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
253400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32(p_cur->rssi);
253600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        writeStringToParcel (p, p_cur->cid);
253700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
253900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p_cur->cid, p_cur->rssi);
254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    removeLastChar;
254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    closeResponse;
254300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
254400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return 0;
254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
25473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/**
25483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists.
25493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */
2550a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p,
2551a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
25523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.isPresent);
25533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signalType);
25543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.alertPitch);
25553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_signalInfoRecord.signal);
25563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
25573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2558a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p,
2559a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            void *response, size_t responselen) {
25603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    int num;
2561a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    char* string8 = NULL;
2562a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int buffer_lenght;
2563a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecord *infoRec;
25643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
25653d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
25668eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
25673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
25683d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
25693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2570a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
257152500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseCdmaInformationRecords: invalid response length %d expected multiple of %d\n",
2572a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
25733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
25743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
25753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2576a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_InformationRecords *p_cur =
2577a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                             (RIL_CDMA_InformationRecords *) response;
2578a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
25793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
25803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
2581a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
25823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2583a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++) {
2584a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        infoRec = &p_cur->infoRec[i];
2585a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(infoRec->name);
2586a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        switch (infoRec->name) {
25873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_DISPLAY_INFO_REC:
2588a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
2589a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.display.alpha_len >
2590a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                         CDMA_ALPHA_INFO_BUFFER_LENGTH) {
25918eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2592a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2593a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.display.alpha_len,
2594a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_ALPHA_INFO_BUFFER_LENGTH);
2595a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
25963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
2597a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1)
2598a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
2599a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
2600a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.display.alpha_buf[i];
26013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
26024380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.display.alpha_len] = '\0';
2603a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2604a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2605a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
26063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
2607a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
26083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
26093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
2610a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
26118eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2612a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2613a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.number.len,
2614a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
2615a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
26163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
2617a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.number.len + 1)
2618a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                                             * sizeof(char) );
2619a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0 ; i < infoRec->rec.number.len; i++) {
2620a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.number.buf[i];
2621a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
26224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.number.len] = '\0';
2623a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2624a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2625a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
2626a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_type);
2627a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.number_plan);
2628a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.pi);
2629a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.number.si);
26303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
26313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_SIGNAL_INFO_REC:
2632a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.isPresent);
2633a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signalType);
2634a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.alertPitch);
2635a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.signal.signal);
2636a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2637a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%sisPresent=%X, signalType=%X, \
2638a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                alertPitch=%X, signal=%X, ",
2639a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   printBuf, (int)infoRec->rec.signal.isPresent,
2640a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signalType,
2641a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.alertPitch,
2642a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                   (int)infoRec->rec.signal.signal);
2643a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
26443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
26453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
2646a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                if (infoRec->rec.redir.redirectingNumber.len >
2647a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                              CDMA_NUMBER_INFO_BUFFER_LENGTH) {
26488eb2a12cb7b525e74736300962a5f3848427275aWink Saville                    RLOGE("invalid display info response length %d \
2649a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                          expected not more than %d\n",
2650a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         (int)infoRec->rec.redir.redirectingNumber.len,
2651a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         CDMA_NUMBER_INFO_BUFFER_LENGTH);
2652a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    return RIL_ERRNO_INVALID_RESPONSE;
2653a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                }
2654a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber
2655a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                          .len + 1) * sizeof(char) );
2656a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                for (int i = 0;
2657a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i < infoRec->rec.redir.redirectingNumber.len;
2658a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                         i++) {
2659a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
26603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                }
26614380897c6cdc99486a061b819943e3b290ebcf09Wink Saville                string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
2662a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                writeStringToParcel(p, (const char*)string8);
2663a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                free(string8);
2664a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                string8 = NULL;
2665a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
2666a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
2667a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
2668a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
2669a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.redir.redirectingReason);
26703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
26713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_LINE_CONTROL_INFO_REC:
2672a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
2673a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
2674a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
2675a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2676a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2677a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
2678a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlToggle=%d, lineCtrlReverse=%d, \
2679a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                                lineCtrlPowerDenial=%d, ", printBuf,
2680a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
2681a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlToggle,
2682a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlReverse,
2683a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                       (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
2684a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
26853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
26863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_CLIR_INFO_REC:
2687a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32((int)(infoRec->rec.clir.cause));
26883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2689a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
2690a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
26913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
26923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
2693a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.upLink);
2694a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p.writeInt32(infoRec->rec.audioCtrl.downLink);
2695a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
2696a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
2697a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.upLink,
2698a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                        infoRec->rec.audioCtrl.downLink);
2699a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                removeLastChar;
27003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville                break;
2701a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            case RIL_CDMA_T53_RELEASE_INFO_REC:
2702a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                // TODO(Moto): See David Krause, he has the answer:)
27038eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
2704a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
2705a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            default:
27068eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("Incorrect name value");
2707a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                return RIL_ERRNO_INVALID_RESPONSE;
27083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        }
27093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
2710a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
27113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2712a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    return 0;
27133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
27143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2715a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p,
2716a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                    void *response, size_t responselen) {
2717a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    if (response == NULL && responselen != 0) {
27188eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
27193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
27203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
27213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2722c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof (RIL_SignalStrength_v5)) {
2723d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RIL_SignalStrength_v10 *p_cur = ((RIL_SignalStrength_v10 *) response);
27243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
27253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
27263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
27273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
27283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
27293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
27303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
27313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
2732c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        if (responselen >= sizeof (RIL_SignalStrength_v6)) {
27339efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam            /*
273418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville             * Fixup LTE for backwards compatibility
27359efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam             */
273618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            if (s_callbacks.version <= 6) {
273718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // signalStrength: -1 -> 99
273818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.signalStrength == -1) {
273918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.signalStrength = 99;
274018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
274118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrp: -1 -> INT_MAX all other negative value to positive.
274218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // So remap here
274318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrp == -1) {
274418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = INT_MAX;
274518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
274618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
274718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
274818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // rsrq: -1 -> INT_MAX
274918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.rsrq == -1) {
275018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.rsrq = INT_MAX;
275118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
275218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // Not remapping rssnr is already using INT_MAX
27539efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam
275418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                // cqi: -1 -> INT_MAX
275518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                if (p_cur->LTE_SignalStrength.cqi == -1) {
275618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                    p_cur->LTE_SignalStrength.cqi = INT_MAX;
275718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville                }
275818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            }
275918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
2760c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
2761c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
2762c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
2763c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p.writeInt32(p_cur->LTE_SignalStrength.cqi);
2764d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            if (responselen >= sizeof (RIL_SignalStrength_v10)) {
2765d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->TD_SCDMA_SignalStrength.rscp);
2766d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            } else {
2767d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(INT_MAX);
2768d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            }
2769c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        } else {
277018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(99);
277118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
277218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
277318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
277418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville            p.writeInt32(INT_MAX);
2775d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32(INT_MAX);
2776c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        }
2777fdf825f9d0dc639787b8523638bb61874ed0b540johnwang
2778fdf825f9d0dc639787b8523638bb61874ed0b540johnwang        startResponse;
2779a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
2780c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
2781c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
2782c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                EVDO_SS.signalNoiseRatio=%d,\
2783c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
2784d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                LTE_SS.rssnr=%d,LTE_SS.cqi=%d,TDSCDMA_SS.rscp=%d]",
2785a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf,
2786a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.signalStrength,
2787a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->GW_SignalStrength.bitErrorRate,
2788a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.dbm,
2789a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->CDMA_SignalStrength.ecio,
2790a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.dbm,
2791a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur->EVDO_SignalStrength.ecio,
2792c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->EVDO_SignalStrength.signalNoiseRatio,
2793c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.signalStrength,
2794c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrp,
2795c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rsrq,
2796c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville                p_cur->LTE_SignalStrength.rssnr,
2797d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p_cur->LTE_SignalStrength.cqi,
2798d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p_cur->TD_SCDMA_SignalStrength.rscp);
2799a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        closeResponse;
2800a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
28013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
28028eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length");
28033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
28043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
28073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
28083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) {
28103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if ((response == NULL) || (responselen == 0)) {
28113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseVoid(p, response, responselen);
28123d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    } else {
28133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return responseCdmaSignalInfoRecord(p, response, responselen);
28143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
28163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
28183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL || responselen == 0) {
28198eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
28203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
28213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
28248eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
28253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
28263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
28273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    startResponse;
28303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
28323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, *p_cur);
28333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
28353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              signal=%d]",
28363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              printBuf,
28373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->isPresent,
28383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signalType,
28393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->alertPitch,
28403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville              p_cur->signal);
28413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
28433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
28443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
28453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2846a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response,
2847a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville            size_t responselen) {
28483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    if (response == NULL && responselen != 0) {
28498eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
28503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
28513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2853c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
28548eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
28553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    }
28563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2857c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
28583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2859c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->number);
28603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    p.writeInt32(p_cur->numberPresentation);
2861c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    writeStringToParcel(p, p_cur->name);
28623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
28633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
2864c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
2865c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_type);
2866c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->number_plan);
2867c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    } else {
2868c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2869c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(0);
2870c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    }
2871c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville
2872c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville    startResponse;
28733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
28743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
2875c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            signal=%d,number_type=%d,number_plan=%d]",
28763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            printBuf,
28773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->number,
28783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->numberPresentation,
28793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->name,
28803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.isPresent,
28813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.signalType,
28823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville            p_cur->signalInfoRecord.alertPitch,
2883c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->signalInfoRecord.signal,
2884c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_type,
2885c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville            p_cur->number_plan);
28863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    closeResponse;
28873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
28883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville    return 0;
28893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
28903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville
289145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen) {
289245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (response == NULL && responselen != 0) {
28938eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimRefresh: invalid response: NULL");
289445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        return RIL_ERRNO_INVALID_RESPONSE;
289545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
289645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
289745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    startResponse;
289845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    if (s_callbacks.version == 7) {
289945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
290045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->result);
290145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur->ef_id);
290245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, p_cur->aid);
290345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
290445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
290545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
290645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->result,
290745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->ef_id,
290845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur->aid);
290945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    } else {
291045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        int *p_cur = ((int *) response);
291145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[0]);
291245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        p.writeInt32(p_cur[1]);
291345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        writeStringToParcel(p, NULL);
291445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
291545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka        appendPrintBuf("%sresult=%d, ef_id=%d",
291645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                printBuf,
291745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[0],
291845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka                p_cur[1]);
291945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    }
292045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    closeResponse;
292145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
292245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka    return 0;
292345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka}
292445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka
29258a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen)
29268a9e02161271505de274db0c3a88087056dd5dfcWink Saville{
29278a9e02161271505de274db0c3a88087056dd5dfcWink Saville    if (response == NULL && responselen != 0) {
29288a9e02161271505de274db0c3a88087056dd5dfcWink Saville        RLOGE("invalid response: NULL");
29298a9e02161271505de274db0c3a88087056dd5dfcWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
29308a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
29318a9e02161271505de274db0c3a88087056dd5dfcWink Saville
29328a9e02161271505de274db0c3a88087056dd5dfcWink Saville    if (responselen % sizeof(RIL_CellInfo) != 0) {
293352500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseCellInfoList: invalid response length %d expected multiple of %d",
29348a9e02161271505de274db0c3a88087056dd5dfcWink Saville                (int)responselen, (int)sizeof(RIL_CellInfo));
29358a9e02161271505de274db0c3a88087056dd5dfcWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
29368a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
29378a9e02161271505de274db0c3a88087056dd5dfcWink Saville
29388a9e02161271505de274db0c3a88087056dd5dfcWink Saville    int num = responselen / sizeof(RIL_CellInfo);
29398a9e02161271505de274db0c3a88087056dd5dfcWink Saville    p.writeInt32(num);
29408a9e02161271505de274db0c3a88087056dd5dfcWink Saville
29418a9e02161271505de274db0c3a88087056dd5dfcWink Saville    RIL_CellInfo *p_cur = (RIL_CellInfo *) response;
29428a9e02161271505de274db0c3a88087056dd5dfcWink Saville    startResponse;
29438a9e02161271505de274db0c3a88087056dd5dfcWink Saville    int i;
29448a9e02161271505de274db0c3a88087056dd5dfcWink Saville    for (i = 0; i < num; i++) {
29458a9e02161271505de274db0c3a88087056dd5dfcWink Saville        appendPrintBuf("%s[%d: type=%d,registered=%d,timeStampType=%d,timeStamp=%lld", printBuf, i,
29468a9e02161271505de274db0c3a88087056dd5dfcWink Saville            p_cur->cellInfoType, p_cur->registered, p_cur->timeStampType, p_cur->timeStamp);
29478a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32((int)p_cur->cellInfoType);
29488a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32(p_cur->registered);
29498a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt32(p_cur->timeStampType);
29508a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p.writeInt64(p_cur->timeStamp);
29518a9e02161271505de274db0c3a88087056dd5dfcWink Saville        switch(p_cur->cellInfoType) {
29528a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_GSM: {
2953c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s GSM id: mcc=%d,mnc=%d,lac=%d,cid=%d,", printBuf,
29548a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.mcc,
29558a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.mnc,
29568a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.lac,
2957c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.gsm.cellIdentityGsm.cid);
2958c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s gsmSS: ss=%d,ber=%d],", printBuf,
29598a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength,
29608a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
29618a9e02161271505de274db0c3a88087056dd5dfcWink Saville
29628a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
29638a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
29648a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
29658a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
29668a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
29678a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
29688a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
29698a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
2970c57b3eb525db241bd3e6092453f48388bc880447Wink Saville            case RIL_CELL_INFO_TYPE_WCDMA: {
2971c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s WCDMA id: mcc=%d,mnc=%d,lac=%d,cid=%d,psc=%d,", printBuf,
2972c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc,
2973c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc,
2974c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.lac,
2975c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.cid,
2976c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
2977c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                appendPrintBuf("%s wcdmaSS: ss=%d,ber=%d],", printBuf,
2978c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength,
2979c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                    p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
2980c57b3eb525db241bd3e6092453f48388bc880447Wink Saville
2981c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
2982c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
2983c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
2984c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
2985c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
2986c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
2987c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
2988c57b3eb525db241bd3e6092453f48388bc880447Wink Saville                break;
2989c57b3eb525db241bd3e6092453f48388bc880447Wink Saville            }
29908a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_CDMA: {
29918a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s CDMA id: nId=%d,sId=%d,bsId=%d,long=%d,lat=%d", printBuf,
29928a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.networkId,
29938a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.systemId,
29948a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.basestationId,
29958a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.longitude,
29968a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
29978a9e02161271505de274db0c3a88087056dd5dfcWink Saville
29988a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
29998a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
30008a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
30018a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
30028a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
30038a9e02161271505de274db0c3a88087056dd5dfcWink Saville
30048a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s cdmaSS: dbm=%d ecio=%d evdoSS: dbm=%d,ecio=%d,snr=%d", printBuf,
30058a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthCdma.dbm,
30068a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthCdma.ecio,
30078a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.dbm,
30088a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.ecio,
30098a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
30108a9e02161271505de274db0c3a88087056dd5dfcWink Saville
30118a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
30128a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
30138a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
30148a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
30158a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
30168a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
30178a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
30188a9e02161271505de274db0c3a88087056dd5dfcWink Saville            case RIL_CELL_INFO_TYPE_LTE: {
30198a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s LTE id: mcc=%d,mnc=%d,ci=%d,pci=%d,tac=%d", printBuf,
30208a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.mcc,
30218a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.mnc,
30228a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.ci,
30238a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.pci,
30248a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.cellIdentityLte.tac);
30258a9e02161271505de274db0c3a88087056dd5dfcWink Saville
30268a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
30278a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
30288a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
30298a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
30308a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
30318a9e02161271505de274db0c3a88087056dd5dfcWink Saville
30328a9e02161271505de274db0c3a88087056dd5dfcWink Saville                appendPrintBuf("%s lteSS: ss=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,ta=%d", printBuf,
30338a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.signalStrength,
30348a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rsrp,
30358a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rsrq,
30368a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.rssnr,
30378a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.cqi,
30388a9e02161271505de274db0c3a88087056dd5dfcWink Saville                    p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
30398a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
30408a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
30418a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
30428a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
30438a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
30448a9e02161271505de274db0c3a88087056dd5dfcWink Saville                p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
30458a9e02161271505de274db0c3a88087056dd5dfcWink Saville                break;
30468a9e02161271505de274db0c3a88087056dd5dfcWink Saville            }
3047d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3048d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                appendPrintBuf("%s TDSCDMA id: mcc=%d,mnc=%d,lac=%d,cid=%d,cpid=%d,", printBuf,
3049d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc,
3050d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc,
3051d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac,
3052d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid,
3053d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
3054d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                appendPrintBuf("%s tdscdmaSS: rscp=%d],", printBuf,
3055d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
3056d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3057d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
3058d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
3059d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac);
3060d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
3061d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
3062d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
3063d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                break;
3064d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            }
30658a9e02161271505de274db0c3a88087056dd5dfcWink Saville        }
30668a9e02161271505de274db0c3a88087056dd5dfcWink Saville        p_cur += 1;
30678a9e02161271505de274db0c3a88087056dd5dfcWink Saville    }
30688a9e02161271505de274db0c3a88087056dd5dfcWink Saville    removeLastChar;
30698a9e02161271505de274db0c3a88087056dd5dfcWink Saville    closeResponse;
30708a9e02161271505de274db0c3a88087056dd5dfcWink Saville
30718a9e02161271505de274db0c3a88087056dd5dfcWink Saville    return 0;
30728a9e02161271505de274db0c3a88087056dd5dfcWink Saville}
30738a9e02161271505de274db0c3a88087056dd5dfcWink Saville
3074d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic int responseHardwareConfig(Parcel &p, void *response, size_t responselen)
3075d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen{
3076d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   if (response == NULL && responselen != 0) {
3077d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen       RLOGE("invalid response: NULL");
3078d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen       return RIL_ERRNO_INVALID_RESPONSE;
3079d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   }
3080d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3081d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   if (responselen % sizeof(RIL_HardwareConfig) != 0) {
308252500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan       RLOGE("responseHardwareConfig: invalid response length %d expected multiple of %d",
3083d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen          (int)responselen, (int)sizeof(RIL_HardwareConfig));
3084d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen       return RIL_ERRNO_INVALID_RESPONSE;
3085d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   }
3086d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3087d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   int num = responselen / sizeof(RIL_HardwareConfig);
3088d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   int i;
3089d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   RIL_HardwareConfig *p_cur = (RIL_HardwareConfig *) response;
3090d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3091d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   p.writeInt32(num);
3092d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3093d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   startResponse;
3094d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   for (i = 0; i < num; i++) {
3095d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      switch (p_cur[i].type) {
3096d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen         case RIL_HARDWARE_CONFIG_MODEM: {
3097d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            writeStringToParcel(p, p_cur[i].uuid);
3098d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32((int)p_cur[i].state);
3099d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32(p_cur[i].cfg.modem.rat);
3100d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32(p_cur[i].cfg.modem.maxVoice);
3101d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32(p_cur[i].cfg.modem.maxData);
3102d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32(p_cur[i].cfg.modem.maxStandby);
3103d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3104d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            appendPrintBuf("%s modem: uuid=%s,state=%d,rat=%08x,maxV=%d,maxD=%d,maxS=%d", printBuf,
3105d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen               p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.modem.rat,
3106d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen               p_cur[i].cfg.modem.maxVoice, p_cur[i].cfg.modem.maxData, p_cur[i].cfg.modem.maxStandby);
3107d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3108d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen         }
3109d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen         case RIL_HARDWARE_CONFIG_SIM: {
3110d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            writeStringToParcel(p, p_cur[i].uuid);
3111d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            p.writeInt32((int)p_cur[i].state);
3112d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            writeStringToParcel(p, p_cur[i].cfg.sim.modemUuid);
3113d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3114d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            appendPrintBuf("%s sim: uuid=%s,state=%d,modem-uuid=%s", printBuf,
3115d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen               p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.sim.modemUuid);
3116d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3117d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen         }
3118d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      }
3119d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   }
3120d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   removeLastChar;
3121d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   closeResponse;
3122d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen   return 0;
3123d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
3124d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
31253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() {
312600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
312700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
312800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* trigger event loop to wakeup. No reason to do this,
312900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         * if we're in the event loop thread */
313000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         do {
313100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = write (s_fdWakeupWrite, " ", 1);
313200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project         } while (ret < 0 && errno == EINTR);
313300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
313400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
313500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
31363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) {
313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_add(ev);
313800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
313900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
314000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3141fd7293711394c422711ff07d15a357955ff2194fWink Savillestatic void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) {
3142fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(num_apps);
3143fd7293711394c422711ff07d15a357955ff2194fWink Saville        startResponse;
3144fd7293711394c422711ff07d15a357955ff2194fWink Saville        for (int i = 0; i < num_apps; i++) {
3145fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_type);
3146fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].app_state);
3147fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].perso_substate);
3148fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr));
3149fd7293711394c422711ff07d15a357955ff2194fWink Saville            writeStringToParcel(p, (const char*)
3150fd7293711394c422711ff07d15a357955ff2194fWink Saville                                          (appStatus[i].app_label_ptr));
3151fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1_replaced);
3152fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin1);
3153fd7293711394c422711ff07d15a357955ff2194fWink Saville            p.writeInt32(appStatus[i].pin2);
3154fd7293711394c422711ff07d15a357955ff2194fWink Saville            appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
3155fd7293711394c422711ff07d15a357955ff2194fWink Saville                    aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
3156fd7293711394c422711ff07d15a357955ff2194fWink Saville                    printBuf,
3157fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_type,
3158fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_state,
3159fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].perso_substate,
3160fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].aid_ptr,
3161fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].app_label_ptr,
3162fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1_replaced,
3163fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin1,
3164fd7293711394c422711ff07d15a357955ff2194fWink Saville                    appStatus[i].pin2);
3165fd7293711394c422711ff07d15a357955ff2194fWink Saville        }
3166fd7293711394c422711ff07d15a357955ff2194fWink Saville        closeResponse;
3167fd7293711394c422711ff07d15a357955ff2194fWink Saville}
3168fd7293711394c422711ff07d15a357955ff2194fWink Saville
3169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) {
3170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int i;
3171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
31738eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
3174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
3175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
31772c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    if (responselen == sizeof (RIL_CardStatus_v6)) {
3178fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3179fd7293711394c422711ff07d15a357955ff2194fWink Saville
3180fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
3181fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
3182fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
3183fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
3184c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(p_cur->ims_subscription_app_index);
3185fd7293711394c422711ff07d15a357955ff2194fWink Saville
3186fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
31872c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else if (responselen == sizeof (RIL_CardStatus_v5)) {
3188fd7293711394c422711ff07d15a357955ff2194fWink Saville        RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response);
3189fd7293711394c422711ff07d15a357955ff2194fWink Saville
3190fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->card_state);
3191fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->universal_pin_state);
3192fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->gsm_umts_subscription_app_index);
3193fd7293711394c422711ff07d15a357955ff2194fWink Saville        p.writeInt32(p_cur->cdma_subscription_app_index);
3194c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        p.writeInt32(-1);
3195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3196fd7293711394c422711ff07d15a357955ff2194fWink Saville        sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
31972c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville    } else {
31988eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n");
31992c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
3200f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3201f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3202f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
32033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville}
3204f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3205a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
3206a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
3207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(num);
3208f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
3210a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_GSM_BroadcastSmsConfigInfo **p_cur =
3211a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                (RIL_GSM_BroadcastSmsConfigInfo **) response;
3212a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0; i < num; i++) {
3213a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromServiceId);
3214a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toServiceId);
3215a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->fromCodeScheme);
3216a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->toCodeScheme);
3217a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
3218a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville
3219a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
3220a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
3221a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
3222a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
3223a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville                p_cur[i]->selected);
3224a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    }
3225f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
3226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3227f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
3228f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
3229f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3230a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
3231a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
3232a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville               (RIL_CDMA_BroadcastSmsConfigInfo **) response;
3233f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3234a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
3235a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    p.writeInt32(num);
3236f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3237f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
3238a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    for (int i = 0 ; i < num ; i++ ) {
3239a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->service_category);
3240a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->language);
3241a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        p.writeInt32(p_cur[i]->selected);
3242f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3243a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
3244a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              selected =%d], ",
3245a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
3246a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville              p_cur[i]->selected);
3247f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    }
3248a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville    closeResponse;
3249f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
3250f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
3251f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
3252f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3253f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
3254f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int num;
3255f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitCount;
3256f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    int digitLimit;
3257f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    uint8_t uct;
3258f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    void* dest;
3259f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
32608eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGD("Inside responseCdmaSms");
3261f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville
3262f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    if (response == NULL && responselen != 0) {
32638eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response: NULL");
3264f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
3265f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3266f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3267f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville    if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
32688eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("invalid response length was %d expected %d",
3269f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville                (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
3270f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        return RIL_ERRNO_INVALID_RESPONSE;
3271f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3272f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3273f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
3274f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uTeleserviceID);
3275f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->bIsServicePresent),sizeof(uct));
3276f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uServicecategory);
3277f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.digit_mode);
3278f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_mode);
3279f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_type);
3280f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sAddress.number_plan);
3281f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
3282f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
3283f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3284f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
3285f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->sSubAddress.subaddressType);
3288f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
3289f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
3290f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
3291f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
3293f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3294f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
3296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    p.writeInt32(p_cur->uBearerDataLen);
3297f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
3298f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville       p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
3299f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    }
3300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3301f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    startResponse;
3302f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
33031b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
3304f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
3305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
3306f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    closeResponse;
3307f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3308f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    return 0;
3309f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville}
3310f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3311c29360a92ad603fcec008c098cbbed47e3399dc8Wink Savillestatic int responseDcRtInfo(Parcel &p, void *response, size_t responselen)
3312c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville{
3313c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    int num = responselen / sizeof(RIL_DcRtInfo);
3314c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    if ((responselen % sizeof(RIL_DcRtInfo) != 0) || (num != 1)) {
331552500160ca3efd2e7e90df27be0eaded16185642Amit Mahajan        RLOGE("responseDcRtInfo: invalid response length %d expected multiple of %d",
3316c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville                (int)responselen, (int)sizeof(RIL_DcRtInfo));
3317c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        return RIL_ERRNO_INVALID_RESPONSE;
3318c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    }
3319c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville
3320c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    startResponse;
3321c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    RIL_DcRtInfo *pDcRtInfo = (RIL_DcRtInfo *)response;
3322c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    p.writeInt64(pDcRtInfo->time);
3323c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    p.writeInt32(pDcRtInfo->powerState);
3324c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    appendPrintBuf("%s[time=%d,powerState=%d]", printBuf,
3325c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        pDcRtInfo->time,
3326c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        pDcRtInfo->powerState);
3327c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    closeResponse;
3328c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville
3329c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville    return 0;
3330c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville}
3331c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville
333200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
333300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select()
333400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the
333500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down
333600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
3337f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) {
333800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char buff[16];
333900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
334000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
33418eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGV("processWakeupCallback");
334200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
334300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* empty our wakeup socket out */
334400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    do {
334500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = read(s_fdWakeupRead, &buff, sizeof(buff));
33467f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    } while (ret > 0 || (ret < 0 && errno == EINTR));
334700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
334800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3349d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic void onCommandsSocketClosed(RIL_SOCKET_ID socket_id) {
335000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
335100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *p_cur;
3352d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* Hook for current context
3353d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen       pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
3354d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_t * pendingRequestsMutexHook = &s_pendingRequestsMutex;
3355d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsHook refer to &s_pendingRequests */
3356d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RequestInfo **    pendingRequestsHook = &s_pendingRequests;
3357d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3358d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
3359d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_2) {
3360d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
3361d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket2;
3362d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3363d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
3364d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_3) {
3365d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
3366d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket3;
3367d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3368d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
3369d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
3370d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    else if (socket_id == RIL_SOCKET_4) {
3371d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
3372d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket4;
3373d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3374d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
3375d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
337600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* mark pending requests as "cancelled" so we dont report responses */
3377d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_lock(pendingRequestsMutexHook);
337800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
337900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3380d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p_cur = *pendingRequestsHook;
338100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3382d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    for (p_cur = *pendingRequestsHook
338300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur != NULL
338400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ; p_cur  = p_cur->p_next
338500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
338600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p_cur->cancelled = 1;
338700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
338800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3389d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = pthread_mutex_unlock(pendingRequestsMutexHook);
339000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    assert (ret == 0);
339100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
339200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3393f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) {
339400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
339500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    void *p_record;
339600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t recordlen;
339700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
3398d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    SocketListenParam *p_info = (SocketListenParam *)param;
339900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3400d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    assert(fd == p_info->fdCommand);
340100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3402d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p_rs = p_info->p_rs;
340300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
340400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (;;) {
340500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* loop until EAGAIN/EINTR, end of stream, or other error */
340600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ret = record_stream_get_next(p_rs, &p_record, &recordlen);
340700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
340800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret == 0 && p_record == NULL) {
340900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* end-of-stream */
341000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
341100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret < 0) {
341200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
341300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else if (ret == 0) { /* && p_record != NULL */
3414d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            processCommandBuffer(p_record, recordlen, p_info->socket_id);
341500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
341600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
341700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
341800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
341900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* fatal error or end-of-stream */
342000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (ret != 0) {
34218eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("error on reading command socket errno:%d\n", errno);
342200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        } else {
34238eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGW("EOS.  Closing command socket.");
342400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
34257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
3426d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        close(fd);
3427d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p_info->fdCommand = -1;
342800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3429d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        ril_event_del(p_info->commands_event);
343000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
343100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        record_stream_free(p_rs);
343200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
343300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
343400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        rilEventAddWakeup(&s_listen_event);
343500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3436d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        onCommandsSocketClosed(p_info->socket_id);
343700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
343800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
343900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
344000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3441d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic void onNewCommandConnect(RIL_SOCKET_ID socket_id) {
34425b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville    // Inform we are connected and the ril version
3443a9c18d17769ee475cf4fd5e76e18ddfa4070c7cdJake Hamby    int rilVer = s_callbacks.version;
3444d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_UNSOL_RESPONSE(RIL_UNSOL_RIL_CONNECTED,
3445d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                                    &rilVer, sizeof(rilVer), socket_id);
34465b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville
344700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // implicit radio state changed
3448d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
3449d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                                    NULL, 0, socket_id);
345000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
345100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Send last NITZ time data, in case it was missed
345200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_lastNITZTimeData != NULL) {
3453d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize, socket_id);
345400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
345500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        free(s_lastNITZTimeData);
345600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = NULL;
345700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
345800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
345900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Get version string
346000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_callbacks.getVersion != NULL) {
346100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        const char *version;
346200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        version = s_callbacks.getVersion();
34638eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: %s\n", version);
34647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
346500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, version);
346600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
34678eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGI("RIL Daemon version: unavailable\n");
346800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        property_set(PROPERTY_RIL_IMPL, "unavailable");
346900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
347000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
347100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
347200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3473f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) {
347400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
347500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int err;
347600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int is_phone_socket;
3477d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fdCommand = -1;
347800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RecordStream *p_rs;
3479d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    SocketListenParam *p_info = (SocketListenParam *)param;
348000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
348200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
348300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct ucred creds;
348500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t szCreds = sizeof(creds);
348600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
348700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct passwd *pwd = NULL;
348800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3489d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    assert (*p_info->fdCommand < 0);
3490d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    assert (fd == *p_info->fdListen);
34917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
3492d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    fdCommand = accept(fd, (sockaddr *) &peeraddr, &socklen);
349300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3494d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (fdCommand < 0 ) {
34958eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error on accept() errno:%d", errno);
349600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* start listening for new connections again */
3497d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        rilEventAddWakeup(p_info->listen_event);
3498d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        return;
349900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
350000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
350100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* check the credential of the other side and only accept socket from
350200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project     * phone process
35037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville     */
350400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    errno = 0;
350500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    is_phone_socket = 0;
3506f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
3507d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    err = getsockopt(fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
3508f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville
350900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (err == 0 && szCreds > 0) {
3510f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        errno = 0;
3511f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        pwd = getpwuid(creds.uid);
3512f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        if (pwd != NULL) {
3513d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            if (strcmp(pwd->pw_name, p_info->processName) == 0) {
3514f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                is_phone_socket = 1;
3515f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            } else {
35168eb2a12cb7b525e74736300962a5f3848427275aWink Saville                RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
3517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville            }
3518f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        } else {
35198eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE("Error on getpwuid() errno: %d", errno);
3520f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        }
352100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
35228eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("Error on getsockopt() errno: %d", errno);
352300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
352400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3525d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (!is_phone_socket) {
3526d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      RLOGE("RILD must accept socket from %s", p_info->processName);
35277f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
3528d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      close(fdCommand);
3529d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      fdCommand = -1;
353000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3531d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      onCommandsSocketClosed(p_info->socket_id);
353200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
353300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      /* start listening for new connections again */
3534d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen      rilEventAddWakeup(p_info->listen_event);
353500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
353600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project      return;
353700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
353800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3539d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = fcntl(fdCommand, F_SETFL, O_NONBLOCK);
354000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
354100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
35428eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
354300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
354400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3545d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("libril: new connection to %s", rilSocketIdToString(p_info->socket_id));
3546d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3547d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p_info->fdCommand = fdCommand;
3548d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3549d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p_rs = record_stream_new(p_info->fdCommand, MAX_COMMAND_BYTES);
355000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3551d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    p_info->p_rs = p_rs;
355200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3553d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ril_event_set (p_info->commands_event, p_info->fdCommand, 1,
3554d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        p_info->processCommandsCallback, p_info);
355500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3556d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    rilEventAddWakeup (p_info->commands_event);
355700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3558d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    onNewCommandConnect(p_info->socket_id);
355900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
356000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
356100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) {
356200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
356300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (args[i] != NULL) {
356400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free(args[i]);
356500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
356600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
356700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(args);
356800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
356900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3570f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) {
357100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int acceptFD, option;
357200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct sockaddr_un peeraddr;
357300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    socklen_t socklen = sizeof (peeraddr);
357400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int data;
357500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsigned int qxdm_data[6];
357600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    const char *deactData[1] = {"1"};
357700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char *actData[1];
357800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RIL_Dial dialData;
357900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int hangupData[1] = {1};
358000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int number;
358100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    char **args;
3582d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
3583d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int sim_id = 0;
3584d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3585d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("debugCallback for socket %s", rilSocketIdToString(socket_id));
358600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
358700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
358800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
358900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (acceptFD < 0) {
35908eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error accepting on debug port: %d\n", errno);
359100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
359200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
359300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
359400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
35958eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE ("error reading on socket: number of Args: \n");
359600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
359700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
359800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    args = (char **) malloc(sizeof(char*) * number);
359900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
360000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    for (int i = 0; i < number; i++) {
360100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        int len;
360200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
36038eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Len of Args: \n");
360400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
360500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
360600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
360700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // +1 for null-term
360800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        args[i] = (char *) malloc((sizeof(char) * len) + 1);
36097f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
36101b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville            != (int)sizeof(char) * len) {
36118eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("error reading on socket: Args[%d] \n", i);
361200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            freeDebugCallbackArgs(i, args);
361300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            return;
361400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
361500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        char * buf = args[i];
361600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        buf[len] = 0;
3617d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if ((i+1) == number) {
3618d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            /* The last argument should be sim id 0(SIM1)~3(SIM4) */
3619d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            sim_id = atoi(args[i]);
3620d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            switch (sim_id) {
3621d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                case 0:
3622d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    socket_id = RIL_SOCKET_1;
3623d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    break;
3624d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #if (SIM_COUNT >= 2)
3625d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                case 1:
3626d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    socket_id = RIL_SOCKET_2;
3627d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    break;
3628d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #endif
3629d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #if (SIM_COUNT >= 3)
3630d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                case 2:
3631d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    socket_id = RIL_SOCKET_3;
3632d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    break;
3633d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #endif
3634d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #if (SIM_COUNT >= 4)
3635d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                case 3:
3636d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    socket_id = RIL_SOCKET_4;
3637d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    break;
3638d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            #endif
3639d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                default:
3640d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    socket_id = RIL_SOCKET_1;
3641d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                    break;
3642d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            }
3643d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        }
364400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
364500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
364600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (atoi(args[0])) {
364700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 0:
36488eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing reset.");
3649d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0, socket_id);
365000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
365100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 1:
36528eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Connection on debug port: issuing radio power off.");
365300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 0;
3654d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
365500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Close the socket
3656d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            if (socket_id == RIL_SOCKET_1 && s_ril_param_socket.fdCommand > 0) {
3657d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                close(s_ril_param_socket.fdCommand);
3658d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                s_ril_param_socket.fdCommand = -1;
3659d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            }
3660d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        #if (SIM_COUNT == 2)
3661d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            else if (socket_id == RIL_SOCKET_2 && s_ril_param_socket2.fdCommand > 0) {
3662d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                close(s_ril_param_socket2.fdCommand);
3663d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                s_ril_param_socket2.fdCommand = -1;
3664d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            }
3665d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        #endif
366600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
366700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 2:
36688eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: issuing unsolicited voice network change.");
3669d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, NULL, 0, socket_id);
367000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
367100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 3:
36728eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log enable.");
3673d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[0] = 65536;     // head.func_tag
3674d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[1] = 16;        // head.len
3675d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 1;         // mode: 1 for 'start logging'
3676d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[3] = 32;        // log_file_size: 32megabytes
3677d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[4] = 0;         // log_mask
3678d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;         // log_max_fileindex
36797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
3680d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              6 * sizeof(int), socket_id);
368100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
368200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 4:
36838eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI ("Debug port: QXDM log disable.");
368400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[0] = 65536;
368500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[1] = 16;
3686d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
368700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[3] = 32;
368800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            qxdm_data[4] = 0;
3689d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang            qxdm_data[5] = 8;
369000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
3691d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              6 * sizeof(int), socket_id);
369200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
369300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 5:
36948eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Radio On");
369500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            data = 1;
3696d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
369700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            sleep(2);
369800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Set network selection automatic.
3699d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0, socket_id);
370000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
370100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 6:
37028eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
370300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            actData[0] = args[1];
37047f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
3705d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              sizeof(actData), socket_id);
370600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
370700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 7:
37088eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Deactivate Data Call");
37097f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
3710d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              sizeof(deactData), socket_id);
371100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
371200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 8:
37138eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Dial Call");
371400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.clir = 0;
371500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            dialData.address = args[1];
3716d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData), socket_id);
371700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
371800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 9:
37198eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: Answer Call");
3720d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0, socket_id);
372100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
372200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case 10:
37238eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGI("Debug port: End Call");
37247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville            issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
3725d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                              sizeof(hangupData), socket_id);
372600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
372700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
37288eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGE ("Invalid request");
372900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
373000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
373100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    freeDebugCallbackArgs(number, args);
373200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    close(acceptFD);
373300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
373400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
373500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3736f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) {
373700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
373800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
373900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *)param;
374000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
374100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->p_callback(p_info->userParam);
374200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
374300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
374400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME generalize this...there should be a cancel mechanism
374500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
374600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info = NULL;
374700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
374800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
374900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(p_info);
375000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
375100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
375200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
375300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *
3754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) {
375500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
375600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int filedes[2];
375700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
375800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_init();
375900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
376000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
376100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
376200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 1;
376300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_cond_broadcast(&s_startupCond);
376400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
376500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
376600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
376700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = pipe(filedes);
376800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
376900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
37708eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Error in pipe() errno:%d", errno);
377100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return NULL;
377200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
377300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupRead = filedes[0];
377500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_fdWakeupWrite = filedes[1];
377600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
377800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
377900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
378000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                processWakeupCallback, NULL);
378100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
378200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_wakeupfd_event);
378300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
378400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Only returns on error
378500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_loop();
37868eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE ("error in event_loop_base errno:%d", errno);
37875cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    // kill self to restart on error
37885cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo    kill(0, SIGKILL);
378900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
379000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return NULL;
379100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
379200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
37937f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
3794f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) {
379500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    /* spin up eventLoop thread and wait for it to get started */
379600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_started = 0;
379700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_lock(&s_startupMutex);
379800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3799c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    pthread_attr_t attr;
3800c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    pthread_attr_init(&attr);
38017f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
3802c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes
3803fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes    int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
3804fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes    if (result != 0) {
3805fd81e7146b2e9253aa2ab131d970b9e300f1f97eElliott Hughes        RLOGE("Failed to create dispatch thread: %s", strerror(result));
3806c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes        goto done;
3807c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughes    }
380800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
380900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    while (s_started == 0) {
381000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pthread_cond_wait(&s_startupCond, &s_startupMutex);
381100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
381200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3813c0d8dc63fa3a71f8731870d0e851eb47acf4f568Elliott Hughesdone:
381400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pthread_mutex_unlock(&s_startupMutex);
381500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
381600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
381700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only.
381800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
381900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
382000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
382100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3822d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenstatic void startListen(RIL_SOCKET_ID socket_id, SocketListenParam* socket_listen_p) {
3823d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fdListen = -1;
3824d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int ret;
3825d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    char socket_name[10];
3826d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3827d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    memset(socket_name, 0, sizeof(char)*10);
3828d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3829d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    switch(socket_id) {
3830d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_1:
3831d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            strncpy(socket_name, RIL_getRilSocketName(), 9);
3832d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3833d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #if (SIM_COUNT >= 2)
3834d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_2:
3835d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            strncpy(socket_name, SOCKET2_NAME_RIL, 9);
3836d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3837d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #endif
3838d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #if (SIM_COUNT >= 3)
3839d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_3:
3840d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            strncpy(socket_name, SOCKET3_NAME_RIL, 9);
3841d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3842d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #endif
3843d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #if (SIM_COUNT >= 4)
3844d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_4:
3845d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            strncpy(socket_name, SOCKET4_NAME_RIL, 9);
3846d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            break;
3847d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    #endif
3848d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        default:
3849d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            RLOGE("Socket id is wrong!!");
3850d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return;
3851d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3852d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3853d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("Start to listen %s", rilSocketIdToString(socket_id));
3854d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3855d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    fdListen = android_get_control_socket(socket_name);
3856d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (fdListen < 0) {
3857d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RLOGE("Failed to get socket %s", socket_name);
3858d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        exit(-1);
3859d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3860d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3861d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = listen(fdListen, 4);
3862d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3863d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (ret < 0) {
3864d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RLOGE("Failed to listen on control socket '%d': %s",
3865d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen             fdListen, strerror(errno));
3866d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        exit(-1);
3867d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
3868d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    socket_listen_p->fdListen = fdListen;
3869d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3870d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* note: non-persistent so we can accept only one connection at a time */
3871d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ril_event_set (socket_listen_p->listen_event, fdListen, false,
3872d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                listenCallback, socket_listen_p);
3873d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3874d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    rilEventAddWakeup (socket_listen_p->listen_event);
3875d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
3876d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
38777f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void
3878f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) {
387900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
388000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int flags;
388100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3882d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("SIM_COUNT: %d", SIM_COUNT);
3883d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
38844380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks == NULL) {
38858eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: RIL_RadioFunctions * null");
388600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
388700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
38884380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version < RIL_VERSION_MIN) {
38898eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is to old, min version is %d",
38904380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION_MIN);
38914380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
38924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    }
38934380897c6cdc99486a061b819943e3b290ebcf09Wink Saville    if (callbacks->version > RIL_VERSION) {
38948eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register: version %d is too new, max version is %d",
38954380897c6cdc99486a061b819943e3b290ebcf09Wink Saville             callbacks->version, RIL_VERSION);
38964380897c6cdc99486a061b819943e3b290ebcf09Wink Saville        return;
38973a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville    }
38988eb2a12cb7b525e74736300962a5f3848427275aWink Saville    RLOGE("RIL_register: RIL version %d", callbacks->version);
389900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
390000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled > 0) {
39018eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("RIL_register has been called more than once. "
390200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                "Subsequent call ignored");
390300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
390400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
390500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
390600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
390700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3908d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* Initialize socket1 parameters */
3909d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    s_ril_param_socket = {
3910d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        RIL_SOCKET_1,             /* socket_id */
3911d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                       /* fdListen */
3912d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                       /* fdCommand */
3913d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        PHONE_PROCESS,            /* processName */
3914d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_commands_event,        /* commands_event */
3915d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_listen_event,          /* listen_event */
3916d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        processCommandsCallback,  /* processCommandsCallback */
3917d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        NULL                      /* p_rs */
3918d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        };
3919d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3920d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
3921d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    s_ril_param_socket2 = {
3922d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        RIL_SOCKET_2,               /* socket_id */
3923d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdListen */
3924d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdCommand */
3925d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        PHONE_PROCESS,              /* processName */
3926d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_commands_event_socket2,  /* commands_event */
3927d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_listen_event_socket2,    /* listen_event */
3928d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        processCommandsCallback,    /* processCommandsCallback */
3929d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        NULL                        /* p_rs */
3930d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        };
3931d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
3932d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3933d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
3934d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    s_ril_param_socket3 = {
3935d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        RIL_SOCKET_3,               /* socket_id */
3936d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdListen */
3937d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdCommand */
3938d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        PHONE_PROCESS,              /* processName */
3939d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_commands_event_socket3,  /* commands_event */
3940d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_listen_event_socket3,    /* listen_event */
3941d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        processCommandsCallback,    /* processCommandsCallback */
3942d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        NULL                        /* p_rs */
3943d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        };
3944d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
3945d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3946d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
3947d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    s_ril_param_socket4 = {
3948d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        RIL_SOCKET_4,               /* socket_id */
3949d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdListen */
3950d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        -1,                         /* fdCommand */
3951d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        PHONE_PROCESS,              /* processName */
3952d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_commands_event_socket4,  /* commands_event */
3953d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &s_listen_event_socket4,    /* listen_event */
3954d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        processCommandsCallback,    /* processCommandsCallback */
3955d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        NULL                        /* p_rs */
3956d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        };
3957d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
3958d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
3959d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
396000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    s_registerCalled = 1;
396100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3962d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("s_registerCalled flag set, %d", s_started);
396300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Little self-check
396400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
396600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        assert(i == s_commands[i].requestNumber);
396700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
396800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville    for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
39707f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        assert(i + RIL_UNSOL_RESPONSE_BASE
397100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                == s_unsolResponses[i].requestNumber);
397200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
397300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
397400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // New rild impl calls RIL_startEventLoop() first
397500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // old standalone impl wants it here.
397600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
397700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_started == 0) {
397800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        RIL_startEventLoop();
397900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
398000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3981d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    // start listen socket1
3982d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startListen(RIL_SOCKET_1, &s_ril_param_socket);
398300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3984d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
3985d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    // start listen socket2
3986d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startListen(RIL_SOCKET_2, &s_ril_param_socket2);
3987d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif /* (SIM_COUNT == 2) */
398800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3989d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
3990d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    // start listen socket3
3991d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startListen(RIL_SOCKET_3, &s_ril_param_socket3);
3992d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif /* (SIM_COUNT == 3) */
399300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
3994d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
3995d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    // start listen socket4
3996d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    startListen(RIL_SOCKET_4, &s_ril_param_socket4);
3997d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif /* (SIM_COUNT == 4) */
399800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
399900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
400000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1
400100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // start debug interface socket
400200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4003d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    char *inst = NULL;
4004d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (strlen(RIL_getRilSocketName()) >= strlen(SOCKET_NAME_RIL)) {
4005d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        inst = RIL_getRilSocketName() + strlen(SOCKET_NAME_RIL);
4006d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4007d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
4008d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    char rildebug[MAX_DEBUG_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL_DEBUG;
4009d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (inst != NULL) {
4010d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        strncat(rildebug, inst, MAX_DEBUG_SOCKET_NAME_LENGTH);
4011d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4012d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
4013d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    s_fdDebug = android_get_control_socket(rildebug);
401400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_fdDebug < 0) {
4015d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        RLOGE("Failed to get socket : %s errno:%d", rildebug, errno);
401600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
401700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
401800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
401900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = listen(s_fdDebug, 4);
402000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
402100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret < 0) {
40228eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("Failed to listen on ril debug socket '%d': %s",
402300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project             s_fdDebug, strerror(errno));
402400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        exit(-1);
402500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
402600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
402700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set (&s_debug_event, s_fdDebug, true,
402800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                debugCallback, NULL);
402900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
403000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    rilEventAddWakeup (&s_debug_event);
403100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif
403200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
403300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
403400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
403500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int
4036f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) {
403700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret = 0;
4038d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* Hook for current context
4039d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen       pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
4040d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
4041d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    /* pendingRequestsHook refer to &s_pendingRequests */
4042d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RequestInfo ** pendingRequestsHook = &s_pendingRequests;
40437f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
404400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI == NULL) {
404500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return 0;
404600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
404700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4048d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
4049d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (pRI->socket_id == RIL_SOCKET_2) {
4050d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
4051d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket2;
4052d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4053d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
4054d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if (pRI->socket_id == RIL_SOCKET_3) {
4055d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
4056d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            pendingRequestsHook = &s_pendingRequests_socket3;
4057d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        }
4058d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4059d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
4060d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (pRI->socket_id == RIL_SOCKET_4) {
4061d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
4062d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        pendingRequestsHook = &s_pendingRequests_socket4;
4063d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4064d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4065d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4066d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_lock(pendingRequestsMutexHook);
406700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4068d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    for(RequestInfo **ppCur = pendingRequestsHook
40697f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville        ; *ppCur != NULL
407000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        ; ppCur = &((*ppCur)->p_next)
407100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ) {
407200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (pRI == *ppCur) {
407300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = 1;
407400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
407500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            *ppCur = (*ppCur)->p_next;
407600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
407700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
407800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
407900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4080d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    pthread_mutex_unlock(pendingRequestsMutexHook);
408100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
408200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return ret;
408300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
408400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
408500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
408600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void
4087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
408800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    RequestInfo *pRI;
408900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
4090d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    int fd = s_ril_param_socket.fdCommand;
409100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    size_t errorOffset;
4092d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
409300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
409400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    pRI = (RequestInfo *)t;
409500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
40966c6075946589d61d3bc051dd1986d0bbf0c88da7Jayachandran C    if (!checkAndDequeueRequestInfo(pRI)) {
40976c6075946589d61d3bc051dd1986d0bbf0c88da7Jayachandran C        RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
40986c6075946589d61d3bc051dd1986d0bbf0c88da7Jayachandran C        return;
40996c6075946589d61d3bc051dd1986d0bbf0c88da7Jayachandran C    }
41006c6075946589d61d3bc051dd1986d0bbf0c88da7Jayachandran C
4101d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    socket_id = pRI->socket_id;
4102d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
4103d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_2) {
4104d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        fd = s_ril_param_socket2.fdCommand;
4105d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4106d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
4107d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if (socket_id == RIL_SOCKET_3) {
4108d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            fd = s_ril_param_socket3.fdCommand;
4109d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        }
4110d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4111d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
4112d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    if (socket_id == RIL_SOCKET_4) {
4113d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        fd = s_ril_param_socket4.fdCommand;
4114d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4115d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4116d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4117d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGD("RequestComplete, %s", rilSocketIdToString(socket_id));
4118d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
411900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->local > 0) {
412000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Locally issued command...void only!
412100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // response does not go back up the command socket
41228eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
412300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
412400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto done;
412500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
412600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
412700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[%04d]< %s",
412800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        pRI->token, requestToString(pRI->pCI->requestNumber));
412900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
413000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (pRI->cancelled == 0) {
413100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        Parcel p;
413200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
413300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (RESPONSE_SOLICITED);
413400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (pRI->token);
413500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        errorOffset = p.dataPosition();
413600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
413700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        p.writeInt32 (e);
413800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4139b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (response != NULL) {
4140b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            // there is a response payload, no matter success or not.
414100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            ret = pRI->pCI->responseFunction(p, response, responselen);
414200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
414300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            /* if an error occurred, rewind and mark it */
414400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            if (ret != 0) {
4145d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                RLOGE ("responseFunction error, ret %d", ret);
414600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.setDataPosition(errorOffset);
414700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                p.writeInt32 (ret);
414800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            }
4149b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        }
4150b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang
4151b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang        if (e != RIL_E_SUCCESS) {
4152b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang            appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
415300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
415400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4155d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        if (fd < 0) {
41568eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD ("RIL onRequestComplete: Command channel closed");
415700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
4158d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        sendResponse(p, socket_id);
415900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
416000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
416100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone:
416200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    free(pRI);
416300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
416400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
416500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
416600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
4167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() {
416800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
416900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
417000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
417100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
4172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() {
417300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    release_wake_lock(ANDROID_WAKE_LOCK_NAME);
417400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
417500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
417600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/**
417700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout
417800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */
417900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void
4180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) {
418100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // We're using "param != NULL" as a cancellation mechanism
418200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (param == NULL) {
41838eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock");
418400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
418500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
418600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
41878eb2a12cb7b525e74736300962a5f3848427275aWink Saville        //RLOGD("wakeTimeout: releasing wake lock CANCELLED");
418800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
418900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
419000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
41912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
41922bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeVoiceRadioTechnology (RIL_RadioState radioState) {
41932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
41942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
41952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
41962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
41972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_UMTS;
41982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
41992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
42002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
42012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
42022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
42032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
42042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return RADIO_TECH_1xRTT;
42052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
42078eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState");
42082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
42092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
42102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
42112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
42132bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeCdmaSubscriptionSource (RIL_RadioState radioState) {
42142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioState) {
42152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_NOT_READY:
42162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
42172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_SIM_READY:
42182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_NOT_READY:
42192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_READY:
42202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
42212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM;
42222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_NOT_READY:
42242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_NV_READY:
42252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return CDMA_SUBSCRIPTION_SOURCE_NV;
42262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
42288eb2a12cb7b525e74736300962a5f3848427275aWink Saville            RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState");
42292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return -1;
42302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
42312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
42322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int
42342bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeSimStatus (RIL_RadioState radioState) {
42352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   switch (radioState) {
42362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_NOT_READY:
42372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_NOT_READY:
42382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_NOT_READY:
42392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_NV_READY:
42402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
42412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
42422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_SIM_READY:
42432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_READY:
42442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
42452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return radioState;
42462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla       default:
42478eb2a12cb7b525e74736300962a5f3848427275aWink Saville           RLOGD("decodeSimStatus: Invoked with incorrect RadioState");
42482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           return -1;
42492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla   }
42502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
42512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic bool is3gpp2(int radioTech) {
42532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    switch (radioTech) {
42542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95A:
42552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_IS95B:
42562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_1xRTT:
42572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_0:
42582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_A:
42592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EVDO_B:
42602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_TECH_EHRPD:
42612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return true;
42622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        default:
42632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            return false;
42642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
42652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
42662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* If RIL sends SIM states or RUIM states, store the voice radio
42682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * technology and subscription source information so that they can be
42692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * returned when telephony framework requests them
42702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */
42712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState
4272d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohenprocessRadioState(RIL_RadioState newRadioState, RIL_SOCKET_ID socket_id) {
42732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) {
42752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newVoiceRadioTech;
42762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newCdmaSubscriptionSource;
42772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        int newSimStatus;
42782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
42792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* This is old RIL. Decode Subscription source and Voice Radio Technology
42802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla           from Radio State and send change notifications if there has been a change */
42812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState);
42822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newVoiceRadioTech != voiceRadioTech) {
42832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            voiceRadioTech = newVoiceRadioTech;
4284d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            RIL_UNSOL_RESPONSE(RIL_UNSOL_VOICE_RADIO_TECH_CHANGED,
4285d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &voiceRadioTech, sizeof(voiceRadioTech), socket_id);
42862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
42872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(is3gpp2(newVoiceRadioTech)) {
42882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState);
42892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            if(newCdmaSubscriptionSource != cdmaSubscriptionSource) {
42902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla                cdmaSubscriptionSource = newCdmaSubscriptionSource;
4291d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                RIL_UNSOL_RESPONSE(RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED,
4292d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                        &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource), socket_id);
42932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            }
42942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
42952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newSimStatus = decodeSimStatus(newRadioState);
42962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        if(newSimStatus != simRuimStatus) {
42972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            simRuimStatus = newSimStatus;
4298d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0, socket_id);
42992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        }
43002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
43012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        /* Send RADIO_ON to telephony */
43022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        newRadioState = RADIO_STATE_ON;
43032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    }
43042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
43052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    return newRadioState;
43062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla}
43072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla
4308d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
4309d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if defined(ANDROID_MULTI_SIM)
431000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C"
4311d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data,
4312d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                                size_t datalen, RIL_SOCKET_ID socket_id)
4313d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#else
4314d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenextern "C"
4315d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data,
431600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                size_t datalen)
4317d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
431800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
431900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int unsolResponseIndex;
432000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int ret;
432100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    int64_t timeReceived = 0;
432200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    bool shouldScheduleTimeout = false;
43232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla    RIL_RadioState newState;
4324d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RIL_SOCKET_ID soc_id = RIL_SOCKET_1;
4325d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
4326d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if defined(ANDROID_MULTI_SIM)
4327d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    soc_id = socket_id;
4328d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4329d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
433000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
433100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (s_registerCalled == 0) {
433200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Ignore RIL_onUnsolicitedResponse before RIL_register
43338eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
433400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
433500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
43367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville
433700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
433800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
433900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if ((unsolResponseIndex < 0)
434000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
43418eb2a12cb7b525e74736300962a5f3848427275aWink Saville        RLOGE("unsupported unsolicited response code %d", unsolResponse);
434200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        return;
434300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
434400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
434500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Grab a wake lock if needed for this reponse,
434600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // as we exit we'll either release it immediately
434700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // or set a timer to release it later.
434800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch (s_unsolResponses[unsolResponseIndex].wakeType) {
434900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case WAKE_PARTIAL:
435000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            grabPartialWakeLock();
435100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = true;
435200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
435300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
435400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case DONT_WAKE:
435500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default:
435600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // No wake lock is grabed so don't set timeout
435700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            shouldScheduleTimeout = false;
435800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            break;
435900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
436000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
436100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Mark the time this was received, doing this
436200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // after grabing the wakelock incase getting
436300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // the elapsedRealTime might cause us to goto
436400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // sleep.
436500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
436600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        timeReceived = elapsedRealtime();
436700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
436800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
436900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
437000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
437100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    Parcel p;
437200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
437300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (RESPONSE_UNSOLICITED);
437400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p.writeInt32 (unsolResponse);
437500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
437600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ret = s_unsolResponses[unsolResponseIndex]
43776e7c1966c6a41b6e7c0431dcc6bf65678438c79eBernhard Rosenkränzer                .responseFunction(p, const_cast<void*>(data), datalen);
437800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0) {
437900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Problem with the response. Don't continue;
438000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        goto error_exit;
438100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
438200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
438300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // some things get more payload
438400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(unsolResponse) {
438500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
4386d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            newState = processRadioState(CALL_ONSTATEREQUEST(soc_id), soc_id);
43872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla            p.writeInt32(newState);
438800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            appendPrintBuf("%s {%s}", printBuf,
4389d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen                radioStateToString(CALL_ONSTATEREQUEST(soc_id)));
439000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
439100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
439200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
439300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED:
439400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // Store the time that this was received so the
439500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // handler of this message can account for
439600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // the time it takes to arrive and process. In
439700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // particular the system has been known to sleep
439800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            // before this message can be processed.
439900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            p.writeInt64(timeReceived);
440000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        break;
440100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
440200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4403d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    RLOGI("%s UNSOLICITED: %s length:%d", rilSocketIdToString(soc_id), requestToString(unsolResponse), p.dataSize());
4404d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    ret = sendResponse(p, soc_id);
440500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
440600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
440700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Unfortunately, NITZ time is not poll/update like everything
440800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // else in the system. So, if the upstream client isn't connected,
440900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // keep a copy of the last NITZ response (with receive time noted
441000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // above) around so we can deliver it when it is connected
441100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
441200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_lastNITZTimeData != NULL) {
441300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            free (s_lastNITZTimeData);
441400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_lastNITZTimeData = NULL;
441500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
441600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
441700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeData = malloc(p.dataSize());
441800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_lastNITZTimeDataSize = p.dataSize();
441900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
442000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
442100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
442200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
442300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // FIXME The java code should handshake here to release wake lock
442400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
442500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
442600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        // Cancel the previous request
442700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        if (s_last_wake_timeout_info != NULL) {
442800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            s_last_wake_timeout_info->userParam = (void *)1;
442900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        }
443000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
443100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        s_last_wake_timeout_info
443200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project            = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
443300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project                                            &TIMEVAL_WAKE_TIMEOUT);
443400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
443500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
443600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    // Normal exit
443700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return;
443800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
443900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit:
444000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (shouldScheduleTimeout) {
444100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        releaseWakeLock();
444200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
444300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
444400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44457f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it
44467f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    when the callback occurs
444700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
444800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *
44497f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param,
44500d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn                                const struct timeval *relativeTime)
445100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{
445200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    struct timeval myRelativeTime;
445300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    UserCallbackInfo *p_info;
445400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
445500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
445600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44577f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville    p_info->p_callback = callback;
445800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    p_info->userParam = param;
44590d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn
446000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    if (relativeTime == NULL) {
446100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* treat null parameter as a 0 relative time */
446200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memset (&myRelativeTime, 0, sizeof(myRelativeTime));
446300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    } else {
446400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        /* FIXME I think event_add's tv param is really const anyway */
446500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
446600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
446700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
446800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
446900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
447000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    ril_timer_add(&(p_info->event), &myRelativeTime);
447100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
447200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    triggerEvLoop();
447300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    return p_info;
447400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
447500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
447600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
44770d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void
44787f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
4479f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville                                const struct timeval *relativeTime) {
44800d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn    internalRequestTimedCallback (callback, param, relativeTime);
448100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
448200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
448300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
4484f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) {
448500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(e) {
448600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SUCCESS: return "E_SUCCESS";
44872126ab2f05c1033fdca7542f38372dffd1468e1cRobert Greenwalt        case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE";
448800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
448900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
449000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
449100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
449200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
449300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_CANCELLED: return "E_CANCELLED";
449400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
449500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
449600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
4497f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
44987553447d44bb3f494b00d573215d81398f61cfcdJohn Wang        case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
44997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID
4500f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
4501f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
4502f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif
450300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown error>";
450400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
450500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
450600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
450700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
4508f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) {
450900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
451000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_OFF: return "RADIO_OFF";
451100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
451200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
451300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
451400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
4515f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
4516f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
4517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
4518f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
4519f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
45202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RADIO_STATE_ON:return"RADIO_ON";
452100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
452200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
452300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
452400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
452500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
4526f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) {
452700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(s) {
452800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ACTIVE : return "ACTIVE";
452900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_HOLDING: return "HOLDING";
453000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_DIALING: return "DIALING";
453100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_ALERTING: return "ALERTING";
453200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_INCOMING: return "INCOMING";
453300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_CALL_WAITING: return "WAITING";
453400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown state>";
453500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
453600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
453700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
453800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char *
4539f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) {
454000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*
454100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \
454200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
454300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
454400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
454500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
454600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \
454700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \
454800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
454900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
455000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/
455100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    switch(request) {
455200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
455300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
455400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
455500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
455600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
455700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
455800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
455900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
456000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
456100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DIAL: return "DIAL";
456200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
456300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP: return "HANGUP";
456400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
456500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
456600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
456700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
456800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_UDUB: return "UDUB";
456900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
457000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
4571c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
4572c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
457300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OPERATOR: return "OPERATOR";
457400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
457500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF: return "DTMF";
457600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
457700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
4578f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
457900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SIM_IO: return "SIM_IO";
458000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
458100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
458200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
458300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
458400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
458500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
458600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
458700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
458800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
458900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
459000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
459100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_ANSWER: return "ANSWER";
4592f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
459300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
459400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
459500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
459600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
459700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
459800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
459900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
460000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_START: return "DTMF_START";
460100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
460200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
460300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
460400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
460500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
460600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
460700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
460800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
460900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
4610f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
4611f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
461200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
461300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
461400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
4615f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
4616f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
461700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
461800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
461900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
462000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
462100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
462200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
462300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
462400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
4625c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
4626f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
4627f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
4628f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
4629f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
4630f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
4631f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
4632f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
4633f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
4634f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
4635f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
4636a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
4637a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
4638a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
4639a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
4640a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville        case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
464103c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla        case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
4642f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
4643f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
4644f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
4645f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
4646000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
4647000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
4648000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh        case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
464909a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh        case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
4650563fd7207da27322bf3f3587ef6000a944a617b7jsh        case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
4651c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
4652fa8d584ca7984bf7d73ff37c7c2bc1e0dfa5fb71Jake Hamby        case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
4653300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
4654300105d1487f5238940c18792b879793826b61f4Jake Hamby        case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
46552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
46568a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
46578a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
465875697538e485ea2981960dcd4878bfdd032731acSungmin Choi        case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
4659a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
4660a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
46612458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
46622458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
46632458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
46642458d8d1e56faae7b00511ceeab19730572c22d9Shishir Agrawal        case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
4665d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
4666d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
46672b77203b8c64e5bfa848303df7328d015069f8c7Amit Mahajan        case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
46682b77203b8c64e5bfa848303df7328d015069f8c7Amit Mahajan        case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
4669c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
4670c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
4671c796e22cf8402452b325ffbf9686a4c985a611e3Amit Mahajan        case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
467200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
467300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
4674c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
467500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
467600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
467700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
467800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
467900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
468000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
468100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
468200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
468300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
468400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
468500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
468600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
468700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
4688f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
468900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
4690f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
4691f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
4692f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
4693f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville        case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
46943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
46953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
46963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
46973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
46983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
4699af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh        case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
47005d621da539abea83309d77317ede40126f47d5f0John Wang        case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
47015909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang        case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
4702ee2745825fae9561c5f83fcf179bbbfa111e5224Wink Saville        case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
4703c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
4704c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville        case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
47055b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville        case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
47062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla        case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
47078a9e02161271505de274db0c3a88087056dd5dfcWink Saville        case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
4708a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
4709d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
4710d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
4711d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "HARDWARE_CONFIG_CHANGED";
4712c29360a92ad603fcec008c098cbbed47e3399dc8Wink Saville        case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
4713a65a16a2e81b11762fd9e4233e1a212effcfee82Naveen Kalla        case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
471400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project        default: return "<unknown request>";
471500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project    }
471600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}
471700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project
4718d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohenconst char *
4719d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan CohenrilSocketIdToString(RIL_SOCKET_ID socket_id)
4720d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen{
4721d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    switch(socket_id) {
4722d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_1:
4723d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return "RIL_SOCKET_1";
4724d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 2)
4725d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_2:
4726d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return "RIL_SOCKET_2";
4727d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4728d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 3)
4729d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_3:
4730d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return "RIL_SOCKET_3";
4731d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4732d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#if (SIM_COUNT >= 4)
4733d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        case RIL_SOCKET_4:
4734d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return "RIL_SOCKET_4";
4735d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen#endif
4736d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen        default:
4737d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen            return "not a valid RIL";
4738d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen    }
4739d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen}
4740d365219a1873e42d2ff669e13a9fe6ce6973bd51Etan Cohen
474100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */
4742