1 /** 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <map> 18 19 #include <v8.h> 20 #include "ril.h" 21 22 #include "hardware/ril/mock-ril/src/proto/ril.pb.h" 23 24 #include "logging.h" 25 #include "mock_ril.h" 26 #include "node_buffer.h" 27 #include "node_object_wrap.h" 28 #include "protobuf_v8.h" 29 #include "status.h" 30 #include "util.h" 31 #include "worker.h" 32 33 #include "responses.h" 34 35 //#define RESPONSES_DEBUG 36 #ifdef RESPONSES_DEBUG 37 38 #define DBG(...) LOGD(__VA_ARGS__) 39 40 #else 41 42 #define DBG(...) 43 44 #endif 45 46 47 /** 48 * The Buffer is assumed to be empty so nothing to convert 49 * @return STATUS_OK and *data = NULL *datalen = 0; 50 */ 51 RIL_Errno RspWithNoData( 52 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 53 DBG("RspWithNoData E"); 54 55 // Complete the request 56 s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); 57 58 DBG("RspWithNoData X"); 59 return rilErrno; 60 } 61 62 /** 63 * Handle response for an array of strings 64 * 65 * If a string value is "*magic-null*" then that value 66 * will be returned as null. 67 */ 68 RIL_Errno RspStrings( 69 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 70 DBG("RspStrings E"); 71 72 ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); 73 rsp->ParseFromArray(buffer->data(), buffer->length()); 74 int result_len = rsp->strings_size() * sizeof(const char *); 75 const char **result = (const char **)alloca(result_len); 76 for (int i = 0; i < rsp->strings_size(); i++) { 77 result[i] = rsp->strings(i).c_str(); 78 DBG("result[%d]='%s'", i, result[i]); 79 if (strcmp("*magic-null*", result[i]) == 0) { 80 result[i] = NULL; 81 } 82 } 83 84 // Complete the request 85 s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 86 87 DBG("RspStrings X rilErrno=%d", rilErrno); 88 return rilErrno; 89 } 90 91 /** 92 * Handle response for a string 93 */ 94 RIL_Errno RspString( 95 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 96 DBG("RspString E"); 97 98 ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); 99 rsp->ParseFromArray(buffer->data(), buffer->length()); 100 const char *result = rsp->strings(0).c_str(); 101 102 // Complete the request 103 s_rilenv->OnRequestComplete(token, rilErrno, (void *)result, strlen(result)); 104 105 DBG("RspString X rilErrno=%d", rilErrno); 106 return rilErrno; 107 } 108 109 /** 110 * Handle response for an array of integers 111 */ 112 RIL_Errno RspIntegers( 113 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { 114 DBG("RspIntegers E"); 115 116 ril_proto::RspIntegers *rsp = new ril_proto::RspIntegers(); 117 rsp->ParseFromArray(buffer->data(), buffer->length()); 118 int result_len = rsp->integers_size() * sizeof(const int32_t); 119 int32_t *result = (int32_t *)alloca(result_len); 120 for (int i = 0; i < rsp->integers_size(); i++) { 121 result[i] = rsp->integers(i); 122 DBG("result[%d]=%d", i, result[i]); 123 } 124 125 // Complete the request 126 s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 127 128 DBG("RspIntegers X rilErrno=%d", rilErrno); 129 return rilErrno; 130 } 131 132 /** 133 * Handle RIL_REQUEST_GET_SIM_STATUS response 134 */ 135 RIL_Errno RspGetSimStatus( 136 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 1 137 DBG("RspGetSimStatus E"); 138 139 ril_proto::RspGetSimStatus *rsp = new ril_proto::RspGetSimStatus(); 140 rsp->ParseFromArray(buffer->data(), buffer->length()); 141 const ril_proto::RilCardStatus& r = rsp->card_status(); 142 RIL_CardStatus_v6 cardStatus; 143 cardStatus.card_state = RIL_CardState(r.card_state()); 144 cardStatus.universal_pin_state = RIL_PinState(r.universal_pin_state()); 145 cardStatus.gsm_umts_subscription_app_index = r.gsm_umts_subscription_app_index(); 146 cardStatus.ims_subscription_app_index = r.ims_subscription_app_index(); 147 cardStatus.num_applications = r.num_applications(); 148 for (int i = 0; i < cardStatus.num_applications; i++) { 149 cardStatus.applications[i].app_type = RIL_AppType(r.applications(i).app_type()); 150 cardStatus.applications[i].app_state = RIL_AppState(r.applications(i).app_state()); 151 cardStatus.applications[i].perso_substate = 152 RIL_PersoSubstate(r.applications(i).perso_substate()); 153 cardStatus.applications[i].aid_ptr = const_cast<char *>(r.applications(i).aid().c_str()); 154 cardStatus.applications[i].app_label_ptr = 155 const_cast<char *>(r.applications(i).app_label().c_str()); 156 cardStatus.applications[i].pin1_replaced = r.applications(i).pin1_replaced(); 157 cardStatus.applications[i].pin1 = RIL_PinState(r.applications(i).pin1()); 158 cardStatus.applications[i].pin2 = RIL_PinState(r.applications(i).pin2()); 159 } 160 161 // Complete the request 162 s_rilenv->OnRequestComplete(token, rilErrno, 163 &cardStatus, sizeof(cardStatus)); 164 165 DBG("RspGetSimStatus X rilErrno=%d", rilErrno); 166 return rilErrno; 167 } 168 169 /** 170 * Handle RIL_REQUEST_ENTER_SIM_PIN_DATA response 171 */ 172 RIL_Errno RspEnterSimPinData( 173 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 2 174 DBG("RspEnterSimPinData E"); 175 176 ril_proto::RspEnterSimPin *rsp = new ril_proto::RspEnterSimPin(); 177 rsp->ParseFromArray(buffer->data(), buffer->length()); 178 DBG("retries_remaining=%d", rsp->retries_remaining()); 179 int retries_remaining = rsp->retries_remaining(); 180 181 // Complete the request 182 s_rilenv->OnRequestComplete(token, rilErrno, 183 &retries_remaining, sizeof(retries_remaining)); 184 185 DBG("RspEnterSimPinData X rilErrno=%d", rilErrno); 186 return rilErrno; 187 } 188 189 /** 190 * Handle RIL_REQUEST_GET_CURRENT_CALLS response // 9 191 */ 192 RIL_Errno RspGetCurrentCalls ( 193 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 9 194 DBG("RspGetCurrentCalls E"); 195 196 ril_proto::RspGetCurrentCalls *rsp = new ril_proto::RspGetCurrentCalls(); 197 rsp->ParseFromArray(buffer->data(), buffer->length()); 198 int result_len = rsp->calls_size() * sizeof(const RIL_Call *); 199 DBG("RspGetCurrentCalls rilErrno=%d result_len=%d", rilErrno, result_len); 200 RIL_Call **result = (RIL_Call **)alloca(result_len); 201 for (int i = 0; i < rsp->calls_size(); i++) { 202 const ril_proto::RilCall& srcCall = rsp->calls(i); 203 RIL_Call *dstCall = (RIL_Call *)alloca(sizeof(RIL_Call)); 204 205 result[i] = dstCall; 206 dstCall->state = (RIL_CallState)srcCall.state(); 207 dstCall->index = srcCall.index(); 208 dstCall->toa = srcCall.toa(); 209 dstCall->isMpty = (char)srcCall.is_mpty(); 210 dstCall->isMT = (char)srcCall.is_mt(); 211 dstCall->als = srcCall.als(); 212 dstCall->isVoice = (char)srcCall.is_voice(); 213 dstCall->isVoicePrivacy = (char)srcCall.is_voice_privacy(); 214 dstCall->number = (char *)srcCall.number().c_str(); 215 dstCall->numberPresentation = srcCall.number_presentation(); 216 dstCall->name = (char *)srcCall.name().c_str(); 217 dstCall->namePresentation = srcCall.name_presentation(); 218 if (srcCall.has_uus_info()) { 219 dstCall->uusInfo = 220 (RIL_UUS_Info *)alloca(sizeof(RIL_UUS_Info)); 221 dstCall->uusInfo->uusType = 222 (RIL_UUS_Type)srcCall.uus_info().uus_type(); 223 dstCall->uusInfo->uusDcs = 224 (RIL_UUS_DCS)srcCall.uus_info().uus_dcs(); 225 dstCall->uusInfo->uusLength = 226 srcCall.uus_info().uus_length(); 227 dstCall->uusInfo->uusData = 228 (char *)srcCall.uus_info().uus_data().c_str(); 229 } else { 230 dstCall->uusInfo = NULL; 231 } 232 } 233 234 // Complete the request 235 s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); 236 237 DBG("RspGetCurrentCalls X rilErrno=%d", rilErrno); 238 return rilErrno; 239 } 240 241 242 void unmarshallRilSignalStrength(Buffer *buffer, RIL_SignalStrength_v6 *pSignalStrength) { 243 // Retrieve response from response message 244 ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 245 rsp->ParseFromArray(buffer->data(), buffer->length()); 246 const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 247 const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 248 const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 249 const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); 250 251 // Copy the response message from response to format defined in ril.h 252 RIL_SignalStrength_v6 curSignalStrength; 253 254 curSignalStrength.GW_SignalStrength.signalStrength = gwST.signal_strength(); 255 curSignalStrength.GW_SignalStrength.bitErrorRate = gwST.bit_error_rate(); 256 curSignalStrength.CDMA_SignalStrength.dbm = cdmaST.dbm(); 257 curSignalStrength.CDMA_SignalStrength.ecio = cdmaST.ecio(); 258 curSignalStrength.EVDO_SignalStrength.dbm = evdoST.dbm(); 259 curSignalStrength.EVDO_SignalStrength.ecio = evdoST.ecio(); 260 curSignalStrength.EVDO_SignalStrength.signalNoiseRatio = evdoST.signal_noise_ratio(); 261 curSignalStrength.LTE_SignalStrength.signalStrength = lteST.signal_strength(); 262 curSignalStrength.LTE_SignalStrength.rsrp = lteST.rsrp(); 263 curSignalStrength.LTE_SignalStrength.rsrq = lteST.rsrq(); 264 curSignalStrength.LTE_SignalStrength.rssnr = lteST.rssnr(); 265 curSignalStrength.LTE_SignalStrength.cqi = lteST.cqi(); 266 267 DBG("print response signal strength: "); 268 DBG("gw signalstrength = %d", curSignalStrength.GW_SignalStrength.signalStrength); 269 DBG("gw_bitErrorRate = %d", curSignalStrength.GW_SignalStrength.bitErrorRate); 270 DBG("cdma_dbm = %d", curSignalStrength.CDMA_SignalStrength.dbm); 271 DBG("cdma_ecio = %d", curSignalStrength.CDMA_SignalStrength.ecio); 272 DBG("evdo_dbm = %d", curSignalStrength.EVDO_SignalStrength.dbm); 273 DBG("evdo_ecio = %d", curSignalStrength.EVDO_SignalStrength.ecio); 274 DBG("evdo_signalNoiseRatio = %d", curSignalStrength.EVDO_SignalStrength.signalNoiseRatio); 275 DBG("lte_signalStrength = %d", curSignalStrength.LTE_SignalStrength.signalStrength); 276 DBG("lte_rsrp = %d", curSignalStrength.LTE_SignalStrength.rsrp); 277 DBG("lte_rsrq = %d", curSignalStrength.LTE_SignalStrength.rsrq); 278 DBG("lte_rssnr = %d", curSignalStrength.LTE_SignalStrength.rssnr); 279 DBG("lte_cqi = %d", curSignalStrength.LTE_SignalStrength.cqi); 280 } 281 282 /** 283 * Handle RIL_REQUEST_SIGNAL_STRENGTH response 284 */ 285 RIL_Errno RspSignalStrength( 286 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 19 287 DBG("RspSignalStrength E"); 288 289 DBG("cmd = %d, token=%p, rilErrno=%d", cmd, token, rilErrno); 290 291 // Retrieve response from response message 292 ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 293 rsp->ParseFromArray(buffer->data(), buffer->length()); 294 const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 295 const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 296 const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 297 const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); 298 299 // Copy the response message from response to format defined in ril.h 300 RIL_SignalStrength_v6 curSignalStrength; 301 unmarshallRilSignalStrength(buffer, &curSignalStrength); 302 303 // Complete the request 304 s_rilenv->OnRequestComplete(token, rilErrno, &curSignalStrength, sizeof(curSignalStrength)); 305 306 DBG("RspSignalStrength X rilErrno=%d", rilErrno); 307 return rilErrno; 308 } 309 310 /** 311 * Handle RIL_REQUEST_OPERATOR response 312 */ 313 RIL_Errno RspOperator( 314 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 22 315 int status; 316 317 DBG("RspOperator E"); 318 319 ril_proto::RspOperator *rsp = new ril_proto::RspOperator(); 320 rsp->ParseFromArray(buffer->data(), buffer->length()); 321 const char *result[3] = { NULL, NULL, NULL }; 322 if (rsp->has_long_alpha_ons()) { 323 DBG("long_alpha_ons=%s", rsp->long_alpha_ons().c_str()); 324 result[0] = rsp->long_alpha_ons().c_str(); 325 } 326 if (rsp->has_short_alpha_ons()) { 327 DBG("short_alpha_ons=%s", rsp->short_alpha_ons().c_str()); 328 result[1] = rsp->short_alpha_ons().c_str(); 329 } 330 if (rsp->has_mcc_mnc()) { 331 DBG("mcc_mnc=%s", rsp->mcc_mnc().c_str()); 332 result[2] = rsp->mcc_mnc().c_str(); 333 } 334 335 // Complete the request 336 s_rilenv->OnRequestComplete(token, rilErrno, result, sizeof(result)); 337 338 DBG("RspOperator X rilErrno=%d", rilErrno); 339 return rilErrno; 340 } 341 342 // ----------------- Handle unsolicited response ---------------------------------------- 343 /** 344 * Handle RIL_UNSOL_SIGNAL_STRENGTH response 345 */ 346 void UnsolRspSignalStrength(int cmd, Buffer* buffer) { 347 348 DBG("UnsolRspSignalStrength E"); 349 LOGE("unsolicited response command: %d", cmd); 350 // Retrieve response from response message 351 ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); 352 rsp->ParseFromArray(buffer->data(), buffer->length()); 353 const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); 354 const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); 355 const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); 356 357 // Copy the response message from response to format defined in ril.h 358 RIL_SignalStrength_v6 curSignalStrength; 359 unmarshallRilSignalStrength(buffer, &curSignalStrength); 360 361 s_rilenv->OnUnsolicitedResponse(cmd, &curSignalStrength, sizeof(curSignalStrength)); 362 DBG("UnsolRspSignalStrength X"); 363 } 364 365 /** 366 * Maps for converting request complete and unsoliciated response 367 * protobufs to ril data arrays. 368 */ 369 typedef RIL_Errno (*RspConversion)( 370 int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer* buffer); 371 typedef std::map<int, RspConversion> RspConversionMap; 372 RspConversionMap rilRspConversionMap; 373 374 typedef void (*UnsolRspConversion)(int cmd, Buffer* buffer); 375 typedef std::map<int, UnsolRspConversion> UnsolRspConversionMap; 376 UnsolRspConversionMap unsolRilRspConversionMap; 377 378 /** 379 * Send a ril request complete response. 380 */ 381 v8::Handle<v8::Value> SendRilRequestComplete(const v8::Arguments& args) { 382 DBG("SendRilRequestComplete E"); 383 v8::HandleScope handle_scope; 384 v8::Handle<v8::Value> retValue; 385 386 int cmd; 387 RIL_Errno rilErrno; 388 RIL_Token token; 389 Buffer* buffer; 390 391 /** 392 * Get the arguments. There should be at least 3, cmd, 393 * ril error code and token. Optionally a Buffer containing 394 * the protobuf representation of the data to return. 395 */ 396 if (args.Length() < REQUEST_COMPLETE_REQUIRED_CMDS) { 397 // Expecting a cmd, ERROR and token 398 LOGE("SendRilRequestComplete X %d parameters" 399 " expecting at least %d: rilErrno, cmd, and token", 400 args.Length(), REQUEST_COMPLETE_REQUIRED_CMDS); 401 return v8::Undefined(); 402 } 403 v8::Handle<v8::Value> v8RilErrCode( 404 args[REQUEST_COMPLETE_RIL_ERR_CODE_INDEX]->ToObject()); 405 rilErrno = RIL_Errno(v8RilErrCode->NumberValue()); 406 407 v8::Handle<v8::Value> v8Cmd( 408 args[REQUEST_COMPLETE_CMD_INDEX]->ToObject()); 409 cmd = int(v8Cmd->NumberValue()); 410 411 v8::Handle<v8::Value> v8Token( 412 args[REQUEST_COMPLETE_TOKEN_INDEX]->ToObject()); 413 token = RIL_Token(int64_t(v8Token->NumberValue())); 414 415 if (args.Length() >= (REQUEST_COMPLETE_DATA_INDEX+1)) { 416 buffer = ObjectWrap::Unwrap<Buffer>( 417 args[REQUEST_COMPLETE_DATA_INDEX]->ToObject()); 418 } else { 419 buffer = NULL; 420 } 421 422 DBG("SendRilRequestComplete: rilErrno=%d, cmd=%d, token=%p", rilErrno, cmd, token); 423 RspConversionMap::iterator itr; 424 itr = rilRspConversionMap.find(cmd); 425 if (itr != rilRspConversionMap.end()) { 426 itr->second(cmd, token, rilErrno, buffer); 427 } else { 428 if ((buffer == NULL) || (buffer->length() <= 0)) { 429 // Nothing to convert 430 rilErrno = RIL_E_SUCCESS; 431 } else { 432 // There was a buffer but we don't support the resonse yet. 433 LOGE("SendRilRequestComplete: No conversion routine for cmd %d," 434 " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); 435 rilErrno = RIL_E_REQUEST_NOT_SUPPORTED; 436 } 437 // Complete the request 438 s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); 439 } 440 441 DBG("SendRilRequestComplete X rillErrno=%d", rilErrno); 442 return v8::Undefined(); 443 } 444 445 /** 446 * Send an unsolicited response. 447 */ 448 v8::Handle<v8::Value> SendRilUnsolicitedResponse(const v8::Arguments& args) { 449 DBG("SendRilUnsolicitedResponse E"); 450 v8::HandleScope handle_scope; 451 v8::Handle<v8::Value> retValue; 452 453 int status; 454 void *data; 455 size_t datalen; 456 457 int cmd; 458 Buffer* buffer; 459 460 /** 461 * Get the cmd number and data arguments 462 */ 463 if (args.Length() < UNSOL_RESPONSE_REQUIRED_CMDS) { 464 // Expecting a cmd 465 LOGE("SendRilUnsolicitedResponse X %d parameters" 466 " expecting at least a cmd", 467 args.Length()); 468 return v8::Undefined(); 469 } 470 v8::Handle<v8::Value> v8RilErrCode(args[UNSOL_RESPONSE_CMD_INDEX]->ToObject()); 471 cmd = int(v8RilErrCode->NumberValue()); 472 473 // data is optional 474 if (args.Length() >= (UNSOL_RESPONSE_DATA_INDEX+1)) { 475 buffer = ObjectWrap::Unwrap<Buffer>(args[UNSOL_RESPONSE_DATA_INDEX]->ToObject()); 476 } else { 477 buffer = NULL; 478 } 479 480 UnsolRspConversionMap::iterator itr; 481 itr = unsolRilRspConversionMap.find(cmd); 482 if (itr != unsolRilRspConversionMap.end()) { 483 itr->second(cmd, buffer); 484 } else { 485 if ((buffer == NULL) || (buffer->length() <= 0)) { 486 // Nothing to convert 487 data = NULL; 488 datalen = 0; 489 } else { 490 // There was a buffer but we don't support the response yet. 491 LOGE("SendRilUnsolicitedResponse: No conversion routine for cmd %d," 492 " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); 493 data = NULL; 494 datalen = 0; 495 } 496 s_rilenv->OnUnsolicitedResponse(cmd, NULL, 0); 497 } 498 499 DBG("SendRilUnsolicitedResponse X"); 500 return v8::Undefined(); 501 } 502 503 int responsesInit(v8::Handle<v8::Context> context) { 504 LOGD("responsesInit E"); 505 int status = STATUS_OK; 506 507 rilRspConversionMap[RIL_REQUEST_GET_SIM_STATUS] = RspGetSimStatus; // 1 508 rilRspConversionMap[RIL_REQUEST_ENTER_SIM_PIN] = RspEnterSimPinData; // 2 509 rilRspConversionMap[RIL_REQUEST_GET_CURRENT_CALLS] = RspGetCurrentCalls; // 9 510 rilRspConversionMap[RIL_REQUEST_GET_IMSI] = RspString; // 11 511 rilRspConversionMap[RIL_REQUEST_HANGUP] = RspWithNoData; // 12 512 rilRspConversionMap[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = RspWithNoData; // 13 513 rilRspConversionMap[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = RspWithNoData; // 14 514 rilRspConversionMap[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = RspWithNoData; // 15 515 rilRspConversionMap[RIL_REQUEST_CONFERENCE] = RspWithNoData; // 16 516 rilRspConversionMap[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = RspIntegers; // 18 517 rilRspConversionMap[RIL_REQUEST_SIGNAL_STRENGTH] = RspSignalStrength; // 19 518 rilRspConversionMap[RIL_REQUEST_VOICE_REGISTRATION_STATE] = RspStrings; // 20 519 rilRspConversionMap[RIL_REQUEST_DATA_REGISTRATION_STATE] = RspStrings; // 21 520 rilRspConversionMap[RIL_REQUEST_OPERATOR] = RspOperator; // 22 521 rilRspConversionMap[RIL_REQUEST_GET_IMEI] = RspString; // 38 522 rilRspConversionMap[RIL_REQUEST_GET_IMEISV] = RspString; // 39 523 rilRspConversionMap[RIL_REQUEST_ANSWER] = RspWithNoData; // 39 524 rilRspConversionMap[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = RspIntegers; // 45 525 rilRspConversionMap[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = RspWithNoData; // 46 526 rilRspConversionMap[RIL_REQUEST_BASEBAND_VERSION] = RspString; // 51 527 rilRspConversionMap[RIL_REQUEST_SEPARATE_CONNECTION] = RspWithNoData; // 52 528 rilRspConversionMap[RIL_REQUEST_SET_MUTE] = RspWithNoData; // 53 529 rilRspConversionMap[RIL_REQUEST_SCREEN_STATE] = RspWithNoData; // 61 530 531 unsolRilRspConversionMap[RIL_UNSOL_SIGNAL_STRENGTH] = UnsolRspSignalStrength; // 1009 532 533 534 LOGD("responsesInit X: status=%d", status); 535 return STATUS_OK; 536 } 537