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