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