114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Copyright (C) 2010 The Android Open Source Project 314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * 414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Licensed under the Apache License, Version 2.0 (the "License"); 514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * you may not use this file except in compliance with the License. 614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * You may obtain a copy of the License at 714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * 814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * http://www.apache.org/licenses/LICENSE-2.0 914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * 1014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Unless required by applicable law or agreed to in writing, software 1114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * distributed under the License is distributed on an "AS IS" BASIS, 1214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * See the License for the specific language governing permissions and 1414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * limitations under the License. 1514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 1614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 1714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include <map> 1814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 1914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include <v8.h> 209a9fbd294bf8a7465cf10480935edea8304ef661Wink Saville#include "ril.h" 2114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 2244662d067dce6eb3234c6a861aefed4be198fe61Ying Wang#include "hardware/ril/mock-ril/src/proto/ril.pb.h" 2314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 2414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "logging.h" 2514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "mock_ril.h" 2614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "node_buffer.h" 2714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "node_object_wrap.h" 2814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "protobuf_v8.h" 2914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "status.h" 3014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "util.h" 3114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "worker.h" 3214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 3314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#include "responses.h" 3414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 3514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang//#define RESPONSES_DEBUG 3614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#ifdef RESPONSES_DEBUG 3714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 386464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block#define DBG(...) ALOGD(__VA_ARGS__) 3914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 4014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#else 4114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 4214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#define DBG(...) 4314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 4414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang#endif 4514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 4614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 4714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 4814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * The Buffer is assumed to be empty so nothing to convert 4914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * @return STATUS_OK and *data = NULL *datalen = 0; 5014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 5114171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspWithNoData( 5214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 5314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspWithNoData E"); 5414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 5514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 5614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); 5714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 5814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspWithNoData X"); 5914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 6014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 6114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 6214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 6314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle response for an array of strings 6414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * 6514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * If a string value is "*magic-null*" then that value 6614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * will be returned as null. 6714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 6814171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspStrings( 6914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 7014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspStrings E"); 7114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 7214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); 7314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 7414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int result_len = rsp->strings_size() * sizeof(const char *); 7514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const char **result = (const char **)alloca(result_len); 7614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang for (int i = 0; i < rsp->strings_size(); i++) { 7714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[i] = rsp->strings(i).c_str(); 7814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("result[%d]='%s'", i, result[i]); 7914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (strcmp("*magic-null*", result[i]) == 0) { 8014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[i] = NULL; 8114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 8214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 8314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 8414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 8514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 8614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 8714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspStrings X rilErrno=%d", rilErrno); 8814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 8914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 9014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 9114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 9214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle response for a string 9314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 9414171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspString( 9514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 9614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspString E"); 9714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 9814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); 9914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 10014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const char *result = rsp->strings(0).c_str(); 10114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 10214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 10314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, (void *)result, strlen(result)); 10414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 10514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspString X rilErrno=%d", rilErrno); 10614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 10714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 10814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 10914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 11014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle response for an array of integers 11114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 11214171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspIntegers( 11314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 11414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspIntegers E"); 11514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 11614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspIntegers *rsp = new ril_proto::RspIntegers(); 11714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 11814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int result_len = rsp->integers_size() * sizeof(const int32_t); 11914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int32_t *result = (int32_t *)alloca(result_len); 12014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang for (int i = 0; i < rsp->integers_size(); i++) { 12114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[i] = rsp->integers(i); 12214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("result[%d]=%d", i, result[i]); 12314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 12414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 12514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 12614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 12714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 12814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspIntegers X rilErrno=%d", rilErrno); 12914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 13014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 13114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 13214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 13314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle RIL_REQUEST_GET_SIM_STATUS response 13414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 13514171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspGetSimStatus( 13614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 1 13714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspGetSimStatus E"); 13814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 13914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspGetSimStatus *rsp = new ril_proto::RspGetSimStatus(); 14014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 14114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RilCardStatus& r = rsp->card_status(); 1422c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville RIL_CardStatus_v6 cardStatus; 14314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.card_state = RIL_CardState(r.card_state()); 14414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.universal_pin_state = RIL_PinState(r.universal_pin_state()); 14514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.gsm_umts_subscription_app_index = r.gsm_umts_subscription_app_index(); 1462c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville cardStatus.ims_subscription_app_index = r.ims_subscription_app_index(); 14714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.num_applications = r.num_applications(); 14814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang for (int i = 0; i < cardStatus.num_applications; i++) { 14914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].app_type = RIL_AppType(r.applications(i).app_type()); 15014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].app_state = RIL_AppState(r.applications(i).app_state()); 15114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].perso_substate = 15214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RIL_PersoSubstate(r.applications(i).perso_substate()); 15314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].aid_ptr = const_cast<char *>(r.applications(i).aid().c_str()); 15414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].app_label_ptr = 15514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const_cast<char *>(r.applications(i).app_label().c_str()); 15614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].pin1_replaced = r.applications(i).pin1_replaced(); 15714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].pin1 = RIL_PinState(r.applications(i).pin1()); 15814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cardStatus.applications[i].pin2 = RIL_PinState(r.applications(i).pin2()); 15914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 16014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 16114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 16214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, 16314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang &cardStatus, sizeof(cardStatus)); 16414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 16514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspGetSimStatus X rilErrno=%d", rilErrno); 16614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 16714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 16814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 16914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 17014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle RIL_REQUEST_ENTER_SIM_PIN_DATA response 17114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 17214171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspEnterSimPinData( 17314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 2 17414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspEnterSimPinData E"); 17514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 17614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspEnterSimPin *rsp = new ril_proto::RspEnterSimPin(); 17714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 17814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("retries_remaining=%d", rsp->retries_remaining()); 17914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int retries_remaining = rsp->retries_remaining(); 18014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 18114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 18214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, 18314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang &retries_remaining, sizeof(retries_remaining)); 18414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 18514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspEnterSimPinData X rilErrno=%d", rilErrno); 18614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 18714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 18814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 18914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 19014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle RIL_REQUEST_GET_CURRENT_CALLS response // 9 19114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 19214171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspGetCurrentCalls ( 19314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 9 19414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspGetCurrentCalls E"); 19514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 19614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspGetCurrentCalls *rsp = new ril_proto::RspGetCurrentCalls(); 19714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 19814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int result_len = rsp->calls_size() * sizeof(const RIL_Call *); 19914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspGetCurrentCalls rilErrno=%d result_len=%d", rilErrno, result_len); 20014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RIL_Call **result = (RIL_Call **)alloca(result_len); 20114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang for (int i = 0; i < rsp->calls_size(); i++) { 20214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RilCall& srcCall = rsp->calls(i); 20314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RIL_Call *dstCall = (RIL_Call *)alloca(sizeof(RIL_Call)); 20414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 20514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[i] = dstCall; 20614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->state = (RIL_CallState)srcCall.state(); 20714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->index = srcCall.index(); 20814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->toa = srcCall.toa(); 20914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->isMpty = (char)srcCall.is_mpty(); 21014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->isMT = (char)srcCall.is_mt(); 21114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->als = srcCall.als(); 21214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->isVoice = (char)srcCall.is_voice(); 21314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->isVoicePrivacy = (char)srcCall.is_voice_privacy(); 21414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->number = (char *)srcCall.number().c_str(); 21514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->numberPresentation = srcCall.number_presentation(); 21614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->name = (char *)srcCall.name().c_str(); 21714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->namePresentation = srcCall.name_presentation(); 21814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (srcCall.has_uus_info()) { 21914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo = 22014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang (RIL_UUS_Info *)alloca(sizeof(RIL_UUS_Info)); 22114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo->uusType = 22214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang (RIL_UUS_Type)srcCall.uus_info().uus_type(); 22314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo->uusDcs = 22414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang (RIL_UUS_DCS)srcCall.uus_info().uus_dcs(); 22514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo->uusLength = 22614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang srcCall.uus_info().uus_length(); 22714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo->uusData = 22814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang (char *)srcCall.uus_info().uus_data().c_str(); 22914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 23014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang dstCall->uusInfo = NULL; 23114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 23214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 23314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 23414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 23514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 23614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 23714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspGetCurrentCalls X rilErrno=%d", rilErrno); 23814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 23914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 24014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 24114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 2422c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Savillevoid unmarshallRilSignalStrength(Buffer *buffer, RIL_SignalStrength_v6 *pSignalStrength) { 24314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Retrieve response from response message 24414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 24514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 24614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 24714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 24814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 2492c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); 25014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 25114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Copy the response message from response to format defined in ril.h 2522c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville RIL_SignalStrength_v6 curSignalStrength; 25314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 25414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.GW_SignalStrength.signalStrength = gwST.signal_strength(); 25514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.GW_SignalStrength.bitErrorRate = gwST.bit_error_rate(); 25614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.CDMA_SignalStrength.dbm = cdmaST.dbm(); 25714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.CDMA_SignalStrength.ecio = cdmaST.ecio(); 25814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.EVDO_SignalStrength.dbm = evdoST.dbm(); 25914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.EVDO_SignalStrength.ecio = evdoST.ecio(); 26014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang curSignalStrength.EVDO_SignalStrength.signalNoiseRatio = evdoST.signal_noise_ratio(); 2612c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville curSignalStrength.LTE_SignalStrength.signalStrength = lteST.signal_strength(); 2622c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville curSignalStrength.LTE_SignalStrength.rsrp = lteST.rsrp(); 2632c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville curSignalStrength.LTE_SignalStrength.rsrq = lteST.rsrq(); 2642c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville curSignalStrength.LTE_SignalStrength.rssnr = lteST.rssnr(); 2652c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville curSignalStrength.LTE_SignalStrength.cqi = lteST.cqi(); 26614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 26714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("print response signal strength: "); 26814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("gw signalstrength = %d", curSignalStrength.GW_SignalStrength.signalStrength); 2692c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("gw_bitErrorRate = %d", curSignalStrength.GW_SignalStrength.bitErrorRate); 2702c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("cdma_dbm = %d", curSignalStrength.CDMA_SignalStrength.dbm); 2712c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("cdma_ecio = %d", curSignalStrength.CDMA_SignalStrength.ecio); 2722c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("evdo_dbm = %d", curSignalStrength.EVDO_SignalStrength.dbm); 2732c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("evdo_ecio = %d", curSignalStrength.EVDO_SignalStrength.ecio); 2742c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("evdo_signalNoiseRatio = %d", curSignalStrength.EVDO_SignalStrength.signalNoiseRatio); 2752c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("lte_signalStrength = %d", curSignalStrength.LTE_SignalStrength.signalStrength); 2762c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("lte_rsrp = %d", curSignalStrength.LTE_SignalStrength.rsrp); 2772c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("lte_rsrq = %d", curSignalStrength.LTE_SignalStrength.rsrq); 2782c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("lte_rssnr = %d", curSignalStrength.LTE_SignalStrength.rssnr); 2792c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("lte_cqi = %d", curSignalStrength.LTE_SignalStrength.cqi); 2802c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville} 2812c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville 2822c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville/** 2832c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville * Handle RIL_REQUEST_SIGNAL_STRENGTH response 2842c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville */ 2852c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink SavilleRIL_Errno RspSignalStrength( 2862c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 19 2872c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("RspSignalStrength E"); 2882c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville 2892c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville DBG("cmd = %d, token=%p, rilErrno=%d", cmd, token, rilErrno); 2902c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville 2912c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville // Retrieve response from response message 2922c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 2932c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville rsp->ParseFromArray(buffer->data(), buffer->length()); 2942c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 2952c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 2962c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 2972c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); 2982c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville 2992c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville // Copy the response message from response to format defined in ril.h 3002c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville RIL_SignalStrength_v6 curSignalStrength; 3012c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville unmarshallRilSignalStrength(buffer, &curSignalStrength); 30214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 30314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 30414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, &curSignalStrength, sizeof(curSignalStrength)); 30514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 30614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspSignalStrength X rilErrno=%d", rilErrno); 30714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 30814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 30914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 31014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 31114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle RIL_REQUEST_OPERATOR response 31214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 31314171dca025273fb64b239c1ec86ed7d4b677343Xia WangRIL_Errno RspOperator( 31414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 22 31514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int status; 31614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 31714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspOperator E"); 31814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 31914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspOperator *rsp = new ril_proto::RspOperator(); 32014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 32114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const char *result[3] = { NULL, NULL, NULL }; 32214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (rsp->has_long_alpha_ons()) { 32314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("long_alpha_ons=%s", rsp->long_alpha_ons().c_str()); 32414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[0] = rsp->long_alpha_ons().c_str(); 32514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 32614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (rsp->has_short_alpha_ons()) { 32714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("short_alpha_ons=%s", rsp->short_alpha_ons().c_str()); 32814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[1] = rsp->short_alpha_ons().c_str(); 32914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 33014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (rsp->has_mcc_mnc()) { 33114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("mcc_mnc=%s", rsp->mcc_mnc().c_str()); 33214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang result[2] = rsp->mcc_mnc().c_str(); 33314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 33414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 33514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 33614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, result, sizeof(result)); 33714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 33814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("RspOperator X rilErrno=%d", rilErrno); 33914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return rilErrno; 34014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 34114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 34214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang// ----------------- Handle unsolicited response ---------------------------------------- 34314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang /** 34414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Handle RIL_UNSOL_SIGNAL_STRENGTH response 34514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 34614171dca025273fb64b239c1ec86ed7d4b677343Xia Wangvoid UnsolRspSignalStrength(int cmd, Buffer* buffer) { 34714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 34814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("UnsolRspSignalStrength E"); 349f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block ALOGE("unsolicited response command: %d", cmd); 35014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Retrieve response from response message 35114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 35214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rsp->ParseFromArray(buffer->data(), buffer->length()); 35314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 35414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 35514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 35614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 35714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Copy the response message from response to format defined in ril.h 3582c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville RIL_SignalStrength_v6 curSignalStrength; 3592c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville unmarshallRilSignalStrength(buffer, &curSignalStrength); 36014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 36114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnUnsolicitedResponse(cmd, &curSignalStrength, sizeof(curSignalStrength)); 36214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("UnsolRspSignalStrength X"); 36314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 36414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 36514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 36614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Maps for converting request complete and unsoliciated response 36714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * protobufs to ril data arrays. 36814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 36914171dca025273fb64b239c1ec86ed7d4b677343Xia Wangtypedef RIL_Errno (*RspConversion)( 37014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer* buffer); 37114171dca025273fb64b239c1ec86ed7d4b677343Xia Wangtypedef std::map<int, RspConversion> RspConversionMap; 37214171dca025273fb64b239c1ec86ed7d4b677343Xia WangRspConversionMap rilRspConversionMap; 37314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 37414171dca025273fb64b239c1ec86ed7d4b677343Xia Wangtypedef void (*UnsolRspConversion)(int cmd, Buffer* buffer); 37514171dca025273fb64b239c1ec86ed7d4b677343Xia Wangtypedef std::map<int, UnsolRspConversion> UnsolRspConversionMap; 37614171dca025273fb64b239c1ec86ed7d4b677343Xia WangUnsolRspConversionMap unsolRilRspConversionMap; 37714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 37814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 37914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Send a ril request complete response. 38014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 38114171dca025273fb64b239c1ec86ed7d4b677343Xia Wangv8::Handle<v8::Value> SendRilRequestComplete(const v8::Arguments& args) { 38214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("SendRilRequestComplete E"); 38314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::HandleScope handle_scope; 38414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> retValue; 38514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 38614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd; 38714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RIL_Errno rilErrno; 38814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RIL_Token token; 38914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang Buffer* buffer; 39014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 39114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang /** 39214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Get the arguments. There should be at least 3, cmd, 39314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * ril error code and token. Optionally a Buffer containing 39414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * the protobuf representation of the data to return. 39514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 39614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (args.Length() < REQUEST_COMPLETE_REQUIRED_CMDS) { 39714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Expecting a cmd, ERROR and token 398f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block ALOGE("SendRilRequestComplete X %d parameters" 39914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang " expecting at least %d: rilErrno, cmd, and token", 40014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args.Length(), REQUEST_COMPLETE_REQUIRED_CMDS); 40114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return v8::Undefined(); 40214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 40314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> v8RilErrCode( 40414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args[REQUEST_COMPLETE_RIL_ERR_CODE_INDEX]->ToObject()); 40514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilErrno = RIL_Errno(v8RilErrCode->NumberValue()); 40614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 40714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> v8Cmd( 40814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args[REQUEST_COMPLETE_CMD_INDEX]->ToObject()); 40914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cmd = int(v8Cmd->NumberValue()); 41014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 41114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> v8Token( 41214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args[REQUEST_COMPLETE_TOKEN_INDEX]->ToObject()); 41314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang token = RIL_Token(int64_t(v8Token->NumberValue())); 41414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 41514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (args.Length() >= (REQUEST_COMPLETE_DATA_INDEX+1)) { 41614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang buffer = ObjectWrap::Unwrap<Buffer>( 41714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args[REQUEST_COMPLETE_DATA_INDEX]->ToObject()); 41814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 41914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang buffer = NULL; 42014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 42114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 42214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("SendRilRequestComplete: rilErrno=%d, cmd=%d, token=%p", rilErrno, cmd, token); 42314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang RspConversionMap::iterator itr; 42414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang itr = rilRspConversionMap.find(cmd); 42514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (itr != rilRspConversionMap.end()) { 42614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang itr->second(cmd, token, rilErrno, buffer); 42714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 42814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if ((buffer == NULL) || (buffer->length() <= 0)) { 42914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Nothing to convert 43014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilErrno = RIL_E_SUCCESS; 43114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 43214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // There was a buffer but we don't support the resonse yet. 433f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block ALOGE("SendRilRequestComplete: No conversion routine for cmd %d," 43414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); 43514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilErrno = RIL_E_REQUEST_NOT_SUPPORTED; 43614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 43714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Complete the request 43814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); 43914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 44014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 44114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("SendRilRequestComplete X rillErrno=%d", rilErrno); 44214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return v8::Undefined(); 44314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 44414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 44514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/** 44614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Send an unsolicited response. 44714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 44814171dca025273fb64b239c1ec86ed7d4b677343Xia Wangv8::Handle<v8::Value> SendRilUnsolicitedResponse(const v8::Arguments& args) { 44914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("SendRilUnsolicitedResponse E"); 45014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::HandleScope handle_scope; 45114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> retValue; 45214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 45314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int status; 45414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang void *data; 45514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang size_t datalen; 45614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 45714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int cmd; 45814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang Buffer* buffer; 45914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 46014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang /** 46114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Get the cmd number and data arguments 46214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */ 46314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (args.Length() < UNSOL_RESPONSE_REQUIRED_CMDS) { 46414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Expecting a cmd 465f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block ALOGE("SendRilUnsolicitedResponse X %d parameters" 46614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang " expecting at least a cmd", 46714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang args.Length()); 46814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return v8::Undefined(); 46914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 47014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang v8::Handle<v8::Value> v8RilErrCode(args[UNSOL_RESPONSE_CMD_INDEX]->ToObject()); 47114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang cmd = int(v8RilErrCode->NumberValue()); 47214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 47314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // data is optional 47414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (args.Length() >= (UNSOL_RESPONSE_DATA_INDEX+1)) { 47514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang buffer = ObjectWrap::Unwrap<Buffer>(args[UNSOL_RESPONSE_DATA_INDEX]->ToObject()); 47614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 47714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang buffer = NULL; 47814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 47914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 48014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang UnsolRspConversionMap::iterator itr; 48114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang itr = unsolRilRspConversionMap.find(cmd); 48214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if (itr != unsolRilRspConversionMap.end()) { 48314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang itr->second(cmd, buffer); 48414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 48514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang if ((buffer == NULL) || (buffer->length() <= 0)) { 48614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // Nothing to convert 48714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang data = NULL; 48814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang datalen = 0; 48914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } else { 49014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang // There was a buffer but we don't support the response yet. 491f423cde8f901a72fd0cb811583a2cdabe62c64bdSteve Block ALOGE("SendRilUnsolicitedResponse: No conversion routine for cmd %d," 49214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); 49314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang data = NULL; 49414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang datalen = 0; 49514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 49614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang s_rilenv->OnUnsolicitedResponse(cmd, NULL, 0); 49714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang } 49814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 49914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang DBG("SendRilUnsolicitedResponse X"); 50014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return v8::Undefined(); 50114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 50214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 50314171dca025273fb64b239c1ec86ed7d4b677343Xia Wangint responsesInit(v8::Handle<v8::Context> context) { 5046464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block ALOGD("responsesInit E"); 50514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang int status = STATUS_OK; 50614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 50714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_GET_SIM_STATUS] = RspGetSimStatus; // 1 50814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_ENTER_SIM_PIN] = RspEnterSimPinData; // 2 50914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_GET_CURRENT_CALLS] = RspGetCurrentCalls; // 9 51014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_GET_IMSI] = RspString; // 11 51114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_HANGUP] = RspWithNoData; // 12 51214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = RspWithNoData; // 13 51314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = RspWithNoData; // 14 51414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = RspWithNoData; // 15 51514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_CONFERENCE] = RspWithNoData; // 16 5162b7b0f7d61dd1ee99722e27b51810fe51de92f0fXia Wang rilRspConversionMap[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = RspIntegers; // 18 51714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SIGNAL_STRENGTH] = RspSignalStrength; // 19 5182c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville rilRspConversionMap[RIL_REQUEST_VOICE_REGISTRATION_STATE] = RspStrings; // 20 5192c1fb3a4e7aa8039bdefacceec98aa43cfe5784cWink Saville rilRspConversionMap[RIL_REQUEST_DATA_REGISTRATION_STATE] = RspStrings; // 21 52014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_OPERATOR] = RspOperator; // 22 52114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_GET_IMEI] = RspString; // 38 52214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_GET_IMEISV] = RspString; // 39 523bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang rilRspConversionMap[RIL_REQUEST_ANSWER] = RspWithNoData; // 39 52414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = RspIntegers; // 45 52514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = RspWithNoData; // 46 52614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_BASEBAND_VERSION] = RspString; // 51 52714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SEPARATE_CONNECTION] = RspWithNoData; // 52 52814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SET_MUTE] = RspWithNoData; // 53 52914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang rilRspConversionMap[RIL_REQUEST_SCREEN_STATE] = RspWithNoData; // 61 53014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 53114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang unsolRilRspConversionMap[RIL_UNSOL_SIGNAL_STRENGTH] = UnsolRspSignalStrength; // 1009 53214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 53314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang 5346464068a31ff890d42d3da9cdf580d07c9c630d8Steve Block ALOGD("responsesInit X: status=%d", status); 53514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang return STATUS_OK; 53614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang} 537