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