ril.cpp revision 18e4ab167c7d8549a360ab5ae1fadddcad8c0523
100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp 200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project 400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License"); 67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License. 77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at 800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** http://www.apache.org/licenses/LICENSE-2.0 1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software 127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS, 137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and 1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License. 1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC" 1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h> 2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h> 23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h> 2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h> 2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/record_stream.h> 2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h> 2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h> 2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h> 308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h> 3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h> 3418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville#include <sys/limits.h> 3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h> 3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h> 3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h> 3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h> 4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h> 4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h> 4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h> 4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h> 4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h> 4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h> 4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h> 4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h> 4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h> 5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h> 5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h> 5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android { 5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio" 5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild" 6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug" 6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface" 6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl" 6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java 6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024) 6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library 7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find 7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner. 7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1 7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a) (sizeof (a) / sizeof (a)[0]) 7600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#define MIN(a,b) ((a)<(b) ? (a) : (b)) 78f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */ 8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0 8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1 8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */ 8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1 8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro 8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096 8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log 9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0 9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest sprintf(printBuf, "(") 9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest sprintf(printBuf, "%s)", printBuf) 9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) \ 968eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("[%04d]> %s %s", token, requestToString(req), printBuf) 9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse sprintf(printBuf, "%s {", printBuf) 9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse sprintf(printBuf, "%s}", printBuf) 1008eb2a12cb7b525e74736300962a5f3848427275aWink Saville #define printResponse RLOGD("%s", printBuf) 10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf printBuf[0] = 0 10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar printBuf[strlen(printBuf)-1] = 0 10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) sprintf(printBuf, x) 10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest 10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest 10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) 10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse 11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse 11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printResponse 11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf 11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar 11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) 11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL}; 11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI); 12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int(*responseFunction) (Parcel &p, void *response, size_t responselen); 12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo; 12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int (*responseFunction) (Parcel &p, void *response, size_t responselen); 12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project WakeType wakeType; 12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo; 13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo { 1327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville int32_t token; //this is not RIL_Token 13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project CommandInfo *pCI; 13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct RequestInfo *p_next; 13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char cancelled; 13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char local; // responses to local commands do not go back to command process 13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo; 13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savilletypedef struct UserCallbackInfo { 14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_TimedCallback p_callback; 14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *userParam; 14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ril_event event; 14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct UserCallbackInfo *p_next; 14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo; 14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1460d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn 14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL}; 15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0; 15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch; 15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader; 15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0; 15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdListen = -1; 15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdCommand = -1; 15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1; 15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead; 16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite; 16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event; 16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event; 16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event; 16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event; 16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event; 16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0}; 17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER; 17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER; 17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER; 17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER; 17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER; 17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER; 17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_pendingRequests = NULL; 18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL; 18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL; 18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL; 18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL; 18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize; 18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 19100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project static char printBuf[PRINTBUF_SIZE]; 19200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 19300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 19500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI); 19700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI); 19800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI); 19900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI); 20000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI); 20100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI); 20200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI); 20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI); 20400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI); 2054f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI); 2062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI); 2072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI); 20800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI); 210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI); 211a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI); 212f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); 213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI); 21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen); 21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen); 21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen); 21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen); 21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen); 21900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen); 22000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen); 22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen); 222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen); 2234380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen); 22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen); 22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen); 226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen); 227a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen); 228a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen); 229f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen); 23000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen); 2313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen); 2323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen); 2333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen); 2343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen); 2353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen); 23645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen); 23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeVoiceRadioTechnology (RIL_RadioState radioState); 2392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeCdmaSubscriptionSource (RIL_RadioState radioState); 2402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState processRadioState(RIL_RadioState newRadioState); 2412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request); 24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno); 24400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState); 24500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState); 24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB 2487f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data, 24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen); 25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2527f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback 2530d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn (RIL_TimedCallback callback, void *param, 2540d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime); 25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */ 25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = { 25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h" 25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = { 26200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h" 26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and 2662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from 2672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla radio state message and store it. Every time there is a change in Radio State 2682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if voice radio tech changes and notify telephony 2692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint voiceRadioTech = -1; 2712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 2722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE 2732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription 2742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla source from radio state and store it. Every time there is a change in Radio State 2752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if subscription source changed and notify telephony 2762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint cdmaSubscriptionSource = -1; 2782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 2792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the 2802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla SIM/RUIM state from radio state and store it. Every time there is a change in Radio State, 2812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if SIM/RUIM status changed and notify telephony 2822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint simRuimStatus = -1; 28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char * 286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) { 28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char16_t *s16; 2897f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = p.readString16Inplace(&stringlen); 2917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return strndup16to8(s16, stringlen); 29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) { 29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char16_t *s16; 29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t s16_len; 29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = strdup8to16(s, &s16_len); 29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeString16(s16, s16_len); 30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s16); 30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) { 30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s != NULL) { 30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (s, 0, strlen(s)); 30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid nullParcelReleaseFunction (const uint8_t* data, size_t dataSize, 31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const size_t* objects, size_t objectsSize, 313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* cookie) { 31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // do nothing -- the data reference lives longer than the Parcel object 31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread 31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response 3207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process 32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) { 32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->local = 1; 33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = 0xffffffff; // token is not used in this context 33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3428eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("C[locl]> %s", requestToString(request)); 34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(request, data, len, pRI); 34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) { 35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t request; 35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t token; 35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setData((uint8_t *) buffer, buflen); 35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // status checked at end 36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&request); 36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&token); 36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 3658eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid request block"); 36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) { 3708eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("unsupported request code %d token %d", request, token); 37100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME this should perhaps return a response 37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = token; 37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* sLastDispatchedToken = token; */ 39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3927f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pRI->pCI->dispatchFunction(p, pRI); 39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 398f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) { 3998eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid command block for token %d request %s", 40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */ 4047f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 405f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) { 40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project clearPrintBuf; 40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI); 40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */ 41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 413f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) { 41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *string8 = NULL; 41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project string8 = strdupReadString(p); 42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, string8); 42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, string8, 42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(char *), pRI); 42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(string8); 43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(string8); 43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */ 44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 442f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) { 44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t countStrings; 44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **pStrings; 44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&countStrings); 44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (countStrings == 0) { 45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // just some non-null pointer 45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(sizeof(char *)); 45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (((int)countStrings) == -1) { 46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = NULL; 46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(char *) * countStrings; 4647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(datalen); 46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings[i] = strdupReadString(p); 46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, pStrings[i]); 47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI); 47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pStrings != NULL) { 47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (pStrings[i]); 48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pStrings[i]); 48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pStrings, 0, datalen); 48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 4907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */ 49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 499f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) { 50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t count; 50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *pInts; 50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&count); 50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || count == 0) { 50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(int) * count; 51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts = (int *)alloca(datalen); 51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < count ; i++) { 51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts[i] = (int)t; 52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, t); 52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5307f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts), 53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen, pRI); 53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pInts, 0, datalen); 53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5457f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs * 54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 54700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status 54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String pdu 54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 551f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) { 55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_WriteArgs args; 55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&args, 0, sizeof(args)); 55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.status = (int)t; 56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.pdu = strdupReadString(p); 56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || args.pdu == NULL) { 56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.smsc = strdupReadString(p); 56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status, 57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)args.pdu, (char*)args.smsc); 57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 5747f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI); 57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (args.pdu); 57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (args.pdu); 5827f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&args, 0, sizeof(args)); 58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5937f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial * 59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String address 59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t clir 59800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 600f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) { 60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dial; 60274fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info uusInfo; 6037bce082edcee07339ebb06a35970b4b218ab8288Wink Saville int32_t sizeOfDial; 60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 60574fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t uusPresent; 60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&dial, 0, sizeof(dial)); 60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.address = strdupReadString(p); 61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.clir = (int)t; 61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || dial.address == NULL) { 61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6193a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3 62074fa38884320698c1623764850e3131b9769dff0Wink Saville uusPresent = 0; 6217bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *); 62274fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 62374fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&uusPresent); 62474fa38884320698c1623764850e3131b9769dff0Wink Saville 62574fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 62674fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 62774fa38884320698c1623764850e3131b9769dff0Wink Saville } 62874fa38884320698c1623764850e3131b9769dff0Wink Saville 62974fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent == 0) { 63074fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = NULL; 63174fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 63274fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t len; 63374fa38884320698c1623764850e3131b9769dff0Wink Saville 63474fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 63574fa38884320698c1623764850e3131b9769dff0Wink Saville 63674fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 63774fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusType = (RIL_UUS_Type) t; 63874fa38884320698c1623764850e3131b9769dff0Wink Saville 63974fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 64074fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusDcs = (RIL_UUS_DCS) t; 64174fa38884320698c1623764850e3131b9769dff0Wink Saville 64274fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&len); 64374fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 64474fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 64574fa38884320698c1623764850e3131b9769dff0Wink Saville } 64674fa38884320698c1623764850e3131b9769dff0Wink Saville 64774fa38884320698c1623764850e3131b9769dff0Wink Saville // The java code writes -1 for null arrays 64874fa38884320698c1623764850e3131b9769dff0Wink Saville if (((int) len) == -1) { 64974fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = NULL; 65074fa38884320698c1623764850e3131b9769dff0Wink Saville len = 0; 65174fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 65274fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = (char*) p.readInplace(len); 65374fa38884320698c1623764850e3131b9769dff0Wink Saville } 65474fa38884320698c1623764850e3131b9769dff0Wink Saville 65574fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusLength = len; 65674fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = &uusInfo; 65774fa38884320698c1623764850e3131b9769dff0Wink Saville } 6587bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial); 65974fa38884320698c1623764850e3131b9769dff0Wink Saville } 66074fa38884320698c1623764850e3131b9769dff0Wink Saville 66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir); 66374fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent) { 66474fa38884320698c1623764850e3131b9769dff0Wink Saville appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf, 66574fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusType, dial.uusInfo->uusDcs, 66674fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusLength); 66774fa38884320698c1623764850e3131b9769dff0Wink Saville } 66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6717bce082edcee07339ebb06a35970b4b218ab8288Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI); 67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (dial.address); 67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (dial.address); 6787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 68074fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&dial, 0, sizeof(dial)); 68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 6917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO * 69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t command 69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t fileid 69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String path 69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t p1, p2, p3 6977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String data 6987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String pin2 699c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville * String aidPtr 70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 702f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) { 703c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville union RIL_SIM_IO { 704c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SIM_IO_v6 v6; 705c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SIM_IO_v5 v5; 706c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } simIO; 707c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville 70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 709c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int size; 71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&simIO, 0, sizeof(simIO)); 71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 7157f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 717c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.command = (int)t; 71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 720c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.fileid = (int)t; 72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 722c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.path = strdupReadString(p); 72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 725c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p1 = (int)t; 72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 728c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p2 = (int)t; 72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 731c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p3 = (int)t; 73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 733c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.data = strdupReadString(p); 734c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.pin2 = strdupReadString(p); 735c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.aidPtr = strdupReadString(p); 73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 738c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf, 739c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path, 740c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p1, simIO.v6.p2, simIO.v6.p3, 741c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)simIO.v6.data, (char*)simIO.v6.pin2, simIO.v6.aidPtr); 74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 7447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 749c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6); 750c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, size, pRI); 75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 753c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.path); 754c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.data); 755c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.pin2); 756c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.aidPtr); 75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 759c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.path); 760c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.data); 761c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.pin2); 762c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.aidPtr); 7637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&simIO, 0, sizeof(simIO)); 76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo * 77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status/action 77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t reason 77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t serviceCode 78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t toa 78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String number (0 length -> null) 78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t timeSeconds 78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 7847f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) { 78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo cff; 78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 78900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&cff, 0, sizeof(cff)); 79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7927f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status = (int)t; 7967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 79700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.reason = (int)t; 79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.serviceClass = (int)t; 80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.toa = (int)t; 80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = strdupReadString(p); 80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.timeSeconds = (int)t; 81000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // special case: number 0-length fields is null 81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (cff.number != NULL && strlen (cff.number) == 0) { 81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = NULL; 81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf, 82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status, cff.reason, cff.serviceClass, cff.toa, 82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)cff.number, cff.timeSeconds); 82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 82600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI); 82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(cff.number); 83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (cff.number); 83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&cff, 0, sizeof(cff)); 83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 84300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 84400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 84500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8477f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) { 84900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t len; 85000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 85100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const void *data; 85200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&len); 85400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 85600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code writes -1 for null arrays 86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (((int)len) == -1) { 86100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = NULL; 86200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len = 0; 8637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } 86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = p.readInplace(len); 86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 86800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sraw_size=%d", printBuf, len); 86900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI); 87300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 87500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 87800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8807f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 881f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSms(Parcel &p, RequestInfo *pRI) { 882f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Message rcsm; 883f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 884f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t ut; 885f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 886f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 887f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 8887f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 892f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uTeleserviceID = (int) t; 893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 894f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 895f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.bIsServicePresent = (uint8_t) ut; 896f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uServicecategory = (int) t; 899f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 903f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 904f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_of_digits= (uint8_t) ut; 914f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 916f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 918f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digits[digitCount] = (uint8_t) ut; 919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9217f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.odd = (uint8_t) ut; 926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.number_of_digits = (uint8_t) ut; 929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 9317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 9327f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut; 934f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uBearerDataLen = (int) t; 938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 9407f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 9417f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut, sizeof(ut)); 942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.aBearerData[digitCount] = (uint8_t) ut; 943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 950f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 9511b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ", 952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory, 9531b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type); 954f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 9557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 957f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI); 959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 964f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9717f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) { 973f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Ack rcsa; 974f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 975f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 977f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 979f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 980f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 981f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t; 982f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 984f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uSMSCauseCode = (int) t; 985f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 987f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 988f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 989f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 990f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 9911b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ", 9921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode); 993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 994f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 995f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 996f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 997f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI); 998f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 999f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1000f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 1001f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1002f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1003f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1004f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1005f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1006f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1007f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1008f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1009f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1010a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 1011a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) { 1012a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1014a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 1015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1016a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 1017a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1018a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1019a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1020f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 102196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel { 102296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_GSM_BroadcastSmsConfigInfo gsmBci[num]; 102396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num]; 1024f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 102596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel startRequest; 102696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel for (int i = 0 ; i < num ; i++ ) { 102796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBciPtrs[i] = &gsmBci[i]; 1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 102996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 103096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromServiceId = (int) t; 1031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 103296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 103396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].toServiceId = (int) t; 1034f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 103596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 103696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromCodeScheme = (int) t; 1037f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 103896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 103996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].toCodeScheme = (int) t; 1040a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 104196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 104296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].selected = (uint8_t) t; 1043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 104496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \ 104596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i, 104696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromServiceId, gsmBci[i].toServiceId, 104796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme, 104896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].selected); 104996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 105096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel closeRequest; 1051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 105296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel if (status != NO_ERROR) { 105396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel goto invalid; 105496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 105696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel s_callbacks.onRequest(pRI->pCI->requestNumber, 105796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBciPtrs, 105896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), 105996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel pRI); 1060f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 106296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo)); 106396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *)); 1064f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 106596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1066f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1071f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1072f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1073f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1074a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 1075f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) { 1076a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 1077f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 1079f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1080a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 1081a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1082a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1083a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1084a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 108596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel { 108696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num]; 108796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num]; 1088a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 108996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel startRequest; 109096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel for (int i = 0 ; i < num ; i++ ) { 109196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBciPtrs[i] = &cdmaBci[i]; 1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 109396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 109496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].service_category = (int) t; 1095f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 109696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 109796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].language = (int) t; 1098f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 109996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 110096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].selected = (uint8_t) t; 1101f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 110296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel appendPrintBuf("%s [%d: service_category=%d, language =%d, \ 110396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category, 110496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].language, cdmaBci[i].selected); 110596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 110696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel closeRequest; 1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 110896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel if (status != NO_ERROR) { 110996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel goto invalid; 111096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 111296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel s_callbacks.onRequest(pRI->pCI->requestNumber, 111396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBciPtrs, 111496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), 111596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel pRI); 1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 111896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo)); 111996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *)); 1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 112196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1130f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) { 1131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_WriteArgs rcsw; 1132f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 1133f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint32_t ut; 1134f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 1137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.status = t; 1142a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uTeleserviceID = (int) t; 1145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.bIsServicePresent = (uint8_t) uct; 1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1149f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1150f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uServicecategory = (int) t; 1151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 1154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1159f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 1160f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1161f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 1163f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1164f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1165f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_of_digits = (uint8_t) uct; 1166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) { 1168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct; 1170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1172a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1175a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.odd = (uint8_t) uct; 1177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct; 1180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) { 1182a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct; 1184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1186a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uBearerDataLen = (int) t; 1188f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1189f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) { 1190a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct, sizeof(uct)); 1191f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.aBearerData[digitCount] = (uint8_t) uct; 1192f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1193f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1194f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 1195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 1196f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1197f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1198f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 11991b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \ 12001b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.uServicecategory=%d, message.sAddress.digit_mode=%d, \ 12011b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_mode=%d, \ 12021b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_type=%d, ", 1203f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent, 12041b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode, 12051b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_mode, 12061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_type); 1207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 1208f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 1210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1211f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI); 1212f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1215f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1216f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1218f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1220f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1221f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1222f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1224f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 12254f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL. 12264f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support 12274f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of 12284f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request. 12294f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) { 12304f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters. 12314f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti const int numParamsRilV3 = 6; 12324f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 12334f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // The first bytes of the RIL parcel contain the request number and the 12344f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // serial number - see processCommandBuffer(). Copy them over too. 12354f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int pos = p.dataPosition(); 12364f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 12374f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int numParams = p.readInt32(); 12384f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti if (s_callbacks.version < 4 && numParams > numParamsRilV3) { 12394f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti Parcel p2; 12404f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.appendFrom(&p, 0, pos); 12414f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeInt32(numParamsRilV3); 12424f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti for(int i = 0; i < numParamsRilV3; i++) { 12434f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeString16(p.readString16()); 12444f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 12454f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.setDataPosition(pos); 12464f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p2, pRI); 12474f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } else { 124857ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti p.setDataPosition(pos); 12494f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p, pRI); 12504f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 12514f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti} 12524f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 12532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH. 12542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and 12552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid. 12562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) { 12572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState state = s_callbacks.onStateRequest(); 12582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) { 12602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0); 12612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 12622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // RILs that support RADIO_STATE_ON should support this request. 12642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (RADIO_STATE_ON == state) { 12652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla dispatchVoid(p, pRI); 12662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return; 12672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 12682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // For Older RILs, that do not support RADIO_STATE_ON, assume that they 12702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // will not support this new request either and decode Voice Radio Technology 12712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // from Radio State 12722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla voiceRadioTech = decodeVoiceRadioTechnology(state); 12732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (voiceRadioTech < 0) 12752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0); 12762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla else 12772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int)); 12782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 12792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:. 12812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and 12822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid. 12832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) { 12842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState state = s_callbacks.onStateRequest(); 12852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) { 12872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0); 12882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 12892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // RILs that support RADIO_STATE_ON should support this request. 12912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (RADIO_STATE_ON == state) { 12922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla dispatchVoid(p, pRI); 12932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return; 12942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 12952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 12962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // For Older RILs, that do not support RADIO_STATE_ON, assume that they 12972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // will not support this new request either and decode CDMA Subscription Source 12982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // from Radio State 12992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state); 13002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 13012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (cdmaSubscriptionSource < 0) 13022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0); 13032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla else 13042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int)); 13052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 13062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1308f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) { 13097f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville size_t writeOffset = 0; 131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const uint8_t *toWrite; 131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project toWrite = (const uint8_t *)buffer; 131300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (writeOffset < len) { 131500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ssize_t written; 131600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 131700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project written = write (fd, toWrite + writeOffset, 131800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len - writeOffset); 1319388849057a8cc91dbc3fff357d2df524ffec9a4dBanavathu, Srinivas Naik } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN))); 132000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 132100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (written >= 0) { 132200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeOffset += written; 132300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { // written < 0 13248eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("RIL Response: unexpected error on write errno:%d", errno); 132500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(fd); 132600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 132700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 132800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 132900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 133100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 133200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1334f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) { 133500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int fd = s_fdCommand; 133600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 133700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project uint32_t header; 133800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 134000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 134100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 134200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (dataSize > MAX_COMMAND_BYTES) { 13448eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL: packet larger than %u (%u)", 134500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project MAX_COMMAND_BYTES, (unsigned int )dataSize); 134600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 134800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 13497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 135000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_writeMutex); 135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project header = htonl(dataSize); 135300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = blockingWrite(fd, (void *)&header, sizeof(header)); 135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1357084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 135800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 135900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 136000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1361ee1fadc192a63724e416b05666844a62d1e75d38Kenny ret = blockingWrite(fd, data, dataSize); 136200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1364084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_writeMutex); 136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) { 137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printResponse; 137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return sendResponseRaw(p.data(), p.dataSize()); 137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/ 13807f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 13817f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int 1382f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) { 138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numInts; 138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 13868eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 138900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(int) != 0) { 13908eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(int)); 139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 139500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *p_int = (int *) response; 139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numInts = responselen / sizeof(int *); 139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numInts); 139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each int*/ 140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 140200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numInts ; i++) { 140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, p_int[i]); 140400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_int[i]); 140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 140800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 140900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 141000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 141100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s 14134380897c6cdc99486a061b819943e3b290ebcf09Wink Saville The parcel will begin with the version */ 14144380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) { 14154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(version); 14164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStrings(p, response, responselen); 14174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 14184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 141900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */ 1420f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) { 142100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numStrings; 14227f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 142300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 14248eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 142500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 142600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 142700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(char *) != 0) { 14288eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 142900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(char *)); 143000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 143100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 143200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 143400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (0); 143500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 143600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **p_cur = (char **) response; 143700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numStrings = responselen / sizeof(char *); 143900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numStrings); 144000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 144100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each string*/ 144200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numStrings ; i++) { 144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]); 144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur[i]); 144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 145000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 145100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 14557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted 145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen 145700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 1458f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) { 145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* one string only */ 146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, (char*)response); 146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, (const char *)response); 146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1469f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) { 147000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1475f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) { 147600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 147700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 14798eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 148300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_Call *) != 0) { 14848eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 148500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_Call *)); 148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 148900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_Call *); 149200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Call *p_cur = ((RIL_Call **) response)[i]; 149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each call info */ 149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->state); 149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMpty); 150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMT); 150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->als); 150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isVoice); 15041b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->isVoicePrivacy); 15051b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->number); 15061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->numberPresentation); 15071b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->name); 15081b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->namePresentation); 15093a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville // Remove when partners upgrade to version 3 151074fa38884320698c1623764850e3131b9769dff0Wink Saville if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) { 151174fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(0); /* UUS Information is absent */ 151274fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 151374fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info *uusInfo = p_cur->uusInfo; 151474fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(1); /* UUS Information is present */ 151574fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusType); 151674fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusDcs); 151774fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusLength); 151874fa38884320698c1623764850e3131b9769dff0Wink Saville p.write(uusInfo->uusData, uusInfo->uusLength); 151974fa38884320698c1623764850e3131b9769dff0Wink Saville } 15203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[id=%d,%s,toa=%d,", 15211b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, 15221b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->index, 15231b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville callStateToString(p_cur->state), 15243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->toa); 15253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,%s,als=%d,%s,%s,", 15263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 15271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMpty)?"conf":"norm", 15281b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMT)?"mt":"mo", 15291b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->als, 15301b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isVoice)?"voc":"nonvoc", 15313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (p_cur->isVoicePrivacy)?"evp":"noevp"); 15323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,cli=%d,name='%s',%d]", 15333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 15341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->number, 15351b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->numberPresentation, 15361b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->name, 15371b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->namePresentation); 153800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 153900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 154000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 154100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 154200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 154300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 154400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1545f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) { 154600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 15478eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 154800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 154900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 155000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 155100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SMS_Response) ) { 15528eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected %d", 155300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SMS_Response)); 155400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 155500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 155600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 155700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response; 155800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 155900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->messageRef); 156000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->ackPDU); 1561920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh p.writeInt32(p_cur->errorCode); 156200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 156300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 1564920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef, 1565920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh (char*)p_cur->ackPDU, p_cur->errorCode); 156600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 156700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 156800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 156900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 157000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1571c0114b325877907fcdf7a5baa24e54a752e7e58bWink Savillestatic int responseDataCallListV4(Parcel &p, void *response, size_t responselen) 157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 15748eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1578c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) { 15798eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 1580c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4)); 158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1584c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v4); 158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1587c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response; 158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 158900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int i; 159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (i = 0; i < num; i++) { 159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].cid); 159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].active); 159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].type); 1594c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville // apn is not used, so don't send. 159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].address); 1596c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf, 159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur[i].cid, 159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur[i].active==0)?"down":"up", 159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].type, 160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].address); 160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16084380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen) 16094380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 16104380897c6cdc99486a061b819943e3b290ebcf09Wink Saville // Write version 16114380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(s_callbacks.version); 16124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 16134380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 1614c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville return responseDataCallListV4(p, response, responselen); 16154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 16164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (response == NULL && responselen != 0) { 16178eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 16184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 16194380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 16204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1621c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) { 16228eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 1623c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6)); 16244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 16254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 16264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1627c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v6); 16284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(num); 16294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1630c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response; 16314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville startResponse; 16324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville int i; 16334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville for (i = 0; i < num; i++) { 16344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32((int)p_cur[i].status); 1635beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo p.writeInt32(p_cur[i].suggestedRetryTime); 16364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].cid); 16374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].active); 1638af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner writeStringToParcel(p, p_cur[i].type); 16394380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].ifname); 16404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].addresses); 16414380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].dnses); 1642c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur[i].gateways); 164356384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf, 16444380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].status, 1645beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo p_cur[i].suggestedRetryTime, 16464380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].cid, 16474380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (p_cur[i].active==0)?"down":"up", 164856384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla (char*)p_cur[i].type, 16494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].ifname, 16504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].addresses, 1651c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)p_cur[i].dnses, 1652c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)p_cur[i].gateways); 16534380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 16544380897c6cdc99486a061b819943e3b290ebcf09Wink Saville removeLastChar; 16554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville closeResponse; 16564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 16574380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 16584380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return 0; 16594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 16604380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 16614380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen) 16624380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 16634380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 16644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStringsWithVersion(s_callbacks.version, p, response, responselen); 16654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 16664380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseDataCallList(p, response, responselen); 16674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 16684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 16694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1670f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) { 167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 16728eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL with responselen != 0"); 167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code reads -1 size as null byte array 167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 16787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p.writeInt32(-1); 167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(responselen); 168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.write(response, responselen); 168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1688f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) { 168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 16908eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SIM_IO_Response) ) { 16958eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SIM_IO_Response)); 169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response; 170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw1); 170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw2); 170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->simResponse); 170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2, 170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->simResponse); 170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1714f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) { 171500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 17167f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 17188eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 171900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 172000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 172100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 172200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(RIL_CallForwardInfo *) != 0) { 17238eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 172400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(RIL_CallForwardInfo *)); 172500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 172600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 172700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 172800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 172900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_CallForwardInfo *); 173000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 173100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 173200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 173300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 173400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i]; 173500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 173600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->status); 173700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->reason); 173800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->serviceClass); 173900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 174000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 174100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->timeSeconds); 174200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf, 174300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->status==1)?"enable":"disable", 174400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->reason, p_cur->serviceClass, p_cur->toa, 174500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number, 174600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->timeSeconds); 174700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 174800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 174900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 17507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 175100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 175200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 175300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) { 175500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 17568eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 175700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 175800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 175900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof(RIL_SuppSvcNotification)) { 17618eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 176200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SuppSvcNotification)); 176300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 176400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 176500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response; 176700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->notificationType); 176800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->code); 176900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 177000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->type); 177100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 177200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 177400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf, 177500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->notificationType==0)?"mo":"mt", 177600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->code, p_cur->index, p_cur->type, 177700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number); 177800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 177900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 178000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 178100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 178200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) { 178400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 178500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 178600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 17878eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 178800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 178900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 179000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_NeighboringCell *) != 0) { 17928eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 179300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_NeighboringCell *)); 179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 179600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 17983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville /* number of records */ 179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_NeighboringCell *); 180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 180300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i]; 180400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 180500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->rssi); 180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur->cid); 180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf, 180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cid, p_cur->rssi); 181000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 181100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 181200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 181300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 181400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 181500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 181600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/** 18183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists. 18193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */ 1820a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p, 1821a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) { 18223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.isPresent); 18233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signalType); 18243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.alertPitch); 18253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signal); 18263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 18273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1828a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p, 1829a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 18303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville int num; 1831a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville char* string8 = NULL; 1832a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int buffer_lenght; 1833a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecord *infoRec; 18343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 18353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 18368eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 18373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 18383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1840a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (responselen != sizeof (RIL_CDMA_InformationRecords)) { 18418eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 1842a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *)); 18433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 18443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1846a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecords *p_cur = 1847a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_InformationRecords *) response; 1848a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); 18493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 18503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 1851a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 18523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1853a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++) { 1854a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec = &p_cur->infoRec[i]; 1855a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->name); 1856a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville switch (infoRec->name) { 18573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_DISPLAY_INFO_REC: 1858a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: 1859a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.display.alpha_len > 1860a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH) { 18618eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 1862a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1863a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.display.alpha_len, 1864a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH); 1865a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 18663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1867a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) 1868a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 1869a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) { 1870a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.display.alpha_buf[i]; 18713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18724380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.display.alpha_len] = '\0'; 1873a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1874a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1875a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 18763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 1877a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: 18783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: 18793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: 1880a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) { 18818eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 1882a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1883a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.number.len, 1884a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 1885a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 18863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1887a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.number.len + 1) 1888a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 1889a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.number.len; i++) { 1890a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.number.buf[i]; 1891a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 18924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.number.len] = '\0'; 1893a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1894a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1895a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 1896a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_type); 1897a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_plan); 1898a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.pi); 1899a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.si); 19003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 19013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_SIGNAL_INFO_REC: 1902a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.isPresent); 1903a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signalType); 1904a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.alertPitch); 1905a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signal); 1906a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1907a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%sisPresent=%X, signalType=%X, \ 1908a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville alertPitch=%X, signal=%X, ", 1909a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, (int)infoRec->rec.signal.isPresent, 1910a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signalType, 1911a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.alertPitch, 1912a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signal); 1913a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 19143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 19153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: 1916a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.redir.redirectingNumber.len > 1917a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH) { 19188eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 1919a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1920a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.redir.redirectingNumber.len, 1921a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 1922a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 1923a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1924a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber 1925a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville .len + 1) * sizeof(char) ); 1926a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; 1927a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i < infoRec->rec.redir.redirectingNumber.len; 1928a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i++) { 1929a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.redir.redirectingNumber.buf[i]; 19303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0'; 1932a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1933a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1934a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 1935a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type); 1936a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan); 1937a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.pi); 1938a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.si); 1939a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingReason); 19403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 19413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_LINE_CONTROL_INFO_REC: 1942a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded); 1943a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle); 1944a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse); 1945a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial); 1946a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1947a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%slineCtrlPolarityIncluded=%d, \ 1948a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlToggle=%d, lineCtrlReverse=%d, \ 1949a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlPowerDenial=%d, ", printBuf, 1950a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded, 1951a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlToggle, 1952a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlReverse, 1953a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial); 1954a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 19553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 19563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_CLIR_INFO_REC: 1957a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32((int)(infoRec->rec.clir.cause)); 19583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1959a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause); 1960a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 19613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 19623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: 1963a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.upLink); 1964a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.downLink); 1965a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1966a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf, 1967a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.upLink, 1968a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.downLink); 1969a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 19703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 1971a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_T53_RELEASE_INFO_REC: 1972a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // TODO(Moto): See David Krause, he has the answer:) 19738eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE"); 1974a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 1975a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville default: 19768eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Incorrect name value"); 1977a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 19783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1980a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 19813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1982a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return 0; 19833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 19843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1985a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p, 1986a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 1987a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (response == NULL && responselen != 0) { 19888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 19893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 19903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1992c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof (RIL_SignalStrength_v5)) { 1993c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SignalStrength_v6 *p_cur = ((RIL_SignalStrength_v6 *) response); 19943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.signalStrength); 19963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate); 19973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.dbm); 19983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.ecio); 19993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.dbm); 20003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.ecio); 20013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio); 2002c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof (RIL_SignalStrength_v6)) { 20039efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam /* 200418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville * Fixup LTE for backwards compatibility 20059efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam */ 200618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (s_callbacks.version <= 6) { 200718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // signalStrength: -1 -> 99 200818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.signalStrength == -1) { 200918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.signalStrength = 99; 201018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 201118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // rsrp: -1 -> INT_MAX all other negative value to positive. 201218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // So remap here 201318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.rsrp == -1) { 201418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrp = INT_MAX; 201518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } else if (p_cur->LTE_SignalStrength.rsrp < -1) { 201618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp; 201718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 201818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // rsrq: -1 -> INT_MAX 201918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.rsrq == -1) { 202018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrq = INT_MAX; 202118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 202218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // Not remapping rssnr is already using INT_MAX 20239efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam 202418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // cqi: -1 -> INT_MAX 202518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.cqi == -1) { 202618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.cqi = INT_MAX; 202718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 202818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 202918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(p_cur->LTE_SignalStrength.signalStrength); 2030c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rsrp); 2031c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rsrq); 2032c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rssnr); 2033c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.cqi); 2034c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } else { 203518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(99); 203618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 203718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 203818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 203918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 2040c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } 2041fdf825f9d0dc639787b8523638bb61874ed0b540johnwang 2042fdf825f9d0dc639787b8523638bb61874ed0b540johnwang startResponse; 2043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\ 2044c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville CDMA_SS.dbm=%d,CDMA_SSecio=%d,\ 2045c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\ 2046c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville EVDO_SS.signalNoiseRatio=%d,\ 2047c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\ 2048c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville LTE_SS.rssnr=%d,LTE_SS.cqi=%d]", 2049a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, 2050a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.signalStrength, 2051a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.bitErrorRate, 2052a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.dbm, 2053a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.ecio, 2054a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.dbm, 2055a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.ecio, 2056c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->EVDO_SignalStrength.signalNoiseRatio, 2057c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.signalStrength, 2058c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rsrp, 2059c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rsrq, 2060c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rssnr, 2061c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.cqi); 2062a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 2063a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 20643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 20658eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length"); 20663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20683d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 20703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 20713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) { 20733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if ((response == NULL) || (responselen == 0)) { 20743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseVoid(p, response, responselen); 20753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 20763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseCdmaSignalInfoRecord(p, response, responselen); 20773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 20793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) { 20813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL || responselen == 0) { 20828eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 20833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) { 20878eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n", 20883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord)); 20893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 20933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response); 20953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, *p_cur); 20963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\ 20983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signal=%d]", 20993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 21003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->isPresent, 21013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalType, 21023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->alertPitch, 21033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signal); 21043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 21053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 21063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 21073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 21083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2109a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response, 2110a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t responselen) { 21113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 21128eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 21133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 21143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 21153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2116c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) { 21178eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("Upgrade to ril version %d\n", RIL_VERSION); 21183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 21193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2120c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response); 21213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2122c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur->number); 21233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->numberPresentation); 2124c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur->name); 21253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, p_cur->signalInfoRecord); 21263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2127c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) { 2128c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->number_type); 2129c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->number_plan); 2130c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } else { 2131c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(0); 2132c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(0); 2133c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } 2134c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville 2135c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville startResponse; 21363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\ 21373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\ 2138c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville signal=%d,number_type=%d,number_plan=%d]", 21393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 21403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->number, 21413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->numberPresentation, 21423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->name, 21433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.isPresent, 21443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.signalType, 21453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.alertPitch, 2146c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->signalInfoRecord.signal, 2147c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->number_type, 2148c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->number_plan); 21493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 21503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 21513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 21523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 21533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 215445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen) { 215545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka if (response == NULL && responselen != 0) { 21568eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("responseSimRefresh: invalid response: NULL"); 215745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka return RIL_ERRNO_INVALID_RESPONSE; 215845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } 215945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 216045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka startResponse; 216145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka if (s_callbacks.version == 7) { 216245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response); 216345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur->result); 216445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur->ef_id); 216545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka writeStringToParcel(p, p_cur->aid); 216645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 216745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s", 216845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka printBuf, 216945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->result, 217045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->ef_id, 217145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->aid); 217245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } else { 217345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka int *p_cur = ((int *) response); 217445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur[0]); 217545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur[1]); 217645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka writeStringToParcel(p, NULL); 217745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 217845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka appendPrintBuf("%sresult=%d, ef_id=%d", 217945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka printBuf, 218045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur[0], 218145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur[1]); 218245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } 218345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka closeResponse; 218445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 218545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka return 0; 218645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka} 218745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 21883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() { 218900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 219000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!pthread_equal(pthread_self(), s_tid_dispatch)) { 219100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* trigger event loop to wakeup. No reason to do this, 219200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * if we're in the event loop thread */ 219300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 219400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = write (s_fdWakeupWrite, " ", 1); 219500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (ret < 0 && errno == EINTR); 219600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 219700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 219800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 21993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) { 220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_add(ev); 220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 220300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2204fd7293711394c422711ff07d15a357955ff2194fWink Savillestatic void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) { 2205fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(num_apps); 2206fd7293711394c422711ff07d15a357955ff2194fWink Saville startResponse; 2207fd7293711394c422711ff07d15a357955ff2194fWink Saville for (int i = 0; i < num_apps; i++) { 2208fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].app_type); 2209fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].app_state); 2210fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].perso_substate); 2211fd7293711394c422711ff07d15a357955ff2194fWink Saville writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr)); 2212fd7293711394c422711ff07d15a357955ff2194fWink Saville writeStringToParcel(p, (const char*) 2213fd7293711394c422711ff07d15a357955ff2194fWink Saville (appStatus[i].app_label_ptr)); 2214fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin1_replaced); 2215fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin1); 2216fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin2); 2217fd7293711394c422711ff07d15a357955ff2194fWink Saville appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\ 2218fd7293711394c422711ff07d15a357955ff2194fWink Saville aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],", 2219fd7293711394c422711ff07d15a357955ff2194fWink Saville printBuf, 2220fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_type, 2221fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_state, 2222fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].perso_substate, 2223fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].aid_ptr, 2224fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_label_ptr, 2225fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin1_replaced, 2226fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin1, 2227fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin2); 2228fd7293711394c422711ff07d15a357955ff2194fWink Saville } 2229fd7293711394c422711ff07d15a357955ff2194fWink Saville closeResponse; 2230fd7293711394c422711ff07d15a357955ff2194fWink Saville} 2231fd7293711394c422711ff07d15a357955ff2194fWink Saville 2232f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) { 2233f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int i; 2234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2235f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 22368eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 2237f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2238f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 22402c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville if (responselen == sizeof (RIL_CardStatus_v6)) { 2241fd7293711394c422711ff07d15a357955ff2194fWink Saville RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response); 2242fd7293711394c422711ff07d15a357955ff2194fWink Saville 2243fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->card_state); 2244fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->universal_pin_state); 2245fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->gsm_umts_subscription_app_index); 2246fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->cdma_subscription_app_index); 2247c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->ims_subscription_app_index); 2248fd7293711394c422711ff07d15a357955ff2194fWink Saville 2249fd7293711394c422711ff07d15a357955ff2194fWink Saville sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications); 22502c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville } else if (responselen == sizeof (RIL_CardStatus_v5)) { 2251fd7293711394c422711ff07d15a357955ff2194fWink Saville RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response); 2252fd7293711394c422711ff07d15a357955ff2194fWink Saville 2253fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->card_state); 2254fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->universal_pin_state); 2255fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->gsm_umts_subscription_app_index); 2256fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->cdma_subscription_app_index); 2257c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(-1); 2258f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2259fd7293711394c422711ff07d15a357955ff2194fWink Saville sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications); 22602c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville } else { 22618eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n"); 22622c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2263f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2264f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2265f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 22663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 2267f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2268a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2269a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *); 2270f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(num); 2271f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2272f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2273a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_GSM_BroadcastSmsConfigInfo **p_cur = 2274a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_GSM_BroadcastSmsConfigInfo **) response; 2275a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; i < num; i++) { 2276a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromServiceId); 2277a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toServiceId); 2278a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromCodeScheme); 2279a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toCodeScheme); 2280a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2281a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2282a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \ 2283a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", 2284a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId, 2285a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme, 2286a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2287a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 2288f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2289f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2290f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2291f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2293a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2294a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_BroadcastSmsConfigInfo **p_cur = 2295a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_BroadcastSmsConfigInfo **) response; 2296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2297a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *); 2298a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 2299f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2301a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++ ) { 2302a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->service_category); 2303a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->language); 2304a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2306a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \ 2307a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville selected =%d], ", 2308a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->service_category, p_cur[i]->language, 2309a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2310f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville } 2311a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 2312f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2315f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) { 2317f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int num; 2318f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitCount; 2319f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 2320f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 2321f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* dest; 2322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 23238eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("Inside responseCdmaSms"); 2324f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2325f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 23268eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 2327f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2328f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2330f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville if (responselen != sizeof(RIL_CDMA_SMS_Message)) { 23318eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 2332f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message)); 2333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2334f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response; 2337f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uTeleserviceID); 2338f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->bIsServicePresent),sizeof(uct)); 2339f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uServicecategory); 2340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.digit_mode); 2341f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_mode); 2342f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_type); 2343f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_plan); 2344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct)); 2345f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 2346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2347f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct)); 2348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2349f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sSubAddress.subaddressType); 2351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.odd),sizeof(uct)); 2352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct)); 2353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 2354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct)); 2356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 2359f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uBearerDataLen); 2360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2361f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct)); 2362f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2364f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2365f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 23661b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ", 2367f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory, 2368f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type); 2369f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2372f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2373f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 237400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 237500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select() 237600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the 237700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down 237800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 2379f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) { 238000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char buff[16]; 238100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 238200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23838eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGV("processWakeupCallback"); 238400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 238500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* empty our wakeup socket out */ 238600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 238700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = read(s_fdWakeupRead, &buff, sizeof(buff)); 23887f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } while (ret > 0 || (ret < 0 && errno == EINTR)); 238900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 239000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2391f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() { 239200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 239300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *p_cur; 239400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 239500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* mark pending requests as "cancelled" so we dont report responses */ 239600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 239700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 239800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 239900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 240000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur = s_pendingRequests; 240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 24027f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for (p_cur = s_pendingRequests 240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur != NULL 240400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur = p_cur->p_next 240500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cancelled = 1; 240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 240800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2413f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) { 241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *p_record; 241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t recordlen; 241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 241800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(fd == s_fdCommand); 242000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = (RecordStream *)param; 242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (;;) { 242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* loop until EAGAIN/EINTR, end of stream, or other error */ 242500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = record_stream_get_next(p_rs, &p_record, &recordlen); 242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 && p_record == NULL) { 242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* end-of-stream */ 242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 243000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret < 0) { 243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret == 0) { /* && p_record != NULL */ 243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandBuffer(p_record, recordlen); 243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) { 243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* fatal error or end-of-stream */ 243900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 24408eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("error on reading command socket errno:%d\n", errno); 244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 24428eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("EOS. Closing command socket."); 244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 24447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 244600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 244800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_del(&s_commands_event); 244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project record_stream_free(p_rs); 245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 245300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2460f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() { 24615b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville // Inform we are connected and the ril version 2462a9c18d17769ee475cf4fd5e76e18ddfa4070c7cdJake Hamby int rilVer = s_callbacks.version; 24635b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville RIL_onUnsolicitedResponse(RIL_UNSOL_RIL_CONNECTED, 24645b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville &rilVer, sizeof(rilVer)); 24655b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville 246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // implicit radio state changed 246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, 246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 246900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 247000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Send last NITZ time data, in case it was missed 247100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 247200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize); 247300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 247400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s_lastNITZTimeData); 247500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Get version string 247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_callbacks.getVersion != NULL) { 248000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *version; 248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project version = s_callbacks.getVersion(); 24828eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("RIL Daemon version: %s\n", version); 24837f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 248400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, version); 248500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 24868eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("RIL Daemon version: unavailable\n"); 248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, "unavailable"); 248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 249100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2492f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) { 249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int err; 249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int is_phone_socket; 249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 249800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 250000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ucred creds; 250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t szCreds = sizeof(creds); 250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 250400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct passwd *pwd = NULL; 250500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (s_fdCommand < 0); 250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (fd == s_fdListen); 25087f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen); 251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0 ) { 25128eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error on accept() errno:%d", errno); 251300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 2515f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 251700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* check the credential of the other side and only accept socket from 251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * phone process 25207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville */ 252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errno = 0; 252200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project is_phone_socket = 0; 2523f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds); 2525f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (err == 0 && szCreds > 0) { 2527f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville errno = 0; 2528f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville pwd = getpwuid(creds.uid); 2529f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (pwd != NULL) { 2530f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) { 2531f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville is_phone_socket = 1; 2532f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 25338eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RILD can't accept socket from process %s", pwd->pw_name); 2534f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2535f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 25368eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error on getpwuid() errno: %d", errno); 2537f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 25398eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("Error on getsockopt() errno: %d", errno); 254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ( !is_phone_socket ) { 25438eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RILD must accept socket from %s", PHONE_PROCESS); 25447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 254700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 254900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 255100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 255200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 255400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 255500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK); 255700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 25598eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("Error setting O_NONBLOCK errno:%d", errno); 256000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 256100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25628eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("libril: new connection"); 256300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 256400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES); 256500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25667f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_commands_event, s_fdCommand, 1, 256700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandsCallback, p_rs); 256800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 256900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_commands_event); 257000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onNewCommandConnect(); 257200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 257300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) { 257500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 257600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (args[i] != NULL) { 257700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args[i]); 257800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 257900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 258000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args); 258100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 258200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2583f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) { 258400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int acceptFD, option; 258500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 258600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 258700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int data; 258800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsigned int qxdm_data[6]; 258900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *deactData[1] = {"1"}; 259000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *actData[1]; 259100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dialData; 259200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int hangupData[1] = {1}; 259300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int number; 259400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **args; 259500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 259600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acceptFD = accept (fd, (sockaddr *) &peeraddr, &socklen); 259700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 259800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (acceptFD < 0) { 25998eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error accepting on debug port: %d\n", errno); 260000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 260100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 260200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 260300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) { 26048eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: number of Args: \n"); 260500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 260600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 260700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args = (char **) malloc(sizeof(char*) * number); 260800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 260900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 261000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int len; 261100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) { 26128eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: Len of Args: \n"); 261300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 261400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 261500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 261600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // +1 for null-term 261700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args[i] = (char *) malloc((sizeof(char) * len) + 1); 26187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville if (recv(acceptFD, args[i], sizeof(char) * len, 0) 26191b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville != (int)sizeof(char) * len) { 26208eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: Args[%d] \n", i); 262100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 262200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 262300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 262400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char * buf = args[i]; 262500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project buf[len] = 0; 262600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 262700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 262800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (atoi(args[0])) { 262900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 0: 26308eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Connection on debug port: issuing reset."); 263100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0); 263200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 263300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 1: 26348eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Connection on debug port: issuing radio power off."); 263500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 0; 263600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 263700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Close the socket 263800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 263900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 264000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 264100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 2: 26428eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: issuing unsolicited voice network change."); 2643c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, 264400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 264500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 264600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 3: 26478eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: QXDM log enable."); 2648d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[0] = 65536; // head.func_tag 2649d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[1] = 16; // head.len 2650d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 1; // mode: 1 for 'start logging' 2651d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[3] = 32; // log_file_size: 32megabytes 2652d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[4] = 0; // log_mask 2653d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; // log_max_fileindex 26547f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 265500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 265600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 265700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 4: 26588eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: QXDM log disable."); 265900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[0] = 65536; 266000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[1] = 16; 2661d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 0; // mode: 0 for 'stop logging' 266200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[3] = 32; 266300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 0; 2664d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; 266500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 266600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 266700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 266800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 5: 26698eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Radio On"); 267000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 1; 267100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 267200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sleep(2); 267300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Set network selection automatic. 267400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0); 267500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 267600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 6: 26778eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]); 267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project actData[0] = args[1]; 26797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData, 268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(actData)); 268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 7: 26838eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Deactivate Data Call"); 26847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData, 268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(deactData)); 268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 8: 26888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Dial Call"); 268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.clir = 0; 269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.address = args[1]; 269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData)); 269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 269300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 9: 26948eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Answer Call"); 269500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0); 269600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 269700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 10: 26988eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: End Call"); 26997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData, 270000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(hangupData)); 270100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 270200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 27038eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("Invalid request"); 270400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 270500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 270600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(number, args); 270700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(acceptFD); 270800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 270900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2711f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) { 271200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 271300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *)param; 271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->p_callback(p_info->userParam); 271700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME generalize this...there should be a cancel mechanism 272000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) { 272100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info = NULL; 272200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 272300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(p_info); 272500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 272600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void * 2729f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) { 273000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 273100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int filedes[2]; 273200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_init(); 273400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 273600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 1; 273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_broadcast(&s_startupCond); 273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pipe(filedes); 274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 27458eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error in pipe() errno:%d", errno); 274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupRead = filedes[0]; 275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupWrite = filedes[1]; 275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK); 275300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true, 275500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processWakeupCallback, NULL); 275600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_wakeupfd_event); 275800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Only returns on error 276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_loop(); 27618eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error in event_loop_base errno:%d", errno); 27625cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo // kill self to restart on error 27635cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo kill(0, SIGKILL); 276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 276600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 276700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27687f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 2769f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) { 277000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 277100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_t attr; 27727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 277300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* spin up eventLoop thread and wait for it to get started */ 277400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 0; 277500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 277600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 277700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_init (&attr); 27787f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 277900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL); 278000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (s_started == 0) { 278200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_wait(&s_startupCond, &s_startupMutex); 278300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 278400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 278600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 27888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to create dispatch thread errno:%d", errno); 278900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 279000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 279100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 279200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only. 279400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) { 279500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 279600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 279700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27987f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 2799f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) { 280000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 280100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int flags; 280200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 28034380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks == NULL) { 28048eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: RIL_RadioFunctions * null"); 280500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 280600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 28074380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version < RIL_VERSION_MIN) { 28088eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: version %d is to old, min version is %d", 28094380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION_MIN); 28104380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 28114380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 28124380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version > RIL_VERSION) { 28138eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: version %d is too new, max version is %d", 28144380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION); 28154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 28163a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville } 28178eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: RIL version %d", callbacks->version); 281800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled > 0) { 28208eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register has been called more than once. " 282100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project "Subsequent call ignored"); 282200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 282300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 282400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 282500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 282600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 282700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_registerCalled = 1; 282800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 282900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Little self-check 283000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2831f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) { 283200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(i == s_commands[i].requestNumber); 283300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 283400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2835f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) { 28367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville assert(i + RIL_UNSOL_RESPONSE_BASE 283700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project == s_unsolResponses[i].requestNumber); 283800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 283900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // New rild impl calls RIL_startEventLoop() first 284100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // old standalone impl wants it here. 284200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_started == 0) { 284400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_startEventLoop(); 284500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 284600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start listen socket 284800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0 28507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ret = socket_local_server (SOCKET_NAME_RIL, 285100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 285200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 285300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 28548eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Unable to bind socket errno:%d", errno); 285500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit (-1); 285600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 285700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = ret; 285800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 285900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 286000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = android_get_control_socket(SOCKET_NAME_RIL); 286100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdListen < 0) { 28628eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to get socket '" SOCKET_NAME_RIL "'"); 286300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 286500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdListen, 4); 286700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 286800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 28698eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to listen on control socket '%d': %s", 287000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen, strerror(errno)); 287100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 287200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 287300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 287400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 287500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 287600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* note: non-persistent so we can accept only one connection at a time */ 28777f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_listen_event, s_fdListen, false, 287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project listenCallback, NULL); 287900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_listen_event); 288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1 288300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start debug interface socket 288400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG); 288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdDebug < 0) { 28878eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno); 288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdDebug, 4); 289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 28948eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to listen on ril debug socket '%d': %s", 289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug, strerror(errno)); 289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_debug_event, s_fdDebug, true, 290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project debugCallback, NULL); 290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_debug_event); 290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 290600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 2908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) { 290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret = 0; 29107f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == NULL) { 291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_pendingRequestsMutex); 291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(RequestInfo **ppCur = &s_pendingRequests 29187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ; *ppCur != NULL 291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; ppCur = &((*ppCur)->p_next) 292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == *ppCur) { 292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = 1; 292300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *ppCur = (*ppCur)->p_next; 292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 292900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_pendingRequestsMutex); 293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 293300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 2936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) { 293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 293900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t errorOffset; 294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)t; 294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!checkAndDequeueRequestInfo(pRI)) { 29448eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("RIL_onRequestComplete: invalid RIL_Token"); 294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->local > 0) { 294900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Locally issued command...void only! 295000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // response does not go back up the command socket 29518eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber)); 295200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto done; 295400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[%04d]< %s", 295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 295800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->cancelled == 0) { 296000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_SOLICITED); 296300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (pRI->token); 296400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errorOffset = p.dataPosition(); 296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (e); 296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2968b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (response != NULL) { 2969b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang // there is a response payload, no matter success or not. 297000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pRI->pCI->responseFunction(p, response, responselen); 297100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 297200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* if an error occurred, rewind and mark it */ 297300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 297400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setDataPosition(errorOffset); 297500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (ret); 297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 2977b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang } 2978b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang 2979b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (e != RIL_E_SUCCESS) { 2980b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e)); 298100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 298200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 298300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 29848eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD ("RIL onRequestComplete: Command channel closed"); 298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponse(p); 298700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 298800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 298900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone: 299000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pRI); 299100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 299200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 299300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 299400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 2995f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() { 299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME); 299700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 299800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 3000f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() { 300100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project release_wake_lock(ANDROID_WAKE_LOCK_NAME); 300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 300400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout 300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 3008f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) { 300900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // We're using "param != NULL" as a cancellation mechanism 301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (param == NULL) { 30118eb2a12cb7b525e74736300962a5f3848427275aWink Saville //RLOGD("wakeTimeout: releasing wake lock"); 301200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 301300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 301400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 30158eb2a12cb7b525e74736300962a5f3848427275aWink Saville //RLOGD("wakeTimeout: releasing wake lock CANCELLED"); 301600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 301700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 301800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 30202bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeVoiceRadioTechnology (RIL_RadioState radioState) { 30212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 30222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 30232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 30242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 30252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return RADIO_TECH_UMTS; 30262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 30282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 30292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 30302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 30312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 30322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return RADIO_TECH_1xRTT; 30332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 30358eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState"); 30362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 30372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 30382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 30392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 30412bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeCdmaSubscriptionSource (RIL_RadioState radioState) { 30422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 30432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 30442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 30452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 30462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 30472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 30482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 30492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM; 30502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 30522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 30532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return CDMA_SUBSCRIPTION_SOURCE_NV; 30542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 30568eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState"); 30572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 30582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 30592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 30602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 30622bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeSimStatus (RIL_RadioState radioState) { 30632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 30642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 30652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 30662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 30672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 30682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 30692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 30702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 30712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 30722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 30732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return radioState; 30742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 30758eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeSimStatus: Invoked with incorrect RadioState"); 30762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 30772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 30782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 30792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic bool is3gpp2(int radioTech) { 30812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioTech) { 30822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_IS95A: 30832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_IS95B: 30842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_1xRTT: 30852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_0: 30862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_A: 30872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_B: 30882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EHRPD: 30892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return true; 30902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 30912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return false; 30922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 30932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 30942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 30952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* If RIL sends SIM states or RUIM states, store the voice radio 30962bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * technology and subscription source information so that they can be 30972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * returned when telephony framework requests them 30982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 30992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState 31002bc78d614e349574426d198c37e51ccb7455b5bbNaveen KallaprocessRadioState(RIL_RadioState newRadioState) { 31012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 31022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) { 31032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newVoiceRadioTech; 31042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newCdmaSubscriptionSource; 31052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newSimStatus; 31062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 31072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla /* This is old RIL. Decode Subscription source and Voice Radio Technology 31082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla from Radio State and send change notifications if there has been a change */ 31092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState); 31102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newVoiceRadioTech != voiceRadioTech) { 31112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla voiceRadioTech = newVoiceRadioTech; 31122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse (RIL_UNSOL_VOICE_RADIO_TECH_CHANGED, 31132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla &voiceRadioTech, sizeof(voiceRadioTech)); 31142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 31152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(is3gpp2(newVoiceRadioTech)) { 31162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState); 31172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newCdmaSubscriptionSource != cdmaSubscriptionSource) { 31182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla cdmaSubscriptionSource = newCdmaSubscriptionSource; 31192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse (RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED, 31202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource)); 31212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 31222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 31232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newSimStatus = decodeSimStatus(newRadioState); 31242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newSimStatus != simRuimStatus) { 31252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla simRuimStatus = newSimStatus; 31262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0); 31272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 31282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 31292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla /* Send RADIO_ON to telephony */ 31302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newRadioState = RADIO_STATE_ON; 31312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 31322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 31332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return newRadioState; 31342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 31352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 313600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" 313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data, 313800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen) 313900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 314000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int unsolResponseIndex; 314100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 314200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int64_t timeReceived = 0; 314300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project bool shouldScheduleTimeout = false; 31442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState newState; 314500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 314600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled == 0) { 314700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Ignore RIL_onUnsolicitedResponse before RIL_register 31488eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("RIL_onUnsolicitedResponse called before RIL_register"); 314900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 315000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 31517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 315200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE; 315300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 315400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ((unsolResponseIndex < 0) 315500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) { 31568eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("unsupported unsolicited response code %d", unsolResponse); 315700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 315800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 315900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 316000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Grab a wake lock if needed for this reponse, 316100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // as we exit we'll either release it immediately 316200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // or set a timer to release it later. 316300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (s_unsolResponses[unsolResponseIndex].wakeType) { 316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case WAKE_PARTIAL: 316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project grabPartialWakeLock(); 316600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = true; 316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 316800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case DONT_WAKE: 317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 317100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // No wake lock is grabed so don't set timeout 317200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = false; 317300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 317500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 317600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Mark the time this was received, doing this 317700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // after grabing the wakelock incase getting 317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the elapsedRealTime might cause us to goto 317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // sleep. 318000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project timeReceived = elapsedRealtime(); 318200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 318300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse)); 318500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 318700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_UNSOLICITED); 318900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (unsolResponse); 319000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 319100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = s_unsolResponses[unsolResponseIndex] 319200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project .responseFunction(p, data, datalen); 319300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 319400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Problem with the response. Don't continue; 319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto error_exit; 319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // some things get more payload 319900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(unsolResponse) { 320000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 32012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newState = processRadioState(s_callbacks.onStateRequest()); 32022bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla p.writeInt32(newState); 320300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s {%s}", printBuf, 320400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project radioStateToString(s_callbacks.onStateRequest())); 320500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 320600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 320700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 320800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: 320900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Store the time that this was received so the 321000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // handler of this message can account for 321100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the time it takes to arrive and process. In 321200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // particular the system has been known to sleep 321300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // before this message can be processed. 321400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt64(timeReceived); 321500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 321600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 321700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 321800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = sendResponse(p); 321900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 322000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 322100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Unfortunately, NITZ time is not poll/update like everything 322200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // else in the system. So, if the upstream client isn't connected, 322300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // keep a copy of the last NITZ response (with receive time noted 322400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // above) around so we can deliver it when it is connected 322500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 322600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 322700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (s_lastNITZTimeData); 322800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 322900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 323000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = malloc(p.dataSize()); 323200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeDataSize = p.dataSize(); 323300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(s_lastNITZTimeData, p.data(), p.dataSize()); 323400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 323500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT 323700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME The java code should handshake here to release wake lock 323800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 324000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Cancel the previous request 324100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL) { 324200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info->userParam = (void *)1; 324300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 324400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 324500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info 324600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project = internalRequestTimedCallback(wakeTimeoutCallback, NULL, 324700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project &TIMEVAL_WAKE_TIMEOUT); 324800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 324900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 325000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Normal exit 325100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 325200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 325300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit: 325400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 325500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 325600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 325700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 325800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it 32607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville when the callback occurs 326100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 326200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * 32637f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param, 32640d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime) 326500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 326600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct timeval myRelativeTime; 326700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 326800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 326900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo)); 327000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p_info->p_callback = callback; 327200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->userParam = param; 32730d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn 327400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (relativeTime == NULL) { 327500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* treat null parameter as a 0 relative time */ 327600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&myRelativeTime, 0, sizeof(myRelativeTime)); 327700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 327800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* FIXME I think event_add's tv param is really const anyway */ 327900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime)); 328000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 328100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info); 328300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_timer_add(&(p_info->event), &myRelativeTime); 328500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 328700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return p_info; 328800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 328900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 329000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32910d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void 32927f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param, 3293f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville const struct timeval *relativeTime) { 32940d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn internalRequestTimedCallback (callback, param, relativeTime); 329500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 329600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 329700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3298f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) { 329900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(e) { 330000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SUCCESS: return "E_SUCCESS"; 330100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE"; 330200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE"; 330300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT"; 330400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PIN2: return "E_SIM_PIN2"; 330500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PUK2: return "E_SIM_PUK2"; 330600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED"; 330700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_CANCELLED: return "E_CANCELLED"; 330800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL"; 330900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW"; 331000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY"; 3311f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT"; 33127553447d44bb3f494b00d573215d81398f61cfcdJohn Wang case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME"; 33137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID 3314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE"; 3315f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED"; 3316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 331700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown error>"; 331800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 331900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 332000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 332100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) { 332300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 332400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_OFF: return "RADIO_OFF"; 332500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE"; 332600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY"; 332700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT"; 332800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY"; 3329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY"; 3330f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY"; 3331f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT"; 3332f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY"; 3333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_READY:return"RADIO_NV_READY"; 33342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_ON:return"RADIO_ON"; 333500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 333600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 333700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 333800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 333900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) { 334100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 334200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ACTIVE : return "ACTIVE"; 334300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_HOLDING: return "HOLDING"; 334400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_DIALING: return "DIALING"; 334500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ALERTING: return "ALERTING"; 334600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_INCOMING: return "INCOMING"; 334700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_WAITING: return "WAITING"; 334800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 334900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 335000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 335100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 335200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) { 335400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* 335500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \ 335600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 335700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 335800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 335900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 336000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \ 336100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 336200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/' 336300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 336400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 336500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(request) { 336600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS"; 336700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN"; 336800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK"; 336900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2"; 337000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2"; 337100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN"; 337200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2"; 337300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION"; 337400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS"; 337500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DIAL: return "DIAL"; 337600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMSI: return "GET_IMSI"; 337700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP: return "HANGUP"; 337800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND"; 337900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 338000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 338100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CONFERENCE: return "CONFERENCE"; 338200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_UDUB: return "UDUB"; 338300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE"; 338400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; 3385c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE"; 3386c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE"; 338700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OPERATOR: return "OPERATOR"; 338800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER"; 338900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF: return "DTMF"; 339000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS: return "SEND_SMS"; 339100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE"; 3392f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL"; 339300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIM_IO: return "SIM_IO"; 339400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_USSD: return "SEND_USSD"; 339500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD"; 339600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CLIR: return "GET_CLIR"; 339700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CLIR: return "SET_CLIR"; 339800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS"; 339900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD"; 340000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING"; 340100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING"; 340200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE"; 340300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEI: return "GET_IMEI"; 340400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV"; 340500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ANSWER: return "ANSWER"; 3406f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL"; 340700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK"; 340800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK"; 340900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD"; 341000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE"; 341100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC"; 341200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL"; 341300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS "; 341400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_START: return "DTMF_START"; 341500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP"; 341600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION"; 341700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION"; 341800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE"; 341900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE"; 342000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS"; 342100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_MUTE: return "SET_MUTE"; 342200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_MUTE: return "GET_MUTE"; 342300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP"; 3424f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE"; 3425f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST"; 342600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO"; 342700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW"; 342800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS"; 3429f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE"; 3430f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE"; 343100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE"; 343200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE"; 343300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND"; 343400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE"; 343500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 343600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE"; 343700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER"; 343800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES"; 3439c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE"; 3440f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE"; 3441f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE"; 3442f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE"; 3443f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE"; 3444f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; 3445f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; 3446f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH"; 3447f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF"; 3448f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS"; 3449f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE"; 3450a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG"; 3451a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG"; 3452a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG"; 3453a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG"; 3454a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION"; 345503c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY"; 3456f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION"; 3457f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM"; 3458f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM"; 3459f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY"; 3460000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE"; 3461000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS"; 3462000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS"; 346309a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS"; 3464563fd7207da27322bf3f3587ef6000a944a617b7jsh case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING"; 3465c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE"; 3466fa8d584ca7984bf7d73ff37c7c2bc1e0dfa5fb71Jake Hamby case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION"; 3467300105d1487f5238940c18792b879793826b61f4Jake Hamby case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU"; 3468300105d1487f5238940c18792b879793826b61f4Jake Hamby case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS"; 34692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH"; 347000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 347100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 3472c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED"; 347300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS"; 347400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 347500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 347600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD"; 347700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)"; 347800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED"; 347900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH"; 348000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END"; 348100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND"; 348200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY"; 348300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP"; 348400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL"; 348500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH"; 3486f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED"; 348700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING"; 3488f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; 3489f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS"; 3490f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS"; 3491f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; 34923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED"; 34933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; 34943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING"; 34953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS"; 34963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC"; 3497af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW"; 34985d621da539abea83309d77317ede40126f47d5f0John Wang case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE"; 34995909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE"; 3500ee2745825fae9561c5f83fcf179bbbfa111e5224Wink Saville case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED"; 3501c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED"; 3502c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; 35035b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED"; 35042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED"; 350500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown request>"; 350600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 350700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 350800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 350900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */ 3510