ril.cpp revision af1298d72fd6a8b2d5bed7db15f6d181240fce83
100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* //device/libs/telephony/ril.cpp 200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** Copyright 2006, The Android Open Source Project 400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 57f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Licensed under the Apache License, Version 2.0 (the "License"); 67f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** you may not use this file except in compliance with the License. 77f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** You may obtain a copy of the License at 800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 97f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** http://www.apache.org/licenses/LICENSE-2.0 1000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** 117f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** Unless required by applicable law or agreed to in writing, software 127f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** distributed under the License is distributed on an "AS IS" BASIS, 137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville** See the License for the specific language governing permissions and 1500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project** limitations under the License. 1600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 1700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define LOG_TAG "RILC" 1900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <hardware_legacy/power.h> 2100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <telephony/ril.h> 23f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#include <telephony/ril_cdma_sms.h> 2400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/sockets.h> 2500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 2600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/record_stream.h> 2700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/Log.h> 2800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <utils/SystemClock.h> 2900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pthread.h> 308a3c48c4eac62f9c25ab3f0dbfd8f829a1e32778Mathias Agopian#include <binder/Parcel.h> 3100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/jstring.h> 3200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/types.h> 3400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <pwd.h> 3500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdio.h> 3700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdlib.h> 3800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <stdarg.h> 3900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <string.h> 4000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <unistd.h> 4100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <fcntl.h> 4200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <time.h> 4300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <errno.h> 4400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ctype.h> 4600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <alloca.h> 4700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <sys/un.h> 4800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <assert.h> 4900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <netinet/in.h> 5000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <cutils/properties.h> 5100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include <ril_event.h> 5300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectnamespace android { 5500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PHONE_PROCESS "radio" 5700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL "rild" 5900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define SOCKET_NAME_RIL_DEBUG "rild-debug" 6000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define ANDROID_WAKE_LOCK_NAME "radio-interface" 6200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PROPERTY_RIL_IMPL "gsm.version.ril-impl" 6500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// match with constant in RIL.java 6700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MAX_COMMAND_BYTES (8 * 1024) 6800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Basically: memset buffers that the client library 7000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// shouldn't be using anymore in an attempt to find 7100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// memory usage issues sooner. 7200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define MEMSET_FREED 1 7300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define NUM_ELEMS(a) (sizeof (a) / sizeof (a)[0]) 7500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#define MIN(a,b) ((a)<(b) ? (a) : (b)) 77f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 7800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Constants for response types */ 7900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_SOLICITED 0 8000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RESPONSE_UNSOLICITED 1 8100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* Negative values for private RIL errno's */ 8300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RIL_ERRNO_INVALID_RESPONSE -1 8400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// request, response, and unsolicited msg print macro 8600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define PRINTBUF_SIZE 8096 8700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Enable RILC log 8900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#define RILC_LOG 0 9000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 9200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest sprintf(printBuf, "(") 9300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest sprintf(printBuf, "%s)", printBuf) 9400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) \ 9500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("[%04d]> %s %s", token, requestToString(req), printBuf) 9600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 9700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse sprintf(printBuf, "%s {", printBuf) 9800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse sprintf(printBuf, "%s}", printBuf) 9900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printResponse LOGD("%s", printBuf) 10000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 10100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf printBuf[0] = 0 10200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar printBuf[strlen(printBuf)-1] = 0 10300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) sprintf(printBuf, x) 10400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 10500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startRequest 10600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeRequest 10700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printRequest(token, req) 10800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define startResponse 10900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define closeResponse 11000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define printResponse 11100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define clearPrintBuf 11200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define removeLastChar 11300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project #define appendPrintBuf(x...) 11400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 11500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectenum WakeType {DONT_WAKE, WAKE_PARTIAL}; 11700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 11800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 11900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 12000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI); 12100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int(*responseFunction) (Parcel &p, void *response, size_t responselen); 12200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} CommandInfo; 12300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 12400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct { 12500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int requestNumber; 12600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int (*responseFunction) (Parcel &p, void *response, size_t responselen); 12700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project WakeType wakeType; 12800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UnsolResponseInfo; 12900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 13000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecttypedef struct RequestInfo { 1317f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville int32_t token; //this is not RIL_Token 13200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project CommandInfo *pCI; 13300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct RequestInfo *p_next; 13400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char cancelled; 13500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char local; // responses to local commands do not go back to command process 13600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} RequestInfo; 13700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savilletypedef struct UserCallbackInfo { 13900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_TimedCallback p_callback; 14000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *userParam; 14100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ril_event event; 14200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct UserCallbackInfo *p_next; 14300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} UserCallbackInfo; 14400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1450d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn 14600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 14700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source ProjectRIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL}; 14900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_registerCalled = 0; 15000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_dispatch; 15200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_t s_tid_reader; 15300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_started = 0; 15400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdListen = -1; 15600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdCommand = -1; 15700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdDebug = -1; 15800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupRead; 16000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int s_fdWakeupWrite; 16100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_commands_event; 16300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wakeupfd_event; 16400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_listen_event; 16500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_wake_timeout_event; 16600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic struct ril_event s_debug_event; 16700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0}; 17000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER; 17200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER; 17300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER; 17400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER; 17500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER; 17700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER; 17800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_pendingRequests = NULL; 18000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchHead = NULL; 18200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic RequestInfo *s_toDispatchTail = NULL; 18300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo *s_last_wake_timeout_info = NULL; 18500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void *s_lastNITZTimeData = NULL; 18700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic size_t s_lastNITZTimeDataSize; 18800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 18900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if RILC_LOG 19000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project static char printBuf[PRINTBUF_SIZE]; 19100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 19200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/*******************************************************************/ 19400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 19500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchVoid (Parcel& p, RequestInfo *pRI); 19600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchString (Parcel& p, RequestInfo *pRI); 19700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchStrings (Parcel& p, RequestInfo *pRI); 19800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchInts (Parcel& p, RequestInfo *pRI); 19900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchDial (Parcel& p, RequestInfo *pRI); 20000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSIM_IO (Parcel& p, RequestInfo *pRI); 20100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchCallForward(Parcel& p, RequestInfo *pRI); 20200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchRaw(Parcel& p, RequestInfo *pRI); 20300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void dispatchSmsWrite (Parcel &p, RequestInfo *pRI); 2044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall (Parcel& p, RequestInfo *pRI); 20500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 206f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSms(Parcel &p, RequestInfo *pRI); 207f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI); 208a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI); 209f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); 210f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI); 21100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseInts(Parcel &p, void *response, size_t responselen); 21200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseStrings(Parcel &p, void *response, size_t responselen); 21300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseString(Parcel &p, void *response, size_t responselen); 21400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseVoid(Parcel &p, void *response, size_t responselen); 21500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallList(Parcel &p, void *response, size_t responselen); 21600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSMS(Parcel &p, void *response, size_t responselen); 21700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSIM_IO(Parcel &p, void *response, size_t responselen); 21800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCallForwards(Parcel &p, void *response, size_t responselen); 219f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen); 2204380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen); 22100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseRaw(Parcel &p, void *response, size_t responselen); 22200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseSsn(Parcel &p, void *response, size_t responselen); 223f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen); 224a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen); 225a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen); 226f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen); 22700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int responseCellList(Parcel &p, void *response, size_t responselen); 2283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen); 2293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseRilSignalStrength(Parcel &p,void *response, size_t responselen); 2303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen); 2313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen); 2323d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen); 23300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * requestToString(int request); 23500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * failCauseToString(RIL_Errno); 23600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * callStateToString(RIL_CallState); 23700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" const char * radioStateToString(RIL_RadioState); 23800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef RIL_SHLIB 2407f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data, 24100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen); 24200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 24300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2447f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic UserCallbackInfo * internalRequestTimedCallback 2450d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn (RIL_TimedCallback callback, void *param, 2460d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime); 24700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 24800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Index == requestNumber */ 24900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic CommandInfo s_commands[] = { 25000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_commands.h" 25100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 25200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UnsolResponseInfo s_unsolResponses[] = { 25400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#include "ril_unsol_commands.h" 25500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project}; 25600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic char * 259f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillestrdupReadString(Parcel &p) { 26000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 26100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char16_t *s16; 2627f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 26300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = p.readString16Inplace(&stringlen); 2647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 26500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return strndup16to8(s16, stringlen); 26600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 26700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 268f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void writeStringToParcel(Parcel &p, const char *s) { 26900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char16_t *s16; 27000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t s16_len; 27100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s16 = strdup8to16(s, &s16_len); 27200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeString16(s16, s16_len); 27300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s16); 27400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 27500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 278f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillememsetString (char *s) { 27900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s != NULL) { 28000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (s, 0, strlen(s)); 28100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 28200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 28300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 28400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid nullParcelReleaseFunction (const uint8_t* data, size_t dataSize, 28500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const size_t* objects, size_t objectsSize, 286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* cookie) { 28700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // do nothing -- the data reference lives longer than the Parcel object 28800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 28900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2907f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 29100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * To be called from dispatch thread 29200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Issue a single local request, ensuring that the response 2937f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * is not sent back up to the command process 29400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 29500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 296f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleissueLocalRequest(int request, void *data, int len) { 29700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 29800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 29900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 30100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->local = 1; 30300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = 0xffffffff; // token is not used in this context 30400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 30500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 30700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 30800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 30900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 31000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 31100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 31300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 31400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("C[locl]> %s", requestToString(request)); 31600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 31700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(request, data, len, pRI); 31800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 31900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 32200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 323f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleprocessCommandBuffer(void *buffer, size_t buflen) { 32400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 32500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 32600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t request; 32700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t token; 32800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 32900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 33000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setData((uint8_t *) buffer, buflen); 33200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // status checked at end 33400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&request); 33500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&token); 33600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 33700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 33800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid request block"); 33900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 34000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 34100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) { 34300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("unsupported request code %d token %d", request, token); 34400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME this should perhaps return a response 34500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 34600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 34700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 34900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo)); 35000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token = token; 35200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->pCI = &(s_commands[request]); 35300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 35500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 35600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 35700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->p_next = s_pendingRequests; 35800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_pendingRequests = pRI; 35900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 36100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 36200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* sLastDispatchedToken = token; */ 36400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 3657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pRI->pCI->dispatchFunction(p, pRI); 36600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 36700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 36800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 36900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 371f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleinvalidCommandBlock (RequestInfo *pRI) { 3727f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid command block for token %d request %s", 37300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 37400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 37500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 37600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects NULL */ 3777f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 378f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchVoid (Parcel& p, RequestInfo *pRI) { 37900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project clearPrintBuf; 38000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 38100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI); 38200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 38300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 38400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char * */ 38500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 386f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchString (Parcel& p, RequestInfo *pRI) { 38700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 38800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 38900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t stringlen; 39000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *string8 = NULL; 39100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project string8 = strdupReadString(p); 39300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 39500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, string8); 39600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 39700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 39800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 39900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, string8, 40000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(char *), pRI); 40100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 40300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(string8); 40400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 40500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 40600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(string8); 40700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 40800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 40900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 41000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 41100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 41200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 41300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const char ** */ 41400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 415f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchStrings (Parcel &p, RequestInfo *pRI) { 41600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t countStrings; 41700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 41800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 41900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **pStrings; 42000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&countStrings); 42200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 42400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 42500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 42600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 42700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 42800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (countStrings == 0) { 42900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // just some non-null pointer 43000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(sizeof(char *)); 43100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 43200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (((int)countStrings) == -1) { 43300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = NULL; 43400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = 0; 43500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 43600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(char *) * countStrings; 4377f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 43800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings = (char **)alloca(datalen); 43900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 44100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pStrings[i] = strdupReadString(p); 44200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, pStrings[i]); 44300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 44400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 44500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 44600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 44700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 44800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 44900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI); 45000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pStrings != NULL) { 45200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < countStrings ; i++) { 45300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 45400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (pStrings[i]); 45500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 45600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pStrings[i]); 45700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 45800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 45900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 46000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pStrings, 0, datalen); 46100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 46200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 4637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 46400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 46500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 46600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 46700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 46800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 46900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** Callee expects const int * */ 47100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 472f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchInts (Parcel &p, RequestInfo *pRI) { 47300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t count; 47400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 47500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen; 47600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *pInts; 47700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 47800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32 (&count); 47900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || count == 0) { 48100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 48200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 48300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen = sizeof(int) * count; 48500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts = (int *)alloca(datalen); 48600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 48700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 48800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < count ; i++) { 48900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 49000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 49200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pInts[i] = (int)t; 49300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, t); 49400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 49500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 49600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 49700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 49800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 49900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 50000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 50100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 50200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts), 50400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project datalen, pRI); 50500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 50600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 50700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(pInts, 0, datalen); 50800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 50900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 51100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 51200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 51300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 51400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 51500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 51600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SMS_WriteArgs * 51900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 52000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status 52100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String pdu 52200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 52300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 524f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSmsWrite (Parcel &p, RequestInfo *pRI) { 52500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_WriteArgs args; 52600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 52700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 52800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 52900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&args, 0, sizeof(args)); 53000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 53200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.status = (int)t; 53300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.pdu = strdupReadString(p); 53500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 53600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || args.pdu == NULL) { 53700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 53800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 53900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 54000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args.smsc = strdupReadString(p); 54100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 54200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 54300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status, 54400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)args.pdu, (char*)args.smsc); 54500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 54600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 5477f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 54800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI); 54900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 55000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 55100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (args.pdu); 55200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 55300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 55400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (args.pdu); 5557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 55600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 55700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&args, 0, sizeof(args)); 55800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 55900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 56000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 56100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 56200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 56300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 56400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 56500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5667f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 5677f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_Dial * 56800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 56900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String address 57000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t clir 57100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 57200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 573f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchDial (Parcel &p, RequestInfo *pRI) { 57400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dial; 57574fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info uusInfo; 5767bce082edcee07339ebb06a35970b4b218ab8288Wink Saville int32_t sizeOfDial; 57700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 57874fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t uusPresent; 57900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 58000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&dial, 0, sizeof(dial)); 58200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.address = strdupReadString(p); 58400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 58600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dial.clir = (int)t; 58700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 58800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR || dial.address == NULL) { 58900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 59000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 59100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 5923a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3 59374fa38884320698c1623764850e3131b9769dff0Wink Saville uusPresent = 0; 5947bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *); 59574fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 59674fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&uusPresent); 59774fa38884320698c1623764850e3131b9769dff0Wink Saville 59874fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 59974fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 60074fa38884320698c1623764850e3131b9769dff0Wink Saville } 60174fa38884320698c1623764850e3131b9769dff0Wink Saville 60274fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent == 0) { 60374fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = NULL; 60474fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 60574fa38884320698c1623764850e3131b9769dff0Wink Saville int32_t len; 60674fa38884320698c1623764850e3131b9769dff0Wink Saville 60774fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 60874fa38884320698c1623764850e3131b9769dff0Wink Saville 60974fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 61074fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusType = (RIL_UUS_Type) t; 61174fa38884320698c1623764850e3131b9769dff0Wink Saville 61274fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&t); 61374fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusDcs = (RIL_UUS_DCS) t; 61474fa38884320698c1623764850e3131b9769dff0Wink Saville 61574fa38884320698c1623764850e3131b9769dff0Wink Saville status = p.readInt32(&len); 61674fa38884320698c1623764850e3131b9769dff0Wink Saville if (status != NO_ERROR) { 61774fa38884320698c1623764850e3131b9769dff0Wink Saville goto invalid; 61874fa38884320698c1623764850e3131b9769dff0Wink Saville } 61974fa38884320698c1623764850e3131b9769dff0Wink Saville 62074fa38884320698c1623764850e3131b9769dff0Wink Saville // The java code writes -1 for null arrays 62174fa38884320698c1623764850e3131b9769dff0Wink Saville if (((int) len) == -1) { 62274fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = NULL; 62374fa38884320698c1623764850e3131b9769dff0Wink Saville len = 0; 62474fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 62574fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusData = (char*) p.readInplace(len); 62674fa38884320698c1623764850e3131b9769dff0Wink Saville } 62774fa38884320698c1623764850e3131b9769dff0Wink Saville 62874fa38884320698c1623764850e3131b9769dff0Wink Saville uusInfo.uusLength = len; 62974fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo = &uusInfo; 63074fa38884320698c1623764850e3131b9769dff0Wink Saville } 6317bce082edcee07339ebb06a35970b4b218ab8288Wink Saville sizeOfDial = sizeof(dial); 63274fa38884320698c1623764850e3131b9769dff0Wink Saville } 63374fa38884320698c1623764850e3131b9769dff0Wink Saville 63400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 63500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir); 63674fa38884320698c1623764850e3131b9769dff0Wink Saville if (uusPresent) { 63774fa38884320698c1623764850e3131b9769dff0Wink Saville appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf, 63874fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusType, dial.uusInfo->uusDcs, 63974fa38884320698c1623764850e3131b9769dff0Wink Saville dial.uusInfo->uusLength); 64074fa38884320698c1623764850e3131b9769dff0Wink Saville } 64100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 64200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 64300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6447bce082edcee07339ebb06a35970b4b218ab8288Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI); 64500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 64600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 64700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (dial.address); 64800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 64900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 65000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (dial.address); 6517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 65200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 65374fa38884320698c1623764850e3131b9769dff0Wink Saville memset(&uusInfo, 0, sizeof(RIL_UUS_Info)); 65400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&dial, 0, sizeof(dial)); 65500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 65600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 65700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 65800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 65900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 66000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 66100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 66200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6637f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** 6647f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * Callee expects const RIL_SIM_IO * 66500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 66600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t command 66700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t fileid 66800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String path 66900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t p1, p2, p3 6707f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String data 6717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * String pin2 67200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 67300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 674f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchSIM_IO (Parcel &p, RequestInfo *pRI) { 67500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO simIO; 67600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 67700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 67800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 67900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&simIO, 0, sizeof(simIO)); 68000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6817f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 6827f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 68300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 68400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.command = (int)t; 68500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 68700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.fileid = (int)t; 68800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 68900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.path = strdupReadString(p); 69000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 69100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 69200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p1 = (int)t; 69300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 69400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 69500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p2 = (int)t; 69600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 69700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 69800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p3 = (int)t; 69900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.data = strdupReadString(p); 70100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.pin2 = strdupReadString(p); 70200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 70300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 70400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s", printBuf, 70500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.command, simIO.fileid, (char*)simIO.path, 70600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project simIO.p1, simIO.p2, simIO.p3, 70700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)simIO.data, (char*)simIO.pin2); 70800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 70900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 7107f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 71100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 71200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 71300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 71400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, sizeof(simIO), pRI); 71600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 71700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 71800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.path); 71900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.data); 72000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString (simIO.pin2); 72100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 72200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 72300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.path); 72400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.data); 72500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (simIO.pin2); 7267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 72700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 72800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&simIO, 0, sizeof(simIO)); 72900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 73000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 73200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 73300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 73400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 73500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 73600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 73700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 73800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Callee expects const RIL_CallForwardInfo * 73900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Payload is: 74000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t status/action 74100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t reason 74200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t serviceCode 74300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t toa 74400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * String number (0 length -> null) 74500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * int32_t timeSeconds 74600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 7477f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 748f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCallForward(Parcel &p, RequestInfo *pRI) { 74900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo cff; 75000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t t; 75100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 75200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&cff, 0, sizeof(cff)); 75400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 7557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville // note we only check status at the end 75600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 75700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 75800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status = (int)t; 7597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 76000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 76100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.reason = (int)t; 76200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 76400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.serviceClass = (int)t; 76500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 76700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.toa = (int)t; 76800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 76900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = strdupReadString(p); 77000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&t); 77200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.timeSeconds = (int)t; 77300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 77500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 77600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 77700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 77800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // special case: number 0-length fields is null 77900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 78000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (cff.number != NULL && strlen (cff.number) == 0) { 78100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.number = NULL; 78200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 78300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 78400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 78500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf, 78600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cff.status, cff.reason, cff.serviceClass, cff.toa, 78700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)cff.number, cff.timeSeconds); 78800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 78900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 79000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI); 79200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 79400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memsetString(cff.number); 79500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 79600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (cff.number); 79800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 79900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#ifdef MEMSET_FREED 80000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset(&cff, 0, sizeof(cff)); 80100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 80200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 80400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 80500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 80600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 80700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 80800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 80900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8107f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 811f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchRaw(Parcel &p, RequestInfo *pRI) { 81200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int32_t len; 81300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status_t status; 81400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const void *data; 81500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project status = p.readInt32(&len); 81700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 81800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (status != NO_ERROR) { 81900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto invalid; 82000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 82100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code writes -1 for null arrays 82300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (((int)len) == -1) { 82400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = NULL; 82500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len = 0; 8267f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } 82700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 82800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = p.readInplace(len); 82900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startRequest; 83100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%sraw_size=%d", printBuf, len); 83200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeRequest; 83300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printRequest(pRI->token, pRI->pCI->requestNumber); 83400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI); 83600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 83700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 83800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectinvalid: 83900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project invalidCommandBlock(pRI); 84000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 84100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 84200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 8437f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 844f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSms(Parcel &p, RequestInfo *pRI) { 845f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Message rcsm; 846f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 847f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t ut; 848f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 849f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 850f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 8517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 852f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 853f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 854f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 855f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uTeleserviceID = (int) t; 856f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 857f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 858f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.bIsServicePresent = (uint8_t) ut; 859f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 860f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 861f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uServicecategory = (int) t; 862f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 863f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 864f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 865f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 866f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 867f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 868f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 869f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 870f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 871f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 872f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 873f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 874f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 875f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 876f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.number_of_digits= (uint8_t) ut; 877f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 878f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 879f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 880f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 881f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sAddress.digits[digitCount] = (uint8_t) ut; 882f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 883f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 8847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 885f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 886f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 8877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 888f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.odd = (uint8_t) ut; 889f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 890f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&ut,sizeof(ut)); 891f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.number_of_digits = (uint8_t) ut; 892f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 893f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 8947f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 8957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut,sizeof(ut)); 896f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut; 897f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 898f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 8997f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.readInt32(&t); 900f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.uBearerDataLen = (int) t; 901f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 902f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 9037f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 9047f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville status = p.read(&ut, sizeof(ut)); 905f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsm.aBearerData[digitCount] = (uint8_t) ut; 906f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 907f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 908f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 909f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 910f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 911f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 912f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 913f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 9141b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ", 915f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory, 9161b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type); 917f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 9187f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 919f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 920f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 921f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI); 922f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 923f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 924f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsm, 0, sizeof(rcsm)); 925f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 926f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 927f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 928f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 929f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 930f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 931f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 932f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 933f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 9347f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic void 935f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) { 936f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Ack rcsa; 937f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 938f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 939f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 940f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 941f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 942f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 943f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 944f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t; 945f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 946f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 947f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsa.uSMSCauseCode = (int) t; 948f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 949f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 950f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 951f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 952f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 953f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 9541b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ", 9551b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode); 956f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 957f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 958f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 959f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 960f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI); 961f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 962f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 963f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsa, 0, sizeof(rcsa)); 964f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 965f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 966f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 967f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 968f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 969f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 970f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 971f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 972f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 973a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 974a592eebc476a3d234f47f93e58252f8c822fc772Wink SavilledispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) { 975a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 976f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 977a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 978f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 979a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 980a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 981a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 982a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 983f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 984a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_GSM_BroadcastSmsConfigInfo gsmBci[num]; 985a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num]; 986f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 987a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville startRequest; 988a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++ ) { 989a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBciPtrs[i] = &gsmBci[i]; 990f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 991a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 992a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].fromServiceId = (int) t; 993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 994a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 995a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].toServiceId = (int) t; 996f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 997a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 998a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].fromCodeScheme = (int) t; 999f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1000a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1001a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].toCodeScheme = (int) t; 1002a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1003a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1004a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].selected = (uint8_t) t; 1005a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1006a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \ 1007a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i, 1008a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].fromServiceId, gsmBci[i].toServiceId, 1009a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme, 1010a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBci[i].selected); 1011a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1012f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 1013f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1014a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1015a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1016a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1017f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1018a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, 1019a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville gsmBciPtrs, 1020a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), 1021a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville pRI); 1022f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1023f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1024a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo)); 1025a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *)); 1026f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1027f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1028f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1029f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1034f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1035a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void 1036f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilledispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) { 1037a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t t; 1038f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1039a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int32_t num; 1040f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1041a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&num); 1042a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (status != NO_ERROR) { 1043a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville goto invalid; 1044a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1045a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1046a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num]; 1047a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num]; 1048a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1049a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville startRequest; 1050a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++ ) { 1051a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBciPtrs[i] = &cdmaBci[i]; 1052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1053a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1054a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBci[i].service_category = (int) t; 1055f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 1056a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1057a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBci[i].language = (int) t; 1058f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 1059a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1060a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBci[i].selected = (uint8_t) t; 1061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1062a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: service_category=%d, language =%d, \ 1063a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category, 1064a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBci[i].language, cdmaBci[i].selected); 1065f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville } 1066a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeRequest; 1067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 1069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 1070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1071f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1072f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, 1073a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville cdmaBciPtrs, 1074a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), 1075f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville pRI); 1076f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1077f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo)); 1079a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *)); 1080f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1081f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1082f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1083f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) { 1090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_WriteArgs rcsw; 1091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t t; 1092f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint32_t ut; 1093f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 1094f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status_t status; 1095f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int32_t digitCount; 1096f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1098f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1099f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1100f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.status = t; 1101a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1102f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1103f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uTeleserviceID = (int) t; 1104f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1106f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.bIsServicePresent = (uint8_t) uct; 1107f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1108f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1109f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uServicecategory = (int) t; 1110f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1111f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1112f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t; 1113f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t; 1116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t; 1119f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1120f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.readInt32(&t); 1121f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t; 1122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.number_of_digits = (uint8_t) uct; 1125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) { 1127f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct; 1129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1130f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1131a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1132f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t; 1133f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1134a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1135f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.odd = (uint8_t) uct; 1136f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1137f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville status = p.read(&uct,sizeof(uct)); 1138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct; 1139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) { 1141a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct,sizeof(uct)); 1142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct; 1143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1145a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.readInt32(&t); 1146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.uBearerDataLen = (int) t; 1147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) { 1149a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville status = p.read(&uct, sizeof(uct)); 1150f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville rcsw.message.aBearerData[digitCount] = (uint8_t) uct; 1151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (status != NO_ERROR) { 1154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville goto invalid; 1155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 1156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startRequest; 11581b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \ 11591b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.uServicecategory=%d, message.sAddress.digit_mode=%d, \ 11601b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_mode=%d, \ 11611b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville message.sAddress.number_type=%d, ", 1162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent, 11631b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode, 11641b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_mode, 11651b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville rcsw.message.sAddress.number_type); 1166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeRequest; 1167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printRequest(pRI->token, pRI->pCI->requestNumber); 1169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI); 1171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#ifdef MEMSET_FREED 1173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville memset(&rcsw, 0, sizeof(rcsw)); 1174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 1175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savilleinvalid: 1179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville invalidCommandBlock(pRI); 1180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 1181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 1182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 1183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 11844f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL. 11854f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// Version 4 of the RIL interface adds a new PDP type parameter to support 11864f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// IPv6 and dual-stack PDP contexts. When dealing with a previous version of 11874f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti// RIL, remove the parameter from the request. 11884f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colittistatic void dispatchDataCall(Parcel& p, RequestInfo *pRI) { 11894f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters. 11904f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti const int numParamsRilV3 = 6; 11914f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 11924f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // The first bytes of the RIL parcel contain the request number and the 11934f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti // serial number - see processCommandBuffer(). Copy them over too. 11944f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int pos = p.dataPosition(); 11954f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 11964f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti int numParams = p.readInt32(); 11974f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti if (s_callbacks.version < 4 && numParams > numParamsRilV3) { 11984f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti Parcel p2; 11994f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.appendFrom(&p, 0, pos); 12004f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeInt32(numParamsRilV3); 12014f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti for(int i = 0; i < numParamsRilV3; i++) { 12024f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.writeString16(p.readString16()); 12034f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 12044f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti p2.setDataPosition(pos); 12054f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p2, pRI); 12064f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } else { 120757ce1f2709484ef8911cabe9b5629d0c21557bd4Lorenzo Colitti p.setDataPosition(pos); 12084f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti dispatchStrings(p, pRI); 12094f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti } 12104f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti} 12114f81dcf2a9bc84cbfbb6d3d658c452c22e9b6e83Lorenzo Colitti 121200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1213f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleblockingWrite(int fd, const void *buffer, size_t len) { 12147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville size_t writeOffset = 0; 121500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const uint8_t *toWrite; 121600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 121700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project toWrite = (const uint8_t *)buffer; 121800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 121900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (writeOffset < len) { 122000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ssize_t written; 122100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 122200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project written = write (fd, toWrite + writeOffset, 122300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project len - writeOffset); 122400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (written < 0 && errno == EINTR); 122500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 122600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (written >= 0) { 122700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeOffset += written; 122800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { // written < 0 122900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("RIL Response: unexpected error on write errno:%d", errno); 123000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(fd); 123100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 123200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 123300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 123400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 123500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 123600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 123700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 123800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponseRaw (const void *data, size_t dataSize) { 124000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int fd = s_fdCommand; 124100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 124200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project uint32_t header; 124300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 124400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 124500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 124600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 124700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 124800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (dataSize > MAX_COMMAND_BYTES) { 124900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RIL: packet larger than %u (%u)", 125000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project MAX_COMMAND_BYTES, (unsigned int )dataSize); 125100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 125200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return -1; 125300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 12547f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 125500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_writeMutex); 125600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 125700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project header = htonl(dataSize); 125800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 125900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = blockingWrite(fd, (void *)&header, sizeof(header)); 126000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1262084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 126300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 126400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 126500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1266ee1fadc192a63724e416b05666844a62d1e75d38Kenny ret = blockingWrite(fd, data, dataSize); 126700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 126800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 1269084f6708312265b501561a9c6d6e9cb38943985cJaikumar Ganesh pthread_mutex_unlock(&s_writeMutex); 127000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 127100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 127200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 127300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_writeMutex); 127400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 127500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 127600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 127700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 127800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 1279f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillesendResponse (Parcel &p) { 128000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project printResponse; 128100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return sendResponseRaw(p.data(), p.dataSize()); 128200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 128300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 128400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is an int* pointing to an array of ints*/ 12857f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 12867f8568086f2ea14885b0091c793e14c2656f0da2Wink Savillestatic int 1287f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleresponseInts(Parcel &p, void *response, size_t responselen) { 128800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numInts; 128900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 129000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 129100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 129200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 129300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 129400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(int) != 0) { 12957f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid response length %d expected multiple of %d\n", 129600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(int)); 129700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 129800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 129900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 130000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int *p_int = (int *) response; 130100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 130200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numInts = responselen / sizeof(int *); 130300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numInts); 130400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 130500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each int*/ 130600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 130700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numInts ; i++) { 130800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%d,", printBuf, p_int[i]); 130900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_int[i]); 131000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 131100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 131200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 131300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 131400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 131500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 131600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 13174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville/** response is a char **, pointing to an array of char *'s 13184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville The parcel will begin with the version */ 13194380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) { 13204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(version); 13214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStrings(p, response, responselen); 13224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 13234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 132400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** response is a char **, pointing to an array of char *'s */ 1325f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseStrings(Parcel &p, void *response, size_t responselen) { 132600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int numStrings; 13277f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 132800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 132900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 133000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 133100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 133200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(char *) != 0) { 13337f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid response length %d expected multiple of %d\n", 133400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(char *)); 133500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 133600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 133700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 133800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 133900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (0); 134000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 134100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **p_cur = (char **) response; 134200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project numStrings = responselen / sizeof(char *); 134400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (numStrings); 134500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 134600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each string*/ 134700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 134800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < numStrings ; i++) { 134900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]); 135000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur[i]); 135100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 135200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 135300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 135400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 135500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 135600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 135700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 135900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 13607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville * NULL strings are accepted 136100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * FIXME currently ignores responselen 136200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 1363f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseString(Parcel &p, void *response, size_t responselen) { 136400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* one string only */ 136500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 136600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s", printBuf, (char*)response); 136700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 136800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 136900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, (const char *)response); 137000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 137100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 137200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 137300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1374f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseVoid(Parcel &p, void *response, size_t responselen) { 137500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 137600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 137700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 137800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 137900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1380f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallList(Parcel &p, void *response, size_t responselen) { 138100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 138200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 138300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 138400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 138500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 138600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 138700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 138800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_Call *) != 0) { 13893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response length %d expected multiple of %d\n", 139000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_Call *)); 139100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 139200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 139300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 139400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 139500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 139600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_Call *); 139700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 139800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 139900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 140000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Call *p_cur = ((RIL_Call **) response)[i]; 140100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* each call info */ 140200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->state); 140300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 140400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 140500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMpty); 140600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isMT); 140700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->als); 140800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->isVoice); 14091b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->isVoicePrivacy); 14101b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->number); 14111b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->numberPresentation); 14121b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville writeStringToParcel(p, p_cur->name); 14131b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p.writeInt32(p_cur->namePresentation); 14143a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville // Remove when partners upgrade to version 3 141574fa38884320698c1623764850e3131b9769dff0Wink Saville if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) { 141674fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(0); /* UUS Information is absent */ 141774fa38884320698c1623764850e3131b9769dff0Wink Saville } else { 141874fa38884320698c1623764850e3131b9769dff0Wink Saville RIL_UUS_Info *uusInfo = p_cur->uusInfo; 141974fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(1); /* UUS Information is present */ 142074fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusType); 142174fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusDcs); 142274fa38884320698c1623764850e3131b9769dff0Wink Saville p.writeInt32(uusInfo->uusLength); 142374fa38884320698c1623764850e3131b9769dff0Wink Saville p.write(uusInfo->uusData, uusInfo->uusLength); 142474fa38884320698c1623764850e3131b9769dff0Wink Saville } 14253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[id=%d,%s,toa=%d,", 14261b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville printBuf, 14271b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->index, 14281b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville callStateToString(p_cur->state), 14293d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->toa); 14303d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,%s,als=%d,%s,%s,", 14313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 14321b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMpty)?"conf":"norm", 14331b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isMT)?"mt":"mo", 14341b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->als, 14351b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville (p_cur->isVoice)?"voc":"nonvoc", 14363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (p_cur->isVoicePrivacy)?"evp":"noevp"); 14373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s%s,cli=%d,name='%s',%d]", 14383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 14391b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->number, 14401b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->numberPresentation, 14411b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->name, 14421b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville p_cur->namePresentation); 144300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 144400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 144500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 144600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 144700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 144800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 144900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1450f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSMS(Parcel &p, void *response, size_t responselen) { 145100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 145200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 145300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 145400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 145500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 145600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SMS_Response) ) { 14577f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid response length %d expected %d", 145800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SMS_Response)); 145900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 146000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 146100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response; 146300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->messageRef); 146500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->ackPDU); 1466920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh p.writeInt32(p_cur->errorCode); 146700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 146800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 1469920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef, 1470920c78f166e787dc799bf5df7d6be30034ac0e77Jaikumar Ganesh (char*)p_cur->ackPDU, p_cur->errorCode); 147100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 147200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 147300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 147400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 147500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14764380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallListV3(Parcel &p, void *response, size_t responselen) 147700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 147800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 147900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 148000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 148100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 148200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14834380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (responselen % sizeof(RIL_Data_Call_Response_v3) != 0) { 14847f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid response length %d expected multiple of %d", 14854380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v3)); 148600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 148700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 148800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14894380897c6cdc99486a061b819943e3b290ebcf09Wink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v3); 149000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 149100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 14924380897c6cdc99486a061b819943e3b290ebcf09Wink Saville RIL_Data_Call_Response_v3 *p_cur = (RIL_Data_Call_Response_v3 *) response; 149300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 149400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int i; 149500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (i = 0; i < num; i++) { 149600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].cid); 149700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur[i].active); 149800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].type); 149900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].apn); 150000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur[i].address); 150100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%d,%s,%s,%s,%s],", printBuf, 150200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur[i].cid, 150300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur[i].active==0)?"down":"up", 150400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].type, 150500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].apn, 150600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur[i].address); 150700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 150800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 150900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 151000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 151100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 151200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 151300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 15144380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseDataCallList(Parcel &p, void *response, size_t responselen) 15154380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 15164380897c6cdc99486a061b819943e3b290ebcf09Wink Saville // Write version 15174380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(s_callbacks.version); 15184380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15194380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 15204380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseDataCallListV3(p, response, responselen); 15214380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 15224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (response == NULL && responselen != 0) { 15234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("invalid response: NULL"); 15244380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 15254380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 15264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (responselen % sizeof(RIL_Data_Call_Response_v5) != 0) { 15284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("invalid response length %d expected multiple of %d", 15294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (int)responselen, (int)sizeof(RIL_Data_Call_Response_v5)); 15304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 15314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 15324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville int num = responselen / sizeof(RIL_Data_Call_Response_v5); 15344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(num); 15354380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville RIL_Data_Call_Response_v5 *p_cur = (RIL_Data_Call_Response_v5 *) response; 15374380897c6cdc99486a061b819943e3b290ebcf09Wink Saville startResponse; 15384380897c6cdc99486a061b819943e3b290ebcf09Wink Saville int i; 15394380897c6cdc99486a061b819943e3b290ebcf09Wink Saville for (i = 0; i < num; i++) { 15404380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32((int)p_cur[i].status); 15414380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].cid); 15424380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p.writeInt32(p_cur[i].active); 1543af1298d72fd6a8b2d5bed7db15f6d181240fce83David 'Digit' Turner writeStringToParcel(p, p_cur[i].type); 15444380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].ifname); 15454380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].addresses); 15464380897c6cdc99486a061b819943e3b290ebcf09Wink Saville writeStringToParcel(p, p_cur[i].dnses); 15474380897c6cdc99486a061b819943e3b290ebcf09Wink Saville appendPrintBuf("%s[status=%d,cid=%d,%s,%d,%s,%s,%s],", printBuf, 15484380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].status, 15494380897c6cdc99486a061b819943e3b290ebcf09Wink Saville p_cur[i].cid, 15504380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (p_cur[i].active==0)?"down":"up", 15514380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].ifname, 15524380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].addresses, 15534380897c6cdc99486a061b819943e3b290ebcf09Wink Saville (char*)p_cur[i].dnses); 15544380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 15554380897c6cdc99486a061b819943e3b290ebcf09Wink Saville removeLastChar; 15564380897c6cdc99486a061b819943e3b290ebcf09Wink Saville closeResponse; 15574380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 15584380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15594380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return 0; 15604380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 15614380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 15624380897c6cdc99486a061b819943e3b290ebcf09Wink Savillestatic int responseSetupDataCall(Parcel &p, void *response, size_t responselen) 15634380897c6cdc99486a061b819943e3b290ebcf09Wink Saville{ 15644380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (s_callbacks.version < 5) { 15654380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseStringsWithVersion(s_callbacks.version, p, response, responselen); 15664380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } else { 15674380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return responseDataCallList(p, response, responselen); 15684380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 15694380897c6cdc99486a061b819943e3b290ebcf09Wink Saville} 15704380897c6cdc99486a061b819943e3b290ebcf09Wink Saville 1571f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseRaw(Parcel &p, void *response, size_t responselen) { 157200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 157300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL with responselen != 0"); 157400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 157500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 157600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 157700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // The java code reads -1 size as null byte array 157800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 15797f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p.writeInt32(-1); 158000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 158100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(responselen); 158200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.write(response, responselen); 158300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 158400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 158600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 158700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 158800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1589f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSIM_IO(Parcel &p, void *response, size_t responselen) { 159000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 159100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 159200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 159300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 159400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 159500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof (RIL_SIM_IO_Response) ) { 159600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length was %d expected %d", 159700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SIM_IO_Response)); 159800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 159900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 160000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response; 160200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw1); 160300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->sw2); 160400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->simResponse); 160500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 160600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 160700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2, 160800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->simResponse); 160900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 161000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 161200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 161300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 161400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1615f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCallForwards(Parcel &p, void *response, size_t responselen) { 161600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 16177f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 161800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 161900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 162000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 162100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 162200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof(RIL_CallForwardInfo *) != 0) { 16247f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville LOGE("invalid response length %d expected multiple of %d", 162500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof(RIL_CallForwardInfo *)); 162600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 162700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 162800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 162900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* number of call info's */ 163000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_CallForwardInfo *); 163100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 163200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 163300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 163400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 163500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i]; 163600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 163700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->status); 163800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->reason); 163900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->serviceClass); 164000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->toa); 164100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 164200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->timeSeconds); 164300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf, 164400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->status==1)?"enable":"disable", 164500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->reason, p_cur->serviceClass, p_cur->toa, 164600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number, 164700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->timeSeconds); 164800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 164900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 165000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 16517f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 165200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 165300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 165400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 1655f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSsn(Parcel &p, void *response, size_t responselen) { 165600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL) { 165700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 165800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 165900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 166000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen != sizeof(RIL_SuppSvcNotification)) { 166200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length was %d expected %d", 166300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_SuppSvcNotification)); 166400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 166500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 166600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 166700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response; 166800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->notificationType); 166900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->code); 167000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->index); 167100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->type); 167200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel(p, p_cur->number); 167300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 167400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 167500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf, 167600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (p_cur->notificationType==0)?"mo":"mt", 167700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->code, p_cur->index, p_cur->type, 167800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (char*)p_cur->number); 167900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 168000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 168200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 168300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 16843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCellList(Parcel &p, void *response, size_t responselen) { 168500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int num; 168600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 168700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (response == NULL && responselen != 0) { 168800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response: NULL"); 168900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (responselen % sizeof (RIL_NeighboringCell *) != 0) { 169300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("invalid response length %d expected multiple of %d\n", 169400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project (int)responselen, (int)sizeof (RIL_NeighboringCell *)); 169500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return RIL_ERRNO_INVALID_RESPONSE; 169600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 169700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 169800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project startResponse; 16993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville /* number of records */ 170000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project num = responselen / sizeof(RIL_NeighboringCell *); 170100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(num); 170200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0 ; i < num ; i++) { 170400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i]; 170500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(p_cur->rssi); 170700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project writeStringToParcel (p, p_cur->cid); 170800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 170900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf, 171000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cid, p_cur->rssi); 171100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 171200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project removeLastChar; 171300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project closeResponse; 171400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 171500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 171600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 171700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 17183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville/** 17193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville * Marshall the signalInfoRecord into the parcel if it exists. 17203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville */ 1721a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic void marshallSignalInfoRecord(Parcel &p, 1722a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) { 17233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.isPresent); 17243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signalType); 17253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.alertPitch); 17263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_signalInfoRecord.signal); 17273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 17283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1729a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaInformationRecords(Parcel &p, 1730a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 17313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville int num; 1732a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville char* string8 = NULL; 1733a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int buffer_lenght; 1734a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecord *infoRec; 17353d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 17363d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 17373d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response: NULL"); 17383d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 17393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 17403d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1741a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (responselen != sizeof (RIL_CDMA_InformationRecords)) { 1742a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("invalid response length %d expected multiple of %d\n", 1743a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *)); 17443d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 17453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 17463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1747a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_InformationRecords *p_cur = 1748a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_InformationRecords *) response; 1749a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); 17503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 17513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 1752a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 17533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1754a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++) { 1755a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec = &p_cur->infoRec[i]; 1756a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->name); 1757a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville switch (infoRec->name) { 17583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_DISPLAY_INFO_REC: 1759a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: 1760a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.display.alpha_len > 1761a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH) { 1762a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("invalid display info response length %d \ 1763a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1764a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.display.alpha_len, 1765a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_ALPHA_INFO_BUFFER_LENGTH); 1766a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 17673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1768a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) 1769a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 1770a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) { 1771a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.display.alpha_buf[i]; 17723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 17734380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.display.alpha_len] = '\0'; 1774a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1775a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1776a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 17773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 1778a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: 17793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: 17803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: 1781a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) { 1782a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("invalid display info response length %d \ 1783a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1784a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.number.len, 1785a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 1786a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 17873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1788a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.number.len + 1) 1789a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville * sizeof(char) ); 1790a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < infoRec->rec.number.len; i++) { 1791a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.number.buf[i]; 1792a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 17934380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.number.len] = '\0'; 1794a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1795a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1796a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 1797a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_type); 1798a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.number_plan); 1799a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.pi); 1800a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.number.si); 18013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 18023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_SIGNAL_INFO_REC: 1803a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.isPresent); 1804a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signalType); 1805a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.alertPitch); 1806a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.signal.signal); 1807a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1808a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%sisPresent=%X, signalType=%X, \ 1809a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville alertPitch=%X, signal=%X, ", 1810a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, (int)infoRec->rec.signal.isPresent, 1811a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signalType, 1812a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.alertPitch, 1813a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.signal.signal); 1814a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 18153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 18163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: 1817a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (infoRec->rec.redir.redirectingNumber.len > 1818a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH) { 1819a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("invalid display info response length %d \ 1820a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville expected not more than %d\n", 1821a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.redir.redirectingNumber.len, 1822a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_NUMBER_INFO_BUFFER_LENGTH); 1823a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 1824a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1825a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber 1826a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville .len + 1) * sizeof(char) ); 1827a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; 1828a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i < infoRec->rec.redir.redirectingNumber.len; 1829a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville i++) { 1830a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8[i] = infoRec->rec.redir.redirectingNumber.buf[i]; 18313d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0'; 1833a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)string8); 1834a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville free(string8); 1835a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville string8 = NULL; 1836a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type); 1837a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan); 1838a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.pi); 1839a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingNumber.si); 1840a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.redir.redirectingReason); 18413d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 18423d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_LINE_CONTROL_INFO_REC: 1843a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded); 1844a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle); 1845a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse); 1846a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial); 1847a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1848a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%slineCtrlPolarityIncluded=%d, \ 1849a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlToggle=%d, lineCtrlReverse=%d, \ 1850a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville lineCtrlPowerDenial=%d, ", printBuf, 1851a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded, 1852a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlToggle, 1853a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlReverse, 1854a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial); 1855a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 18563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 18573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_CLIR_INFO_REC: 1858a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32((int)(infoRec->rec.clir.cause)); 18593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1860a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause); 1861a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 18623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 18633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: 1864a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.upLink); 1865a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(infoRec->rec.audioCtrl.downLink); 1866a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1867a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf, 1868a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.upLink, 1869a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville infoRec->rec.audioCtrl.downLink); 1870a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville removeLastChar; 18713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville break; 1872a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_CDMA_T53_RELEASE_INFO_REC: 1873a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // TODO(Moto): See David Krause, he has the answer:) 1874a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE"); 1875a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 1876a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville default: 1877a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville LOGE("Incorrect name value"); 1878a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return RIL_ERRNO_INVALID_RESPONSE; 18793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 1881a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 18823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1883a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville return 0; 18843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 18853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1886a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseRilSignalStrength(Parcel &p, 1887a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville void *response, size_t responselen) { 1888a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (response == NULL && responselen != 0) { 18893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response: NULL"); 18903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 18913d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 18923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1893a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville if (responselen == sizeof (RIL_SignalStrength)) { 18943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville // New RIL 18953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville RIL_SignalStrength *p_cur = ((RIL_SignalStrength *) response); 18963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 18973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.signalStrength); 18983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate); 18993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.dbm); 19003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->CDMA_SignalStrength.ecio); 19013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.dbm); 19023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.ecio); 19033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio); 1904fdf825f9d0dc639787b8523638bb61874ed0b540johnwang 1905fdf825f9d0dc639787b8523638bb61874ed0b540johnwang startResponse; 1906a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\ 1907a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville CDMA_SignalStrength.dbm=%d,CDMA_SignalStrength.ecio=%d,\ 1908a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville EVDO_SignalStrength.dbm =%d,EVDO_SignalStrength.ecio=%d,\ 1909a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville EVDO_SignalStrength.signalNoiseRatio=%d]", 1910a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, 1911a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.signalStrength, 1912a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->GW_SignalStrength.bitErrorRate, 1913a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.dbm, 1914a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->CDMA_SignalStrength.ecio, 1915a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.dbm, 1916a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.ecio, 1917a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur->EVDO_SignalStrength.signalNoiseRatio); 1918a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1919a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 1920a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1921a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } else if (responselen % sizeof (int) == 0) { 1922a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // Old RIL deprecated 1923a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int *p_cur = (int *) response; 1924a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1925a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville startResponse; 1926a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1927a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // With the Old RIL we see one or 2 integers. 1928a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t num = responselen / sizeof (int); // Number of integers from ril 1929a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t totalIntegers = 7; // Number of integers in RIL_SignalStrength 1930a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t i; 1931a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1932a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s[", printBuf); 1933a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (i = 0; i < num; i++) { 1934a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s %d", printBuf, *p_cur); 1935a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(*p_cur++); 1936a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1937a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s]", printBuf); 1938a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1939a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville // Fill the remainder with zero's. 1940a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (; i < totalIntegers; i++) { 1941a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(0); 1942a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 1943a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 1944fdf825f9d0dc639787b8523638bb61874ed0b540johnwang closeResponse; 19453d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 19463d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response length"); 19473d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 19483d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19493d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19503d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 19513d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 19523d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCallRing(Parcel &p, void *response, size_t responselen) { 19543d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if ((response == NULL) || (responselen == 0)) { 19553d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseVoid(p, response, responselen); 19563d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } else { 19573d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return responseCdmaSignalInfoRecord(p, response, responselen); 19583d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19593d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 19603d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19613d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) { 19623d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL || responselen == 0) { 19633d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response: NULL"); 19643d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 19653d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19663d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19673d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) { 19683d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n", 19693d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord)); 19703d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 19713d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19723d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19733d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 19743d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19753d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response); 19763d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, *p_cur); 19773d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19783d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\ 19793d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signal=%d]", 19803d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 19813d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->isPresent, 19823d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalType, 19833d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->alertPitch, 19843d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signal); 19853d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 19873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 19883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 19893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 1990a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaCallWaiting(Parcel &p, void *response, 1991a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville size_t responselen) { 19923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (response == NULL && responselen != 0) { 19933d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response: NULL"); 19943d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 19953d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 19963d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 19973d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville if (responselen != sizeof(RIL_CDMA_CallWaiting)) { 19983d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response length %d expected %d\n", 19993d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville (int)responselen, (int)sizeof(RIL_CDMA_CallWaiting)); 20003d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return RIL_ERRNO_INVALID_RESPONSE; 20013d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville } 20023d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20033d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville startResponse; 20043d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville RIL_CDMA_CallWaiting *p_cur = ((RIL_CDMA_CallWaiting *) response); 20053d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20063d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville writeStringToParcel (p, p_cur->number); 20073d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p.writeInt32(p_cur->numberPresentation); 20083d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville writeStringToParcel (p, p_cur->name); 20093d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville marshallSignalInfoRecord(p, p_cur->signalInfoRecord); 20103d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20113d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\ 20123d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\ 20133d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville signal=%d]", 20143d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville printBuf, 20153d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->number, 20163d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->numberPresentation, 20173d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->name, 20183d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.isPresent, 20193d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.signalType, 20203d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.alertPitch, 20213d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville p_cur->signalInfoRecord.signal); 20223d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20233d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville closeResponse; 20243d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20253d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville return 0; 20263d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 20273d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville 20283d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void triggerEvLoop() { 202900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 203000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!pthread_equal(pthread_self(), s_tid_dispatch)) { 203100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* trigger event loop to wakeup. No reason to do this, 203200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * if we're in the event loop thread */ 203300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 203400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = write (s_fdWakeupWrite, " ", 1); 203500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } while (ret < 0 && errno == EINTR); 203600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 203700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 203800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 20393d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Savillestatic void rilEventAddWakeup(struct ril_event *ev) { 204000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_add(ev); 204100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 204200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 204300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2044f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseSimStatus(Parcel &p, void *response, size_t responselen) { 2045f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int i; 2046f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2047f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 2048f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGE("invalid response: NULL"); 2049f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2050f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2051f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (responselen % sizeof (RIL_CardStatus *) != 0) { 20533d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville LOGE("invalid response length %d expected multiple of %d\n", 2054f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville (int)responselen, (int)sizeof (RIL_CardStatus *)); 2055f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2056f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2057f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2058f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CardStatus *p_cur = ((RIL_CardStatus *) response); 2059f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2060f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->card_state); 2061f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->universal_pin_state); 2062f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->gsm_umts_subscription_app_index); 2063f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->cdma_subscription_app_index); 2064f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->num_applications); 2065f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2066f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2067f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (i = 0; i < p_cur->num_applications; i++) { 2068f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].app_type); 2069f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].app_state); 2070f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].perso_substate); 2071a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*)(p_cur->applications[i].aid_ptr)); 2072a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville writeStringToParcel(p, (const char*) 2073a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (p_cur->applications[i].app_label_ptr)); 2074f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].pin1_replaced); 2075f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].pin1); 2076f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->applications[i].pin2); 2077a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\ 2078a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],", 2079f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, 2080f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].app_type, 2081f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].app_state, 2082f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].perso_substate, 2083f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].aid_ptr, 2084f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].app_label_ptr, 2085f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].pin1_replaced, 2086f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].pin1, 2087f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->applications[i].pin2); 2088f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2089f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2090f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 20923d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville} 2093f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2094a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2095a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *); 2096f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(num); 2097f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2098f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2099a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_GSM_BroadcastSmsConfigInfo **p_cur = 2100a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_GSM_BroadcastSmsConfigInfo **) response; 2101a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0; i < num; i++) { 2102a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromServiceId); 2103a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toServiceId); 2104a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->fromCodeScheme); 2105a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->toCodeScheme); 2106a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2107a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville 2108a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \ 2109a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", 2110a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId, 2111a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme, 2112a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2113a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville } 2114f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2115f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2116f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2117f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2118f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2119a592eebc476a3d234f47f93e58252f8c822fc772Wink Savillestatic int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) { 2120a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville RIL_CDMA_BroadcastSmsConfigInfo **p_cur = 2121a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville (RIL_CDMA_BroadcastSmsConfigInfo **) response; 2122f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2123a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *); 2124a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(num); 2125f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2126f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2127a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville for (int i = 0 ; i < num ; i++ ) { 2128a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->service_category); 2129a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->language); 2130a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p.writeInt32(p_cur[i]->selected); 2131f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2132a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \ 2133a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville selected =%d], ", 2134a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville printBuf, i, p_cur[i]->service_category, p_cur[i]->language, 2135a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville p_cur[i]->selected); 2136f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville } 2137a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville closeResponse; 2138f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic int responseCdmaSms(Parcel &p, void *response, size_t responselen) { 2143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int num; 2144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitCount; 2145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville int digitLimit; 2146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville uint8_t uct; 2147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville void* dest; 2148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2149f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville LOGD("Inside responseCdmaSms"); 2150f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville 2151f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (response == NULL && responselen != 0) { 2152f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGE("invalid response: NULL"); 2153f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2154f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2156f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville if (responselen != sizeof(RIL_CDMA_SMS_Message)) { 2157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGE("invalid response length was %d expected %d", 2158f5903dfd25c2ef104b3e9267b53f6ee3e7588063Wink Saville (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message)); 2159f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return RIL_ERRNO_INVALID_RESPONSE; 2160f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2161f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2162f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response; 2163f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uTeleserviceID); 2164f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->bIsServicePresent),sizeof(uct)); 2165f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uServicecategory); 2166f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.digit_mode); 2167f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_mode); 2168f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_type); 2169f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sAddress.number_plan); 2170f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct)); 2171f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 2172f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2173f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct)); 2174f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2175f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2176f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->sSubAddress.subaddressType); 2177f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.odd),sizeof(uct)); 2178f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct)); 2179f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 2180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2181f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct)); 2182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 2185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.writeInt32(p_cur->uBearerDataLen); 2186f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for(digitCount =0 ; digitCount < digitLimit; digitCount ++) { 2187f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct)); 2188f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2189f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2190f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville startResponse; 2191f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \ 21921b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ", 2193f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory, 2194f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type); 2195f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville closeResponse; 2196f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 2197f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return 0; 2198f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville} 2199f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 220000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 220100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * A write on the wakeup fd is done just to pop us out of select() 220200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * We empty the buffer here and then ril_event will reset the timers on the 220300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * way back down 220400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 2205f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processWakeupCallback(int fd, short flags, void *param) { 220600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char buff[16]; 220700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 220800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 220900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGV("processWakeupCallback"); 221000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 221100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* empty our wakeup socket out */ 221200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project do { 221300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = read(s_fdWakeupRead, &buff, sizeof(buff)); 22147f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville } while (ret > 0 || (ret < 0 && errno == EINTR)); 221500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 221600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2217f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onCommandsSocketClosed() { 221800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 221900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *p_cur; 222000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 222100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* mark pending requests as "cancelled" so we dont report responses */ 222200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 222300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_lock(&s_pendingRequestsMutex); 222400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 222500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 222600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur = s_pendingRequests; 222700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 22287f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for (p_cur = s_pendingRequests 222900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur != NULL 223000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; p_cur = p_cur->p_next 223100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 223200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_cur->cancelled = 1; 223300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 223400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 223500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_mutex_unlock(&s_pendingRequestsMutex); 223600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (ret == 0); 223700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 223800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2239f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void processCommandsCallback(int fd, short flags, void *param) { 224000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 224100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project void *p_record; 224200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t recordlen; 224300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 224400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 224500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(fd == s_fdCommand); 224600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 224700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = (RecordStream *)param; 224800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 224900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (;;) { 225000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* loop until EAGAIN/EINTR, end of stream, or other error */ 225100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = record_stream_get_next(p_rs, &p_record, &recordlen); 225200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 225300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 && p_record == NULL) { 225400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* end-of-stream */ 225500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 225600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret < 0) { 225700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 225800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else if (ret == 0) { /* && p_record != NULL */ 225900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandBuffer(p_record, recordlen); 226000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 226100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 226200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 226300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) { 226400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* fatal error or end-of-stream */ 226500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 226600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("error on reading command socket errno:%d\n", errno); 226700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 226800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGW("EOS. Closing command socket."); 226900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 22707f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 227100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 227200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 227300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 227400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_del(&s_commands_event); 227500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 227600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project record_stream_free(p_rs); 227700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 227800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 227900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 228000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 228100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 228200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 228300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 228400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 228500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2286f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void onNewCommandConnect() { 228700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // implicit radio state changed 228800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, 228900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 229000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 229100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Send last NITZ time data, in case it was missed 229200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 229300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize); 229400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 229500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(s_lastNITZTimeData); 229600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 229700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 229800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 229900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Get version string 230000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_callbacks.getVersion != NULL) { 230100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *version; 230200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project version = s_callbacks.getVersion(); 230300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("RIL Daemon version: %s\n", version); 23047f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 230500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, version); 230600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 230700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("RIL Daemon version: unavailable\n"); 230800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project property_set(PROPERTY_RIL_IMPL, "unavailable"); 230900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 231000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 231100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 231200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2313f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void listenCallback (int fd, short flags, void *param) { 231400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 231500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int err; 231600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int is_phone_socket; 231700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RecordStream *p_rs; 231800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 231900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 232000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 232100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 232200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct ucred creds; 232300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t szCreds = sizeof(creds); 232400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 232500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct passwd *pwd = NULL; 232600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 232700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (s_fdCommand < 0); 232800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert (fd == s_fdListen); 23297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 233000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen); 233100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 233200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0 ) { 233300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Error on accept() errno:%d", errno); 233400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 233500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 2336f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville return; 233700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 233800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 233900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* check the credential of the other side and only accept socket from 234000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * phone process 23417f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville */ 234200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errno = 0; 234300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project is_phone_socket = 0; 2344f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 234500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds); 2346f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville 234700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (err == 0 && szCreds > 0) { 2348f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville errno = 0; 2349f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville pwd = getpwuid(creds.uid); 2350f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (pwd != NULL) { 2351f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) { 2352f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville is_phone_socket = 1; 2353f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 2354f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGE("RILD can't accept socket from process %s", pwd->pw_name); 2355f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 2356f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } else { 2357f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGE("Error on getpwuid() errno: %d", errno); 2358f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville } 235900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 2360f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGD("Error on getsockopt() errno: %d", errno); 236100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 236200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 236300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ( !is_phone_socket ) { 236400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RILD must accept socket from %s", PHONE_PROCESS); 23657f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 236600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 236700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 236800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 236900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onCommandsSocketClosed(); 237000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 237100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* start listening for new connections again */ 237200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup(&s_listen_event); 237300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 237400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 237500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 237600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 237700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK); 237800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 237900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 238000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("Error setting O_NONBLOCK errno:%d", errno); 238100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 238200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 238300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("libril: new connection"); 238400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 238500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES); 238600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 23877f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_commands_event, s_fdCommand, 1, 238800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processCommandsCallback, p_rs); 238900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 239000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_commands_event); 239100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 239200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project onNewCommandConnect(); 239300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 239400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 239500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void freeDebugCallbackArgs(int number, char **args) { 239600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 239700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (args[i] != NULL) { 239800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args[i]); 239900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 240000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 240100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(args); 240200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 240300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2404f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void debugCallback (int fd, short flags, void *param) { 240500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int acceptFD, option; 240600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct sockaddr_un peeraddr; 240700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project socklen_t socklen = sizeof (peeraddr); 240800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int data; 240900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsigned int qxdm_data[6]; 241000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project const char *deactData[1] = {"1"}; 241100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char *actData[1]; 241200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_Dial dialData; 241300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int hangupData[1] = {1}; 241400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int number; 241500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char **args; 241600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 241700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acceptFD = accept (fd, (sockaddr *) &peeraddr, &socklen); 241800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 241900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (acceptFD < 0) { 242000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error accepting on debug port: %d\n", errno); 242100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 242200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 242300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 242400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) { 242500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: number of Args: \n"); 242600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 242700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 242800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args = (char **) malloc(sizeof(char*) * number); 242900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 243000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project for (int i = 0; i < number; i++) { 243100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int len; 243200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) { 243300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: Len of Args: \n"); 243400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 243500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 243600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 243700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // +1 for null-term 243800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project args[i] = (char *) malloc((sizeof(char) * len) + 1); 24397f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville if (recv(acceptFD, args[i], sizeof(char) * len, 0) 24401b5fd23e2bc82e5bed48125317cf2f9837cf6ae8Wink Saville != (int)sizeof(char) * len) { 244100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error reading on socket: Args[%d] \n", i); 244200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(i, args); 244300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 244400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 244500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project char * buf = args[i]; 244600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project buf[len] = 0; 244700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 244800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 244900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (atoi(args[0])) { 245000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 0: 245100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Connection on debug port: issuing reset."); 245200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0); 245300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 245400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 1: 245500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Connection on debug port: issuing radio power off."); 245600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 0; 245700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 245800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Close the socket 245900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(s_fdCommand); 246000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdCommand = -1; 246100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 246200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 2: 246300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: issuing unsolicited network change."); 246400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED, 246500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project NULL, 0); 246600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 246700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 3: 246800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: QXDM log enable."); 2469d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[0] = 65536; // head.func_tag 2470d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[1] = 16; // head.len 2471d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 1; // mode: 1 for 'start logging' 2472d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[3] = 32; // log_file_size: 32megabytes 2473d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[4] = 0; // log_mask 2474d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; // log_max_fileindex 24757f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 247600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 247700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 247800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 4: 247900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI ("Debug port: QXDM log disable."); 248000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[0] = 65536; 248100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[1] = 16; 2482d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[2] = 0; // mode: 0 for 'stop logging' 248300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[3] = 32; 248400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project qxdm_data[4] = 0; 2485d855ef4370e1185d79ecb3fb3434c9b5f84d15bdXia Wang qxdm_data[5] = 8; 248600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data, 248700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 6 * sizeof(int)); 248800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 248900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 5: 249000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Radio On"); 249100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project data = 1; 249200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 249300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sleep(2); 249400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Set network selection automatic. 249500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0); 249600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 249700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 6: 2498f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]); 249900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project actData[0] = args[1]; 25007f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData, 250100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(actData)); 250200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 250300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 7: 2504f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville LOGI("Debug port: Deactivate Data Call"); 25057f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData, 250600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(deactData)); 250700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 250800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 8: 250900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Dial Call"); 251000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.clir = 0; 251100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project dialData.address = args[1]; 251200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData)); 251300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 251400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 9: 251500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: Answer Call"); 251600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0); 251700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 251800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case 10: 251900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGI("Debug port: End Call"); 25207f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData, 252100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sizeof(hangupData)); 252200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 252300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 252400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("Invalid request"); 252500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 252600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 252700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project freeDebugCallbackArgs(number, args); 252800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project close(acceptFD); 252900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 253000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 253100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2532f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Savillestatic void userTimerCallback (int fd, short flags, void *param) { 253300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 253400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 253500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *)param; 253600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 253700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->p_callback(p_info->userParam); 253800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 253900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME generalize this...there should be a cancel mechanism 254100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) { 254200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info = NULL; 254300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 254400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(p_info); 254600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 254700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 254900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void * 2550f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleeventLoop(void *param) { 255100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 255200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int filedes[2]; 255300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_init(); 255500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 255700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 255800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 1; 255900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_broadcast(&s_startupCond); 256000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 256100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 256200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 256300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pipe(filedes); 256400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 256500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 256600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Error in pipe() errno:%d", errno); 256700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 256800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 256900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupRead = filedes[0]; 257100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdWakeupWrite = filedes[1]; 257200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK); 257400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true, 257600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project processWakeupCallback, NULL); 257700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 257800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_wakeupfd_event); 257900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 258000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Only returns on error 258100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_loop(); 258200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("error in event_loop_base errno:%d", errno); 258300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 258400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return NULL; 258500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 258600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 25877f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 2588f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_startEventLoop(void) { 258900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 259000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_t attr; 25917f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 259200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* spin up eventLoop thread and wait for it to get started */ 259300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_started = 0; 259400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_startupMutex); 259500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 259600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_attr_init (&attr); 25977f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 259800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL); 259900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 260000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project while (s_started == 0) { 260100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_cond_wait(&s_startupCond, &s_startupMutex); 260200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 260300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 260400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_startupMutex); 260500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 260600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 260700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to create dispatch thread errno:%d", errno); 260800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 260900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 261000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 261100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 261200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project// Used for testing purpose only. 261300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) { 261400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 261500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 261600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26177f8568086f2ea14885b0091c793e14c2656f0da2Wink Savilleextern "C" void 2618f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_register (const RIL_RadioFunctions *callbacks) { 261900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 262000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int flags; 262100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 26224380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks == NULL) { 26234380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("RIL_register: RIL_RadioFunctions * null"); 262400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 262500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 26264380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version < RIL_VERSION_MIN) { 26274380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("RIL_register: version %d is to old, min version is %d", 26284380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION_MIN); 26294380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 26304380897c6cdc99486a061b819943e3b290ebcf09Wink Saville } 26314380897c6cdc99486a061b819943e3b290ebcf09Wink Saville if (callbacks->version > RIL_VERSION) { 26324380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("RIL_register: version %d is too new, max version is %d", 26334380897c6cdc99486a061b819943e3b290ebcf09Wink Saville callbacks->version, RIL_VERSION); 26344380897c6cdc99486a061b819943e3b290ebcf09Wink Saville return; 26353a4840bea36ce53bc0fb181811ebf9d1cd0aa261Wink Saville } 26364380897c6cdc99486a061b819943e3b290ebcf09Wink Saville LOGE("RIL_register: RIL version %d", callbacks->version); 263700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 263800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled > 0) { 263900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("RIL_register has been called more than once. " 264000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project "Subsequent call ignored"); 264100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 264200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 264300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 264400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions)); 264500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 264600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_registerCalled = 1; 264700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 264800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Little self-check 264900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2650f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) { 265100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project assert(i == s_commands[i].requestNumber); 265200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 265300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2654f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) { 26557f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville assert(i + RIL_UNSOL_RESPONSE_BASE 265600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project == s_unsolResponses[i].requestNumber); 265700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 265800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 265900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // New rild impl calls RIL_startEventLoop() first 266000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // old standalone impl wants it here. 266100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 266200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_started == 0) { 266300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RIL_startEventLoop(); 266400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 266500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 266600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start listen socket 266700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 266800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 0 26697f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ret = socket_local_server (SOCKET_NAME_RIL, 267000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM); 267100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 267200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 267300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Unable to bind socket errno:%d", errno); 267400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit (-1); 267500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 267600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = ret; 267700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 267800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#else 267900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen = android_get_control_socket(SOCKET_NAME_RIL); 268000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdListen < 0) { 268100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to get socket '" SOCKET_NAME_RIL "'"); 268200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 268300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 268400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 268500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdListen, 4); 268600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 268700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 268800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to listen on control socket '%d': %s", 268900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdListen, strerror(errno)); 269000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 269100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 269200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 269300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 269400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 269500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* note: non-persistent so we can accept only one connection at a time */ 26967f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ril_event_set (&s_listen_event, s_fdListen, false, 269700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project listenCallback, NULL); 269800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 269900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_listen_event); 270000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 270100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#if 1 270200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // start debug interface socket 270300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 270400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG); 270500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdDebug < 0) { 270600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno); 270700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 270800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 270900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = listen(s_fdDebug, 4); 271100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret < 0) { 271300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("Failed to listen on ril debug socket '%d': %s", 271400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_fdDebug, strerror(errno)); 271500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project exit(-1); 271600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 271700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 271800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set (&s_debug_event, s_fdDebug, true, 271900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project debugCallback, NULL); 272000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project rilEventAddWakeup (&s_debug_event); 272200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project#endif 272300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 272500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 272600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic int 2727f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecheckAndDequeueRequestInfo(struct RequestInfo *pRI) { 272800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret = 0; 27297f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 273000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == NULL) { 273100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return 0; 273200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 273300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 273400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_lock(&s_pendingRequestsMutex); 273500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 27367f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville for(RequestInfo **ppCur = &s_pendingRequests 27377f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville ; *ppCur != NULL 273800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ; ppCur = &((*ppCur)->p_next) 273900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ) { 274000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI == *ppCur) { 274100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = 1; 274200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project *ppCur = (*ppCur)->p_next; 274400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 274500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 274600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 274700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 274800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pthread_mutex_unlock(&s_pendingRequestsMutex); 274900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return ret; 275100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 275200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 275400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" void 2755f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleRIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) { 275600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project RequestInfo *pRI; 275700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 275800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t errorOffset; 275900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI = (RequestInfo *)t; 276100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (!checkAndDequeueRequestInfo(pRI)) { 276300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE ("RIL_onRequestComplete: invalid RIL_Token"); 276400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 276500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 276600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 276700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->local > 0) { 276800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Locally issued command...void only! 276900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // response does not go back up the command socket 277000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber)); 277100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 277200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto done; 277300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 277400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 277500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[%04d]< %s", 277600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project pRI->token, requestToString(pRI->pCI->requestNumber)); 277700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 277800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (pRI->cancelled == 0) { 277900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 278000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_SOLICITED); 278200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (pRI->token); 278300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project errorOffset = p.dataPosition(); 278400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 278500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (e); 278600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 2787b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (response != NULL) { 2788b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang // there is a response payload, no matter success or not. 278900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = pRI->pCI->responseFunction(p, response, responselen); 279000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 279100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* if an error occurred, rewind and mark it */ 279200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 279300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.setDataPosition(errorOffset); 279400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (ret); 279500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 2796b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang } 2797b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang 2798b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang if (e != RIL_E_SUCCESS) { 2799b2a6184ec942c4c1728cbac723db90fbed4f85c5johnwang appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e)); 280000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 280100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 280200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_fdCommand < 0) { 280300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGD ("RIL onRequestComplete: Command channel closed"); 280400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 280500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project sendResponse(p); 280600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 280700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 280800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectdone: 280900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free(pRI); 281000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 281100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 2814f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillegrabPartialWakeLock() { 281500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME); 281600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 281700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 281800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 2819f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillereleaseWakeLock() { 282000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project release_wake_lock(ANDROID_WAKE_LOCK_NAME); 282100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 282200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 282300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/** 282400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project * Timer callback to put us back to sleep before the default timeout 282500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project */ 282600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic void 2827f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillewakeTimeoutCallback (void *param) { 282800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // We're using "param != NULL" as a cancellation mechanism 282900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (param == NULL) { 283000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project //LOGD("wakeTimeout: releasing wake lock"); 283100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 283200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 283300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 283400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project //LOGD("wakeTimeout: releasing wake lock CANCELLED"); 283500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 283600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 283700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 283800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectextern "C" 283900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectvoid RIL_onUnsolicitedResponse(int unsolResponse, void *data, 284000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project size_t datalen) 284100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 284200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int unsolResponseIndex; 284300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int ret; 284400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project int64_t timeReceived = 0; 284500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project bool shouldScheduleTimeout = false; 284600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 284700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_registerCalled == 0) { 284800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Ignore RIL_onUnsolicitedResponse before RIL_register 284900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGW("RIL_onUnsolicitedResponse called before RIL_register"); 285000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 285100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 28527f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville 285300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE; 285400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 285500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if ((unsolResponseIndex < 0) 285600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) { 285700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project LOGE("unsupported unsolicited response code %d", unsolResponse); 285800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 285900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 286000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 286100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Grab a wake lock if needed for this reponse, 286200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // as we exit we'll either release it immediately 286300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // or set a timer to release it later. 286400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch (s_unsolResponses[unsolResponseIndex].wakeType) { 286500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case WAKE_PARTIAL: 286600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project grabPartialWakeLock(); 286700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = true; 286800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 286900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 287000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case DONT_WAKE: 287100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: 287200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // No wake lock is grabed so don't set timeout 287300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project shouldScheduleTimeout = false; 287400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 287500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 287600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 287700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Mark the time this was received, doing this 287800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // after grabing the wakelock incase getting 287900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the elapsedRealTime might cause us to goto 288000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // sleep. 288100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 288200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project timeReceived = elapsedRealtime(); 288300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 288400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse)); 288600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project Parcel p; 288800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 288900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (RESPONSE_UNSOLICITED); 289000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32 (unsolResponse); 289100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = s_unsolResponses[unsolResponseIndex] 289300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project .responseFunction(p, data, datalen); 289400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0) { 289500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Problem with the response. Don't continue; 289600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project goto error_exit; 289700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 289800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 289900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // some things get more payload 290000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(unsolResponse) { 290100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 290200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt32(s_callbacks.onStateRequest()); 290300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project appendPrintBuf("%s {%s}", printBuf, 290400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project radioStateToString(s_callbacks.onStateRequest())); 290500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 290600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 290800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: 290900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Store the time that this was received so the 291000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // handler of this message can account for 291100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // the time it takes to arrive and process. In 291200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // particular the system has been known to sleep 291300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // before this message can be processed. 291400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p.writeInt64(timeReceived); 291500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project break; 291600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 291700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 291800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ret = sendResponse(p); 291900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) { 292000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 292100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Unfortunately, NITZ time is not poll/update like everything 292200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // else in the system. So, if the upstream client isn't connected, 292300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // keep a copy of the last NITZ response (with receive time noted 292400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // above) around so we can deliver it when it is connected 292500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 292600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_lastNITZTimeData != NULL) { 292700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project free (s_lastNITZTimeData); 292800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = NULL; 292900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 293000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeData = malloc(p.dataSize()); 293200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_lastNITZTimeDataSize = p.dataSize(); 293300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy(s_lastNITZTimeData, p.data(), p.dataSize()); 293400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 293500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT 293700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // FIXME The java code should handshake here to release wake lock 293800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 293900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 294000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Cancel the previous request 294100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (s_last_wake_timeout_info != NULL) { 294200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info->userParam = (void *)1; 294300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 294400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 294500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project s_last_wake_timeout_info 294600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project = internalRequestTimedCallback(wakeTimeoutCallback, NULL, 294700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project &TIMEVAL_WAKE_TIMEOUT); 294800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 294900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project // Normal exit 295100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return; 295200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 295300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projecterror_exit: 295400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (shouldScheduleTimeout) { 295500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project releaseWakeLock(); 295600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 295700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 295800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29597f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville/** FIXME generalize this if you track UserCAllbackInfo, clear it 29607f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville when the callback occurs 296100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 296200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectstatic UserCallbackInfo * 29637f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleinternalRequestTimedCallback (RIL_TimedCallback callback, void *param, 29640d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn const struct timeval *relativeTime) 296500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project{ 296600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project struct timeval myRelativeTime; 296700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project UserCallbackInfo *p_info; 296800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 296900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo)); 297000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29717f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville p_info->p_callback = callback; 297200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project p_info->userParam = param; 29730d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn 297400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project if (relativeTime == NULL) { 297500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* treat null parameter as a 0 relative time */ 297600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memset (&myRelativeTime, 0, sizeof(myRelativeTime)); 297700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } else { 297800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project /* FIXME I think event_add's tv param is really const anyway */ 297900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime)); 298000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 298100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 298200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info); 298300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 298400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project ril_timer_add(&(p_info->event), &myRelativeTime); 298500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 298600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project triggerEvLoop(); 298700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project return p_info; 298800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 298900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 299000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 29910d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackbornextern "C" void 29927f8568086f2ea14885b0091c793e14c2656f0da2Wink SavilleRIL_requestTimedCallback (RIL_TimedCallback callback, void *param, 2993f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville const struct timeval *relativeTime) { 29940d9f0c0ea45a0239653e04f2c63ccecb1bc62c6bDianne Hackborn internalRequestTimedCallback (callback, param, relativeTime); 299500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 299600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 299700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 2998f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillefailCauseToString(RIL_Errno e) { 299900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(e) { 300000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SUCCESS: return "E_SUCCESS"; 300100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_RADIO_NOT_AVAILABLE: return "E_RAIDO_NOT_AVAILABLE"; 300200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE"; 300300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT"; 300400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PIN2: return "E_SIM_PIN2"; 300500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SIM_PUK2: return "E_SIM_PUK2"; 300600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED"; 300700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_CANCELLED: return "E_CANCELLED"; 300800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL"; 300900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW"; 301000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY"; 3011f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT"; 30127553447d44bb3f494b00d573215d81398f61cfcdJohn Wang case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME"; 30137f8568086f2ea14885b0091c793e14c2656f0da2Wink Saville#ifdef FEATURE_MULTIMODE_ANDROID 3014f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE"; 3015f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED"; 3016f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville#endif 301700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown error>"; 301800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 301900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 302000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 302100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3022f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavilleradioStateToString(RIL_RadioState s) { 302300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 302400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_OFF: return "RADIO_OFF"; 302500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE"; 302600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY"; 302700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT"; 302800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY"; 3029f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY"; 3030f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY"; 3031f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT"; 3032f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY"; 3033f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RADIO_STATE_NV_READY:return"RADIO_NV_READY"; 303400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 303500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 303600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 303700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 303800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3039f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillecallStateToString(RIL_CallState s) { 304000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(s) { 304100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ACTIVE : return "ACTIVE"; 304200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_HOLDING: return "HOLDING"; 304300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_DIALING: return "DIALING"; 304400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_ALERTING: return "ALERTING"; 304500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_INCOMING: return "INCOMING"; 304600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_CALL_WAITING: return "WAITING"; 304700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown state>"; 304800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 304900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 305000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Projectconst char * 3052f4c4d36c410a3501d282dd7de1c7c3350734f27eWink SavillerequestToString(int request) { 305300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project/* 305400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_commands.h \ 305500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 305600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/' 305700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 305900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project cat libs/telephony/ril_unsol_commands.h \ 306000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | egrep "^ *{RIL_" \ 306100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/' 306200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 306300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project*/ 306400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project switch(request) { 306500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS"; 306600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN"; 306700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK"; 306800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2"; 306900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2"; 307000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN"; 307100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2"; 307200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION"; 307300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS"; 307400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DIAL: return "DIAL"; 307500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMSI: return "GET_IMSI"; 307600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP: return "HANGUP"; 307700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND"; 307800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 307900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 308000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CONFERENCE: return "CONFERENCE"; 308100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_UDUB: return "UDUB"; 308200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE"; 308300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; 308400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_REGISTRATION_STATE: return "REGISTRATION_STATE"; 308500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GPRS_REGISTRATION_STATE: return "GPRS_REGISTRATION_STATE"; 308600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OPERATOR: return "OPERATOR"; 308700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER"; 308800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF: return "DTMF"; 308900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS: return "SEND_SMS"; 309000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE"; 3091f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL"; 309200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SIM_IO: return "SIM_IO"; 309300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEND_USSD: return "SEND_USSD"; 309400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD"; 309500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_CLIR: return "GET_CLIR"; 309600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CLIR: return "SET_CLIR"; 309700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS"; 309800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD"; 309900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING"; 310000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING"; 310100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE"; 310200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEI: return "GET_IMEI"; 310300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV"; 310400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_ANSWER: return "ANSWER"; 3105f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL"; 310600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK"; 310700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK"; 310800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD"; 310900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE"; 311000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC"; 311100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL"; 311200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS "; 311300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_START: return "DTMF_START"; 311400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP"; 311500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION"; 311600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION"; 311700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE"; 311800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE"; 311900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS"; 312000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_MUTE: return "SET_MUTE"; 312100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_GET_MUTE: return "GET_MUTE"; 312200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP"; 3123f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE"; 3124f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST"; 312500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO"; 312600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW"; 312700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS"; 3128f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE"; 3129f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE"; 313000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE"; 313100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE"; 313200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND"; 313300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE"; 313400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 313500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE"; 313600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER"; 313700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES"; 3138f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_SUBSCRIPTION:return"CDMA_SET_SUBSCRIPTION"; 3139f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE"; 3140f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE"; 3141f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE"; 3142f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE"; 3143f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; 3144f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; 3145f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH"; 3146f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF"; 3147f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS"; 3148f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE"; 3149a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG"; 3150a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG"; 3151a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG"; 3152a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG"; 3153a592eebc476a3d234f47f93e58252f8c822fc772Wink Saville case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION"; 315403c1edf23e76a83b95ac6847e333cb1329bbfa1dNaveen Kalla case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY"; 3155f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION"; 3156f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM"; 3157f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM"; 3158f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY"; 3159000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE"; 3160000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS"; 3161000a9fe96fdf9111387d2bc389d2f6bb3e627d0fjsh case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS"; 316209a68ba315ca3d6b092fd8078cc42b93b7934a1ajsh case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS"; 3163563fd7207da27322bf3f3587ef6000a944a617b7jsh case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING"; 316400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 316500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 316600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED"; 316700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS"; 316800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 316900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 317000f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD"; 317100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)"; 317200f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED"; 317300f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH"; 317400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END"; 317500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND"; 317600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY"; 317700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP"; 317800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL"; 317900f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH"; 3180f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED"; 318100f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING"; 3182f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; 3183f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS"; 3184f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS"; 3185f4c4d36c410a3501d282dd7de1c7c3350734f27eWink Saville case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; 31863d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED"; 31873d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; 31883d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING"; 31893d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS"; 31903d54e74bc450bb40977e3ae6fab6185fe687bdaeWink Saville case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC"; 3191af6ecbf0fa03379818038459ee1b61ea393ffd4fJaikumar Ganesh case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW"; 31925d621da539abea83309d77317ede40126f47d5f0John Wang case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE"; 31935909cf831f0d687e93164daaecc43a2ff792cc3aJohn Wang case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE"; 319400f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project default: return "<unknown request>"; 319500f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project } 319600f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} 319700f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project 319800f06fc3fdb05d4276e76091cacb42b6f6862222The Android Open Source Project} /* namespace android */ 3199