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