13d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
23d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Copyright (C) 2010 The Android Open Source Project
33d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
43d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
53d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * you may not use this file except in compliance with the License.
63d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * You may obtain a copy of the License at
73d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
83d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
93d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
103d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Unless required by applicable law or agreed to in writing, software
113d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
123d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * See the License for the specific language governing permissions and
143d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * limitations under the License.
153d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
163d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
173d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <stdio.h>
183d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <assert.h>
193d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <string.h>
203d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <errno.h>
213d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <unistd.h>
223d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <sys/types.h>
233d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <sys/stat.h>
243d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <fcntl.h>
253d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <pthread.h>
263d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <alloca.h>
273d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <getopt.h>
283d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <sys/socket.h>
293d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <cutils/sockets.h>
303d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <termios.h>
313d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
323d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include <v8.h>
339a9fbd294bf8a7465cf10480935edea8304ef661Wink Saville#include "ril.h"
343d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3544662d067dce6eb3234c6a861aefed4be198fe61Ying Wang#include "hardware/ril/mock-ril/src/proto/ril.pb.h"
363d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
373d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "ctrl_server.h"
383d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "logging.h"
393d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "experiments.h"
403d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "js_support.h"
413d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "node_buffer.h"
423d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "node_object_wrap.h"
433d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "node_util.h"
443d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "protobuf_v8.h"
453d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "requests.h"
463d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "responses.h"
473d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "status.h"
483d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "util.h"
493d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "worker.h"
503d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "worker_v8.h"
513d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
523d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#include "mock_ril.h"
533d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
54a6b6baf518c8814cfae9841f352503ce045eb3edWink Savilleextern "C" {
55a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville// Needed so we can call it prior to calling startMockRil
56a6b6baf518c8814cfae9841f352503ce045eb3edWink Savilleextern void RIL_register(const RIL_RadioFunctions *callbacks);
57a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville}
58a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
593d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville//#define MOCK_RIL_DEBUG
603d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#ifdef  MOCK_RIL_DEBUG
613d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
626464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block#define DBG(...) ALOGD(__VA_ARGS__)
633d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
643d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#else
653d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
663d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#define DBG(...)
673d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
683d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#endif
693d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
703d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
713d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#define MOCK_RIL_VER_STRING "Android Mock-ril 0.1"
723d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
733d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
743d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Forward declarations
753d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
763d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void onRequest (int request, void *data, size_t datalen, RIL_Token t);
773d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic RIL_RadioState currentState();
783d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic int onSupports (int requestCode);
793d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void onCancel (RIL_Token t);
803d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic const char *getVersion();
813d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
823d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void testOnRequestComplete(RIL_Token t, RIL_Errno e,
833d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                       void *response, size_t responselen);
843d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void testRequestTimedCallback(RIL_TimedCallback callback,
853d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                void *param, const struct timeval *relativeTime);
863d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void testOnUnsolicitedResponse(int unsolResponse, const void *data,
873d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                                size_t datalen);
883d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
893d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
903d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * The environment from rild with the completion routine
913d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
923d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savilleconst struct RIL_Env *s_rilenv;
933d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
943d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
953d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Expose our routines to rild
963d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
973d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic const RIL_RadioFunctions s_callbacks = {
983d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    RIL_VERSION,
993d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    onRequest,
1003d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    currentState,
1013d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    onSupports,
1023d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    onCancel,
1033d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    getVersion
1043d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville};
1053d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1063d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1073d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * A test environment
1083d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1093d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic const RIL_Env testEnv = {
1103d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    testOnRequestComplete,
1113d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    testOnUnsolicitedResponse,
1123d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    testRequestTimedCallback
1133d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville};
1143d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1153d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1163d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * The request worker queue to handle requests
1173d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1183d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic RilRequestWorkerQueue *s_requestWorkerQueue;
1193d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1203d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1213d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Call from RIL to us to make a RIL_REQUEST
1223d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1233d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Must be completed with a call to RIL_onRequestComplete()
1243d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1253d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * RIL_onRequestComplete() may be called from any thread, before or after
1263d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * this function returns.
1273d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1283d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Will always be called from the same thread, so returning here implies
1293d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * that the radio is ready to process another command (whether or not
1303d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * the previous command has c1mpleted).
1313d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1323d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void onRequest (int request, void *data, size_t datalen, RIL_Token t)
1333d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville{
1343d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("onRequest: request=%d data=%p datalen=%d token=%p",
1353d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            request, data, datalen, t);
1363d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    s_requestWorkerQueue->AddRequest(request, data, datalen, t);
1373d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1383d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1393d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1403d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Synchronous call from the RIL to us to return current radio state.
1413d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * RADIO_STATE_UNAVAILABLE should be the initial state.
1423d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1433d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic RIL_RadioState currentState()
1443d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville{
145311475aeb4f37eb50445d3a6ed04094a10fffe99Wink Saville    DBG("currentState: gRadioState=%d", gRadioState);
146311475aeb4f37eb50445d3a6ed04094a10fffe99Wink Saville    return gRadioState;
1473d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1483d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1493d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1503d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Call from RIL to us to find out whether a specific request code
1513d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * is supported by this implementation.
1523d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1533d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Return 1 for "supported" and 0 for "unsupported"
1543d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1553d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1563d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic int
1573d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink SavilleonSupports (int requestCode)
1583d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville{
1593d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("onSupports: nothing supported at the moment, return 0");
1603d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    return 0;
1613d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1623d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1633d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic void onCancel (RIL_Token t)
1643d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville{
1653d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("onCancel: ignorning");
1663d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1673d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1683d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillestatic const char * getVersion(void)
1693d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville{
1703d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("getVersion: return '%s'", MOCK_RIL_VER_STRING);
1713d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    return MOCK_RIL_VER_STRING;
1723d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1733d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1743d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1753d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * "t" is parameter passed in on previous call to RIL_Notification
1763d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * routine.
1773d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1783d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * If "e" != SUCCESS, then response can be null/is ignored
1793d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1803d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * "response" is owned by caller, and should not be modified or
1813d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * freed by callee
1823d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1833d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * RIL_onRequestComplete will return as soon as possible
1843d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1853d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillevoid testOnRequestComplete(RIL_Token t, RIL_Errno e,
1863d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                       void *response, size_t responselen) {
1873d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("testOnRequestComplete E: token=%p rilErrCode=%d data=%p datalen=%d",
1883d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            t, e, response, responselen);
1893d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("testOnRequestComplete X:");
1903d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
1913d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
1923d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
1933d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * "unsolResponse" is one of RIL_UNSOL_RESPONSE_*
1943d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * "data" is pointer to data defined for that RIL_UNSOL_RESPONSE_*
1953d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville *
1963d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * "data" is owned by caller, and should not be modified or freed by callee
1973d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
1983d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillevoid testOnUnsolicitedResponse(int unsolResponse, const void *data,
1993d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                                size_t datalen) {
2003d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("testOnUnsolicitedResponse ignoring");
2013d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
2023d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2033d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville/**
2043d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * Call user-specifed "callback" function on on the same thread that
2053d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * RIL_RequestFunc is called. If "relativeTime" is specified, then it specifies
2063d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * a relative time value at which the callback is invoked. If relativeTime is
2073d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * NULL or points to a 0-filled structure, the callback will be invoked as
2083d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville * soon as possible
2093d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville */
2103d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savillevoid testRequestTimedCallback(RIL_TimedCallback callback,
2113d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                               void *param, const struct timeval *relativeTime) {
2123d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    DBG("testRequestTimedCallback ignoring");
2133d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
2143d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2153d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#if 0
2163d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savilleclass UnsolicitedThread : public WorkerThread {
2173d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville  private:
2183d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::Handle<v8::Context> context_;
2193d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2203d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville  public:
2213d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    UnsolicitedThread(v8::Handle<v8::Context> context) :
2223d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        context_(context) {
2233d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    }
2243d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2253d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    int OnUnsolicitedTick(int tick) {
2263d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::HandleScope handle_scope;
2273d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2283d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        // Get handle to onUnslicitedTick.
2293d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::String> name = v8::String::New("onUnsolicitedTick");
2303d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::Value> functionValue = context_->Global()->Get(name);
2313d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::Function> onUnsolicitedTick =
2323d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville                v8::Handle<v8::Function>::Cast(functionValue);
2333d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2343d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        // Create the argument array
2353d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::Value> v8TickValue = v8::Number::New(tick);
2363d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::Value> argv[1] = { v8TickValue };
2373d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2383d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Handle<v8::Value> resultValue =
2393d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            onUnsolicitedTick->Call(context_->Global(), 1, argv);
2403d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        int result = int(resultValue->NumberValue());
2413d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        return result;
2423d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    }
2433d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2443d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    void * Worker(void *param)
2453d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    {
2466464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block        ALOGD("UnsolicitedThread::Worker E param=%p", param);
2473d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2483d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        v8::Locker locker;
2493d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
250a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville        for (int i = 0; isRunning(); i++) {
2513d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            // Get access and setup scope
2523d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            v8::HandleScope handle_scope;
2533d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            v8::Context::Scope context_scope(context_);
2543d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2553d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            // Do it
2563d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            int sleepTime = OnUnsolicitedTick(i);
2573d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2583d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            // Wait
2593d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            v8::Unlocker unlocker;
2603d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            sleep(sleepTime);
2613d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            v8::Locker locker;
2623d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        }
2633d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2646464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block        ALOGD("UnsolicitedThread::Worker X param=%p", param);
2653d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2663d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        return NULL;
2673d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    }
2683d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville};
2693d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#endif
2703d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
271a6b6baf518c8814cfae9841f352503ce045eb3edWink Savillevoid startMockRil(v8::Handle<v8::Context> context) {
272a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    v8::HandleScope handle_scope;
2736e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang    v8::TryCatch try_catch;
274a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
275a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    // Get handle to startMockRil and call it.
276a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    v8::Handle<v8::String> name = v8::String::New("startMockRil");
277a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    v8::Handle<v8::Value> functionValue = context->Global()->Get(name);
278a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    v8::Handle<v8::Function> start =
279a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville            v8::Handle<v8::Function>::Cast(functionValue);
280a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
2816e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang    v8::Handle<v8::Value> result = start->Call(context->Global(), 0, NULL);
2826e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang    if (try_catch.HasCaught()) {
283f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block        ALOGE("startMockRil error");
2846e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang        ReportException(&try_catch);
285f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block        ALOGE("FATAL ERROR: Unsable to startMockRil.");
2866e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang    } else {
2876e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang        v8::String::Utf8Value result_string(result);
288f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block        ALOGE("startMockRil result=%s", ToCString(result_string));
2896e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang    }
2906e9b68672783e613607e3f1e7867a4e5b863f344Xia Wang
291a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville}
292a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
293a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
2943d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Savilleconst RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc,
2953d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        char **argv) {
2963d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    int ret;
2973d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    pthread_attr_t attr;
2983d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
2996464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block    ALOGD("RIL_Init E: ----------------");
3003d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3013d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // Initialize V8
3023d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::V8::Initialize();
3033d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3043d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // We're going to use multiple threads need to start locked
3053d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::Locker locker;
3063d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3073d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // Initialize modules
3083d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    protobuf_v8::Init();
3093d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    WorkerV8Init();
3103d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3113d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // Make a context and setup a scope
3123d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::Persistent<v8::Context> context = makeJsContext();
3133d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::Context::Scope context_scope(context);
3143d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    v8::TryCatch try_catch;
3153d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    try_catch.SetVerbose(true);
3163d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3173d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // Initialize modules needing context
3183d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    ctrlServerInit(context);
3193d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3203d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    s_rilenv = &testEnv;
3213d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3223d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    // load/run mock_ril.js
3233d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    char *buffer;
3243d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    int status = ReadFile("/sdcard/data/mock_ril.js", &buffer);
3253d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    if (status == 0) {
3263d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        runJs(context, &try_catch, "mock_ril.js", buffer);
3273d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        if (try_catch.HasCaught()) {
3283d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville            // TODO: Change to event this is fatal
329f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block            ALOGE("FATAL ERROR: Unable to run mock_ril.js");
3303d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville        }
3313d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    }
3323d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3333d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    s_rilenv = env;
3343d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    requestsInit(context, &s_requestWorkerQueue);
3353d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    responsesInit(context);
3363d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
33765afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang#if 0
3386464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block    ALOGD("RIL_Init run tests #####################");
33965afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang    testJsSupport(context);
34065afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang    testRequests(context);
34165afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang    experiments(context);
34265afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang    testWorker();
34365afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang    testWorkerV8(context);
3446464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block    ALOGD("RIL_Init tests completed ###############");
34565afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang#endif
34665afce60eeaf9ab855d6d1ef262f144e95fb92c4Xia Wang
347a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    // Register our call backs so when we startMockRil
348a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    // and it wants to send unsolicited messages the
349a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    // mock ril is registered
350a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    RIL_register(&s_callbacks);
351a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
352a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    // Start the mock ril
353a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville    startMockRil(context);
354a6b6baf518c8814cfae9841f352503ce045eb3edWink Saville
3553d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#if 0
3563d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    UnsolicitedThread *ut = new UnsolicitedThread(context);
3573d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    ut->Run(NULL);
3583d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville#endif
3593d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville
3606464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block    ALOGD("RIL_Init X: ----------------");
3613d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville    return &s_callbacks;
3623d6d348df5378b3f3f79ebbfad21d86ae1c9f239Wink Saville}
363