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