ril.cpp revision 00f06fc3fdb05d4276e76091cacb42b6f6862222
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> 2300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h> 2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/record_stream.h> 2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h> 2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h> 2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h> 2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Parcel.h> 3000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h> 3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h> 3400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h> 3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h> 3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h> 3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h> 3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h> 4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h> 4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h> 4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h> 4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h> 4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h> 4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h> 4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h> 4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h> 5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h> 5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android { 5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio" 5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild" 5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug" 5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface" 6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl" 6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java 6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024) 6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library 6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find 7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner. 7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1 7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a) (sizeof (a) / sizeof (a)[0]) 7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */ 7600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0 7700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1 7800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */ 8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1 8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro 8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096 8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log 8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0 8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest sprintf(printBuf, "(") 9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest sprintf(printBuf, "%s)", printBuf) 9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) \ 9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("[%04d]> %s %s", token, requestToString(req), printBuf) 9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse sprintf(printBuf, "%s {", printBuf) 9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse sprintf(printBuf, "%s}", printBuf) 9600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printResponse LOGD("%s", printBuf) 9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf printBuf[0] = 0 9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar printBuf[strlen(printBuf)-1] = 0 10000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) sprintf(printBuf, x) 10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest 10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest 10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) 10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse 10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse 10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printResponse 10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf 10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar 11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) 11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL}; 11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI); 11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int(*responseFunction) (Parcel &p, void *response, size_t responselen); 11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo; 12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int (*responseFunction) (Parcel &p, void *response, size_t responselen); 12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project WakeType wakeType; 12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo; 12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo { 12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t token; //this is not RIL_Token 12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project CommandInfo *pCI; 13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct RequestInfo *p_next; 13100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char cancelled; 13200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char local; // responses to local commands do not go back to command process 13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo; 13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct UserCallbackInfo{ 13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_TimedCallback p_callback; 13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *userParam; 13800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ril_event event; 13900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct UserCallbackInfo *p_next; 14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo; 14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL}; 14600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0; 14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch; 14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader; 15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0; 15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdListen = -1; 15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdCommand = -1; 15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1; 15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead; 15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite; 15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event; 16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event; 16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event; 16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event; 16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event; 16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0}; 16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER; 16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER; 17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER; 17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER; 17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER; 17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER; 17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_pendingRequests = NULL; 17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL; 17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL; 18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL; 18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL; 18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize; 18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project static char printBuf[PRINTBUF_SIZE]; 18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 19100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI); 19300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI); 19400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI); 19500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI); 19600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI); 19700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI); 19800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI); 19900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI); 20000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI); 20100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 20200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen); 20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen); 20400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen); 20500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen); 20600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen); 20700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen); 20800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen); 20900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen); 21000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseContexts(Parcel &p, void *response, size_t responselen); 21100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen); 21200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen); 21300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen); 21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request); 21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno); 21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState); 21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState); 21900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 22000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB 22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data, 22200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen); 22300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 22400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 22500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * internalRequestTimedCallback 22600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (RIL_TimedCallback callback, void *param, 22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const struct timeval *relativeTime); 22800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 22900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */ 23000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = { 23100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h" 23200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = { 23500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h" 23600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char * 24000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectstrdupReadString(Parcel &p) 24100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char16_t *s16; 24400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 24500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = p.readString16Inplace(&stringlen); 24600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return strndup16to8(s16, stringlen); 24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void writeStringToParcel(Parcel &p, const char *s) 25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char16_t *s16; 25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t s16_len; 25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = strdup8to16(s, &s16_len); 25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeString16(s16, s16_len); 25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s16); 25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectmemsetString (char *s) 26200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s != NULL) { 26400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (s, 0, strlen(s)); 26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid nullParcelReleaseFunction (const uint8_t* data, size_t dataSize, 26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const size_t* objects, size_t objectsSize, 27000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void* cookie) 27100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 27200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // do nothing -- the data reference lives longer than the Parcel object 27300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 27400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 27600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread 27700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response 27800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * is not sent back up to the command process 27900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 28000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 28100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectissueLocalRequest(int request, void *data, int len) 28200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 28300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 28600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->local = 1; 28900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = 0xffffffff; // token is not used in this context 29000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 29100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 29300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 29600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("C[locl]> %s", requestToString(request)); 30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(request, data, len, pRI); 30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectprocessCommandBuffer(void *buffer, size_t buflen) 31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t request; 31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t token; 31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setData((uint8_t *) buffer, buflen); 31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // status checked at end 32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&request); 32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&token); 32300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid request block"); 32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) { 33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("unsupported request code %d token %d", request, token); 33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME this should perhaps return a response 33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = token; 33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* sLastDispatchedToken = token; */ 35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI->dispatchFunction(p, pRI); 35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectinvalidCommandBlock (RequestInfo *pRI) 35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid command block for token %d request %s", 36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */ 36500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchVoid (Parcel& p, RequestInfo *pRI) 36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project clearPrintBuf; 36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 37000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI); 37100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 37200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */ 37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchString (Parcel& p, RequestInfo *pRI) 37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 37700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 37800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *string8 = NULL; 38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project string8 = strdupReadString(p); 38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, string8); 38600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, string8, 39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(char *), pRI); 39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(string8); 39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(string8); 39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */ 40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchStrings (Parcel &p, RequestInfo *pRI) 40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t countStrings; 40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **pStrings; 41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&countStrings); 41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 41500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (countStrings == 0) { 42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // just some non-null pointer 42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(sizeof(char *)); 42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (((int)countStrings) == -1) { 42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = NULL; 42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(char *) * countStrings; 42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(datalen); 43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings[i] = strdupReadString(p); 43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, pStrings[i]); 43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 43700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI); 44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pStrings != NULL) { 44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (pStrings[i]); 44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pStrings[i]); 44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pStrings, 0, datalen); 45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */ 46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 46300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchInts (Parcel &p, RequestInfo *pRI) 46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t count; 46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *pInts; 46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&count); 47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || count == 0) { 47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(int) * count; 47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts = (int *)alloca(datalen); 47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < count ; i++) { 48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts[i] = (int)t; 48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, t); 48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts), 49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen, pRI); 49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pInts, 0, datalen); 50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 50300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_SMS_WriteArgs * 51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status 51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String pdu 51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchSmsWrite (Parcel &p, RequestInfo *pRI) 51700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 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 56600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchDial (Parcel &p, RequestInfo *pRI) 56700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dial; 56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&dial, 0, sizeof(dial)); 57300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.address = strdupReadString(p); 57500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.clir = (int)t; 57800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || dial.address == NULL) { 58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir); 58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeof(dial), pRI); 58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (dial.address); 59200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 59300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 59400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (dial.address); 59500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 59600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 59700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&dial, 0, sizeof(dial)); 59800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 59900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 60000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 60100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 60200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 60300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 60400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 60500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 60600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 60700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_SIM_IO * 60800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 60900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t command 61000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t fileid 61100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String path 61200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t p1, p2, p3 61300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String data 61400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String pin2 61500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 61600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 61700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchSIM_IO (Parcel &p, RequestInfo *pRI) 61800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 61900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO simIO; 62000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 62100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 62200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 62300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&simIO, 0, sizeof(simIO)); 62400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 62500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // note we only check status at the end 62600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 62700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 62800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.command = (int)t; 62900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 63000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 63100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.fileid = (int)t; 63200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 63300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.path = strdupReadString(p); 63400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 63500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 63600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p1 = (int)t; 63700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 63800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 63900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p2 = (int)t; 64000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 64100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 64200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p3 = (int)t; 64300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 64400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.data = strdupReadString(p); 64500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.pin2 = strdupReadString(p); 64600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 64700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 64800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s", printBuf, 64900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.command, simIO.fileid, (char*)simIO.path, 65000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p1, simIO.p2, simIO.p3, 65100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)simIO.data, (char*)simIO.pin2); 65200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 65300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 65400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 65500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 65600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 65700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 65800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 65900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, sizeof(simIO), pRI); 66000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.path); 66300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.data); 66400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.pin2); 66500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.path); 66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.data); 66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.pin2); 67000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&simIO, 0, sizeof(simIO)); 67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 67400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 68200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo * 68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status/action 68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t reason 68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t serviceCode 68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t toa 68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String number (0 length -> null) 68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t timeSeconds 69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchCallForward(Parcel &p, RequestInfo *pRI) 69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo cff; 69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&cff, 0, sizeof(cff)); 69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // note we only check status at the end 70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status = (int)t; 70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.reason = (int)t; 70700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 70900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.serviceClass = (int)t; 71000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.toa = (int)t; 71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = strdupReadString(p); 71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.timeSeconds = (int)t; 71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // special case: number 0-length fields is null 72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (cff.number != NULL && strlen (cff.number) == 0) { 72600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = NULL; 72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf, 73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status, cff.reason, cff.serviceClass, cff.toa, 73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)cff.number, cff.timeSeconds); 73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 73400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI); 73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 73900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(cff.number); 74000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (cff.number); 74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 74400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&cff, 0, sizeof(cff)); 74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 74700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 74800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 74900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 75300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectdispatchRaw(Parcel &p, RequestInfo *pRI) 75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t len; 75900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 76000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const void *data; 76100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&len); 76300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code writes -1 for null arrays 76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (((int)len) == -1) { 77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = NULL; 77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len = 0; 77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = p.readInplace(len); 77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sraw_size=%d", printBuf, len); 77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI); 78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 78400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 78500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 78900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 79000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectblockingWrite(int fd, const void *buffer, size_t len) 79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 79200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t writeOffset = 0; 79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const uint8_t *toWrite; 79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project toWrite = (const uint8_t *)buffer; 79600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (writeOffset < len) { 79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ssize_t written; 79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project written = write (fd, toWrite + writeOffset, 80100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len - writeOffset); 80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (written < 0 && errno == EINTR); 80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (written >= 0) { 80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeOffset += written; 80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { // written < 0 80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("RIL Response: unexpected error on write errno:%d", errno); 80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(fd); 80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 81000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 81100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectsendResponseRaw (const void *data, size_t dataSize) 81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int fd = s_fdCommand; 82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project uint32_t header; 82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 82600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (dataSize > MAX_COMMAND_BYTES) { 82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RIL: packet larger than %u (%u)", 82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project MAX_COMMAND_BYTES, (unsigned int )dataSize); 83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME is blocking here ok? issue #550970 83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_writeMutex); 83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project header = htonl(dataSize); 84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = blockingWrite(fd, (void *)&header, sizeof(header)); 84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 84400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 84500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 84600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project blockingWrite(fd, data, dataSize); 84800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 84900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 85000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 85100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 85200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_writeMutex); 85400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 85600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 85700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 85800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 85900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectsendResponse (Parcel &p) 86000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 86100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printResponse; 86200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return sendResponseRaw(p.data(), p.dataSize()); 86300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 86400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/ 86600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 86700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 86800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectresponseInts(Parcel &p, void *response, size_t responselen) 86900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 87000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numInts; 87100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 87200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 87300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 87400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 87500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 87600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(int) != 0) { 87700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d\n", 87800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(int)); 87900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 88000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 88100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 88200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *p_int = (int *) response; 88300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 88400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numInts = responselen / sizeof(int *); 88500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numInts); 88600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 88700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each int*/ 88800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 88900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numInts ; i++) { 89000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, p_int[i]); 89100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_int[i]); 89200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 89300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 89400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 89500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 89600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 89700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 89800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 89900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */ 90000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen) 90100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 90200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numStrings; 90300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 90400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 90500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 90600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 90700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 90800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(char *) != 0) { 90900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d\n", 91000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(char *)); 91100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 91200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 91300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 91400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 91500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (0); 91600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 91700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **p_cur = (char **) response; 91800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 91900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numStrings = responselen / sizeof(char *); 92000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numStrings); 92100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 92200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each string*/ 92300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 92400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numStrings ; i++) { 92500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]); 92600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur[i]); 92700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 92800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 92900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 93000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 93100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 93200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 93300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 93400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 93500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 93600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * NULL strings are accepted 93700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen 93800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 93900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen) 94000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 94100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* one string only */ 94200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 94300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, (char*)response); 94400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 94500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 94600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, (const char *)response); 94700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 94800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 94900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 95000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 95100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen) 95200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 95300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 95400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 95500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 95600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 95700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 95800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen) 95900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 96000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 96100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 96200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 96300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 96400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 96500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 96600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 96700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_Call *) != 0) { 96800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d\n", 96900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_Call *)); 97000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 97100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 97200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 97300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 97400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 97500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_Call *); 97600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 97700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 97800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 97900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Call *p_cur = ((RIL_Call **) response)[i]; 98000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each call info */ 98100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->state); 98200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 98300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 98400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMpty); 98500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMT); 98600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->als); 98700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isVoice); 98800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur->number); 98900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[%s,id=%d,toa=%d,%s,%s,als=%d,%s,%s],", printBuf, 99000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project callStateToString(p_cur->state), 99100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->index, p_cur->toa, 99200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->isMpty)?"mpty":"norm", 99300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->isMT)?"mt":"mo", 99400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->als, 99500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->isVoice)?"voc":"nonvoc", 99600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number); 99700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 99800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 99900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 100000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 100100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 100200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 100300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 100400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen) 100500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 100600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 100700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 100800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 100900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 101000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 101100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SMS_Response) ) { 101200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected %d", 101300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SMS_Response)); 101400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 101500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 101600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 101700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response; 101800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 101900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->messageRef); 102000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->ackPDU); 102100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 102200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 102300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,%s", printBuf, p_cur->messageRef, 102400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->ackPDU); 102500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 102600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 102700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 102800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 102900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 103000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseContexts(Parcel &p, void *response, size_t responselen) 103100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 103200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 103300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 103400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 103500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 103600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 103700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(RIL_PDP_Context_Response) != 0) { 103800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d", 103900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(RIL_PDP_Context_Response)); 104000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 104100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 104200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 104300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num = responselen / sizeof(RIL_PDP_Context_Response); 104400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 104500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 104600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_PDP_Context_Response *p_cur = (RIL_PDP_Context_Response *) response; 104700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 104800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int i; 104900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (i = 0; i < num; i++) { 105000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].cid); 105100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].active); 105200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].type); 105300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].apn); 105400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].address); 105500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%d,%s,%s,%s,%s],", printBuf, 105600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur[i].cid, 105700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur[i].active==0)?"down":"up", 105800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].type, 105900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].apn, 106000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].address); 106100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 106200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 106300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 106400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 106500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 106600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 106700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 106800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen) 106900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 107000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 107100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL with responselen != 0"); 107200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 107300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 107400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 107500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code reads -1 size as null byte array 107600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 107700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(-1); 107800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 107900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(responselen); 108000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.write(response, responselen); 108100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 108200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 108300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 108400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 108500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 108600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 108700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) 108800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 108900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 109000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 109100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 109200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 109300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 109400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SIM_IO_Response) ) { 109500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length was %d expected %d", 109600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SIM_IO_Response)); 109700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 109800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 109900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 110000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response; 110100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw1); 110200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw2); 110300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->simResponse); 110400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 110500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 110600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2, 110700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->simResponse); 110800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 110900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 111000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 111100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 111200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 111300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 111400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen) 111500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 111600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 111700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 111800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 111900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 112000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 112100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 112200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 112300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(RIL_CallForwardInfo *) != 0) { 112400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d", 112500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(RIL_CallForwardInfo *)); 112600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 112700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 112800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 112900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 113000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_CallForwardInfo *); 113100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 113200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 113300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 113400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 113500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i]; 113600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 113700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->status); 113800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->reason); 113900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->serviceClass); 114000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 114100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 114200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->timeSeconds); 114300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf, 114400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->status==1)?"enable":"disable", 114500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->reason, p_cur->serviceClass, p_cur->toa, 114600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number, 114700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->timeSeconds); 114800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 114900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 115000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 115100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 115200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 115300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 115400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 115500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen) 115600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 115700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 115800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 115900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 116000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 116100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 116200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof(RIL_SuppSvcNotification)) { 116300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length was %d expected %d", 116400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SuppSvcNotification)); 116500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 116600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 116700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 116800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response; 116900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->notificationType); 117000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->code); 117100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 117200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->type); 117300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 117400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 117500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 117600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf, 117700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->notificationType==0)?"mo":"mt", 117800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->code, p_cur->index, p_cur->type, 117900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number); 118000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 118100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 118200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 118300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 118400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 118500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen) 118600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 118700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 118800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 118900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 119000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 119100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 119200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 119300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 119400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_NeighboringCell *) != 0) { 119500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d\n", 119600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_NeighboringCell *)); 119700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 119800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 119900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 120000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 120100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of cell info's */ 120200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_NeighboringCell *); 120300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 120400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 120500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 120600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i]; 120700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 120800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each cell info */ 120900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->rssi); 121000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur->cid); 121100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 121200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf, 121300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cid, p_cur->rssi); 121400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 121500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 121600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 121700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 121800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 121900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 122000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 122100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void triggerEvLoop() 122200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 122300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 122400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!pthread_equal(pthread_self(), s_tid_dispatch)) { 122500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* trigger event loop to wakeup. No reason to do this, 122600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * if we're in the event loop thread */ 122700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 122800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = write (s_fdWakeupWrite, " ", 1); 122900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (ret < 0 && errno == EINTR); 123000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 123100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 123200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 123300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void rilEventAddWakeup(struct ril_event *ev) 123400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 123500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_add(ev); 123600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 123700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 123800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 123900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 124000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select() 124100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the 124200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down 124300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 124400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void processWakeupCallback(int fd, short flags, void *param) 124500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 124600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char buff[16]; 124700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 124800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 124900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGV("processWakeupCallback"); 125000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 125100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* empty our wakeup socket out */ 125200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 125300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = read(s_fdWakeupRead, &buff, sizeof(buff)); 125400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (ret > 0 || (ret < 0 && errno == EINTR)); 125500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 125600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 125700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void onCommandsSocketClosed() 125800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 125900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 126000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *p_cur; 126100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* mark pending requests as "cancelled" so we dont report responses */ 126300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 126500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 126600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur = s_pendingRequests; 126800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (p_cur = s_pendingRequests 127000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur != NULL 127100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur = p_cur->p_next 127200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 127300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cancelled = 1; 127400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 127500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 127600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 127700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 127800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 127900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 128000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void processCommandsCallback(int fd, short flags, void *param) 128100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 128200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 128300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *p_record; 128400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t recordlen; 128500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 128600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 128700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(fd == s_fdCommand); 128800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 128900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = (RecordStream *)param; 129000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 129100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (;;) { 129200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* loop until EAGAIN/EINTR, end of stream, or other error */ 129300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = record_stream_get_next(p_rs, &p_record, &recordlen); 129400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 129500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 && p_record == NULL) { 129600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* end-of-stream */ 129700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 129800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret < 0) { 129900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 130000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret == 0) { /* && p_record != NULL */ 130100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandBuffer(p_record, recordlen); 130200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 130300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 130400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 130500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) { 130600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* fatal error or end-of-stream */ 130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 130800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("error on reading command socket errno:%d\n", errno); 130900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGW("EOS. Closing command socket."); 131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 131400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 131500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_del(&s_commands_event); 131700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project record_stream_free(p_rs); 131900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 132000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 132100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 132200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 132300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 132400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 132500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 132600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 132700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 132800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void onNewCommandConnect() 132900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 133000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // implicit radio state changed 133100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, 133200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 133300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Send last NITZ time data, in case it was missed 133500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 133600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize); 133700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s_lastNITZTimeData); 133900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 134000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 134100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Get version string 134300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_callbacks.getVersion != NULL) { 134400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *version; 134500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project version = s_callbacks.getVersion(); 134600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("RIL Daemon version: %s\n", version); 134700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, version); 134900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 135000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("RIL Daemon version: unavailable\n"); 135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, "unavailable"); 135200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 135300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void listenCallback (int fd, short flags, void *param) 135700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 135800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 135900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int err; 136000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int is_phone_socket; 136100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 136200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 136400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ucred creds; 136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t szCreds = sizeof(creds); 136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct passwd *pwd = NULL; 137000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (s_fdCommand < 0); 137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (fd == s_fdListen); 137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen); 137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0 ) { 137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Error on accept() errno:%d", errno); 137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 138000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 138100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 138200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* check the credential of the other side and only accept socket from 138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * phone process 138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 138600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errno = 0; 138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project is_phone_socket = 0; 138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 138900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds); 139000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (err == 0 && szCreds > 0) { 139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errno = 0; 139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pwd = getpwuid(creds.uid); 139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pwd != NULL) { 139500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) { 139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project is_phone_socket = 1; 139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RILD can't accept socket from process %s", pwd->pw_name); 139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Error on getpwuid() errno: %d", errno); 140200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 140400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("Error on getsockopt() errno: %d", errno); 140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ( !is_phone_socket ) { 140800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RILD must accept socket from %s", PHONE_PROCESS); 140900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 141000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 141100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 141200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 141300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 141400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 141500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 141600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 141700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 141800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 141900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 142000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 142100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK); 142200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 142300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 142400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("Error setting O_NONBLOCK errno:%d", errno); 142500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 142600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 142700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("libril: new connection"); 142800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 142900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES); 143000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_commands_event, s_fdCommand, 1, 143200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandsCallback, p_rs); 143300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_commands_event); 143500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onNewCommandConnect(); 143700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 143800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 143900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) { 144000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 144100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (args[i] != NULL) { 144200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args[i]); 144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args); 144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void debugCallback (int fd, short flags, void *param) 144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 145000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int acceptFD, option; 145100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int data; 145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsigned int qxdm_data[6]; 145500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *deactData[1] = {"1"}; 145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *actData[1]; 145700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dialData; 145800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int hangupData[1] = {1}; 145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int number; 146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **args; 146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acceptFD = accept (fd, (sockaddr *) &peeraddr, &socklen); 146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (acceptFD < 0) { 146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error accepting on debug port: %d\n", errno); 146600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) { 147000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: number of Args: \n"); 147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args = (char **) malloc(sizeof(char*) * number); 147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 147500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 147600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int len; 147700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) { 147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: Len of Args: \n"); 147900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // +1 for null-term 148300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args[i] = (char *) malloc((sizeof(char) * len) + 1); 148400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, args[i], sizeof(char) * len, 0) 148500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project != sizeof(char) * len) { 148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: Args[%d] \n", i); 148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 148900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char * buf = args[i]; 149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project buf[len] = 0; 149200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (atoi(args[0])) { 149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 0: 149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Connection on debug port: issuing reset."); 149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0); 149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 1: 150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Connection on debug port: issuing radio power off."); 150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 0; 150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Close the socket 150400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 150500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 150600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 150700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 2: 150800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: issuing unsolicited network change."); 150900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED, 151000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 151100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 151200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 3: 151300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: QXDM log enable."); 151400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[0] = 65536; 151500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[1] = 16; 151600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[2] = 1; 151700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[3] = 32; 151800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 0; 151900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 8; 152000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 152100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 152200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 152300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 4: 152400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: QXDM log disable."); 152500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[0] = 65536; 152600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[1] = 16; 152700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[2] = 0; 152800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[3] = 32; 152900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 0; 153000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 8; 153100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 153200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 153300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 153400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 5: 153500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Radio On"); 153600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 1; 153700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 153800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sleep(2); 153900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Set network selection automatic. 154000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0); 154100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 154200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 6: 154300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Setup PDP, Apn :%s\n", args[1]); 154400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project actData[0] = args[1]; 154500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_SETUP_DEFAULT_PDP, &actData, 154600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(actData)); 154700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 154800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 7: 154900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Deactivate PDP"); 155000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_DEACTIVATE_DEFAULT_PDP, &deactData, 155100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(deactData)); 155200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 155300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 8: 155400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Dial Call"); 155500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.clir = 0; 155600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.address = args[1]; 155700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData)); 155800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 155900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 9: 156000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Answer Call"); 156100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0); 156200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 156300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 10: 156400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: End Call"); 156500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData, 156600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(hangupData)); 156700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 156800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 156900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("Invalid request"); 157000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 157100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(number, args); 157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(acceptFD); 157400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void userTimerCallback (int fd, short flags, void *param) 157800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 157900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 158000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *)param; 158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->p_callback(p_info->userParam); 158400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME generalize this...there should be a cancel mechanism 158700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) { 158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info = NULL; 158900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(p_info); 159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 159400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void * 159600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjecteventLoop(void *param) 159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int filedes[2]; 160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_init(); 160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 1; 160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_broadcast(&s_startupCond); 160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 160900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pipe(filedes); 161100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 161300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Error in pipe() errno:%d", errno); 161400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 161500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 161600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupRead = filedes[0]; 161800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupWrite = filedes[1]; 161900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK); 162100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true, 162300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processWakeupCallback, NULL); 162400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_wakeupfd_event); 162600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Only returns on error 162800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_loop(); 162900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error in event_loop_base errno:%d", errno); 163000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 163100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 163200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 163300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 163400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 163500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_startEventLoop(void) 163600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 163700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 163800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_t attr; 163900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 164000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* spin up eventLoop thread and wait for it to get started */ 164100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 0; 164200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 164300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 164400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_init (&attr); 164500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 164600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL); 164700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 164800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (s_started == 0) { 164900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_wait(&s_startupCond, &s_startupMutex); 165000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 165100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 165200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 165300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 165400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 165500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to create dispatch thread errno:%d", errno); 165600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 165700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 165800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 165900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only. 166100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) { 166200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 166300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 166400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 166600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_register (const RIL_RadioFunctions *callbacks) 166700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 166800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 166900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int flags; 167000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (callbacks == NULL 167200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project || ! (callbacks->version == RIL_VERSION || callbacks->version == 1) 167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE( 167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project "RIL_register: RIL_RadioFunctions * null or invalid version" 167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project " (expected %d)", RIL_VERSION); 167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 167800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled > 0) { 168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RIL_register has been called more than once. " 168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project "Subsequent call ignored"); 168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 168400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_registerCalled = 1; 168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Little self-check 169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < (int)NUM_ELEMS(s_commands) ; i++) { 169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(i == s_commands[i].requestNumber); 169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses) ; i++) { 169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(i + RIL_UNSOL_RESPONSE_BASE 169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project == s_unsolResponses[i].requestNumber); 169900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // New rild impl calls RIL_startEventLoop() first 170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // old standalone impl wants it here. 170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_started == 0) { 170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_startEventLoop(); 170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start listen socket 170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0 171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = socket_local_server (SOCKET_NAME_RIL, 171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 171400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 171500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Unable to bind socket errno:%d", errno); 171600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit (-1); 171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 171800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = ret; 171900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 172000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 172100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = android_get_control_socket(SOCKET_NAME_RIL); 172200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdListen < 0) { 172300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to get socket '" SOCKET_NAME_RIL "'"); 172400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 172500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 172600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 172700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdListen, 4); 172800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 172900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 173000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to listen on control socket '%d': %s", 173100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen, strerror(errno)); 173200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 173300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 173400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 173500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 173600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 173700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* note: non-persistent so we can accept only one connection at a time */ 173800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_listen_event, s_fdListen, false, 173900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project listenCallback, NULL); 174000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 174100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_listen_event); 174200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 174300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1 174400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start debug interface socket 174500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 174600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG); 174700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdDebug < 0) { 174800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno); 174900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 175000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 175100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 175200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdDebug, 4); 175300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 175400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 175500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to listen on ril debug socket '%d': %s", 175600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug, strerror(errno)); 175700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 175800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 175900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_debug_event, s_fdDebug, true, 176100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project debugCallback, NULL); 176200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_debug_event); 176400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 176500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 176700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 176800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 176900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectcheckAndDequeueRequestInfo(struct RequestInfo *pRI) 177000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 177100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret = 0; 177200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == NULL) { 177400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 177500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 177600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_pendingRequestsMutex); 177800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 177900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for(RequestInfo **ppCur = &s_pendingRequests 178000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; *ppCur != NULL 178100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; ppCur = &((*ppCur)->p_next) 178200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 178300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == *ppCur) { 178400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = 1; 178500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 178600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *ppCur = (*ppCur)->p_next; 178700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 178800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 178900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 179000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_pendingRequestsMutex); 179200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 179400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 179500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 179700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 179800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) 179900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 180000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 180100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 180200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t errorOffset; 180300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 180400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)t; 180500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 180600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!checkAndDequeueRequestInfo(pRI)) { 180700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("RIL_onRequestComplete: invalid RIL_Token"); 180800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 180900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 181000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 181100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->local > 0) { 181200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Locally issued command...void only! 181300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // response does not go back up the command socket 181400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber)); 181500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 181600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto done; 181700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 181800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 181900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[%04d]< %s", 182000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 182100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 182200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->cancelled == 0) { 182300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 182400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 182500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_SOLICITED); 182600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (pRI->token); 182700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errorOffset = p.dataPosition(); 182800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 182900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (e); 183000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 183100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (e == RIL_E_SUCCESS) { 183200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* process response on success */ 183300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pRI->pCI->responseFunction(p, response, responselen); 183400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 183500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* if an error occurred, rewind and mark it */ 183600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 183700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setDataPosition(errorOffset); 183800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (ret); 183900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 184000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 184100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s returns %s", printBuf, failCauseToString(e)); 184200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 184300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 184400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 184500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD ("RIL onRequestComplete: Command channel closed"); 184600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 184700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponse(p); 184800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 184900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 185000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone: 185100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pRI); 185200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 185300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 185400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 185500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 185600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectgrabPartialWakeLock() 185700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 185800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME); 185900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 186000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 186100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 186200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectreleaseWakeLock() 186300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 186400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project release_wake_lock(ANDROID_WAKE_LOCK_NAME); 186500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 186600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 186700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 186800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout 186900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 187000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 187100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectwakeTimeoutCallback (void *param) 187200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 187300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // We're using "param != NULL" as a cancellation mechanism 187400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (param == NULL) { 187500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project //LOGD("wakeTimeout: releasing wake lock"); 187600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 187700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 187800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 187900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project //LOGD("wakeTimeout: releasing wake lock CANCELLED"); 188000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 188100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 188200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 188300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" 188400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data, 188500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen) 188600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 188700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int unsolResponseIndex; 188800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 188900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int64_t timeReceived = 0; 189000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project bool shouldScheduleTimeout = false; 189100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 189200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled == 0) { 189300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Ignore RIL_onUnsolicitedResponse before RIL_register 189400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGW("RIL_onUnsolicitedResponse called before RIL_register"); 189500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 189600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 189700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 189800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE; 189900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 190000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ((unsolResponseIndex < 0) 190100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) { 190200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("unsupported unsolicited response code %d", unsolResponse); 190300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 190400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 190500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 190600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Grab a wake lock if needed for this reponse, 190700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // as we exit we'll either release it immediately 190800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // or set a timer to release it later. 190900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (s_unsolResponses[unsolResponseIndex].wakeType) { 191000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case WAKE_PARTIAL: 191100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project grabPartialWakeLock(); 191200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = true; 191300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 191400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 191500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case DONT_WAKE: 191600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 191700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // No wake lock is grabed so don't set timeout 191800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = false; 191900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 192000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 192100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 192200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Mark the time this was received, doing this 192300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // after grabing the wakelock incase getting 192400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the elapsedRealTime might cause us to goto 192500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // sleep. 192600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 192700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project timeReceived = elapsedRealtime(); 192800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 192900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse)); 193100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 193300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_UNSOLICITED); 193500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (unsolResponse); 193600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 193700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = s_unsolResponses[unsolResponseIndex] 193800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project .responseFunction(p, data, datalen); 193900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 194000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Problem with the response. Don't continue; 194100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto error_exit; 194200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 194300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 194400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // some things get more payload 194500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(unsolResponse) { 194600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 194700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(s_callbacks.onStateRequest()); 194800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s {%s}", printBuf, 194900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project radioStateToString(s_callbacks.onStateRequest())); 195000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 195100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 195200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 195300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: 195400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Store the time that this was received so the 195500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // handler of this message can account for 195600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the time it takes to arrive and process. In 195700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // particular the system has been known to sleep 195800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // before this message can be processed. 195900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt64(timeReceived); 196000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 196100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 196200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 196300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = sendResponse(p); 196400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 196500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 196600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Unfortunately, NITZ time is not poll/update like everything 196700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // else in the system. So, if the upstream client isn't connected, 196800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // keep a copy of the last NITZ response (with receive time noted 196900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // above) around so we can deliver it when it is connected 197000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 197100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 197200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (s_lastNITZTimeData); 197300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 197400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 197500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 197600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = malloc(p.dataSize()); 197700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeDataSize = p.dataSize(); 197800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(s_lastNITZTimeData, p.data(), p.dataSize()); 197900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 198000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 198100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT 198200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME The java code should handshake here to release wake lock 198300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 198400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 198500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Cancel the previous request 198600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL) { 198700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info->userParam = (void *)1; 198800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 198900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 199000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info 199100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project = internalRequestTimedCallback(wakeTimeoutCallback, NULL, 199200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project &TIMEVAL_WAKE_TIMEOUT); 199300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 199400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 199500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Normal exit 199600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 199700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 199800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit: 199900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // There was an error and we've got the wake lock so release it. 200000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 200100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 200200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 200300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 200400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 200500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** FIXME generalize this if you track UserCAllbackInfo, clear it 200600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project when the callback occurs 200700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 200800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * 200900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectinternalRequestTimedCallback (RIL_TimedCallback callback, void *param, 201000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const struct timeval *relativeTime) 201100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 201300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct timeval myRelativeTime; 201400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 201500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo)); 201700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 201800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->p_callback = callback; 201900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->userParam = param; 202000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 202100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (relativeTime == NULL) { 202200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* treat null parameter as a 0 relative time */ 202300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&myRelativeTime, 0, sizeof(myRelativeTime)); 202400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 202500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* FIXME I think event_add's tv param is really const anyway */ 202600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime)); 202700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 202800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info); 203000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_timer_add(&(p_info->event), &myRelativeTime); 203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 203300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return p_info; 203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 203600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 203700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 203900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_requestTimedCallback (RIL_TimedCallback callback, void *param, 204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const struct timeval *relativeTime) 204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project internalRequestTimedCallback (callback, param, relativeTime); 204300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 204400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 204500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 204600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectfailCauseToString(RIL_Errno e) 204700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 204800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(e) { 204900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SUCCESS: return "E_SUCCESS"; 205000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE"; 205100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE"; 205200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT"; 205300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PIN2: return "E_SIM_PIN2"; 205400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PUK2: return "E_SIM_PUK2"; 205500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED"; 205600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_CANCELLED: return "E_CANCELLED"; 205700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL"; 205800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW"; 205900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY"; 206000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown error>"; 206100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 206200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 206300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 206400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 206500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectradioStateToString(RIL_RadioState s) 206600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 206700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 206800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_OFF: return "RADIO_OFF"; 206900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE"; 207000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY"; 207100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT"; 207200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY"; 207300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 207400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 207500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 207600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 207700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 207800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectcallStateToString(RIL_CallState s) 207900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 208000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 208100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ACTIVE : return "ACTIVE"; 208200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_HOLDING: return "HOLDING"; 208300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_DIALING: return "DIALING"; 208400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ALERTING: return "ALERTING"; 208500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_INCOMING: return "INCOMING"; 208600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_WAITING: return "WAITING"; 208700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 208800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 208900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 209000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 209100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 209200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectrequestToString(int request) 209300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 209400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* 209500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \ 209600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 209700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 209800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 209900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 210000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \ 210100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 210200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/' 210300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 210400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 210500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(request) { 210600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS"; 210700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN"; 210800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK"; 210900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2"; 211000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2"; 211100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN"; 211200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2"; 211300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION"; 211400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS"; 211500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DIAL: return "DIAL"; 211600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMSI: return "GET_IMSI"; 211700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP: return "HANGUP"; 211800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND"; 211900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 212000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 212100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CONFERENCE: return "CONFERENCE"; 212200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_UDUB: return "UDUB"; 212300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE"; 212400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; 212500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_REGISTRATION_STATE: return "REGISTRATION_STATE"; 212600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GPRS_REGISTRATION_STATE: return "GPRS_REGISTRATION_STATE"; 212700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OPERATOR: return "OPERATOR"; 212800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER"; 212900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF: return "DTMF"; 213000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS: return "SEND_SMS"; 213100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE"; 213200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SETUP_DEFAULT_PDP: return "SETUP_DEFAULT_PDP"; 213300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIM_IO: return "SIM_IO"; 213400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_USSD: return "SEND_USSD"; 213500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD"; 213600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CLIR: return "GET_CLIR"; 213700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CLIR: return "SET_CLIR"; 213800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS"; 213900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD"; 214000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING"; 214100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING"; 214200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE"; 214300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEI: return "GET_IMEI"; 214400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV"; 214500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ANSWER: return "ANSWER"; 214600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DEACTIVATE_DEFAULT_PDP: return "DEACTIVATE_DEFAULT_PDP"; 214700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK"; 214800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK"; 214900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD"; 215000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE"; 215100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC"; 215200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL"; 215300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS "; 215400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_START: return "DTMF_START"; 215500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP"; 215600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION"; 215700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION"; 215800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE"; 215900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE"; 216000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS"; 216100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_MUTE: return "SET_MUTE"; 216200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_MUTE: return "GET_MUTE"; 216300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP"; 216400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_LAST_PDP_FAIL_CAUSE: return "LAST_PDP_FAIL_CAUSE"; 216500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_PDP_CONTEXT_LIST: return "PDP_CONTEXT_LIST"; 216600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO"; 216700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW"; 216800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS"; 216900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE"; 217000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE"; 217100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE"; 217200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE"; 217300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND"; 217400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE"; 217500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 217600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE"; 217700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER"; 217800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES"; 217900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 218000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 218100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 218200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED"; 218300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS"; 218400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 218500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 218600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD"; 218700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)"; 218800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED"; 218900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH"; 219000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END"; 219100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND"; 219200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY"; 219300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP"; 219400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL"; 219500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH"; 219600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_PDP_CONTEXT_LIST_CHANGED: return "UNSOL_PDP_CONTEXT_LIST_CHANGED"; 219700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING"; 219800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown request>"; 219900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */ 2203