100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp 200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project 400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License"); 67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License. 77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at 800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** http://www.apache.org/licenses/LICENSE-2.0 1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software 127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS, 137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and 1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License. 1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC" 1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h> 2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h> 23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h> 2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h> 2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 26622bf2bf79849127cbedd1f56631615bf58aaf78Dima Zavin#include <telephony/record_stream.h> 2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h> 2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h> 2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h> 308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h> 3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h> 3418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville#include <sys/limits.h> 3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h> 3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h> 3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h> 3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h> 4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h> 4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h> 4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h> 4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h> 4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h> 4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h> 4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h> 4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h> 4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h> 5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h> 5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h> 5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android { 5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio" 5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild" 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); 20775697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI); 2082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI); 20900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI); 211a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsSms(Parcel &p, RequestInfo *pRI); 212a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef); 213a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef); 214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI); 215a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI); 216f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); 217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI); 21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen); 21900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen); 22000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen); 22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen); 22200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen); 22300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen); 22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen); 22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen); 226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen); 2274380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen); 22800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen); 22900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen); 230f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen); 231a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen); 232a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen); 233f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen); 23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen); 2353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen); 2363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen); 2373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen); 2383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen); 2393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen); 24045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen); 2418a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen); 24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeVoiceRadioTechnology (RIL_RadioState radioState); 2442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int decodeCdmaSubscriptionSource (RIL_RadioState radioState); 2452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState processRadioState(RIL_RadioState newRadioState); 2462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request); 24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno); 24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState); 25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState); 25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB 2537f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data, 25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen); 25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2577f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback 2580d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn (RIL_TimedCallback callback, void *param, 2590d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime); 26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */ 26200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = { 26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h" 26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = { 26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h" 26800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and 2712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from 2722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla radio state message and store it. Every time there is a change in Radio State 2732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if voice radio tech changes and notify telephony 2742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint voiceRadioTech = -1; 2762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 2772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE 2782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription 2792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla source from radio state and store it. Every time there is a change in Radio State 2802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if subscription source changed and notify telephony 2812bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint cdmaSubscriptionSource = -1; 2832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 2842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the 2852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla SIM/RUIM state from radio state and store it. Every time there is a change in Radio State, 2862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla check to see if SIM/RUIM status changed and notify telephony 2872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 2882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallaint simRuimStatus = -1; 28900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char * 291f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) { 29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char16_t *s16; 2947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 29500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = p.readString16Inplace(&stringlen); 2967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return strndup16to8(s16, stringlen); 29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) { 30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char16_t *s16; 30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t s16_len; 30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = strdup8to16(s, &s16_len); 30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeString16(s16, s16_len); 30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s16); 30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 310f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) { 31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s != NULL) { 31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (s, 0, strlen(s)); 31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid nullParcelReleaseFunction (const uint8_t* data, size_t dataSize, 31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const size_t* objects, size_t objectsSize, 318f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* cookie) { 31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // do nothing -- the data reference lives longer than the Parcel object 32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3227f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 32300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread 32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response 3257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process 32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 328f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) { 32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->local = 1; 33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = 0xffffffff; // token is not used in this context 33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3478eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("C[locl]> %s", requestToString(request)); 34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(request, data, len, pRI); 35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) { 35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t request; 35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t token; 36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setData((uint8_t *) buffer, buflen); 36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // status checked at end 36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&request); 36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&token); 36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 3708eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid request block"); 37100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) { 3758eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("unsupported request code %d token %d", request, token); 37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME this should perhaps return a response 37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = token; 38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* sLastDispatchedToken = token; */ 39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pRI->pCI->dispatchFunction(p, pRI); 39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 403f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) { 4048eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid command block for token %d request %s", 40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */ 4097f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 410f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) { 41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project clearPrintBuf; 41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI); 41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */ 41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 418f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) { 41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *string8 = NULL; 42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project string8 = strdupReadString(p); 42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, string8); 42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, string8, 43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(char *), pRI); 43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(string8); 43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(string8); 43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */ 44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 447f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) { 44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t countStrings; 44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **pStrings; 45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&countStrings); 45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (countStrings == 0) { 46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // just some non-null pointer 46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(sizeof(char *)); 46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (((int)countStrings) == -1) { 46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = NULL; 46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(char *) * countStrings; 4697f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(datalen); 47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings[i] = strdupReadString(p); 47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, pStrings[i]); 47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI); 48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pStrings != NULL) { 48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (pStrings[i]); 48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pStrings[i]); 48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pStrings, 0, datalen); 49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 4957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */ 50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 504f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) { 50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t count; 50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *pInts; 50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&count); 51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || count == 0) { 51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(int) * count; 51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts = (int *)alloca(datalen); 51800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < count ; i++) { 52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 52400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts[i] = (int)t; 52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, t); 52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5357f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts), 53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen, pRI); 53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pInts, 0, datalen); 54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 54700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs * 55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status 55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String pdu 55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 55500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 556f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) { 55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_WriteArgs args; 55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&args, 0, sizeof(args)); 56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.status = (int)t; 56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.pdu = strdupReadString(p); 56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || args.pdu == NULL) { 56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.smsc = strdupReadString(p); 57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status, 57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)args.pdu, (char*)args.smsc); 57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 5797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI); 58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (args.pdu); 58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (args.pdu); 5877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&args, 0, sizeof(args)); 59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 59300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 59400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5987f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial * 60000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String address 60200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t clir 60300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 605f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) { 60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dial; 60774fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info uusInfo; 6087bce082edcee07339ebb06a35970b4b218ab8288Wink Saville int32_t sizeOfDial; 60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 61074fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t uusPresent; 61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&dial, 0, sizeof(dial)); 61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.address = strdupReadString(p); 61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.clir = (int)t; 61900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 62000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || dial.address == NULL) { 62100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 62200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 62300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6243a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3 62574fa38884320698c1623764850e3131b9769dff0Wink Saville uusPresent = 0; 6267bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *); 62774fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 62874fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&uusPresent); 62974fa38884320698c1623764850e3131b9769dff0Wink Saville 63074fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 63174fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 63274fa38884320698c1623764850e3131b9769dff0Wink Saville } 63374fa38884320698c1623764850e3131b9769dff0Wink Saville 63474fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent == 0) { 63574fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = NULL; 63674fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 63774fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t len; 63874fa38884320698c1623764850e3131b9769dff0Wink Saville 63974fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 64074fa38884320698c1623764850e3131b9769dff0Wink Saville 64174fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 64274fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusType = (RIL_UUS_Type) t; 64374fa38884320698c1623764850e3131b9769dff0Wink Saville 64474fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 64574fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusDcs = (RIL_UUS_DCS) t; 64674fa38884320698c1623764850e3131b9769dff0Wink Saville 64774fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&len); 64874fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 64974fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 65074fa38884320698c1623764850e3131b9769dff0Wink Saville } 65174fa38884320698c1623764850e3131b9769dff0Wink Saville 65274fa38884320698c1623764850e3131b9769dff0Wink Saville // The java code writes -1 for null arrays 65374fa38884320698c1623764850e3131b9769dff0Wink Saville if (((int) len) == -1) { 65474fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = NULL; 65574fa38884320698c1623764850e3131b9769dff0Wink Saville len = 0; 65674fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 65774fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = (char*) p.readInplace(len); 65874fa38884320698c1623764850e3131b9769dff0Wink Saville } 65974fa38884320698c1623764850e3131b9769dff0Wink Saville 66074fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusLength = len; 66174fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = &uusInfo; 66274fa38884320698c1623764850e3131b9769dff0Wink Saville } 6637bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial); 66474fa38884320698c1623764850e3131b9769dff0Wink Saville } 66574fa38884320698c1623764850e3131b9769dff0Wink Saville 66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir); 66874fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent) { 66974fa38884320698c1623764850e3131b9769dff0Wink Saville appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf, 67074fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusType, dial.uusInfo->uusDcs, 67174fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusLength); 67274fa38884320698c1623764850e3131b9769dff0Wink Saville } 67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6767bce082edcee07339ebb06a35970b4b218ab8288Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI); 67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (dial.address); 68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (dial.address); 6837f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 68574fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&dial, 0, sizeof(dial)); 68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 6967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO * 69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t command 69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t fileid 70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String path 70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t p1, p2, p3 7027f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String data 7037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String pin2 704c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville * String aidPtr 70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 707f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) { 708c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville union RIL_SIM_IO { 709c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SIM_IO_v6 v6; 710c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SIM_IO_v5 v5; 711c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } simIO; 712c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville 71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 714c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int size; 71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&simIO, 0, sizeof(simIO)); 71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7197f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 7207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 722c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.command = (int)t; 72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 725c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.fileid = (int)t; 72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 727c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.path = strdupReadString(p); 72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 730c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p1 = (int)t; 73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 733c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p2 = (int)t; 73400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 736c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p3 = (int)t; 73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 738c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.data = strdupReadString(p); 739c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.pin2 = strdupReadString(p); 740c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.aidPtr = strdupReadString(p); 74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 743c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf, 744c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path, 745c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville simIO.v6.p1, simIO.v6.p2, simIO.v6.p3, 746c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)simIO.v6.data, (char*)simIO.v6.pin2, simIO.v6.aidPtr); 74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 7497f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 75300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 754c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6); 755c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, size, pRI); 75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 758c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.path); 759c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.data); 760c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.pin2); 761c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville memsetString (simIO.v6.aidPtr); 76200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 76300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 764c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.path); 765c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.data); 766c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.pin2); 767c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville free (simIO.v6.aidPtr); 7687f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&simIO, 0, sizeof(simIO)); 77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo * 78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status/action 78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t reason 78400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t serviceCode 78500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t toa 78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String number (0 length -> null) 78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t timeSeconds 78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 7897f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 790f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) { 79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo cff; 79200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&cff, 0, sizeof(cff)); 79600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status = (int)t; 8017f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.reason = (int)t; 80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.serviceClass = (int)t; 80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.toa = (int)t; 81000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = strdupReadString(p); 81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.timeSeconds = (int)t; 81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // special case: number 0-length fields is null 82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (cff.number != NULL && strlen (cff.number) == 0) { 82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = NULL; 82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf, 82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status, cff.reason, cff.serviceClass, cff.toa, 82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)cff.number, cff.timeSeconds); 83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI); 83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(cff.number); 83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (cff.number); 84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&cff, 0, sizeof(cff)); 84300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 84400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 84600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 84700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 84800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 84900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 85000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8527f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 853f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) { 85400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t len; 85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 85600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const void *data; 85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&len); 85900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 86100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 86200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 86300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code writes -1 for null arrays 86500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (((int)len) == -1) { 86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = NULL; 86700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len = 0; 8687f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } 86900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = p.readInplace(len); 87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 87300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sraw_size=%d", printBuf, len); 87400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 87500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI); 87800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 88000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 88100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 88200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 88300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 88400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 885a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic status_t 886a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowaconstructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) { 887f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 888f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t ut; 889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 8927f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 894f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 895f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 896f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uTeleserviceID = (int) t; 897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 899f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.bIsServicePresent = (uint8_t) ut; 900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uServicecategory = (int) t; 903f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 904f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 914f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 916f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_of_digits= (uint8_t) ut; 918f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 921f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digits[digitCount] = (uint8_t) ut; 923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 924f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9287f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.odd = (uint8_t) ut; 930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 932f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.number_of_digits = (uint8_t) ut; 933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 934f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 9357f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 9367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut; 938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9407f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 941f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uBearerDataLen = (int) t; 942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 9447f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 9457f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut, sizeof(ut)); 946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.aBearerData[digitCount] = (uint8_t) ut; 947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 950a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return status; 951f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 953f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 954f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 9551b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ", 956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory, 9571b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type); 958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 9597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 962a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return status; 963a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa} 964a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 965a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void 966a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchCdmaSms(Parcel &p, RequestInfo *pRI) { 967a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa RIL_CDMA_SMS_Message rcsm; 968a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 969a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGD("dispatchCdmaSms"); 970a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) { 971a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 972a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 973a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 974f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI); 975f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 977f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 979f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 980f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 981f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 982f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 984f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 985f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9877f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 988a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) { 989a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa RIL_IMS_SMS_Message rism; 990a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa RIL_CDMA_SMS_Message rcsm; 991a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 992a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef); 993a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 994a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) { 995a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 996a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 997a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(&rism, 0, sizeof(rism)); 998a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.tech = RADIO_TECH_3GPP2; 999a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.retry = retry; 1000a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.messageRef = messageRef; 1001a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.message.cdmaMessage = &rcsm; 1002a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1003a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa s_callbacks.onRequest(pRI->pCI->requestNumber, &rism, 1004a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t) 1005a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa +sizeof(rcsm),pRI); 1006a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1007a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED 1008a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(&rcsm, 0, sizeof(rcsm)); 1009a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(&rism, 0, sizeof(rism)); 1010a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif 1011a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1012a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1013a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1014a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid: 1015a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa invalidCommandBlock(pRI); 1016a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1017a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa} 1018a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1019a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void 1020a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) { 1021a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa RIL_IMS_SMS_Message rism; 1022a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa int32_t countStrings; 1023a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa status_t status; 1024a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa size_t datalen; 1025a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa char **pStrings; 1026a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef); 1027a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1028a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa status = p.readInt32 (&countStrings); 1029a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1030a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (status != NO_ERROR) { 1031a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 1032a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1033a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1034a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(&rism, 0, sizeof(rism)); 1035a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.tech = RADIO_TECH_3GPP; 1036a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.retry = retry; 1037a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.messageRef = messageRef; 1038a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1039a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa startRequest; 1040a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa appendPrintBuf("%sformat=%d,", printBuf, rism.format); 1041a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (countStrings == 0) { 1042a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa // just some non-null pointer 1043a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa pStrings = (char **)alloca(sizeof(char *)); 1044a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa datalen = 0; 1045a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } else if (((int)countStrings) == -1) { 1046a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa pStrings = NULL; 1047a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa datalen = 0; 1048a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } else { 1049a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa datalen = sizeof(char *) * countStrings; 1050a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1051a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa pStrings = (char **)alloca(datalen); 1052a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1053a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa for (int i = 0 ; i < countStrings ; i++) { 1054a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa pStrings[i] = strdupReadString(p); 1055a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa appendPrintBuf("%s%s,", printBuf, pStrings[i]); 1056a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1057a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1058a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa removeLastChar; 1059a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa closeRequest; 1060a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa printRequest(pRI->token, pRI->pCI->requestNumber); 1061a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1062a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa rism.message.gsmMessage = pStrings; 1063a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa s_callbacks.onRequest(pRI->pCI->requestNumber, &rism, 1064a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t) 1065a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa +datalen, pRI); 1066a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1067a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (pStrings != NULL) { 1068a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa for (int i = 0 ; i < countStrings ; i++) { 1069a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED 1070a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memsetString (pStrings[i]); 1071a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif 1072a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa free(pStrings[i]); 1073a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1074a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1075a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED 1076a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(pStrings, 0, datalen); 1077a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif 1078a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1079a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1080a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#ifdef MEMSET_FREED 1081a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa memset(&rism, 0, sizeof(rism)); 1082a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa#endif 1083a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1084a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid: 1085a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGE("dispatchImsGsmSms invalid block"); 1086a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa invalidCommandBlock(pRI); 1087a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1088a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa} 1089a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1090a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void 1091a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya RajkhowadispatchImsSms(Parcel &p, RequestInfo *pRI) { 1092a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa int32_t t; 1093a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa status_t status = p.readInt32(&t); 1094a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa RIL_RadioTechnologyFamily format; 1095a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa uint8_t retry; 1096a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa int32_t messageRef; 1097a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1098a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGD("dispatchImsSms"); 1099a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (status != NO_ERROR) { 1100a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 1101a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1102a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa format = (RIL_RadioTechnologyFamily) t; 1103a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1104a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa // read retry field 1105a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa status = p.read(&retry,sizeof(retry)); 1106a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (status != NO_ERROR) { 1107a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 1108a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1109a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa // read messageRef field 1110a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa status = p.read(&messageRef,sizeof(messageRef)); 1111a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (status != NO_ERROR) { 1112a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa goto invalid; 1113a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1114a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1115a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa if (RADIO_TECH_3GPP == format) { 1116a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa dispatchImsGsmSms(p, pRI, retry, messageRef); 1117a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } else if (RADIO_TECH_3GPP2 == format) { 1118a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa dispatchImsCdmaSms(p, pRI, retry, messageRef); 1119a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } else { 1120a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa ALOGE("requestImsSendSMS invalid format value =%d", format); 1121a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa } 1122a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1123a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1124a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1125a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowainvalid: 1126a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa invalidCommandBlock(pRI); 1127a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa return; 1128a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa} 1129a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa 1130a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowastatic void 1131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) { 1132f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Ack rcsa; 1133f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 1134f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t; 1141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uSMSCauseCode = (int) t; 1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 1147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1149f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 11501b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ", 11511b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode); 1152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI); 1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1159f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 1160f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1161f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1163f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1164f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1165f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1169a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 1170a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) { 1171a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 1172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1173a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1175a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 1176a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1177a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1178a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 118096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel { 118196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_GSM_BroadcastSmsConfigInfo gsmBci[num]; 118296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num]; 1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 118496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel startRequest; 118596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel for (int i = 0 ; i < num ; i++ ) { 118696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBciPtrs[i] = &gsmBci[i]; 1187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 118896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 118996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromServiceId = (int) t; 1190f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 119196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 119296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].toServiceId = (int) t; 1193f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 119496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 119596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromCodeScheme = (int) t; 1196f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 119796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 119896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].toCodeScheme = (int) t; 1199a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 120096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 120196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].selected = (uint8_t) t; 1202a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 120396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \ 120496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i, 120596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromServiceId, gsmBci[i].toServiceId, 120696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme, 120796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBci[i].selected); 120896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 120996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel closeRequest; 1210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 121196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel if (status != NO_ERROR) { 121296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel goto invalid; 121396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1214f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 121596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel s_callbacks.onRequest(pRI->pCI->requestNumber, 121696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel gsmBciPtrs, 121796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), 121896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel pRI); 1219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1220f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 122196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo)); 122296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *)); 1223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 122496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1225f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1227f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1228f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1229f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1230f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1231f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1232f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1233a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 1234f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) { 1235a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 1236f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1237a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 1238f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1239a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 1240a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1241a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1242a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1243a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 124496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel { 124596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num]; 124696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num]; 1247a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 124896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel startRequest; 124996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel for (int i = 0 ; i < num ; i++ ) { 125096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBciPtrs[i] = &cdmaBci[i]; 1251f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 125296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 125396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].service_category = (int) t; 1254f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 125596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 125696dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].language = (int) t; 1257f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 125896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel status = p.readInt32(&t); 125996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].selected = (uint8_t) t; 1260f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 126196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel appendPrintBuf("%s [%d: service_category=%d, language =%d, \ 126296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category, 126396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBci[i].language, cdmaBci[i].selected); 126496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 126596dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel closeRequest; 1266f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 126796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel if (status != NO_ERROR) { 126896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel goto invalid; 126996dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1270f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 127196dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel s_callbacks.onRequest(pRI->pCI->requestNumber, 127296dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel cdmaBciPtrs, 127396dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), 127496dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel pRI); 1275f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1276f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 127796dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo)); 127896dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *)); 1279f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 128096dcdbcfe5111346f1a1f4542a8533a0a6611c01Kevin Schoedel } 1281f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1282f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1283f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1284f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1285f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1288f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1289f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) { 1290f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_WriteArgs rcsw; 1291f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 1292f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint32_t ut; 1293f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 1294f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1295f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 1296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1297f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1298f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1299f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1300f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.status = t; 1301a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1302f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1303f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uTeleserviceID = (int) t; 1304f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1305f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1306f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.bIsServicePresent = (uint8_t) uct; 1307f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1308f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1309f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uServicecategory = (int) t; 1310f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1311f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1312f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 1313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1314f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1315f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 1316f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1317f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1318f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 1319f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1320f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1321f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 1322f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1324f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_of_digits = (uint8_t) uct; 1325f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1326f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) { 1327f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1328f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct; 1329f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1330f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1331a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1332f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 1333f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1334a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.odd = (uint8_t) uct; 1336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1337f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1338f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct; 1339f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) { 1341a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1342f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct; 1343f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1345a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uBearerDataLen = (int) t; 1347f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) { 1349a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct, sizeof(uct)); 1350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.aBearerData[digitCount] = (uint8_t) uct; 1351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 1354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 1355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 13581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \ 13591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.uServicecategory=%d, message.sAddress.digit_mode=%d, \ 13601b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_mode=%d, \ 13611b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_type=%d, ", 1362f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent, 13631b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode, 13641b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_mode, 13651b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_type); 1366f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 1367f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1368f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 1369f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1370f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI); 1371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1372f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1373f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1375f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1376f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1377f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1378f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1379f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1380f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1381f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1382f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1383f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 13844f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL. 13854f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support 13864f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of 13874f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request. 13884f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) { 13894f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters. 13904f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti const int numParamsRilV3 = 6; 13914f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 13924f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // The first bytes of the RIL parcel contain the request number and the 13934f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // serial number - see processCommandBuffer(). Copy them over too. 13944f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int pos = p.dataPosition(); 13954f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 13964f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int numParams = p.readInt32(); 13974f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti if (s_callbacks.version < 4 && numParams > numParamsRilV3) { 13984f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti Parcel p2; 13994f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.appendFrom(&p, 0, pos); 14004f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeInt32(numParamsRilV3); 14014f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti for(int i = 0; i < numParamsRilV3; i++) { 14024f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeString16(p.readString16()); 14034f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 14044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.setDataPosition(pos); 14054f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p2, pRI); 14064f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } else { 140757ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti p.setDataPosition(pos); 14084f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p, pRI); 14094f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 14104f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti} 14114f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 14122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH. 14132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and 14142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid. 14152bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) { 14162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState state = s_callbacks.onStateRequest(); 14172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) { 14192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0); 14202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 14212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // RILs that support RADIO_STATE_ON should support this request. 14232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (RADIO_STATE_ON == state) { 14242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla dispatchVoid(p, pRI); 14252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return; 14262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 14272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // For Older RILs, that do not support RADIO_STATE_ON, assume that they 14292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // will not support this new request either and decode Voice Radio Technology 14302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // from Radio State 14312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla voiceRadioTech = decodeVoiceRadioTechnology(state); 14322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (voiceRadioTech < 0) 14342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0); 14352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla else 14362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int)); 14372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 14382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:. 14402bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// When all RILs handle this request, this function can be removed and 14412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla// the request can be sent directly to the RIL using dispatchVoid. 14422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) { 14432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState state = s_callbacks.onStateRequest(); 14442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) { 14462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0); 14472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 14482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // RILs that support RADIO_STATE_ON should support this request. 14502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (RADIO_STATE_ON == state) { 14512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla dispatchVoid(p, pRI); 14522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return; 14532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 14542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // For Older RILs, that do not support RADIO_STATE_ON, assume that they 14562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // will not support this new request either and decode CDMA Subscription Source 14572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla // from Radio State 14582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state); 14592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 14602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if (cdmaSubscriptionSource < 0) 14612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0); 14622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla else 14632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int)); 14642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 14652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 146675697538e485ea2981960dcd4878bfdd032731acSungmin Choistatic void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI) 146775697538e485ea2981960dcd4878bfdd032731acSungmin Choi{ 146875697538e485ea2981960dcd4878bfdd032731acSungmin Choi RIL_InitialAttachApn pf; 146975697538e485ea2981960dcd4878bfdd032731acSungmin Choi int32_t t; 147075697538e485ea2981960dcd4878bfdd032731acSungmin Choi status_t status; 147175697538e485ea2981960dcd4878bfdd032731acSungmin Choi 147275697538e485ea2981960dcd4878bfdd032731acSungmin Choi memset(&pf, 0, sizeof(pf)); 147375697538e485ea2981960dcd4878bfdd032731acSungmin Choi 147475697538e485ea2981960dcd4878bfdd032731acSungmin Choi pf.apn = strdupReadString(p); 147575697538e485ea2981960dcd4878bfdd032731acSungmin Choi pf.protocol = strdupReadString(p); 147675697538e485ea2981960dcd4878bfdd032731acSungmin Choi 147775697538e485ea2981960dcd4878bfdd032731acSungmin Choi status = p.readInt32(&t); 147875697538e485ea2981960dcd4878bfdd032731acSungmin Choi pf.authtype = (int) t; 147975697538e485ea2981960dcd4878bfdd032731acSungmin Choi 148075697538e485ea2981960dcd4878bfdd032731acSungmin Choi pf.username = strdupReadString(p); 148175697538e485ea2981960dcd4878bfdd032731acSungmin Choi pf.password = strdupReadString(p); 148275697538e485ea2981960dcd4878bfdd032731acSungmin Choi 148375697538e485ea2981960dcd4878bfdd032731acSungmin Choi startRequest; 148475697538e485ea2981960dcd4878bfdd032731acSungmin Choi appendPrintBuf("%sapn=%s, protocol=%s, auth_type=%d, username=%s, password=%s", 148575697538e485ea2981960dcd4878bfdd032731acSungmin Choi printBuf, pf.apn, pf.protocol, pf.auth_type, pf.username, pf.password); 148675697538e485ea2981960dcd4878bfdd032731acSungmin Choi closeRequest; 148775697538e485ea2981960dcd4878bfdd032731acSungmin Choi printRequest(pRI->token, pRI->pCI->requestNumber); 148875697538e485ea2981960dcd4878bfdd032731acSungmin Choi 148975697538e485ea2981960dcd4878bfdd032731acSungmin Choi if (status != NO_ERROR) { 149075697538e485ea2981960dcd4878bfdd032731acSungmin Choi goto invalid; 149175697538e485ea2981960dcd4878bfdd032731acSungmin Choi } 149275697538e485ea2981960dcd4878bfdd032731acSungmin Choi s_callbacks.onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI); 149375697538e485ea2981960dcd4878bfdd032731acSungmin Choi 149475697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED 149575697538e485ea2981960dcd4878bfdd032731acSungmin Choi memsetString(pf.apn); 149675697538e485ea2981960dcd4878bfdd032731acSungmin Choi memsetString(pf.protocol); 149775697538e485ea2981960dcd4878bfdd032731acSungmin Choi memsetString(pf.username); 149875697538e485ea2981960dcd4878bfdd032731acSungmin Choi memsetString(pf.password); 149975697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif 150075697538e485ea2981960dcd4878bfdd032731acSungmin Choi 150175697538e485ea2981960dcd4878bfdd032731acSungmin Choi free(pf.apn); 150275697538e485ea2981960dcd4878bfdd032731acSungmin Choi free(pf.protocol); 150375697538e485ea2981960dcd4878bfdd032731acSungmin Choi free(pf.username); 150475697538e485ea2981960dcd4878bfdd032731acSungmin Choi free(pf.password); 150575697538e485ea2981960dcd4878bfdd032731acSungmin Choi 150675697538e485ea2981960dcd4878bfdd032731acSungmin Choi#ifdef MEMSET_FREED 150775697538e485ea2981960dcd4878bfdd032731acSungmin Choi memset(&pf, 0, sizeof(pf)); 150875697538e485ea2981960dcd4878bfdd032731acSungmin Choi#endif 150975697538e485ea2981960dcd4878bfdd032731acSungmin Choi 151075697538e485ea2981960dcd4878bfdd032731acSungmin Choi return; 151175697538e485ea2981960dcd4878bfdd032731acSungmin Choiinvalid: 151275697538e485ea2981960dcd4878bfdd032731acSungmin Choi invalidCommandBlock(pRI); 151375697538e485ea2981960dcd4878bfdd032731acSungmin Choi return; 151475697538e485ea2981960dcd4878bfdd032731acSungmin Choi} 151575697538e485ea2981960dcd4878bfdd032731acSungmin Choi 151600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1517f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) { 15187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville size_t writeOffset = 0; 151900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const uint8_t *toWrite; 152000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 152100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project toWrite = (const uint8_t *)buffer; 152200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 152300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (writeOffset < len) { 152400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ssize_t written; 152500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 152600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project written = write (fd, toWrite + writeOffset, 152700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len - writeOffset); 1528388849057a8cc91dbc3fff357d2df524ffec9a4dBanavathu, Srinivas Naik } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN))); 152900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 153000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (written >= 0) { 153100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeOffset += written; 153200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { // written < 0 15338eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("RIL Response: unexpected error on write errno:%d", errno); 153400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(fd); 153500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 153600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 153700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 153800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 153900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 154000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 154100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 154200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1543f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) { 154400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int fd = s_fdCommand; 154500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 154600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project uint32_t header; 154700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 154800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 154900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 155000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 155100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 155200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (dataSize > MAX_COMMAND_BYTES) { 15538eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL: packet larger than %u (%u)", 155400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project MAX_COMMAND_BYTES, (unsigned int )dataSize); 155500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 155600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 155700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 15587f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 155900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_writeMutex); 156000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 156100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project header = htonl(dataSize); 156200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 156300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = blockingWrite(fd, (void *)&header, sizeof(header)); 156400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 156500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1566084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 156700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 156800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 156900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1570ee1fadc192a63724e416b05666844a62d1e75d38Kenny ret = blockingWrite(fd, data, dataSize); 157100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1573084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 157400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_writeMutex); 157800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 158000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1583f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) { 158400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printResponse; 158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return sendResponseRaw(p.data(), p.dataSize()); 158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 158700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/ 15897f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 15907f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int 1591f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) { 159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numInts; 159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 159400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 15958eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 159600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(int) != 0) { 15998eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(int)); 160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *p_int = (int *) response; 160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numInts = responselen / sizeof(int *); 160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numInts); 160800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each int*/ 161000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 161100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numInts ; i++) { 161200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, p_int[i]); 161300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_int[i]); 161400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 161500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 161600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 161700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 161900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 162000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s 16224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville The parcel will begin with the version */ 16234380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) { 16244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(version); 16254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStrings(p, response, responselen); 16264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 16274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 162800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */ 1629f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) { 163000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numStrings; 16317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 163200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 16338eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 163400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 163500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 163600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(char *) != 0) { 16378eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 163800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(char *)); 163900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 164000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 164100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 164200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 164300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (0); 164400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 164500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **p_cur = (char **) response; 164600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 164700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numStrings = responselen / sizeof(char *); 164800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numStrings); 164900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 165000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each string*/ 165100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 165200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numStrings ; i++) { 165300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]); 165400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur[i]); 165500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 165600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 165700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 165800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 165900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 166000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 166100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 16647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted 166500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen 166600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 1667f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) { 166800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* one string only */ 166900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 167000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, (char*)response); 167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 167200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, (const char *)response); 167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1678f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) { 167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1684f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) { 168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 16888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_Call *) != 0) { 16938eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_Call *)); 169500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 169900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_Call *); 170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Call *p_cur = ((RIL_Call **) response)[i]; 170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each call info */ 170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->state); 170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMpty); 171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMT); 171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->als); 171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isVoice); 17131b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->isVoicePrivacy); 17141b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->number); 17151b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->numberPresentation); 17161b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->name); 17171b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->namePresentation); 17183a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville // Remove when partners upgrade to version 3 171974fa38884320698c1623764850e3131b9769dff0Wink Saville if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) { 172074fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(0); /* UUS Information is absent */ 172174fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 172274fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info *uusInfo = p_cur->uusInfo; 172374fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(1); /* UUS Information is present */ 172474fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusType); 172574fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusDcs); 172674fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusLength); 172774fa38884320698c1623764850e3131b9769dff0Wink Saville p.write(uusInfo->uusData, uusInfo->uusLength); 172874fa38884320698c1623764850e3131b9769dff0Wink Saville } 17293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[id=%d,%s,toa=%d,", 17301b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, 17311b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->index, 17321b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville callStateToString(p_cur->state), 17333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->toa); 17343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,%s,als=%d,%s,%s,", 17353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 17361b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMpty)?"conf":"norm", 17371b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMT)?"mt":"mo", 17381b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->als, 17391b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isVoice)?"voc":"nonvoc", 17403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (p_cur->isVoicePrivacy)?"evp":"noevp"); 17413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,cli=%d,name='%s',%d]", 17423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 17431b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->number, 17441b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->numberPresentation, 17451b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->name, 17461b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->namePresentation); 174700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 174800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 174900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 175000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 175100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 175200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 175300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1754f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(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_SMS_Response) ) { 17618eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected %d", 176200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SMS_Response)); 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_SMS_Response *p_cur = (RIL_SMS_Response *) response; 176700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->messageRef); 176900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->ackPDU); 1770920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh p.writeInt32(p_cur->errorCode); 177100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 1773920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef, 1774920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh (char*)p_cur->ackPDU, p_cur->errorCode); 177500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 177600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 177800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 177900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1780c0114b325877907fcdf7a5baa24e54a752e7e58bWink Savillestatic int responseDataCallListV4(Parcel &p, void *response, size_t responselen) 178100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 178200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 17838eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 178400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 178500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 178600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1787c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) { 17888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 1789c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4)); 179000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 179100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 179200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1793c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v4); 179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1796c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response; 179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 179800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int i; 179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (i = 0; i < num; i++) { 180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].cid); 180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].active); 180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].type); 1803c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville // apn is not used, so don't send. 180400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].address); 1805c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf, 180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur[i].cid, 180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur[i].active==0)?"down":"up", 180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].type, 180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].address); 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 18174380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen) 18184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 18194380897c6cdc99486a061b819943e3b290ebcf09Wink Saville // Write version 18204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(s_callbacks.version); 18214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 18224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 1823c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville return responseDataCallListV4(p, response, responselen); 18244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 18254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (response == NULL && responselen != 0) { 18268eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 18274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 18284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 18294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1830c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) { 18318eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 1832c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6)); 18334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 18344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 18354380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1836c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v6); 18374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(num); 18384380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1839c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response; 18404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville startResponse; 18414380897c6cdc99486a061b819943e3b290ebcf09Wink Saville int i; 18424380897c6cdc99486a061b819943e3b290ebcf09Wink Saville for (i = 0; i < num; i++) { 18434380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32((int)p_cur[i].status); 1844beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo p.writeInt32(p_cur[i].suggestedRetryTime); 18454380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].cid); 18464380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].active); 1847af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner writeStringToParcel(p, p_cur[i].type); 18484380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].ifname); 18494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].addresses); 18504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].dnses); 1851c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur[i].gateways); 185256384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf, 18534380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].status, 1854beb25b58dcb48a2cfa2cfe10f5fb15908ff465f8Kazuhiro Ondo p_cur[i].suggestedRetryTime, 18554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].cid, 18564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (p_cur[i].active==0)?"down":"up", 185756384157f32856066ee9c1b77cbcf96d4ee90a98Naveen Kalla (char*)p_cur[i].type, 18584380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].ifname, 18594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].addresses, 1860c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)p_cur[i].dnses, 1861c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville (char*)p_cur[i].gateways); 18624380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 18634380897c6cdc99486a061b819943e3b290ebcf09Wink Saville removeLastChar; 18644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville closeResponse; 18654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 18664380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 18674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return 0; 18684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 18694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 18704380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen) 18714380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 18724380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 18734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStringsWithVersion(s_callbacks.version, p, response, responselen); 18744380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 18754380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseDataCallList(p, response, responselen); 18764380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 18774380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 18784380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1879f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) { 188000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 18818eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL with responselen != 0"); 188200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 188300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 188400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 188500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code reads -1 size as null byte array 188600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 18877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p.writeInt32(-1); 188800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 188900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(responselen); 189000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.write(response, responselen); 189100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 189200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 189300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 189400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 189500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 189600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) { 189800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 18998eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 190000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 190100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 190200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 190300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SIM_IO_Response) ) { 19048eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 190500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SIM_IO_Response)); 190600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 190700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 190800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 190900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response; 191000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw1); 191100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw2); 191200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->simResponse); 191300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 191400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 191500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2, 191600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->simResponse); 191700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 191800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 191900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 192000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 192100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 192200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) { 192400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 19257f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 192600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 19278eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 192800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 192900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 193000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(RIL_CallForwardInfo *) != 0) { 19328eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d", 193300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(RIL_CallForwardInfo *)); 193400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 193500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 193600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 193800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_CallForwardInfo *); 193900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 194000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 194100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 194200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 194300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i]; 194400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 194500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->status); 194600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->reason); 194700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->serviceClass); 194800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 194900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 195000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->timeSeconds); 195100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf, 195200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->status==1)?"enable":"disable", 195300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->reason, p_cur->serviceClass, p_cur->toa, 195400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number, 195500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->timeSeconds); 195600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 195700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 195800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 19597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 196000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 196100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 196200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) { 196400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 19658eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 196600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 196700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 196800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 196900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof(RIL_SuppSvcNotification)) { 19708eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 197100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SuppSvcNotification)); 197200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 197300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 197400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 197500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response; 197600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->notificationType); 197700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->code); 197800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 197900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->type); 198000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 198100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 198200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 198300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf, 198400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->notificationType==0)?"mo":"mt", 198500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->code, p_cur->index, p_cur->type, 198600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number); 198700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 198800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 198900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 199000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 199100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) { 199300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 199400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 199500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 19968eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 199700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 199800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 199900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 200000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_NeighboringCell *) != 0) { 20018eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 200200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_NeighboringCell *)); 200300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 200400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 200500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 200600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 20073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville /* number of records */ 200800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_NeighboringCell *); 200900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 201000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 201200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i]; 201300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->rssi); 201500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur->cid); 201600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf, 201800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cid, p_cur->rssi); 201900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 202000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 202100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 202200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 202300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 202400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 202500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 20263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/** 20273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists. 20283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */ 2029a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p, 2030a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) { 20313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.isPresent); 20323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signalType); 20333d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.alertPitch); 20343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signal); 20353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 20363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2037a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p, 2038a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 20393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville int num; 2040a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville char* string8 = NULL; 2041a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int buffer_lenght; 2042a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecord *infoRec; 20433d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 20458eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 20463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2049a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (responselen != sizeof (RIL_CDMA_InformationRecords)) { 20508eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected multiple of %d\n", 2051a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *)); 20523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2055a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecords *p_cur = 2056a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_InformationRecords *) response; 2057a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); 20583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 2060a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 20613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2062a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++) { 2063a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec = &p_cur->infoRec[i]; 2064a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->name); 2065a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville switch (infoRec->name) { 20663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_DISPLAY_INFO_REC: 2067a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: 2068a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.display.alpha_len > 2069a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH) { 20708eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 2071a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 2072a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.display.alpha_len, 2073a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH); 2074a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 20753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 2076a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) 2077a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 2078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) { 2079a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.display.alpha_buf[i]; 20803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20814380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.display.alpha_len] = '\0'; 2082a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 2083a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 2084a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 20853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 2086a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: 20873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: 20883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: 2089a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) { 20908eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 2091a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 2092a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.number.len, 2093a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 2094a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 20953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 2096a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.number.len + 1) 2097a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 2098a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.number.len; i++) { 2099a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.number.buf[i]; 2100a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 21014380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.number.len] = '\0'; 2102a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 2103a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 2104a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 2105a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_type); 2106a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_plan); 2107a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.pi); 2108a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.si); 21093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 21103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_SIGNAL_INFO_REC: 2111a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.isPresent); 2112a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signalType); 2113a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.alertPitch); 2114a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signal); 2115a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2116a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%sisPresent=%X, signalType=%X, \ 2117a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville alertPitch=%X, signal=%X, ", 2118a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, (int)infoRec->rec.signal.isPresent, 2119a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signalType, 2120a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.alertPitch, 2121a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signal); 2122a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 21233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 21243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: 2125a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.redir.redirectingNumber.len > 2126a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH) { 21278eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid display info response length %d \ 2128a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 2129a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.redir.redirectingNumber.len, 2130a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 2131a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 2132a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 2133a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber 2134a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville .len + 1) * sizeof(char) ); 2135a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; 2136a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i < infoRec->rec.redir.redirectingNumber.len; 2137a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i++) { 2138a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.redir.redirectingNumber.buf[i]; 21393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 21404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0'; 2141a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 2142a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 2143a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 2144a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type); 2145a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan); 2146a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.pi); 2147a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.si); 2148a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingReason); 21493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 21503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_LINE_CONTROL_INFO_REC: 2151a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded); 2152a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle); 2153a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse); 2154a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial); 2155a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2156a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%slineCtrlPolarityIncluded=%d, \ 2157a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlToggle=%d, lineCtrlReverse=%d, \ 2158a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlPowerDenial=%d, ", printBuf, 2159a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded, 2160a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlToggle, 2161a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlReverse, 2162a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial); 2163a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 21643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 21653d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_CLIR_INFO_REC: 2166a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32((int)(infoRec->rec.clir.cause)); 21673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2168a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause); 2169a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 21703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 21713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: 2172a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.upLink); 2173a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.downLink); 2174a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2175a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf, 2176a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.upLink, 2177a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.downLink); 2178a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 21793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 2180a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_T53_RELEASE_INFO_REC: 2181a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // TODO(Moto): See David Krause, he has the answer:) 21828eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE"); 2183a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 2184a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville default: 21858eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Incorrect name value"); 2186a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 21873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 21883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 2189a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 21903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2191a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return 0; 21923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 21933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2194a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p, 2195a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 2196a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (response == NULL && responselen != 0) { 21978eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 21983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 21993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 22003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2201c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof (RIL_SignalStrength_v5)) { 2202c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_SignalStrength_v6 *p_cur = ((RIL_SignalStrength_v6 *) response); 22033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 22043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.signalStrength); 22053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate); 22063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.dbm); 22073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.ecio); 22083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.dbm); 22093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.ecio); 22103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio); 2211c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof (RIL_SignalStrength_v6)) { 22129efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam /* 221318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville * Fixup LTE for backwards compatibility 22149efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam */ 221518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (s_callbacks.version <= 6) { 221618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // signalStrength: -1 -> 99 221718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.signalStrength == -1) { 221818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.signalStrength = 99; 221918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 222018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // rsrp: -1 -> INT_MAX all other negative value to positive. 222118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // So remap here 222218e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.rsrp == -1) { 222318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrp = INT_MAX; 222418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } else if (p_cur->LTE_SignalStrength.rsrp < -1) { 222518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp; 222618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 222718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // rsrq: -1 -> INT_MAX 222818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.rsrq == -1) { 222918e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.rsrq = INT_MAX; 223018e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 223118e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // Not remapping rssnr is already using INT_MAX 22329efcac5782b93564d47c1687e67e85849c72afedUma Maheswari Ramalingam 223318e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville // cqi: -1 -> INT_MAX 223418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville if (p_cur->LTE_SignalStrength.cqi == -1) { 223518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p_cur->LTE_SignalStrength.cqi = INT_MAX; 223618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 223718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville } 223818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(p_cur->LTE_SignalStrength.signalStrength); 2239c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rsrp); 2240c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rsrq); 2241c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.rssnr); 2242c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->LTE_SignalStrength.cqi); 2243c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } else { 224418e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(99); 224518e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 224618e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 224718e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 224818e4ab167c7d8549a360ab5ae1fadddcad8c0523Wink Saville p.writeInt32(INT_MAX); 2249c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } 2250fdf825f9d0dc639787b8523638bb61874ed0b540johnwang 2251fdf825f9d0dc639787b8523638bb61874ed0b540johnwang startResponse; 2252a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\ 2253c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville CDMA_SS.dbm=%d,CDMA_SSecio=%d,\ 2254c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\ 2255c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville EVDO_SS.signalNoiseRatio=%d,\ 2256c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\ 2257c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville LTE_SS.rssnr=%d,LTE_SS.cqi=%d]", 2258a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, 2259a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.signalStrength, 2260a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.bitErrorRate, 2261a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.dbm, 2262a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.ecio, 2263a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.dbm, 2264a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.ecio, 2265c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->EVDO_SignalStrength.signalNoiseRatio, 2266c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.signalStrength, 2267c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rsrp, 2268c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rsrq, 2269c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.rssnr, 2270c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->LTE_SignalStrength.cqi); 2271a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 2272a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 22733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 22748eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length"); 22753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 22763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 22773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 22783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 22793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 22803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 22813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) { 22823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if ((response == NULL) || (responselen == 0)) { 22833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseVoid(p, response, responselen); 22843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 22853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseCdmaSignalInfoRecord(p, response, responselen); 22863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 22873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 22883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 22893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) { 22903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL || responselen == 0) { 22918eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 22923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 22933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 22943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 22953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) { 22968eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n", 22973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord)); 22983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 22993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 23003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 23013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 23023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 23033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response); 23043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, *p_cur); 23053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 23063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\ 23073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signal=%d]", 23083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 23093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->isPresent, 23103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalType, 23113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->alertPitch, 23123d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signal); 23133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 23143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 23153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 23163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 23173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2318a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response, 2319a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t responselen) { 23203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 23218eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 23223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 23233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 23243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2325c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) { 23268eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("Upgrade to ril version %d\n", RIL_VERSION); 23273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 23283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2329c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response); 23303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2331c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur->number); 23323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->numberPresentation); 2333c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville writeStringToParcel(p, p_cur->name); 23343d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, p_cur->signalInfoRecord); 23353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 2336c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) { 2337c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->number_type); 2338c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->number_plan); 2339c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } else { 2340c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(0); 2341c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(0); 2342c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville } 2343c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville 2344c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville startResponse; 23453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\ 23463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\ 2347c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville signal=%d,number_type=%d,number_plan=%d]", 23483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 23493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->number, 23503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->numberPresentation, 23513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->name, 23523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.isPresent, 23533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.signalType, 23543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.alertPitch, 2355c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->signalInfoRecord.signal, 2356c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->number_type, 2357c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p_cur->number_plan); 23583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 23593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 23603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 23613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 23623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 236345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenkastatic int responseSimRefresh(Parcel &p, void *response, size_t responselen) { 236445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka if (response == NULL && responselen != 0) { 23658eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("responseSimRefresh: invalid response: NULL"); 236645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka return RIL_ERRNO_INVALID_RESPONSE; 236745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } 236845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 236945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka startResponse; 237045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka if (s_callbacks.version == 7) { 237145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response); 237245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur->result); 237345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur->ef_id); 237445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka writeStringToParcel(p, p_cur->aid); 237545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 237645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s", 237745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka printBuf, 237845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->result, 237945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->ef_id, 238045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur->aid); 238145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } else { 238245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka int *p_cur = ((int *) response); 238345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur[0]); 238445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p.writeInt32(p_cur[1]); 238545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka writeStringToParcel(p, NULL); 238645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 238745e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka appendPrintBuf("%sresult=%d, ef_id=%d", 238845e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka printBuf, 238945e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur[0], 239045e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka p_cur[1]); 239145e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka } 239245e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka closeResponse; 239345e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 239445e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka return 0; 239545e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka} 239645e740ef3c422bf75aadca21f98614fc120f49fbAlex Yakavenka 23978a9e02161271505de274db0c3a88087056dd5dfcWink Savillestatic int responseCellInfoList(Parcel &p, void *response, size_t responselen) 23988a9e02161271505de274db0c3a88087056dd5dfcWink Saville{ 23998a9e02161271505de274db0c3a88087056dd5dfcWink Saville if (response == NULL && responselen != 0) { 24008a9e02161271505de274db0c3a88087056dd5dfcWink Saville RLOGE("invalid response: NULL"); 24018a9e02161271505de274db0c3a88087056dd5dfcWink Saville return RIL_ERRNO_INVALID_RESPONSE; 24028a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 24038a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24048a9e02161271505de274db0c3a88087056dd5dfcWink Saville if (responselen % sizeof(RIL_CellInfo) != 0) { 24058a9e02161271505de274db0c3a88087056dd5dfcWink Saville RLOGE("invalid response length %d expected multiple of %d", 24068a9e02161271505de274db0c3a88087056dd5dfcWink Saville (int)responselen, (int)sizeof(RIL_CellInfo)); 24078a9e02161271505de274db0c3a88087056dd5dfcWink Saville return RIL_ERRNO_INVALID_RESPONSE; 24088a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 24098a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24108a9e02161271505de274db0c3a88087056dd5dfcWink Saville int num = responselen / sizeof(RIL_CellInfo); 24118a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(num); 24128a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24138a9e02161271505de274db0c3a88087056dd5dfcWink Saville RIL_CellInfo *p_cur = (RIL_CellInfo *) response; 24148a9e02161271505de274db0c3a88087056dd5dfcWink Saville startResponse; 24158a9e02161271505de274db0c3a88087056dd5dfcWink Saville int i; 24168a9e02161271505de274db0c3a88087056dd5dfcWink Saville for (i = 0; i < num; i++) { 24178a9e02161271505de274db0c3a88087056dd5dfcWink Saville appendPrintBuf("%s[%d: type=%d,registered=%d,timeStampType=%d,timeStamp=%lld", printBuf, i, 24188a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->cellInfoType, p_cur->registered, p_cur->timeStampType, p_cur->timeStamp); 24198a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32((int)p_cur->cellInfoType); 24208a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->registered); 24218a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->timeStampType); 24228a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt64(p_cur->timeStamp); 24238a9e02161271505de274db0c3a88087056dd5dfcWink Saville switch(p_cur->cellInfoType) { 24248a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_CELL_INFO_TYPE_GSM: { 2425c57b3eb525db241bd3e6092453f48388bc880447Wink Saville appendPrintBuf("%s GSM id: mcc=%d,mnc=%d,lac=%d,cid=%d,", printBuf, 24268a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.gsm.cellIdentityGsm.mcc, 24278a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.gsm.cellIdentityGsm.mnc, 24288a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.gsm.cellIdentityGsm.lac, 2429c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.gsm.cellIdentityGsm.cid); 2430c57b3eb525db241bd3e6092453f48388bc880447Wink Saville appendPrintBuf("%s gsmSS: ss=%d,ber=%d],", printBuf, 24318a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength, 24328a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate); 24338a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24348a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc); 24358a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc); 24368a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac); 24378a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid); 24388a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength); 24398a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate); 24408a9e02161271505de274db0c3a88087056dd5dfcWink Saville break; 24418a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 2442c57b3eb525db241bd3e6092453f48388bc880447Wink Saville case RIL_CELL_INFO_TYPE_WCDMA: { 2443c57b3eb525db241bd3e6092453f48388bc880447Wink Saville appendPrintBuf("%s WCDMA id: mcc=%d,mnc=%d,lac=%d,cid=%d,psc=%d,", printBuf, 2444c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc, 2445c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc, 2446c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.cellIdentityWcdma.lac, 2447c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.cellIdentityWcdma.cid, 2448c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.cellIdentityWcdma.psc); 2449c57b3eb525db241bd3e6092453f48388bc880447Wink Saville appendPrintBuf("%s wcdmaSS: ss=%d,ber=%d],", printBuf, 2450c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength, 2451c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate); 2452c57b3eb525db241bd3e6092453f48388bc880447Wink Saville 2453c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc); 2454c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc); 2455c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac); 2456c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid); 2457c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc); 2458c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength); 2459c57b3eb525db241bd3e6092453f48388bc880447Wink Saville p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate); 2460c57b3eb525db241bd3e6092453f48388bc880447Wink Saville break; 2461c57b3eb525db241bd3e6092453f48388bc880447Wink Saville } 24628a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_CELL_INFO_TYPE_CDMA: { 24638a9e02161271505de274db0c3a88087056dd5dfcWink Saville appendPrintBuf("%s CDMA id: nId=%d,sId=%d,bsId=%d,long=%d,lat=%d", printBuf, 24648a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.cellIdentityCdma.networkId, 24658a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.cellIdentityCdma.systemId, 24668a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.cellIdentityCdma.basestationId, 24678a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.cellIdentityCdma.longitude, 24688a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.cellIdentityCdma.latitude); 24698a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24708a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId); 24718a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId); 24728a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId); 24738a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude); 24748a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude); 24758a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24768a9e02161271505de274db0c3a88087056dd5dfcWink Saville appendPrintBuf("%s cdmaSS: dbm=%d ecio=%d evdoSS: dbm=%d,ecio=%d,snr=%d", printBuf, 24778a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.signalStrengthCdma.dbm, 24788a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.signalStrengthCdma.ecio, 24798a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.signalStrengthEvdo.dbm, 24808a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.signalStrengthEvdo.ecio, 24818a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio); 24828a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24838a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm); 24848a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio); 24858a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm); 24868a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio); 24878a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio); 24888a9e02161271505de274db0c3a88087056dd5dfcWink Saville break; 24898a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 24908a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_CELL_INFO_TYPE_LTE: { 24918a9e02161271505de274db0c3a88087056dd5dfcWink Saville appendPrintBuf("%s LTE id: mcc=%d,mnc=%d,ci=%d,pci=%d,tac=%d", printBuf, 24928a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.cellIdentityLte.mcc, 24938a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.cellIdentityLte.mnc, 24948a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.cellIdentityLte.ci, 24958a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.cellIdentityLte.pci, 24968a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.cellIdentityLte.tac); 24978a9e02161271505de274db0c3a88087056dd5dfcWink Saville 24988a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc); 24998a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc); 25008a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci); 25018a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci); 25028a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac); 25038a9e02161271505de274db0c3a88087056dd5dfcWink Saville 25048a9e02161271505de274db0c3a88087056dd5dfcWink Saville appendPrintBuf("%s lteSS: ss=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,ta=%d", printBuf, 25058a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.signalStrength, 25068a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.rsrp, 25078a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.rsrq, 25088a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.rssnr, 25098a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.cqi, 25108a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur->CellInfo.lte.signalStrengthLte.timingAdvance); 25118a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength); 25128a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp); 25138a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq); 25148a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr); 25158a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi); 25168a9e02161271505de274db0c3a88087056dd5dfcWink Saville p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance); 25178a9e02161271505de274db0c3a88087056dd5dfcWink Saville break; 25188a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 25198a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 25208a9e02161271505de274db0c3a88087056dd5dfcWink Saville p_cur += 1; 25218a9e02161271505de274db0c3a88087056dd5dfcWink Saville } 25228a9e02161271505de274db0c3a88087056dd5dfcWink Saville removeLastChar; 25238a9e02161271505de274db0c3a88087056dd5dfcWink Saville closeResponse; 25248a9e02161271505de274db0c3a88087056dd5dfcWink Saville 25258a9e02161271505de274db0c3a88087056dd5dfcWink Saville return 0; 25268a9e02161271505de274db0c3a88087056dd5dfcWink Saville} 25278a9e02161271505de274db0c3a88087056dd5dfcWink Saville 25283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() { 252900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 253000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!pthread_equal(pthread_self(), s_tid_dispatch)) { 253100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* trigger event loop to wakeup. No reason to do this, 253200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * if we're in the event loop thread */ 253300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 253400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = write (s_fdWakeupWrite, " ", 1); 253500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (ret < 0 && errno == EINTR); 253600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 253700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) { 254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_add(ev); 254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 254300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2544fd7293711394c422711ff07d15a357955ff2194fWink Savillestatic void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) { 2545fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(num_apps); 2546fd7293711394c422711ff07d15a357955ff2194fWink Saville startResponse; 2547fd7293711394c422711ff07d15a357955ff2194fWink Saville for (int i = 0; i < num_apps; i++) { 2548fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].app_type); 2549fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].app_state); 2550fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].perso_substate); 2551fd7293711394c422711ff07d15a357955ff2194fWink Saville writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr)); 2552fd7293711394c422711ff07d15a357955ff2194fWink Saville writeStringToParcel(p, (const char*) 2553fd7293711394c422711ff07d15a357955ff2194fWink Saville (appStatus[i].app_label_ptr)); 2554fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin1_replaced); 2555fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin1); 2556fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(appStatus[i].pin2); 2557fd7293711394c422711ff07d15a357955ff2194fWink Saville appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\ 2558fd7293711394c422711ff07d15a357955ff2194fWink Saville aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],", 2559fd7293711394c422711ff07d15a357955ff2194fWink Saville printBuf, 2560fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_type, 2561fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_state, 2562fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].perso_substate, 2563fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].aid_ptr, 2564fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].app_label_ptr, 2565fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin1_replaced, 2566fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin1, 2567fd7293711394c422711ff07d15a357955ff2194fWink Saville appStatus[i].pin2); 2568fd7293711394c422711ff07d15a357955ff2194fWink Saville } 2569fd7293711394c422711ff07d15a357955ff2194fWink Saville closeResponse; 2570fd7293711394c422711ff07d15a357955ff2194fWink Saville} 2571fd7293711394c422711ff07d15a357955ff2194fWink Saville 2572f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) { 2573f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int i; 2574f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2575f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 25768eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 2577f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2578f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2579f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 25802c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville if (responselen == sizeof (RIL_CardStatus_v6)) { 2581fd7293711394c422711ff07d15a357955ff2194fWink Saville RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response); 2582fd7293711394c422711ff07d15a357955ff2194fWink Saville 2583fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->card_state); 2584fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->universal_pin_state); 2585fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->gsm_umts_subscription_app_index); 2586fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->cdma_subscription_app_index); 2587c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(p_cur->ims_subscription_app_index); 2588fd7293711394c422711ff07d15a357955ff2194fWink Saville 2589fd7293711394c422711ff07d15a357955ff2194fWink Saville sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications); 25902c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville } else if (responselen == sizeof (RIL_CardStatus_v5)) { 2591fd7293711394c422711ff07d15a357955ff2194fWink Saville RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response); 2592fd7293711394c422711ff07d15a357955ff2194fWink Saville 2593fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->card_state); 2594fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->universal_pin_state); 2595fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->gsm_umts_subscription_app_index); 2596fd7293711394c422711ff07d15a357955ff2194fWink Saville p.writeInt32(p_cur->cdma_subscription_app_index); 2597c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville p.writeInt32(-1); 2598f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2599fd7293711394c422711ff07d15a357955ff2194fWink Saville sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications); 26002c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville } else { 26018eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n"); 26022c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2603f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2604f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2605f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 26063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 2607f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2608a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2609a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *); 2610f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(num); 2611f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2612f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2613a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_GSM_BroadcastSmsConfigInfo **p_cur = 2614a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_GSM_BroadcastSmsConfigInfo **) response; 2615a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; i < num; i++) { 2616a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromServiceId); 2617a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toServiceId); 2618a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromCodeScheme); 2619a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toCodeScheme); 2620a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2621a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2622a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \ 2623a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", 2624a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId, 2625a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme, 2626a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2627a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 2628f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2629f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2630f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2631f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2632f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2633a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2634a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_BroadcastSmsConfigInfo **p_cur = 2635a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_BroadcastSmsConfigInfo **) response; 2636f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2637a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *); 2638a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 2639f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2640f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2641a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++ ) { 2642a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->service_category); 2643a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->language); 2644a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2645f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2646a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \ 2647a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville selected =%d], ", 2648a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->service_category, p_cur[i]->language, 2649a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2650f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville } 2651a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 2652f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2653f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2654f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2655f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2656f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) { 2657f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int num; 2658f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitCount; 2659f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 2660f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 2661f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* dest; 2662f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 26638eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("Inside responseCdmaSms"); 2664f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2665f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 26668eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response: NULL"); 2667f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2668f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2669f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2670f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville if (responselen != sizeof(RIL_CDMA_SMS_Message)) { 26718eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("invalid response length was %d expected %d", 2672f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message)); 2673f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2674f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2675f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2676f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response; 2677f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uTeleserviceID); 2678f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->bIsServicePresent),sizeof(uct)); 2679f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uServicecategory); 2680f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.digit_mode); 2681f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_mode); 2682f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_type); 2683f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_plan); 2684f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct)); 2685f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 2686f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2687f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct)); 2688f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2689f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2690f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sSubAddress.subaddressType); 2691f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.odd),sizeof(uct)); 2692f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct)); 2693f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 2694f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2695f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct)); 2696f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2697f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2698f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 2699f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uBearerDataLen); 2700f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2701f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct)); 2702f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2703f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2704f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2705f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 27061b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ", 2707f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory, 2708f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type); 2709f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2710f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2711f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2712f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2713f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select() 271600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the 271700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down 271800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 2719f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) { 272000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char buff[16]; 272100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 272200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27238eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGV("processWakeupCallback"); 272400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* empty our wakeup socket out */ 272600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 272700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = read(s_fdWakeupRead, &buff, sizeof(buff)); 27287f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } while (ret > 0 || (ret < 0 && errno == EINTR)); 272900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 273000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2731f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() { 273200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 273300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *p_cur; 273400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* mark pending requests as "cancelled" so we dont report responses */ 273600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur = s_pendingRequests; 274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27427f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for (p_cur = s_pendingRequests 274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur != NULL 274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur = p_cur->p_next 274500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cancelled = 1; 274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2753f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) { 275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 275500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *p_record; 275600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t recordlen; 275700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 275800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(fd == s_fdCommand); 276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = (RecordStream *)param; 276200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (;;) { 276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* loop until EAGAIN/EINTR, end of stream, or other error */ 276500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = record_stream_get_next(p_rs, &p_record, &recordlen); 276600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 && p_record == NULL) { 276800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* end-of-stream */ 276900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 277000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret < 0) { 277100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 277200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret == 0) { /* && p_record != NULL */ 277300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandBuffer(p_record, recordlen); 277400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 277500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 277600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 277700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) { 277800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* fatal error or end-of-stream */ 277900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 27808eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("error on reading command socket errno:%d\n", errno); 278100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 27828eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("EOS. Closing command socket."); 278300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 27847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 278500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 278600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 278700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_del(&s_commands_event); 278900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project record_stream_free(p_rs); 279100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 279300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 279400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 279600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 279700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 279800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2800f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() { 28015b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville // Inform we are connected and the ril version 2802a9c18d17769ee475cf4fd5e76e18ddfa4070c7cdJake Hamby int rilVer = s_callbacks.version; 28035b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville RIL_onUnsolicitedResponse(RIL_UNSOL_RIL_CONNECTED, 28045b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville &rilVer, sizeof(rilVer)); 28055b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville 280600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // implicit radio state changed 280700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, 280800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 280900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Send last NITZ time data, in case it was missed 281100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 281200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize); 281300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s_lastNITZTimeData); 281500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 281600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 281700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Get version string 281900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_callbacks.getVersion != NULL) { 282000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *version; 282100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project version = s_callbacks.getVersion(); 28228eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("RIL Daemon version: %s\n", version); 28237f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 282400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, version); 282500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 28268eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("RIL Daemon version: unavailable\n"); 282700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, "unavailable"); 282800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 282900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 283000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 283100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2832f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) { 283300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 283400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int err; 283500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int is_phone_socket; 283600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 283700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 283800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 283900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 284000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ucred creds; 284200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t szCreds = sizeof(creds); 284300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct passwd *pwd = NULL; 284500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (s_fdCommand < 0); 284700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (fd == s_fdListen); 28487f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 284900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen); 285000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 285100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0 ) { 28528eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error on accept() errno:%d", errno); 285300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 285400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 2855f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 285600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 285700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 285800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* check the credential of the other side and only accept socket from 285900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * phone process 28607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville */ 286100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errno = 0; 286200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project is_phone_socket = 0; 2863f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds); 2865f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (err == 0 && szCreds > 0) { 2867f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville errno = 0; 2868f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville pwd = getpwuid(creds.uid); 2869f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (pwd != NULL) { 2870f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) { 2871f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville is_phone_socket = 1; 2872f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 28738eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RILD can't accept socket from process %s", pwd->pw_name); 2874f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2875f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 28768eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error on getpwuid() errno: %d", errno); 2877f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 28798eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("Error on getsockopt() errno: %d", errno); 288000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ( !is_phone_socket ) { 28838eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RILD must accept socket from %s", PHONE_PROCESS); 28847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 288700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 289100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 289400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK); 289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 28998eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("Error setting O_NONBLOCK errno:%d", errno); 290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29028eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("libril: new connection"); 290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES); 290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29067f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_commands_event, s_fdCommand, 1, 290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandsCallback, p_rs); 290800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_commands_event); 291000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onNewCommandConnect(); 291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) { 291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (args[i] != NULL) { 291700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args[i]); 291800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args); 292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) { 292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int acceptFD, option; 292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int data; 292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsigned int qxdm_data[6]; 292900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *deactData[1] = {"1"}; 293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *actData[1]; 293100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dialData; 293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int hangupData[1] = {1}; 293300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int number; 293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **args; 293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acceptFD = accept (fd, (sockaddr *) &peeraddr, &socklen); 293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (acceptFD < 0) { 29398eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error accepting on debug port: %d\n", errno); 294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) { 29448eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: number of Args: \n"); 294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args = (char **) malloc(sizeof(char*) * number); 294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 295000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int len; 295100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) { 29528eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: Len of Args: \n"); 295300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 295400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // +1 for null-term 295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args[i] = (char *) malloc((sizeof(char) * len) + 1); 29587f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville if (recv(acceptFD, args[i], sizeof(char) * len, 0) 29591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville != (int)sizeof(char) * len) { 29608eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error reading on socket: Args[%d] \n", i); 296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 296300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 296400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char * buf = args[i]; 296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project buf[len] = 0; 296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 296800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (atoi(args[0])) { 296900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 0: 29708eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Connection on debug port: issuing reset."); 297100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0); 297200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 297300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 1: 29748eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Connection on debug port: issuing radio power off."); 297500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 0; 297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 297700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Close the socket 297800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 297900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 298000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 298100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 2: 29828eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: issuing unsolicited voice network change."); 2983c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, 298400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 3: 29878eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: QXDM log enable."); 2988d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[0] = 65536; // head.func_tag 2989d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[1] = 16; // head.len 2990d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 1; // mode: 1 for 'start logging' 2991d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[3] = 32; // log_file_size: 32megabytes 2992d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[4] = 0; // log_mask 2993d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; // log_max_fileindex 29947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 299500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 299700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 4: 29988eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI ("Debug port: QXDM log disable."); 299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[0] = 65536; 300000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[1] = 16; 3001d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 0; // mode: 0 for 'stop logging' 300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[3] = 32; 300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 0; 3004d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; 300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 300800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 5: 30098eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Radio On"); 301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 1; 301100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 301200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sleep(2); 301300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Set network selection automatic. 301400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0); 301500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 301600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 6: 30178eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]); 301800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project actData[0] = args[1]; 30197f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData, 302000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(actData)); 302100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 302200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 7: 30238eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Deactivate Data Call"); 30247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData, 302500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(deactData)); 302600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 302700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 8: 30288eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Dial Call"); 302900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.clir = 0; 303000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.address = args[1]; 303100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData)); 303200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 303300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 9: 30348eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: Answer Call"); 303500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0); 303600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 303700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 10: 30388eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGI("Debug port: End Call"); 30397f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData, 304000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(hangupData)); 304100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 304200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 30438eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("Invalid request"); 304400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 304500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 304600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(number, args); 304700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(acceptFD); 304800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 304900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) { 305200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 305300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *)param; 305500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->p_callback(p_info->userParam); 305700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME generalize this...there should be a cancel mechanism 306000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) { 306100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info = NULL; 306200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 306300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 306400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(p_info); 306500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 306600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 306700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 306800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void * 3069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) { 307000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 307100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int filedes[2]; 307200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 307300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_init(); 307400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 307500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 307600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 307700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 1; 307800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_broadcast(&s_startupCond); 307900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 308000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 308100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 308200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pipe(filedes); 308300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 308400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 30858eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Error in pipe() errno:%d", errno); 308600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 308700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 308800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 308900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupRead = filedes[0]; 309000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupWrite = filedes[1]; 309100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 309200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK); 309300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 309400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true, 309500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processWakeupCallback, NULL); 309600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 309700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_wakeupfd_event); 309800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 309900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Only returns on error 310000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_loop(); 31018eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("error in event_loop_base errno:%d", errno); 31025cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo // kill self to restart on error 31035cdc1354de1e1b98347fe67c5fefdb0be7e0f589Kazuhiro Ondo kill(0, SIGKILL); 310400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 310500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 310600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 310700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31087f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 3109f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) { 311000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 311100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_t attr; 31127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 311300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* spin up eventLoop thread and wait for it to get started */ 311400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 0; 311500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 311600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 311700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_init (&attr); 31187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 311900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL); 312000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 312100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (s_started == 0) { 312200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_wait(&s_startupCond, &s_startupMutex); 312300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 312400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 312500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 312600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 312700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 31288eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to create dispatch thread errno:%d", errno); 312900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 313000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 313100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 313200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 313300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only. 313400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) { 313500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 313600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31387f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 3139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) { 314000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 314100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int flags; 314200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31434380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks == NULL) { 31448eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: RIL_RadioFunctions * null"); 314500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 314600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 31474380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version < RIL_VERSION_MIN) { 31488eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: version %d is to old, min version is %d", 31494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION_MIN); 31504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 31514380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 31524380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version > RIL_VERSION) { 31538eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: version %d is too new, max version is %d", 31544380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION); 31554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 31563a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville } 31578eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register: RIL version %d", callbacks->version); 315800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 315900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled > 0) { 31608eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("RIL_register has been called more than once. " 316100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project "Subsequent call ignored"); 316200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 316300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 316600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_registerCalled = 1; 316800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Little self-check 317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) { 317200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(i == s_commands[i].requestNumber); 317300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) { 31767f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville assert(i + RIL_UNSOL_RESPONSE_BASE 317700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project == s_unsolResponses[i].requestNumber); 317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // New rild impl calls RIL_startEventLoop() first 318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // old standalone impl wants it here. 318200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_started == 0) { 318400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_startEventLoop(); 318500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 318600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start listen socket 318800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 318900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0 31907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ret = socket_local_server (SOCKET_NAME_RIL, 319100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 319200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 319300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 31948eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Unable to bind socket errno:%d", errno); 319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit (-1); 319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = ret; 319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 319900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 320000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = android_get_control_socket(SOCKET_NAME_RIL); 320100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdListen < 0) { 32028eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to get socket '" SOCKET_NAME_RIL "'"); 320300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 320400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 320500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 320600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdListen, 4); 320700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 320800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 32098eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to listen on control socket '%d': %s", 321000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen, strerror(errno)); 321100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 321200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 321300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 321400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 321500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 321600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* note: non-persistent so we can accept only one connection at a time */ 32177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_listen_event, s_fdListen, false, 321800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project listenCallback, NULL); 321900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 322000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_listen_event); 322100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 322200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1 322300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start debug interface socket 322400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 322500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG); 322600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdDebug < 0) { 32278eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno); 322800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 322900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 323000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdDebug, 4); 323200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 32348eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("Failed to listen on ril debug socket '%d': %s", 323500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug, strerror(errno)); 323600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 323700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 323800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 323900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_debug_event, s_fdDebug, true, 324000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project debugCallback, NULL); 324100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 324200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_debug_event); 324300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 324400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 324500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 324600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 324700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 3248f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) { 324900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret = 0; 32507f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 325100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == NULL) { 325200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 325300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 325400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 325500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_pendingRequestsMutex); 325600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32577f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(RequestInfo **ppCur = &s_pendingRequests 32587f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ; *ppCur != NULL 325900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; ppCur = &((*ppCur)->p_next) 326000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 326100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == *ppCur) { 326200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = 1; 326300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 326400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *ppCur = (*ppCur)->p_next; 326500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 326600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 326700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 326800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 326900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_pendingRequestsMutex); 327000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 327100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 327200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 327300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 327400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 327500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 3276f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) { 327700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 327800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 327900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t errorOffset; 328000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)t; 328200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!checkAndDequeueRequestInfo(pRI)) { 32848eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE ("RIL_onRequestComplete: invalid RIL_Token"); 328500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 328600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 328700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 328800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->local > 0) { 328900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Locally issued command...void only! 329000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // response does not go back up the command socket 32918eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber)); 329200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 329300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto done; 329400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 329500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 329600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[%04d]< %s", 329700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 329800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 329900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->cancelled == 0) { 330000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 330100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 330200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_SOLICITED); 330300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (pRI->token); 330400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errorOffset = p.dataPosition(); 330500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 330600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (e); 330700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3308b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (response != NULL) { 3309b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang // there is a response payload, no matter success or not. 331000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pRI->pCI->responseFunction(p, response, responselen); 331100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 331200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* if an error occurred, rewind and mark it */ 331300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 331400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setDataPosition(errorOffset); 331500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (ret); 331600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 3317b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang } 3318b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang 3319b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (e != RIL_E_SUCCESS) { 3320b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e)); 332100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 332200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 332300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 33248eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD ("RIL onRequestComplete: Command channel closed"); 332500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 332600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponse(p); 332700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 332800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 332900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone: 333000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pRI); 333100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 333200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 333300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 333400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 3335f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() { 333600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME); 333700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 333800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 333900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 3340f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() { 334100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project release_wake_lock(ANDROID_WAKE_LOCK_NAME); 334200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 334300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 334400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 334500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout 334600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 334700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 3348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) { 334900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // We're using "param != NULL" as a cancellation mechanism 335000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (param == NULL) { 33518eb2a12cb7b525e74736300962a5f3848427275aWink Saville //RLOGD("wakeTimeout: releasing wake lock"); 335200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 335300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 335400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 33558eb2a12cb7b525e74736300962a5f3848427275aWink Saville //RLOGD("wakeTimeout: releasing wake lock CANCELLED"); 335600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 335700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 335800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 33602bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeVoiceRadioTechnology (RIL_RadioState radioState) { 33612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 33622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 33632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 33642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 33652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return RADIO_TECH_UMTS; 33662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 33672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 33682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 33692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 33702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 33712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 33722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return RADIO_TECH_1xRTT; 33732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 33742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 33758eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState"); 33762bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 33772bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 33782bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 33792bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 33802bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 33812bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeCdmaSubscriptionSource (RIL_RadioState radioState) { 33822bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 33832bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 33842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 33852bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 33862bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 33872bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 33882bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 33892bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM; 33902bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 33912bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 33922bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 33932bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return CDMA_SUBSCRIPTION_SOURCE_NV; 33942bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 33952bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 33968eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState"); 33972bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 33982bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 33992bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 34002bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34012bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic int 34022bc78d614e349574426d198c37e51ccb7455b5bbNaveen KalladecodeSimStatus (RIL_RadioState radioState) { 34032bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioState) { 34042bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_NOT_READY: 34052bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_NOT_READY: 34062bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_NOT_READY: 34072bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_NV_READY: 34082bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 34092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_LOCKED_OR_ABSENT: 34102bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_SIM_READY: 34112bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_READY: 34122bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_RUIM_LOCKED_OR_ABSENT: 34132bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return radioState; 34142bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 34158eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGD("decodeSimStatus: Invoked with incorrect RadioState"); 34162bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return -1; 34172bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34182bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 34192bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34202bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic bool is3gpp2(int radioTech) { 34212bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla switch (radioTech) { 34222bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_IS95A: 34232bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_IS95B: 34242bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_1xRTT: 34252bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_0: 34262bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_A: 34272bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EVDO_B: 34282bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_TECH_EHRPD: 34292bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return true; 34302bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla default: 34312bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return false; 34322bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34332bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 34342bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34352bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla/* If RIL sends SIM states or RUIM states, store the voice radio 34362bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * technology and subscription source information so that they can be 34372bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla * returned when telephony framework requests them 34382bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla */ 34392bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kallastatic RIL_RadioState 34402bc78d614e349574426d198c37e51ccb7455b5bbNaveen KallaprocessRadioState(RIL_RadioState newRadioState) { 34412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) { 34432bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newVoiceRadioTech; 34442bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newCdmaSubscriptionSource; 34452bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla int newSimStatus; 34462bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34472bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla /* This is old RIL. Decode Subscription source and Voice Radio Technology 34482bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla from Radio State and send change notifications if there has been a change */ 34492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState); 34502bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newVoiceRadioTech != voiceRadioTech) { 34512bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla voiceRadioTech = newVoiceRadioTech; 34522bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse (RIL_UNSOL_VOICE_RADIO_TECH_CHANGED, 34532bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla &voiceRadioTech, sizeof(voiceRadioTech)); 34542bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34552bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(is3gpp2(newVoiceRadioTech)) { 34562bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState); 34572bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newCdmaSubscriptionSource != cdmaSubscriptionSource) { 34582bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla cdmaSubscriptionSource = newCdmaSubscriptionSource; 34592bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse (RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED, 34602bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource)); 34612bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34622bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34632bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newSimStatus = decodeSimStatus(newRadioState); 34642bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla if(newSimStatus != simRuimStatus) { 34652bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla simRuimStatus = newSimStatus; 34662bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0); 34672bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34682bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34692bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla /* Send RADIO_ON to telephony */ 34702bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newRadioState = RADIO_STATE_ON; 34712bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla } 34722bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 34732bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla return newRadioState; 34742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla} 34752bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla 347600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" 347700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data, 347800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen) 347900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 348000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int unsolResponseIndex; 348100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 348200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int64_t timeReceived = 0; 348300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project bool shouldScheduleTimeout = false; 34842bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla RIL_RadioState newState; 348500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 348600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled == 0) { 348700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Ignore RIL_onUnsolicitedResponse before RIL_register 34888eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGW("RIL_onUnsolicitedResponse called before RIL_register"); 348900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 349000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 34917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 349200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE; 349300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 349400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ((unsolResponseIndex < 0) 349500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) { 34968eb2a12cb7b525e74736300962a5f3848427275aWink Saville RLOGE("unsupported unsolicited response code %d", unsolResponse); 349700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 349800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 349900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 350000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Grab a wake lock if needed for this reponse, 350100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // as we exit we'll either release it immediately 350200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // or set a timer to release it later. 350300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (s_unsolResponses[unsolResponseIndex].wakeType) { 350400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case WAKE_PARTIAL: 350500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project grabPartialWakeLock(); 350600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = true; 350700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 350800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 350900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case DONT_WAKE: 351000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 351100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // No wake lock is grabed so don't set timeout 351200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = false; 351300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 351400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 351500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 351600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Mark the time this was received, doing this 351700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // after grabing the wakelock incase getting 351800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the elapsedRealTime might cause us to goto 351900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // sleep. 352000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 352100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project timeReceived = elapsedRealtime(); 352200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 352300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 352400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse)); 352500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 352600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 352700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 352800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_UNSOLICITED); 352900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (unsolResponse); 353000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 353100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = s_unsolResponses[unsolResponseIndex] 353200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project .responseFunction(p, data, datalen); 353300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 353400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Problem with the response. Don't continue; 353500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto error_exit; 353600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 353700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 353800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // some things get more payload 353900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(unsolResponse) { 354000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 35412bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla newState = processRadioState(s_callbacks.onStateRequest()); 35422bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla p.writeInt32(newState); 354300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s {%s}", printBuf, 354400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project radioStateToString(s_callbacks.onStateRequest())); 354500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 354600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 354700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 354800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: 354900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Store the time that this was received so the 355000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // handler of this message can account for 355100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the time it takes to arrive and process. In 355200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // particular the system has been known to sleep 355300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // before this message can be processed. 355400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt64(timeReceived); 355500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 355600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 355700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 355800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = sendResponse(p); 355900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 356000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 356100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Unfortunately, NITZ time is not poll/update like everything 356200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // else in the system. So, if the upstream client isn't connected, 356300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // keep a copy of the last NITZ response (with receive time noted 356400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // above) around so we can deliver it when it is connected 356500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 356600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 356700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (s_lastNITZTimeData); 356800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 356900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 357000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 357100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = malloc(p.dataSize()); 357200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeDataSize = p.dataSize(); 357300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(s_lastNITZTimeData, p.data(), p.dataSize()); 357400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 357500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 357600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT 357700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME The java code should handshake here to release wake lock 357800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 357900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 358000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Cancel the previous request 358100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL) { 358200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info->userParam = (void *)1; 358300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 358400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 358500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info 358600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project = internalRequestTimedCallback(wakeTimeoutCallback, NULL, 358700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project &TIMEVAL_WAKE_TIMEOUT); 358800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 358900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 359000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Normal exit 359100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 359200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 359300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit: 359400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 359500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 359600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 359700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 359800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it 36007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville when the callback occurs 360100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 360200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * 36037f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param, 36040d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime) 360500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 360600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct timeval myRelativeTime; 360700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 360800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 360900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo)); 361000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p_info->p_callback = callback; 361200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->userParam = param; 36130d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn 361400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (relativeTime == NULL) { 361500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* treat null parameter as a 0 relative time */ 361600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&myRelativeTime, 0, sizeof(myRelativeTime)); 361700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 361800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* FIXME I think event_add's tv param is really const anyway */ 361900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime)); 362000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 362100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 362200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info); 362300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 362400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_timer_add(&(p_info->event), &myRelativeTime); 362500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 362600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 362700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return p_info; 362800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 362900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 363000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36310d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void 36327f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param, 3633f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville const struct timeval *relativeTime) { 36340d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn internalRequestTimedCallback (callback, param, relativeTime); 363500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 363600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 363700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3638f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) { 363900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(e) { 364000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SUCCESS: return "E_SUCCESS"; 36412126ab2f05c1033fdca7542f38372dffd1468e1cRobert Greenwalt case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE"; 364200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE"; 364300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT"; 364400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PIN2: return "E_SIM_PIN2"; 364500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PUK2: return "E_SIM_PUK2"; 364600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED"; 364700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_CANCELLED: return "E_CANCELLED"; 364800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL"; 364900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW"; 365000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY"; 3651f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT"; 36527553447d44bb3f494b00d573215d81398f61cfcdJohn Wang case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME"; 36537f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID 3654f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE"; 3655f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED"; 3656f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 365700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown error>"; 365800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 365900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 366000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 366100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3662f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) { 366300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 366400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_OFF: return "RADIO_OFF"; 366500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE"; 366600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY"; 366700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT"; 366800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY"; 3669f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY"; 3670f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY"; 3671f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT"; 3672f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY"; 3673f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_READY:return"RADIO_NV_READY"; 36742bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RADIO_STATE_ON:return"RADIO_ON"; 367500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 367600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 367700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 367800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 367900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3680f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) { 368100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 368200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ACTIVE : return "ACTIVE"; 368300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_HOLDING: return "HOLDING"; 368400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_DIALING: return "DIALING"; 368500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ALERTING: return "ALERTING"; 368600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_INCOMING: return "INCOMING"; 368700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_WAITING: return "WAITING"; 368800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 368900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 369000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 369100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 369200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3693f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) { 369400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* 369500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \ 369600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 369700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 369800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 369900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 370000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \ 370100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 370200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/' 370300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 370400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 370500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(request) { 370600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS"; 370700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN"; 370800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK"; 370900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2"; 371000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2"; 371100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN"; 371200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2"; 371300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION"; 371400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS"; 371500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DIAL: return "DIAL"; 371600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMSI: return "GET_IMSI"; 371700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP: return "HANGUP"; 371800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND"; 371900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 372000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 372100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CONFERENCE: return "CONFERENCE"; 372200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_UDUB: return "UDUB"; 372300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE"; 372400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; 3725c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE"; 3726c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE"; 372700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OPERATOR: return "OPERATOR"; 372800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER"; 372900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF: return "DTMF"; 373000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS: return "SEND_SMS"; 373100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE"; 3732f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL"; 373300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIM_IO: return "SIM_IO"; 373400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_USSD: return "SEND_USSD"; 373500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD"; 373600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CLIR: return "GET_CLIR"; 373700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CLIR: return "SET_CLIR"; 373800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS"; 373900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD"; 374000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING"; 374100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING"; 374200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE"; 374300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEI: return "GET_IMEI"; 374400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV"; 374500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ANSWER: return "ANSWER"; 3746f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL"; 374700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK"; 374800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK"; 374900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD"; 375000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE"; 375100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC"; 375200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL"; 375300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS "; 375400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_START: return "DTMF_START"; 375500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP"; 375600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION"; 375700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION"; 375800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE"; 375900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE"; 376000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS"; 376100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_MUTE: return "SET_MUTE"; 376200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_MUTE: return "GET_MUTE"; 376300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP"; 3764f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE"; 3765f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST"; 376600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO"; 376700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW"; 376800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS"; 3769f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE"; 3770f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE"; 377100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE"; 377200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE"; 377300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND"; 377400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE"; 377500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 377600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE"; 377700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER"; 377800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES"; 3779c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE"; 3780f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE"; 3781f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE"; 3782f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE"; 3783f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE"; 3784f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; 3785f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; 3786f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH"; 3787f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF"; 3788f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS"; 3789f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE"; 3790a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG"; 3791a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG"; 3792a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG"; 3793a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG"; 3794a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION"; 379503c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY"; 3796f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION"; 3797f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM"; 3798f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM"; 3799f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY"; 3800000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE"; 3801000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS"; 3802000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS"; 380309a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS"; 3804563fd7207da27322bf3f3587ef6000a944a617b7jsh case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING"; 3805c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE"; 3806fa8d584ca7984bf7d73ff37c7c2bc1e0dfa5fb71Jake Hamby case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION"; 3807300105d1487f5238940c18792b879793826b61f4Jake Hamby case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU"; 3808300105d1487f5238940c18792b879793826b61f4Jake Hamby case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS"; 38092bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH"; 38108a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST"; 38118a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE"; 381275697538e485ea2981960dcd4878bfdd032731acSungmin Choi case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN"; 3813a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE"; 3814a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS"; 381500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 381600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 3817c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED"; 381800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS"; 381900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 382000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 382100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD"; 382200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)"; 382300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED"; 382400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH"; 382500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END"; 382600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND"; 382700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY"; 382800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP"; 382900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL"; 383000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH"; 3831f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED"; 383200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING"; 3833f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; 3834f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS"; 3835f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS"; 3836f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; 38373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED"; 38383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; 38393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING"; 38403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS"; 38413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC"; 3842af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW"; 38435d621da539abea83309d77317ede40126f47d5f0John Wang case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE"; 38445909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE"; 3845ee2745825fae9561c5f83fcf179bbbfa111e5224Wink Saville case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED"; 3846c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED"; 3847c0114b325877907fcdf7a5baa24e54a752e7e58bWink Saville case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; 38485b9df33c53682addaebc0b6073901a8b441d82f9Wink Saville case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED"; 38492bc78d614e349574426d198c37e51ccb7455b5bbNaveen Kalla case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED"; 38508a9e02161271505de274db0c3a88087056dd5dfcWink Saville case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST"; 3851a18b9d1e1a014290691d63a7f335085dadc83e46Sukanya Rajkhowa case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED"; 385200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown request>"; 385300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 385400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 385500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 385600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */ 3857