Home | History | Annotate | Download | only in libril
      1 /*
      2  * Copyright (c) 2016 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 #define LOG_TAG "RILC"
     18 
     19 #include <android/hardware/radio/1.0/IRadio.h>
     20 #include <android/hardware/radio/deprecated/1.0/IOemHook.h>
     21 
     22 #include <hwbinder/IPCThreadState.h>
     23 #include <hwbinder/ProcessState.h>
     24 #include <ril_service.h>
     25 #include <hidl/HidlTransportSupport.h>
     26 #include <utils/SystemClock.h>
     27 #include <inttypes.h>
     28 
     29 #define INVALID_HEX_CHAR 16
     30 
     31 // Enable verbose logging
     32 #define VDBG 0
     33 
     34 using namespace android::hardware::radio::V1_0;
     35 using namespace android::hardware::radio::deprecated::V1_0;
     36 using ::android::hardware::configureRpcThreadpool;
     37 using ::android::hardware::joinRpcThreadpool;
     38 using ::android::hardware::Return;
     39 using ::android::hardware::hidl_string;
     40 using ::android::hardware::hidl_vec;
     41 using ::android::hardware::hidl_array;
     42 using ::android::hardware::Void;
     43 using android::CommandInfo;
     44 using android::RequestInfo;
     45 using android::requestToString;
     46 using android::sp;
     47 
     48 #define BOOL_TO_INT(x) (x ? 1 : 0)
     49 #define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
     50 #define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
     51 
     52 #if defined(ANDROID_MULTI_SIM)
     53 #define CALL_ONREQUEST(a, b, c, d, e) \
     54         s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
     55 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
     56 #else
     57 #define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
     58 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
     59 #endif
     60 
     61 RIL_RadioFunctions *s_vendorFunctions = NULL;
     62 static CommandInfo *s_commands;
     63 
     64 struct RadioImpl;
     65 struct OemHookImpl;
     66 
     67 #if (SIM_COUNT >= 2)
     68 sp<RadioImpl> radioService[SIM_COUNT];
     69 sp<OemHookImpl> oemHookService[SIM_COUNT];
     70 // counter used for synchronization. It is incremented every time response callbacks are updated.
     71 volatile int32_t mCounterRadio[SIM_COUNT];
     72 volatile int32_t mCounterOemHook[SIM_COUNT];
     73 #else
     74 sp<RadioImpl> radioService[1];
     75 sp<OemHookImpl> oemHookService[1];
     76 // counter used for synchronization. It is incremented every time response callbacks are updated.
     77 volatile int32_t mCounterRadio[1];
     78 volatile int32_t mCounterOemHook[1];
     79 #endif
     80 
     81 static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
     82 
     83 #if (SIM_COUNT >= 2)
     84 static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
     85 #if (SIM_COUNT >= 3)
     86 static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
     87 #if (SIM_COUNT >= 4)
     88 static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
     89 #endif
     90 #endif
     91 #endif
     92 
     93 void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
     94         hidl_vec<HardwareConfig>& records);
     95 
     96 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
     97 
     98 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
     99 
    100 void convertRilSignalStrengthToHal(void *response, size_t responseLen,
    101         SignalStrength& signalStrength);
    102 
    103 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
    104         SetupDataCallResult& dcResult);
    105 
    106 void convertRilDataCallListToHal(void *response, size_t responseLen,
    107         hidl_vec<SetupDataCallResult>& dcResultList);
    108 
    109 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
    110 
    111 struct RadioImpl : public IRadio {
    112     int32_t mSlotId;
    113     sp<IRadioResponse> mRadioResponse;
    114     sp<IRadioIndication> mRadioIndication;
    115 
    116     Return<void> setResponseFunctions(
    117             const ::android::sp<IRadioResponse>& radioResponse,
    118             const ::android::sp<IRadioIndication>& radioIndication);
    119 
    120     Return<void> getIccCardStatus(int32_t serial);
    121 
    122     Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
    123             const hidl_string& aid);
    124 
    125     Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
    126             const hidl_string& pin, const hidl_string& aid);
    127 
    128     Return<void> supplyIccPin2ForApp(int32_t serial,
    129             const hidl_string& pin2,
    130             const hidl_string& aid);
    131 
    132     Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
    133             const hidl_string& pin2, const hidl_string& aid);
    134 
    135     Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
    136             const hidl_string& newPin, const hidl_string& aid);
    137 
    138     Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
    139             const hidl_string& newPin2, const hidl_string& aid);
    140 
    141     Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
    142 
    143     Return<void> getCurrentCalls(int32_t serial);
    144 
    145     Return<void> dial(int32_t serial, const Dial& dialInfo);
    146 
    147     Return<void> getImsiForApp(int32_t serial,
    148             const ::android::hardware::hidl_string& aid);
    149 
    150     Return<void> hangup(int32_t serial, int32_t gsmIndex);
    151 
    152     Return<void> hangupWaitingOrBackground(int32_t serial);
    153 
    154     Return<void> hangupForegroundResumeBackground(int32_t serial);
    155 
    156     Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
    157 
    158     Return<void> conference(int32_t serial);
    159 
    160     Return<void> rejectCall(int32_t serial);
    161 
    162     Return<void> getLastCallFailCause(int32_t serial);
    163 
    164     Return<void> getSignalStrength(int32_t serial);
    165 
    166     Return<void> getVoiceRegistrationState(int32_t serial);
    167 
    168     Return<void> getDataRegistrationState(int32_t serial);
    169 
    170     Return<void> getOperator(int32_t serial);
    171 
    172     Return<void> setRadioPower(int32_t serial, bool on);
    173 
    174     Return<void> sendDtmf(int32_t serial,
    175             const ::android::hardware::hidl_string& s);
    176 
    177     Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
    178 
    179     Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
    180 
    181     Return<void> setupDataCall(int32_t serial,
    182             RadioTechnology radioTechnology,
    183             const DataProfileInfo& profileInfo,
    184             bool modemCognitive,
    185             bool roamingAllowed,
    186             bool isRoaming);
    187 
    188     Return<void> iccIOForApp(int32_t serial,
    189             const IccIo& iccIo);
    190 
    191     Return<void> sendUssd(int32_t serial,
    192             const ::android::hardware::hidl_string& ussd);
    193 
    194     Return<void> cancelPendingUssd(int32_t serial);
    195 
    196     Return<void> getClir(int32_t serial);
    197 
    198     Return<void> setClir(int32_t serial, int32_t status);
    199 
    200     Return<void> getCallForwardStatus(int32_t serial,
    201             const CallForwardInfo& callInfo);
    202 
    203     Return<void> setCallForward(int32_t serial,
    204             const CallForwardInfo& callInfo);
    205 
    206     Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
    207 
    208     Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
    209 
    210     Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
    211             bool success, SmsAcknowledgeFailCause cause);
    212 
    213     Return<void> acceptCall(int32_t serial);
    214 
    215     Return<void> deactivateDataCall(int32_t serial,
    216             int32_t cid, bool reasonRadioShutDown);
    217 
    218     Return<void> getFacilityLockForApp(int32_t serial,
    219             const ::android::hardware::hidl_string& facility,
    220             const ::android::hardware::hidl_string& password,
    221             int32_t serviceClass,
    222             const ::android::hardware::hidl_string& appId);
    223 
    224     Return<void> setFacilityLockForApp(int32_t serial,
    225             const ::android::hardware::hidl_string& facility,
    226             bool lockState,
    227             const ::android::hardware::hidl_string& password,
    228             int32_t serviceClass,
    229             const ::android::hardware::hidl_string& appId);
    230 
    231     Return<void> setBarringPassword(int32_t serial,
    232             const ::android::hardware::hidl_string& facility,
    233             const ::android::hardware::hidl_string& oldPassword,
    234             const ::android::hardware::hidl_string& newPassword);
    235 
    236     Return<void> getNetworkSelectionMode(int32_t serial);
    237 
    238     Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
    239 
    240     Return<void> setNetworkSelectionModeManual(int32_t serial,
    241             const ::android::hardware::hidl_string& operatorNumeric);
    242 
    243     Return<void> getAvailableNetworks(int32_t serial);
    244 
    245     Return<void> startDtmf(int32_t serial,
    246             const ::android::hardware::hidl_string& s);
    247 
    248     Return<void> stopDtmf(int32_t serial);
    249 
    250     Return<void> getBasebandVersion(int32_t serial);
    251 
    252     Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
    253 
    254     Return<void> setMute(int32_t serial, bool enable);
    255 
    256     Return<void> getMute(int32_t serial);
    257 
    258     Return<void> getClip(int32_t serial);
    259 
    260     Return<void> getDataCallList(int32_t serial);
    261 
    262     Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
    263 
    264     Return<void> writeSmsToSim(int32_t serial,
    265             const SmsWriteArgs& smsWriteArgs);
    266 
    267     Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
    268 
    269     Return<void> setBandMode(int32_t serial, RadioBandMode mode);
    270 
    271     Return<void> getAvailableBandModes(int32_t serial);
    272 
    273     Return<void> sendEnvelope(int32_t serial,
    274             const ::android::hardware::hidl_string& command);
    275 
    276     Return<void> sendTerminalResponseToSim(int32_t serial,
    277             const ::android::hardware::hidl_string& commandResponse);
    278 
    279     Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
    280 
    281     Return<void> explicitCallTransfer(int32_t serial);
    282 
    283     Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
    284 
    285     Return<void> getPreferredNetworkType(int32_t serial);
    286 
    287     Return<void> getNeighboringCids(int32_t serial);
    288 
    289     Return<void> setLocationUpdates(int32_t serial, bool enable);
    290 
    291     Return<void> setCdmaSubscriptionSource(int32_t serial,
    292             CdmaSubscriptionSource cdmaSub);
    293 
    294     Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
    295 
    296     Return<void> getCdmaRoamingPreference(int32_t serial);
    297 
    298     Return<void> setTTYMode(int32_t serial, TtyMode mode);
    299 
    300     Return<void> getTTYMode(int32_t serial);
    301 
    302     Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
    303 
    304     Return<void> getPreferredVoicePrivacy(int32_t serial);
    305 
    306     Return<void> sendCDMAFeatureCode(int32_t serial,
    307             const ::android::hardware::hidl_string& featureCode);
    308 
    309     Return<void> sendBurstDtmf(int32_t serial,
    310             const ::android::hardware::hidl_string& dtmf,
    311             int32_t on,
    312             int32_t off);
    313 
    314     Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
    315 
    316     Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
    317             const CdmaSmsAck& smsAck);
    318 
    319     Return<void> getGsmBroadcastConfig(int32_t serial);
    320 
    321     Return<void> setGsmBroadcastConfig(int32_t serial,
    322             const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
    323 
    324     Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
    325 
    326     Return<void> getCdmaBroadcastConfig(int32_t serial);
    327 
    328     Return<void> setCdmaBroadcastConfig(int32_t serial,
    329             const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
    330 
    331     Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
    332 
    333     Return<void> getCDMASubscription(int32_t serial);
    334 
    335     Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
    336 
    337     Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
    338 
    339     Return<void> getDeviceIdentity(int32_t serial);
    340 
    341     Return<void> exitEmergencyCallbackMode(int32_t serial);
    342 
    343     Return<void> getSmscAddress(int32_t serial);
    344 
    345     Return<void> setSmscAddress(int32_t serial,
    346             const ::android::hardware::hidl_string& smsc);
    347 
    348     Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
    349 
    350     Return<void> reportStkServiceIsRunning(int32_t serial);
    351 
    352     Return<void> getCdmaSubscriptionSource(int32_t serial);
    353 
    354     Return<void> requestIsimAuthentication(int32_t serial,
    355             const ::android::hardware::hidl_string& challenge);
    356 
    357     Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
    358             bool success,
    359             const ::android::hardware::hidl_string& ackPdu);
    360 
    361     Return<void> sendEnvelopeWithStatus(int32_t serial,
    362             const ::android::hardware::hidl_string& contents);
    363 
    364     Return<void> getVoiceRadioTechnology(int32_t serial);
    365 
    366     Return<void> getCellInfoList(int32_t serial);
    367 
    368     Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
    369 
    370     Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
    371             bool modemCognitive, bool isRoaming);
    372 
    373     Return<void> getImsRegistrationState(int32_t serial);
    374 
    375     Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
    376 
    377     Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
    378 
    379     Return<void> iccOpenLogicalChannel(int32_t serial,
    380             const ::android::hardware::hidl_string& aid, int32_t p2);
    381 
    382     Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
    383 
    384     Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
    385 
    386     Return<void> nvReadItem(int32_t serial, NvItem itemId);
    387 
    388     Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
    389 
    390     Return<void> nvWriteCdmaPrl(int32_t serial,
    391             const ::android::hardware::hidl_vec<uint8_t>& prl);
    392 
    393     Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
    394 
    395     Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
    396 
    397     Return<void> setDataAllowed(int32_t serial, bool allow);
    398 
    399     Return<void> getHardwareConfig(int32_t serial);
    400 
    401     Return<void> requestIccSimAuthentication(int32_t serial,
    402             int32_t authContext,
    403             const ::android::hardware::hidl_string& authData,
    404             const ::android::hardware::hidl_string& aid);
    405 
    406     Return<void> setDataProfile(int32_t serial,
    407             const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
    408 
    409     Return<void> requestShutdown(int32_t serial);
    410 
    411     Return<void> getRadioCapability(int32_t serial);
    412 
    413     Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
    414 
    415     Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
    416 
    417     Return<void> stopLceService(int32_t serial);
    418 
    419     Return<void> pullLceData(int32_t serial);
    420 
    421     Return<void> getModemActivityInfo(int32_t serial);
    422 
    423     Return<void> setAllowedCarriers(int32_t serial,
    424             bool allAllowed,
    425             const CarrierRestrictions& carriers);
    426 
    427     Return<void> getAllowedCarriers(int32_t serial);
    428 
    429     Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
    430 
    431     Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
    432 
    433     Return<void> setSimCardPower(int32_t serial, bool powerUp);
    434 
    435     Return<void> responseAcknowledgement();
    436 
    437     void checkReturnStatus(Return<void>& ret);
    438 };
    439 
    440 struct OemHookImpl : public IOemHook {
    441     int32_t mSlotId;
    442     sp<IOemHookResponse> mOemHookResponse;
    443     sp<IOemHookIndication> mOemHookIndication;
    444 
    445     Return<void> setResponseFunctions(
    446             const ::android::sp<IOemHookResponse>& oemHookResponse,
    447             const ::android::sp<IOemHookIndication>& oemHookIndication);
    448 
    449     Return<void> sendRequestRaw(int32_t serial,
    450             const ::android::hardware::hidl_vec<uint8_t>& data);
    451 
    452     Return<void> sendRequestStrings(int32_t serial,
    453             const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
    454 };
    455 
    456 void memsetAndFreeStrings(int numPointers, ...) {
    457     va_list ap;
    458     va_start(ap, numPointers);
    459     for (int i = 0; i < numPointers; i++) {
    460         char *ptr = va_arg(ap, char *);
    461         if (ptr) {
    462 #ifdef MEMSET_FREED
    463             // TODO: Should pass in the maximum length of the string
    464             memsetString(ptr);
    465 #endif
    466             free(ptr);
    467         }
    468     }
    469     va_end(ap);
    470 }
    471 
    472 void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
    473     pRI->pCI->responseFunction((int) pRI->socket_id,
    474             (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
    475 }
    476 
    477 /**
    478  * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
    479  * request with error RIL_E_NO_MEMORY.
    480  * Returns true on success, and false on failure.
    481  */
    482 bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
    483     size_t len = src.size();
    484     if (len == 0) {
    485         *dest = NULL;
    486         return true;
    487     }
    488     *dest = (char *) calloc(len + 1, sizeof(char));
    489     if (*dest == NULL) {
    490         RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
    491         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
    492         return false;
    493     }
    494     strncpy(*dest, src.c_str(), len + 1);
    495     return true;
    496 }
    497 
    498 hidl_string convertCharPtrToHidlString(const char *ptr) {
    499     hidl_string ret;
    500     if (ptr != NULL) {
    501         // TODO: replace this with strnlen
    502         ret.setToExternal(ptr, strlen(ptr));
    503     }
    504     return ret;
    505 }
    506 
    507 bool dispatchVoid(int serial, int slotId, int request) {
    508     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    509     if (pRI == NULL) {
    510         return false;
    511     }
    512     CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
    513     return true;
    514 }
    515 
    516 bool dispatchString(int serial, int slotId, int request, const char * str) {
    517     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    518     if (pRI == NULL) {
    519         return false;
    520     }
    521 
    522     char *pString;
    523     if (!copyHidlStringToRil(&pString, str, pRI)) {
    524         return false;
    525     }
    526 
    527     CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
    528 
    529     memsetAndFreeStrings(1, pString);
    530     return true;
    531 }
    532 
    533 bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
    534     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    535     if (pRI == NULL) {
    536         return false;
    537     }
    538 
    539     char **pStrings;
    540     pStrings = (char **)calloc(countStrings, sizeof(char *));
    541     if (pStrings == NULL) {
    542         RLOGE("Memory allocation failed for request %s", requestToString(request));
    543         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
    544         return false;
    545     }
    546     va_list ap;
    547     va_start(ap, countStrings);
    548     for (int i = 0; i < countStrings; i++) {
    549         const char* str = va_arg(ap, const char *);
    550         if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
    551             va_end(ap);
    552             for (int j = 0; j < i; j++) {
    553                 memsetAndFreeStrings(1, pStrings[j]);
    554             }
    555             free(pStrings);
    556             return false;
    557         }
    558     }
    559     va_end(ap);
    560 
    561     CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
    562 
    563     if (pStrings != NULL) {
    564         for (int i = 0 ; i < countStrings ; i++) {
    565             memsetAndFreeStrings(1, pStrings[i]);
    566         }
    567 
    568 #ifdef MEMSET_FREED
    569         memset(pStrings, 0, countStrings * sizeof(char *));
    570 #endif
    571         free(pStrings);
    572     }
    573     return true;
    574 }
    575 
    576 bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
    577     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    578     if (pRI == NULL) {
    579         return false;
    580     }
    581 
    582     int countStrings = data.size();
    583     char **pStrings;
    584     pStrings = (char **)calloc(countStrings, sizeof(char *));
    585     if (pStrings == NULL) {
    586         RLOGE("Memory allocation failed for request %s", requestToString(request));
    587         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
    588         return false;
    589     }
    590 
    591     for (int i = 0; i < countStrings; i++) {
    592         if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
    593             for (int j = 0; j < i; j++) {
    594                 memsetAndFreeStrings(1, pStrings[j]);
    595             }
    596             free(pStrings);
    597             return false;
    598         }
    599     }
    600 
    601     CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
    602 
    603     if (pStrings != NULL) {
    604         for (int i = 0 ; i < countStrings ; i++) {
    605             memsetAndFreeStrings(1, pStrings[i]);
    606         }
    607 
    608 #ifdef MEMSET_FREED
    609         memset(pStrings, 0, countStrings * sizeof(char *));
    610 #endif
    611         free(pStrings);
    612     }
    613     return true;
    614 }
    615 
    616 bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
    617     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    618     if (pRI == NULL) {
    619         return false;
    620     }
    621 
    622     int *pInts = (int *)calloc(countInts, sizeof(int));
    623 
    624     if (pInts == NULL) {
    625         RLOGE("Memory allocation failed for request %s", requestToString(request));
    626         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
    627         return false;
    628     }
    629     va_list ap;
    630     va_start(ap, countInts);
    631     for (int i = 0; i < countInts; i++) {
    632         pInts[i] = va_arg(ap, int);
    633     }
    634     va_end(ap);
    635 
    636     CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
    637 
    638     if (pInts != NULL) {
    639 #ifdef MEMSET_FREED
    640         memset(pInts, 0, countInts * sizeof(int));
    641 #endif
    642         free(pInts);
    643     }
    644     return true;
    645 }
    646 
    647 bool dispatchCallForwardStatus(int serial, int slotId, int request,
    648                               const CallForwardInfo& callInfo) {
    649     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    650     if (pRI == NULL) {
    651         return false;
    652     }
    653 
    654     RIL_CallForwardInfo cf;
    655     cf.status = (int) callInfo.status;
    656     cf.reason = callInfo.reason;
    657     cf.serviceClass = callInfo.serviceClass;
    658     cf.toa = callInfo.toa;
    659     cf.timeSeconds = callInfo.timeSeconds;
    660 
    661     if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
    662         return false;
    663     }
    664 
    665     CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
    666 
    667     memsetAndFreeStrings(1, cf.number);
    668 
    669     return true;
    670 }
    671 
    672 bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
    673     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    674     if (pRI == NULL) {
    675         return false;
    676     }
    677 
    678     const uint8_t *uData = rawBytes.data();
    679 
    680     CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
    681 
    682     return true;
    683 }
    684 
    685 bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
    686     RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
    687     if (pRI == NULL) {
    688         return false;
    689     }
    690 
    691     RIL_SIM_APDU apdu = {};
    692 
    693     apdu.sessionid = message.sessionId;
    694     apdu.cla = message.cla;
    695     apdu.instruction = message.instruction;
    696     apdu.p1 = message.p1;
    697     apdu.p2 = message.p2;
    698     apdu.p3 = message.p3;
    699 
    700     if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
    701         return false;
    702     }
    703 
    704     CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
    705 
    706     memsetAndFreeStrings(1, apdu.data);
    707 
    708     return true;
    709 }
    710 
    711 void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
    712     if (ret.isOk() == false) {
    713         RLOGE("checkReturnStatus: unable to call response/indication callback");
    714         // Remote process hosting the callbacks must be dead. Reset the callback objects;
    715         // there's no other recovery to be done here. When the client process is back up, it will
    716         // call setResponseFunctions()
    717 
    718         // Caller should already hold rdlock, release that first
    719         // note the current counter to avoid overwriting updates made by another thread before
    720         // write lock is acquired.
    721         int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
    722         pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
    723         int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
    724         assert(ret == 0);
    725 
    726         // acquire wrlock
    727         ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
    728         assert(ret == 0);
    729 
    730         // make sure the counter value has not changed
    731         if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
    732             if (isRadioService) {
    733                 radioService[slotId]->mRadioResponse = NULL;
    734                 radioService[slotId]->mRadioIndication = NULL;
    735             } else {
    736                 oemHookService[slotId]->mOemHookResponse = NULL;
    737                 oemHookService[slotId]->mOemHookIndication = NULL;
    738             }
    739             isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
    740         } else {
    741             RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
    742                     "got updated on another thread");
    743         }
    744 
    745         // release wrlock
    746         ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
    747         assert(ret == 0);
    748 
    749         // Reacquire rdlock
    750         ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
    751         assert(ret == 0);
    752     }
    753 }
    754 
    755 void RadioImpl::checkReturnStatus(Return<void>& ret) {
    756     ::checkReturnStatus(mSlotId, ret, true);
    757 }
    758 
    759 Return<void> RadioImpl::setResponseFunctions(
    760         const ::android::sp<IRadioResponse>& radioResponseParam,
    761         const ::android::sp<IRadioIndication>& radioIndicationParam) {
    762     RLOGD("setResponseFunctions");
    763 
    764     pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
    765     int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
    766     assert(ret == 0);
    767 
    768     mRadioResponse = radioResponseParam;
    769     mRadioIndication = radioIndicationParam;
    770     mCounterRadio[mSlotId]++;
    771 
    772     ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
    773     assert(ret == 0);
    774 
    775     // client is connected. Send initial indications.
    776     android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
    777 
    778     return Void();
    779 }
    780 
    781 Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
    782 #if VDBG
    783     RLOGD("getIccCardStatus: serial %d", serial);
    784 #endif
    785     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
    786     return Void();
    787 }
    788 
    789 Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
    790         const hidl_string& aid) {
    791 #if VDBG
    792     RLOGD("supplyIccPinForApp: serial %d", serial);
    793 #endif
    794     dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
    795             2, pin.c_str(), aid.c_str());
    796     return Void();
    797 }
    798 
    799 Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
    800                                            const hidl_string& pin, const hidl_string& aid) {
    801 #if VDBG
    802     RLOGD("supplyIccPukForApp: serial %d", serial);
    803 #endif
    804     dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
    805             3, puk.c_str(), pin.c_str(), aid.c_str());
    806     return Void();
    807 }
    808 
    809 Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
    810                                             const hidl_string& aid) {
    811 #if VDBG
    812     RLOGD("supplyIccPin2ForApp: serial %d", serial);
    813 #endif
    814     dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
    815             2, pin2.c_str(), aid.c_str());
    816     return Void();
    817 }
    818 
    819 Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
    820                                             const hidl_string& pin2, const hidl_string& aid) {
    821 #if VDBG
    822     RLOGD("supplyIccPuk2ForApp: serial %d", serial);
    823 #endif
    824     dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
    825             3, puk2.c_str(), pin2.c_str(), aid.c_str());
    826     return Void();
    827 }
    828 
    829 Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
    830                                            const hidl_string& newPin, const hidl_string& aid) {
    831 #if VDBG
    832     RLOGD("changeIccPinForApp: serial %d", serial);
    833 #endif
    834     dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
    835             3, oldPin.c_str(), newPin.c_str(), aid.c_str());
    836     return Void();
    837 }
    838 
    839 Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
    840                                             const hidl_string& newPin2, const hidl_string& aid) {
    841 #if VDBG
    842     RLOGD("changeIccPin2ForApp: serial %d", serial);
    843 #endif
    844     dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
    845             3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
    846     return Void();
    847 }
    848 
    849 Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
    850                                                        const hidl_string& netPin) {
    851 #if VDBG
    852     RLOGD("supplyNetworkDepersonalization: serial %d", serial);
    853 #endif
    854     dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
    855             1, netPin.c_str());
    856     return Void();
    857 }
    858 
    859 Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
    860 #if VDBG
    861     RLOGD("getCurrentCalls: serial %d", serial);
    862 #endif
    863     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
    864     return Void();
    865 }
    866 
    867 Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
    868 #if VDBG
    869     RLOGD("dial: serial %d", serial);
    870 #endif
    871     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
    872     if (pRI == NULL) {
    873         return Void();
    874     }
    875     RIL_Dial dial = {};
    876     RIL_UUS_Info uusInfo = {};
    877     int32_t sizeOfDial = sizeof(dial);
    878 
    879     if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
    880         return Void();
    881     }
    882     dial.clir = (int) dialInfo.clir;
    883 
    884     if (dialInfo.uusInfo.size() != 0) {
    885         uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
    886         uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
    887 
    888         if (dialInfo.uusInfo[0].uusData.size() == 0) {
    889             uusInfo.uusData = NULL;
    890             uusInfo.uusLength = 0;
    891         } else {
    892             if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
    893                 memsetAndFreeStrings(1, dial.address);
    894                 return Void();
    895             }
    896             uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
    897         }
    898 
    899         dial.uusInfo = &uusInfo;
    900     }
    901 
    902     CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
    903 
    904     memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
    905 
    906     return Void();
    907 }
    908 
    909 Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
    910 #if VDBG
    911     RLOGD("getImsiForApp: serial %d", serial);
    912 #endif
    913     dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
    914             1, aid.c_str());
    915     return Void();
    916 }
    917 
    918 Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
    919 #if VDBG
    920     RLOGD("hangup: serial %d", serial);
    921 #endif
    922     dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
    923     return Void();
    924 }
    925 
    926 Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
    927 #if VDBG
    928     RLOGD("hangupWaitingOrBackground: serial %d", serial);
    929 #endif
    930     dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
    931     return Void();
    932 }
    933 
    934 Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
    935 #if VDBG
    936     RLOGD("hangupForegroundResumeBackground: serial %d", serial);
    937 #endif
    938     dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
    939     return Void();
    940 }
    941 
    942 Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
    943 #if VDBG
    944     RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
    945 #endif
    946     dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
    947     return Void();
    948 }
    949 
    950 Return<void> RadioImpl::conference(int32_t serial) {
    951 #if VDBG
    952     RLOGD("conference: serial %d", serial);
    953 #endif
    954     dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
    955     return Void();
    956 }
    957 
    958 Return<void> RadioImpl::rejectCall(int32_t serial) {
    959 #if VDBG
    960     RLOGD("rejectCall: serial %d", serial);
    961 #endif
    962     dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
    963     return Void();
    964 }
    965 
    966 Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
    967 #if VDBG
    968     RLOGD("getLastCallFailCause: serial %d", serial);
    969 #endif
    970     dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
    971     return Void();
    972 }
    973 
    974 Return<void> RadioImpl::getSignalStrength(int32_t serial) {
    975 #if VDBG
    976     RLOGD("getSignalStrength: serial %d", serial);
    977 #endif
    978     dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
    979     return Void();
    980 }
    981 
    982 Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
    983 #if VDBG
    984     RLOGD("getVoiceRegistrationState: serial %d", serial);
    985 #endif
    986     dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
    987     return Void();
    988 }
    989 
    990 Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
    991 #if VDBG
    992     RLOGD("getDataRegistrationState: serial %d", serial);
    993 #endif
    994     dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
    995     return Void();
    996 }
    997 
    998 Return<void> RadioImpl::getOperator(int32_t serial) {
    999 #if VDBG
   1000     RLOGD("getOperator: serial %d", serial);
   1001 #endif
   1002     dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
   1003     return Void();
   1004 }
   1005 
   1006 Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
   1007     RLOGD("setRadioPower: serial %d on %d", serial, on);
   1008     dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
   1009     return Void();
   1010 }
   1011 
   1012 Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
   1013 #if VDBG
   1014     RLOGD("sendDtmf: serial %d", serial);
   1015 #endif
   1016     dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
   1017     return Void();
   1018 }
   1019 
   1020 Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
   1021 #if VDBG
   1022     RLOGD("sendSms: serial %d", serial);
   1023 #endif
   1024     dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
   1025             2, message.smscPdu.c_str(), message.pdu.c_str());
   1026     return Void();
   1027 }
   1028 
   1029 Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
   1030 #if VDBG
   1031     RLOGD("sendSMSExpectMore: serial %d", serial);
   1032 #endif
   1033     dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
   1034             2, message.smscPdu.c_str(), message.pdu.c_str());
   1035     return Void();
   1036 }
   1037 
   1038 static bool convertMvnoTypeToString(MvnoType type, char *&str) {
   1039     switch (type) {
   1040         case MvnoType::IMSI:
   1041             str = (char *)"imsi";
   1042             return true;
   1043         case MvnoType::GID:
   1044             str = (char *)"gid";
   1045             return true;
   1046         case MvnoType::SPN:
   1047             str = (char *)"spn";
   1048             return true;
   1049         case MvnoType::NONE:
   1050             str = (char *)"";
   1051             return true;
   1052     }
   1053     return false;
   1054 }
   1055 
   1056 Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
   1057                                       const DataProfileInfo& dataProfileInfo, bool modemCognitive,
   1058                                       bool roamingAllowed, bool isRoaming) {
   1059 
   1060 #if VDBG
   1061     RLOGD("setupDataCall: serial %d", serial);
   1062 #endif
   1063 
   1064     if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
   1065         const hidl_string &protocol =
   1066                 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
   1067         dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
   1068             std::to_string((int) radioTechnology + 2).c_str(),
   1069             std::to_string((int) dataProfileInfo.profileId).c_str(),
   1070             dataProfileInfo.apn.c_str(),
   1071             dataProfileInfo.user.c_str(),
   1072             dataProfileInfo.password.c_str(),
   1073             std::to_string((int) dataProfileInfo.authType).c_str(),
   1074             protocol.c_str());
   1075     } else if (s_vendorFunctions->version >= 15) {
   1076         char *mvnoTypeStr = NULL;
   1077         if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
   1078             RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1079                     RIL_REQUEST_SETUP_DATA_CALL);
   1080             if (pRI != NULL) {
   1081                 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   1082             }
   1083             return Void();
   1084         }
   1085         dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
   1086             std::to_string((int) radioTechnology + 2).c_str(),
   1087             std::to_string((int) dataProfileInfo.profileId).c_str(),
   1088             dataProfileInfo.apn.c_str(),
   1089             dataProfileInfo.user.c_str(),
   1090             dataProfileInfo.password.c_str(),
   1091             std::to_string((int) dataProfileInfo.authType).c_str(),
   1092             dataProfileInfo.protocol.c_str(),
   1093             dataProfileInfo.roamingProtocol.c_str(),
   1094             std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
   1095             std::to_string(dataProfileInfo.bearerBitmap).c_str(),
   1096             modemCognitive ? "1" : "0",
   1097             std::to_string(dataProfileInfo.mtu).c_str(),
   1098             mvnoTypeStr,
   1099             dataProfileInfo.mvnoMatchData.c_str(),
   1100             roamingAllowed ? "1" : "0");
   1101     } else {
   1102         RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
   1103         RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1104                 RIL_REQUEST_SETUP_DATA_CALL);
   1105         if (pRI != NULL) {
   1106             sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
   1107         }
   1108     }
   1109     return Void();
   1110 }
   1111 
   1112 Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
   1113 #if VDBG
   1114     RLOGD("iccIOForApp: serial %d", serial);
   1115 #endif
   1116     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
   1117     if (pRI == NULL) {
   1118         return Void();
   1119     }
   1120 
   1121     RIL_SIM_IO_v6 rilIccIo = {};
   1122     rilIccIo.command = iccIo.command;
   1123     rilIccIo.fileid = iccIo.fileId;
   1124     if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
   1125         return Void();
   1126     }
   1127 
   1128     rilIccIo.p1 = iccIo.p1;
   1129     rilIccIo.p2 = iccIo.p2;
   1130     rilIccIo.p3 = iccIo.p3;
   1131 
   1132     if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
   1133         memsetAndFreeStrings(1, rilIccIo.path);
   1134         return Void();
   1135     }
   1136 
   1137     if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
   1138         memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
   1139         return Void();
   1140     }
   1141 
   1142     if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
   1143         memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
   1144         return Void();
   1145     }
   1146 
   1147     CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
   1148 
   1149     memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
   1150 
   1151     return Void();
   1152 }
   1153 
   1154 Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
   1155 #if VDBG
   1156     RLOGD("sendUssd: serial %d", serial);
   1157 #endif
   1158     dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
   1159     return Void();
   1160 }
   1161 
   1162 Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
   1163 #if VDBG
   1164     RLOGD("cancelPendingUssd: serial %d", serial);
   1165 #endif
   1166     dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
   1167     return Void();
   1168 }
   1169 
   1170 Return<void> RadioImpl::getClir(int32_t serial) {
   1171 #if VDBG
   1172     RLOGD("getClir: serial %d", serial);
   1173 #endif
   1174     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
   1175     return Void();
   1176 }
   1177 
   1178 Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
   1179 #if VDBG
   1180     RLOGD("setClir: serial %d", serial);
   1181 #endif
   1182     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
   1183     return Void();
   1184 }
   1185 
   1186 Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
   1187 #if VDBG
   1188     RLOGD("getCallForwardStatus: serial %d", serial);
   1189 #endif
   1190     dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
   1191             callInfo);
   1192     return Void();
   1193 }
   1194 
   1195 Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
   1196 #if VDBG
   1197     RLOGD("setCallForward: serial %d", serial);
   1198 #endif
   1199     dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
   1200             callInfo);
   1201     return Void();
   1202 }
   1203 
   1204 Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
   1205 #if VDBG
   1206     RLOGD("getCallWaiting: serial %d", serial);
   1207 #endif
   1208     dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
   1209     return Void();
   1210 }
   1211 
   1212 Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
   1213 #if VDBG
   1214     RLOGD("setCallWaiting: serial %d", serial);
   1215 #endif
   1216     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
   1217             serviceClass);
   1218     return Void();
   1219 }
   1220 
   1221 Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
   1222                                                       bool success, SmsAcknowledgeFailCause cause) {
   1223 #if VDBG
   1224     RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
   1225 #endif
   1226     dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
   1227             cause);
   1228     return Void();
   1229 }
   1230 
   1231 Return<void> RadioImpl::acceptCall(int32_t serial) {
   1232 #if VDBG
   1233     RLOGD("acceptCall: serial %d", serial);
   1234 #endif
   1235     dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
   1236     return Void();
   1237 }
   1238 
   1239 Return<void> RadioImpl::deactivateDataCall(int32_t serial,
   1240                                            int32_t cid, bool reasonRadioShutDown) {
   1241 #if VDBG
   1242     RLOGD("deactivateDataCall: serial %d", serial);
   1243 #endif
   1244     dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
   1245             2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
   1246     return Void();
   1247 }
   1248 
   1249 Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
   1250                                               const hidl_string& password, int32_t serviceClass,
   1251                                               const hidl_string& appId) {
   1252 #if VDBG
   1253     RLOGD("getFacilityLockForApp: serial %d", serial);
   1254 #endif
   1255     dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
   1256             4, facility.c_str(), password.c_str(),
   1257             (std::to_string(serviceClass)).c_str(), appId.c_str());
   1258     return Void();
   1259 }
   1260 
   1261 Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
   1262                                               bool lockState, const hidl_string& password,
   1263                                               int32_t serviceClass, const hidl_string& appId) {
   1264 #if VDBG
   1265     RLOGD("setFacilityLockForApp: serial %d", serial);
   1266 #endif
   1267     dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
   1268             5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
   1269             (std::to_string(serviceClass)).c_str(), appId.c_str() );
   1270     return Void();
   1271 }
   1272 
   1273 Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
   1274                                            const hidl_string& oldPassword,
   1275                                            const hidl_string& newPassword) {
   1276 #if VDBG
   1277     RLOGD("setBarringPassword: serial %d", serial);
   1278 #endif
   1279     dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
   1280             3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
   1281     return Void();
   1282 }
   1283 
   1284 Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
   1285 #if VDBG
   1286     RLOGD("getNetworkSelectionMode: serial %d", serial);
   1287 #endif
   1288     dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
   1289     return Void();
   1290 }
   1291 
   1292 Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
   1293 #if VDBG
   1294     RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
   1295 #endif
   1296     dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
   1297     return Void();
   1298 }
   1299 
   1300 Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
   1301                                                       const hidl_string& operatorNumeric) {
   1302 #if VDBG
   1303     RLOGD("setNetworkSelectionModeManual: serial %d", serial);
   1304 #endif
   1305     dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
   1306             operatorNumeric.c_str());
   1307     return Void();
   1308 }
   1309 
   1310 Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
   1311 #if VDBG
   1312     RLOGD("getAvailableNetworks: serial %d", serial);
   1313 #endif
   1314     dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
   1315     return Void();
   1316 }
   1317 
   1318 Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
   1319 #if VDBG
   1320     RLOGD("startDtmf: serial %d", serial);
   1321 #endif
   1322     dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
   1323             s.c_str());
   1324     return Void();
   1325 }
   1326 
   1327 Return<void> RadioImpl::stopDtmf(int32_t serial) {
   1328 #if VDBG
   1329     RLOGD("stopDtmf: serial %d", serial);
   1330 #endif
   1331     dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
   1332     return Void();
   1333 }
   1334 
   1335 Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
   1336 #if VDBG
   1337     RLOGD("getBasebandVersion: serial %d", serial);
   1338 #endif
   1339     dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
   1340     return Void();
   1341 }
   1342 
   1343 Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
   1344 #if VDBG
   1345     RLOGD("separateConnection: serial %d", serial);
   1346 #endif
   1347     dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
   1348     return Void();
   1349 }
   1350 
   1351 Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
   1352 #if VDBG
   1353     RLOGD("setMute: serial %d", serial);
   1354 #endif
   1355     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
   1356     return Void();
   1357 }
   1358 
   1359 Return<void> RadioImpl::getMute(int32_t serial) {
   1360 #if VDBG
   1361     RLOGD("getMute: serial %d", serial);
   1362 #endif
   1363     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
   1364     return Void();
   1365 }
   1366 
   1367 Return<void> RadioImpl::getClip(int32_t serial) {
   1368 #if VDBG
   1369     RLOGD("getClip: serial %d", serial);
   1370 #endif
   1371     dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
   1372     return Void();
   1373 }
   1374 
   1375 Return<void> RadioImpl::getDataCallList(int32_t serial) {
   1376 #if VDBG
   1377     RLOGD("getDataCallList: serial %d", serial);
   1378 #endif
   1379     dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
   1380     return Void();
   1381 }
   1382 
   1383 Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
   1384 #if VDBG
   1385     RLOGD("setSuppServiceNotifications: serial %d", serial);
   1386 #endif
   1387     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
   1388             BOOL_TO_INT(enable));
   1389     return Void();
   1390 }
   1391 
   1392 Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
   1393 #if VDBG
   1394     RLOGD("writeSmsToSim: serial %d", serial);
   1395 #endif
   1396     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
   1397     if (pRI == NULL) {
   1398         return Void();
   1399     }
   1400 
   1401     RIL_SMS_WriteArgs args;
   1402     args.status = (int) smsWriteArgs.status;
   1403 
   1404     int len;
   1405     if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
   1406         return Void();
   1407     }
   1408 
   1409     if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
   1410         memsetAndFreeStrings(1, args.pdu);
   1411         return Void();
   1412     }
   1413 
   1414     CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
   1415 
   1416     memsetAndFreeStrings(2, args.smsc, args.pdu);
   1417 
   1418     return Void();
   1419 }
   1420 
   1421 Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
   1422 #if VDBG
   1423     RLOGD("deleteSmsOnSim: serial %d", serial);
   1424 #endif
   1425     dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
   1426     return Void();
   1427 }
   1428 
   1429 Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
   1430 #if VDBG
   1431     RLOGD("setBandMode: serial %d", serial);
   1432 #endif
   1433     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
   1434     return Void();
   1435 }
   1436 
   1437 Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
   1438 #if VDBG
   1439     RLOGD("getAvailableBandModes: serial %d", serial);
   1440 #endif
   1441     dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
   1442     return Void();
   1443 }
   1444 
   1445 Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
   1446 #if VDBG
   1447     RLOGD("sendEnvelope: serial %d", serial);
   1448 #endif
   1449     dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
   1450             command.c_str());
   1451     return Void();
   1452 }
   1453 
   1454 Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
   1455                                                   const hidl_string& commandResponse) {
   1456 #if VDBG
   1457     RLOGD("sendTerminalResponseToSim: serial %d", serial);
   1458 #endif
   1459     dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
   1460             commandResponse.c_str());
   1461     return Void();
   1462 }
   1463 
   1464 Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
   1465 #if VDBG
   1466     RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
   1467 #endif
   1468     dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
   1469             1, BOOL_TO_INT(accept));
   1470     return Void();
   1471 }
   1472 
   1473 Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
   1474 #if VDBG
   1475     RLOGD("explicitCallTransfer: serial %d", serial);
   1476 #endif
   1477     dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
   1478     return Void();
   1479 }
   1480 
   1481 Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
   1482 #if VDBG
   1483     RLOGD("setPreferredNetworkType: serial %d", serial);
   1484 #endif
   1485     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
   1486     return Void();
   1487 }
   1488 
   1489 Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
   1490 #if VDBG
   1491     RLOGD("getPreferredNetworkType: serial %d", serial);
   1492 #endif
   1493     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
   1494     return Void();
   1495 }
   1496 
   1497 Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
   1498 #if VDBG
   1499     RLOGD("getNeighboringCids: serial %d", serial);
   1500 #endif
   1501     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
   1502     return Void();
   1503 }
   1504 
   1505 Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
   1506 #if VDBG
   1507     RLOGD("setLocationUpdates: serial %d", serial);
   1508 #endif
   1509     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
   1510     return Void();
   1511 }
   1512 
   1513 Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
   1514 #if VDBG
   1515     RLOGD("setCdmaSubscriptionSource: serial %d", serial);
   1516 #endif
   1517     dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
   1518     return Void();
   1519 }
   1520 
   1521 Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
   1522 #if VDBG
   1523     RLOGD("setCdmaRoamingPreference: serial %d", serial);
   1524 #endif
   1525     dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
   1526     return Void();
   1527 }
   1528 
   1529 Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
   1530 #if VDBG
   1531     RLOGD("getCdmaRoamingPreference: serial %d", serial);
   1532 #endif
   1533     dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
   1534     return Void();
   1535 }
   1536 
   1537 Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
   1538 #if VDBG
   1539     RLOGD("setTTYMode: serial %d", serial);
   1540 #endif
   1541     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
   1542     return Void();
   1543 }
   1544 
   1545 Return<void> RadioImpl::getTTYMode(int32_t serial) {
   1546 #if VDBG
   1547     RLOGD("getTTYMode: serial %d", serial);
   1548 #endif
   1549     dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
   1550     return Void();
   1551 }
   1552 
   1553 Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
   1554 #if VDBG
   1555     RLOGD("setPreferredVoicePrivacy: serial %d", serial);
   1556 #endif
   1557     dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
   1558             1, BOOL_TO_INT(enable));
   1559     return Void();
   1560 }
   1561 
   1562 Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
   1563 #if VDBG
   1564     RLOGD("getPreferredVoicePrivacy: serial %d", serial);
   1565 #endif
   1566     dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
   1567     return Void();
   1568 }
   1569 
   1570 Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
   1571 #if VDBG
   1572     RLOGD("sendCDMAFeatureCode: serial %d", serial);
   1573 #endif
   1574     dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
   1575             featureCode.c_str());
   1576     return Void();
   1577 }
   1578 
   1579 Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
   1580                                       int32_t off) {
   1581 #if VDBG
   1582     RLOGD("sendBurstDtmf: serial %d", serial);
   1583 #endif
   1584     dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
   1585             3, dtmf.c_str(), (std::to_string(on)).c_str(),
   1586             (std::to_string(off)).c_str());
   1587     return Void();
   1588 }
   1589 
   1590 void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
   1591     rcsm.uTeleserviceID = sms.teleserviceId;
   1592     rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
   1593     rcsm.uServicecategory = sms.serviceCategory;
   1594     rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
   1595     rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
   1596     rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
   1597     rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
   1598 
   1599     rcsm.sAddress.number_of_digits = sms.address.digits.size();
   1600     int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   1601     for (int i = 0; i < digitLimit; i++) {
   1602         rcsm.sAddress.digits[i] = sms.address.digits[i];
   1603     }
   1604 
   1605     rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
   1606     rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
   1607 
   1608     rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
   1609     digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   1610     for (int i = 0; i < digitLimit; i++) {
   1611         rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
   1612     }
   1613 
   1614     rcsm.uBearerDataLen = sms.bearerData.size();
   1615     digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   1616     for (int i = 0; i < digitLimit; i++) {
   1617         rcsm.aBearerData[i] = sms.bearerData[i];
   1618     }
   1619 }
   1620 
   1621 Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
   1622 #if VDBG
   1623     RLOGD("sendCdmaSms: serial %d", serial);
   1624 #endif
   1625     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
   1626     if (pRI == NULL) {
   1627         return Void();
   1628     }
   1629 
   1630     RIL_CDMA_SMS_Message rcsm = {};
   1631     constructCdmaSms(rcsm, sms);
   1632 
   1633     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
   1634     return Void();
   1635 }
   1636 
   1637 Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
   1638 #if VDBG
   1639     RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
   1640 #endif
   1641     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
   1642     if (pRI == NULL) {
   1643         return Void();
   1644     }
   1645 
   1646     RIL_CDMA_SMS_Ack rcsa = {};
   1647 
   1648     rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
   1649     rcsa.uSMSCauseCode = smsAck.smsCauseCode;
   1650 
   1651     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
   1652     return Void();
   1653 }
   1654 
   1655 Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
   1656 #if VDBG
   1657     RLOGD("getGsmBroadcastConfig: serial %d", serial);
   1658 #endif
   1659     dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
   1660     return Void();
   1661 }
   1662 
   1663 Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
   1664                                               const hidl_vec<GsmBroadcastSmsConfigInfo>&
   1665                                               configInfo) {
   1666 #if VDBG
   1667     RLOGD("setGsmBroadcastConfig: serial %d", serial);
   1668 #endif
   1669     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1670             RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
   1671     if (pRI == NULL) {
   1672         return Void();
   1673     }
   1674 
   1675     int num = configInfo.size();
   1676     RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
   1677     RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
   1678 
   1679     for (int i = 0 ; i < num ; i++ ) {
   1680         gsmBciPtrs[i] = &gsmBci[i];
   1681         gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
   1682         gsmBci[i].toServiceId = configInfo[i].toServiceId;
   1683         gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
   1684         gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
   1685         gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
   1686     }
   1687 
   1688     CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
   1689             num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
   1690     return Void();
   1691 }
   1692 
   1693 Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
   1694 #if VDBG
   1695     RLOGD("setGsmBroadcastActivation: serial %d", serial);
   1696 #endif
   1697     dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
   1698             1, BOOL_TO_INT(!activate));
   1699     return Void();
   1700 }
   1701 
   1702 Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
   1703 #if VDBG
   1704     RLOGD("getCdmaBroadcastConfig: serial %d", serial);
   1705 #endif
   1706     dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
   1707     return Void();
   1708 }
   1709 
   1710 Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
   1711                                                const hidl_vec<CdmaBroadcastSmsConfigInfo>&
   1712                                                configInfo) {
   1713 #if VDBG
   1714     RLOGD("setCdmaBroadcastConfig: serial %d", serial);
   1715 #endif
   1716     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1717             RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
   1718     if (pRI == NULL) {
   1719         return Void();
   1720     }
   1721 
   1722     int num = configInfo.size();
   1723     RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
   1724     RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
   1725 
   1726     for (int i = 0 ; i < num ; i++ ) {
   1727         cdmaBciPtrs[i] = &cdmaBci[i];
   1728         cdmaBci[i].service_category = configInfo[i].serviceCategory;
   1729         cdmaBci[i].language = configInfo[i].language;
   1730         cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
   1731     }
   1732 
   1733     CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
   1734             num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
   1735     return Void();
   1736 }
   1737 
   1738 Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
   1739 #if VDBG
   1740     RLOGD("setCdmaBroadcastActivation: serial %d", serial);
   1741 #endif
   1742     dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
   1743             1, BOOL_TO_INT(!activate));
   1744     return Void();
   1745 }
   1746 
   1747 Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
   1748 #if VDBG
   1749     RLOGD("getCDMASubscription: serial %d", serial);
   1750 #endif
   1751     dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
   1752     return Void();
   1753 }
   1754 
   1755 Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
   1756 #if VDBG
   1757     RLOGD("writeSmsToRuim: serial %d", serial);
   1758 #endif
   1759     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1760             RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
   1761     if (pRI == NULL) {
   1762         return Void();
   1763     }
   1764 
   1765     RIL_CDMA_SMS_WriteArgs rcsw = {};
   1766     rcsw.status = (int) cdmaSms.status;
   1767     constructCdmaSms(rcsw.message, cdmaSms.message);
   1768 
   1769     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
   1770     return Void();
   1771 }
   1772 
   1773 Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
   1774 #if VDBG
   1775     RLOGD("deleteSmsOnRuim: serial %d", serial);
   1776 #endif
   1777     dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
   1778     return Void();
   1779 }
   1780 
   1781 Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
   1782 #if VDBG
   1783     RLOGD("getDeviceIdentity: serial %d", serial);
   1784 #endif
   1785     dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
   1786     return Void();
   1787 }
   1788 
   1789 Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
   1790 #if VDBG
   1791     RLOGD("exitEmergencyCallbackMode: serial %d", serial);
   1792 #endif
   1793     dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
   1794     return Void();
   1795 }
   1796 
   1797 Return<void> RadioImpl::getSmscAddress(int32_t serial) {
   1798 #if VDBG
   1799     RLOGD("getSmscAddress: serial %d", serial);
   1800 #endif
   1801     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
   1802     return Void();
   1803 }
   1804 
   1805 Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
   1806 #if VDBG
   1807     RLOGD("setSmscAddress: serial %d", serial);
   1808 #endif
   1809     dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
   1810             smsc.c_str());
   1811     return Void();
   1812 }
   1813 
   1814 Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
   1815 #if VDBG
   1816     RLOGD("reportSmsMemoryStatus: serial %d", serial);
   1817 #endif
   1818     dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
   1819             BOOL_TO_INT(available));
   1820     return Void();
   1821 }
   1822 
   1823 Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
   1824 #if VDBG
   1825     RLOGD("reportStkServiceIsRunning: serial %d", serial);
   1826 #endif
   1827     dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
   1828     return Void();
   1829 }
   1830 
   1831 Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
   1832 #if VDBG
   1833     RLOGD("getCdmaSubscriptionSource: serial %d", serial);
   1834 #endif
   1835     dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
   1836     return Void();
   1837 }
   1838 
   1839 Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
   1840 #if VDBG
   1841     RLOGD("requestIsimAuthentication: serial %d", serial);
   1842 #endif
   1843     dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
   1844             challenge.c_str());
   1845     return Void();
   1846 }
   1847 
   1848 Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
   1849                                                          const hidl_string& ackPdu) {
   1850 #if VDBG
   1851     RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
   1852 #endif
   1853     dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
   1854             2, success ? "1" : "0", ackPdu.c_str());
   1855     return Void();
   1856 }
   1857 
   1858 Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
   1859 #if VDBG
   1860     RLOGD("sendEnvelopeWithStatus: serial %d", serial);
   1861 #endif
   1862     dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
   1863             contents.c_str());
   1864     return Void();
   1865 }
   1866 
   1867 Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
   1868 #if VDBG
   1869     RLOGD("getVoiceRadioTechnology: serial %d", serial);
   1870 #endif
   1871     dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
   1872     return Void();
   1873 }
   1874 
   1875 Return<void> RadioImpl::getCellInfoList(int32_t serial) {
   1876 #if VDBG
   1877     RLOGD("getCellInfoList: serial %d", serial);
   1878 #endif
   1879     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
   1880     return Void();
   1881 }
   1882 
   1883 Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
   1884 #if VDBG
   1885     RLOGD("setCellInfoListRate: serial %d", serial);
   1886 #endif
   1887     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
   1888     return Void();
   1889 }
   1890 
   1891 Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
   1892                                             bool modemCognitive, bool isRoaming) {
   1893 #if VDBG
   1894     RLOGD("setInitialAttachApn: serial %d", serial);
   1895 #endif
   1896     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   1897             RIL_REQUEST_SET_INITIAL_ATTACH_APN);
   1898     if (pRI == NULL) {
   1899         return Void();
   1900     }
   1901 
   1902     if (s_vendorFunctions->version <= 14) {
   1903         RIL_InitialAttachApn iaa = {};
   1904 
   1905         if (dataProfileInfo.apn.size() == 0) {
   1906             iaa.apn = (char *) calloc(1, sizeof(char));
   1907             if (iaa.apn == NULL) {
   1908                 RLOGE("Memory allocation failed for request %s",
   1909                         requestToString(pRI->pCI->requestNumber));
   1910                 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   1911                 return Void();
   1912             }
   1913             iaa.apn[0] = '\0';
   1914         } else {
   1915             if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
   1916                 return Void();
   1917             }
   1918         }
   1919 
   1920         const hidl_string &protocol =
   1921                 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
   1922 
   1923         if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
   1924             memsetAndFreeStrings(1, iaa.apn);
   1925             return Void();
   1926         }
   1927         iaa.authtype = (int) dataProfileInfo.authType;
   1928         if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
   1929             memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
   1930             return Void();
   1931         }
   1932         if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
   1933             memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
   1934             return Void();
   1935         }
   1936 
   1937         CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
   1938 
   1939         memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
   1940     } else {
   1941         RIL_InitialAttachApn_v15 iaa = {};
   1942 
   1943         if (dataProfileInfo.apn.size() == 0) {
   1944             iaa.apn = (char *) calloc(1, sizeof(char));
   1945             if (iaa.apn == NULL) {
   1946                 RLOGE("Memory allocation failed for request %s",
   1947                         requestToString(pRI->pCI->requestNumber));
   1948                 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   1949                 return Void();
   1950             }
   1951             iaa.apn[0] = '\0';
   1952         } else {
   1953             if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
   1954                 return Void();
   1955             }
   1956         }
   1957 
   1958         if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
   1959             memsetAndFreeStrings(1, iaa.apn);
   1960             return Void();
   1961         }
   1962         if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
   1963             memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
   1964             return Void();
   1965         }
   1966         iaa.authtype = (int) dataProfileInfo.authType;
   1967         if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
   1968             memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
   1969             return Void();
   1970         }
   1971         if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
   1972             memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
   1973             return Void();
   1974         }
   1975         iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
   1976         iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
   1977         iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
   1978         iaa.mtu = dataProfileInfo.mtu;
   1979 
   1980         if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
   1981             sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   1982             memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
   1983                     iaa.password);
   1984             return Void();
   1985         }
   1986 
   1987         if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
   1988             memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
   1989                     iaa.password);
   1990             return Void();
   1991         }
   1992 
   1993         CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
   1994 
   1995         memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
   1996                 iaa.password, iaa.mvnoMatchData);
   1997     }
   1998 
   1999     return Void();
   2000 }
   2001 
   2002 Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
   2003 #if VDBG
   2004     RLOGD("getImsRegistrationState: serial %d", serial);
   2005 #endif
   2006     dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
   2007     return Void();
   2008 }
   2009 
   2010 bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
   2011     RIL_IMS_SMS_Message rism = {};
   2012     char **pStrings;
   2013     int countStrings = 2;
   2014     int dataLen = sizeof(char *) * countStrings;
   2015 
   2016     rism.tech = RADIO_TECH_3GPP;
   2017     rism.retry = BOOL_TO_INT(message.retry);
   2018     rism.messageRef = message.messageRef;
   2019 
   2020     if (message.gsmMessage.size() != 1) {
   2021         RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
   2022         sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   2023         return false;
   2024     }
   2025 
   2026     pStrings = (char **)calloc(countStrings, sizeof(char *));
   2027     if (pStrings == NULL) {
   2028         RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
   2029                 requestToString(pRI->pCI->requestNumber));
   2030         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2031         return false;
   2032     }
   2033 
   2034     if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
   2035 #ifdef MEMSET_FREED
   2036         memset(pStrings, 0, datalen);
   2037 #endif
   2038         free(pStrings);
   2039         return false;
   2040     }
   2041 
   2042     if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
   2043         memsetAndFreeStrings(1, pStrings[0]);
   2044 #ifdef MEMSET_FREED
   2045         memset(pStrings, 0, datalen);
   2046 #endif
   2047         free(pStrings);
   2048         return false;
   2049     }
   2050 
   2051     rism.message.gsmMessage = pStrings;
   2052     CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
   2053             sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
   2054 
   2055     for (int i = 0 ; i < countStrings ; i++) {
   2056         memsetAndFreeStrings(1, pStrings[i]);
   2057     }
   2058 
   2059 #ifdef MEMSET_FREED
   2060     memset(pStrings, 0, datalen);
   2061 #endif
   2062     free(pStrings);
   2063 
   2064     return true;
   2065 }
   2066 
   2067 bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
   2068     RIL_IMS_SMS_Message rism = {};
   2069     RIL_CDMA_SMS_Message rcsm = {};
   2070 
   2071     if (message.cdmaMessage.size() != 1) {
   2072         RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
   2073         sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   2074         return false;
   2075     }
   2076 
   2077     rism.tech = RADIO_TECH_3GPP2;
   2078     rism.retry = BOOL_TO_INT(message.retry);
   2079     rism.messageRef = message.messageRef;
   2080     rism.message.cdmaMessage = &rcsm;
   2081 
   2082     constructCdmaSms(rcsm, message.cdmaMessage[0]);
   2083 
   2084     CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
   2085             sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI, pRI->socket_id);
   2086 
   2087     return true;
   2088 }
   2089 
   2090 Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
   2091 #if VDBG
   2092     RLOGD("sendImsSms: serial %d", serial);
   2093 #endif
   2094     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
   2095     if (pRI == NULL) {
   2096         return Void();
   2097     }
   2098 
   2099     RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
   2100 
   2101     if (RADIO_TECH_3GPP == format) {
   2102         dispatchImsGsmSms(message, pRI);
   2103     } else if (RADIO_TECH_3GPP2 == format) {
   2104         dispatchImsCdmaSms(message, pRI);
   2105     } else {
   2106         RLOGE("sendImsSms: Invalid radio tech %s",
   2107                 requestToString(pRI->pCI->requestNumber));
   2108         sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   2109     }
   2110     return Void();
   2111 }
   2112 
   2113 Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
   2114 #if VDBG
   2115     RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
   2116 #endif
   2117     dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
   2118     return Void();
   2119 }
   2120 
   2121 Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
   2122 #if VDBG
   2123     RLOGD("iccOpenLogicalChannel: serial %d", serial);
   2124 #endif
   2125     if (s_vendorFunctions->version < 15) {
   2126         dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
   2127     } else {
   2128         RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
   2129         if (pRI == NULL) {
   2130             return Void();
   2131         }
   2132 
   2133         RIL_OpenChannelParams params = {};
   2134 
   2135         params.p2 = p2;
   2136 
   2137         if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
   2138             return Void();
   2139         }
   2140 
   2141         CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
   2142 
   2143         memsetAndFreeStrings(1, params.aidPtr);
   2144     }
   2145     return Void();
   2146 }
   2147 
   2148 Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
   2149 #if VDBG
   2150     RLOGD("iccCloseLogicalChannel: serial %d", serial);
   2151 #endif
   2152     dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
   2153     return Void();
   2154 }
   2155 
   2156 Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
   2157 #if VDBG
   2158     RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
   2159 #endif
   2160     dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
   2161     return Void();
   2162 }
   2163 
   2164 Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
   2165 #if VDBG
   2166     RLOGD("nvReadItem: serial %d", serial);
   2167 #endif
   2168     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
   2169     if (pRI == NULL) {
   2170         return Void();
   2171     }
   2172 
   2173     RIL_NV_ReadItem nvri = {};
   2174     nvri.itemID = (RIL_NV_Item) itemId;
   2175 
   2176     CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
   2177     return Void();
   2178 }
   2179 
   2180 Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
   2181 #if VDBG
   2182     RLOGD("nvWriteItem: serial %d", serial);
   2183 #endif
   2184     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
   2185     if (pRI == NULL) {
   2186         return Void();
   2187     }
   2188 
   2189     RIL_NV_WriteItem nvwi = {};
   2190 
   2191     nvwi.itemID = (RIL_NV_Item) item.itemId;
   2192 
   2193     if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
   2194         return Void();
   2195     }
   2196 
   2197     CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
   2198 
   2199     memsetAndFreeStrings(1, nvwi.value);
   2200     return Void();
   2201 }
   2202 
   2203 Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
   2204 #if VDBG
   2205     RLOGD("nvWriteCdmaPrl: serial %d", serial);
   2206 #endif
   2207     dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
   2208     return Void();
   2209 }
   2210 
   2211 Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
   2212     int rilResetType = -1;
   2213 #if VDBG
   2214     RLOGD("nvResetConfig: serial %d", serial);
   2215 #endif
   2216     /* Convert ResetNvType to RIL.h values
   2217      * RIL_REQUEST_NV_RESET_CONFIG
   2218      * 1 - reload all NV items
   2219      * 2 - erase NV reset (SCRTN)
   2220      * 3 - factory reset (RTN)
   2221      */
   2222     switch(resetType) {
   2223       case ResetNvType::RELOAD:
   2224         rilResetType = 1;
   2225         break;
   2226       case ResetNvType::ERASE:
   2227         rilResetType = 2;
   2228         break;
   2229       case ResetNvType::FACTORY_RESET:
   2230         rilResetType = 3;
   2231         break;
   2232     }
   2233     dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
   2234     return Void();
   2235 }
   2236 
   2237 Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
   2238 #if VDBG
   2239     RLOGD("setUiccSubscription: serial %d", serial);
   2240 #endif
   2241     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   2242             RIL_REQUEST_SET_UICC_SUBSCRIPTION);
   2243     if (pRI == NULL) {
   2244         return Void();
   2245     }
   2246 
   2247     RIL_SelectUiccSub rilUiccSub = {};
   2248 
   2249     rilUiccSub.slot = uiccSub.slot;
   2250     rilUiccSub.app_index = uiccSub.appIndex;
   2251     rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
   2252     rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
   2253 
   2254     CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
   2255     return Void();
   2256 }
   2257 
   2258 Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
   2259 #if VDBG
   2260     RLOGD("setDataAllowed: serial %d", serial);
   2261 #endif
   2262     dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
   2263     return Void();
   2264 }
   2265 
   2266 Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
   2267 #if VDBG
   2268     RLOGD("getHardwareConfig: serial %d", serial);
   2269 #endif
   2270     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
   2271     return Void();
   2272 }
   2273 
   2274 Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
   2275         const hidl_string& authData, const hidl_string& aid) {
   2276 #if VDBG
   2277     RLOGD("requestIccSimAuthentication: serial %d", serial);
   2278 #endif
   2279     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
   2280     if (pRI == NULL) {
   2281         return Void();
   2282     }
   2283 
   2284     RIL_SimAuthentication pf = {};
   2285 
   2286     pf.authContext = authContext;
   2287 
   2288     int len;
   2289     if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
   2290         return Void();
   2291     }
   2292 
   2293     if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
   2294         memsetAndFreeStrings(1, pf.authData);
   2295         return Void();
   2296     }
   2297 
   2298     CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
   2299 
   2300     memsetAndFreeStrings(2, pf.authData, pf.aid);
   2301     return Void();
   2302 }
   2303 
   2304 /**
   2305  * @param numProfiles number of data profile
   2306  * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
   2307           RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
   2308  * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
   2309  * @param numfields number of string-type member in the data profile structure
   2310  * @param ... the variadic parameters are pointers to each string-type member
   2311  **/
   2312 template <typename T>
   2313 void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
   2314                             int numfields, ...) {
   2315     va_list args;
   2316     va_start(args, numfields);
   2317 
   2318     // Iterate through each string-type field that need to be free.
   2319     for (int i = 0; i < numfields; i++) {
   2320         // Iterate through each data profile and free that specific string-type field.
   2321         // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
   2322         char *T::*ptr = va_arg(args, char *T::*);
   2323         for (int j = 0; j < numProfiles; j++) {
   2324             memsetAndFreeStrings(1, dataProfiles[j].*ptr);
   2325         }
   2326     }
   2327 
   2328     va_end(args);
   2329 
   2330 #ifdef MEMSET_FREED
   2331     memset(dataProfiles, 0, numProfiles * sizeof(T));
   2332     memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
   2333 #endif
   2334     free(dataProfiles);
   2335     free(dataProfilePtrs);
   2336 }
   2337 
   2338 Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
   2339                                        bool isRoaming) {
   2340 #if VDBG
   2341     RLOGD("setDataProfile: serial %d", serial);
   2342 #endif
   2343     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
   2344     if (pRI == NULL) {
   2345         return Void();
   2346     }
   2347 
   2348     size_t num = profiles.size();
   2349     bool success = false;
   2350 
   2351     if (s_vendorFunctions->version <= 14) {
   2352 
   2353         RIL_DataProfileInfo *dataProfiles =
   2354             (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
   2355 
   2356         if (dataProfiles == NULL) {
   2357             RLOGE("Memory allocation failed for request %s",
   2358                     requestToString(pRI->pCI->requestNumber));
   2359             sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2360             return Void();
   2361         }
   2362 
   2363         RIL_DataProfileInfo **dataProfilePtrs =
   2364             (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
   2365         if (dataProfilePtrs == NULL) {
   2366             RLOGE("Memory allocation failed for request %s",
   2367                     requestToString(pRI->pCI->requestNumber));
   2368             free(dataProfiles);
   2369             sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2370             return Void();
   2371         }
   2372 
   2373         for (size_t i = 0; i < num; i++) {
   2374             dataProfilePtrs[i] = &dataProfiles[i];
   2375 
   2376             success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
   2377 
   2378             const hidl_string &protocol =
   2379                     (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
   2380 
   2381             if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
   2382                 success = false;
   2383             }
   2384 
   2385             if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
   2386                 success = false;
   2387             }
   2388             if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
   2389                     pRI)) {
   2390                 success = false;
   2391             }
   2392 
   2393             if (!success) {
   2394                 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
   2395                     &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
   2396                     &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
   2397                 return Void();
   2398             }
   2399 
   2400             dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
   2401             dataProfiles[i].authType = (int) profiles[i].authType;
   2402             dataProfiles[i].type = (int) profiles[i].type;
   2403             dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
   2404             dataProfiles[i].maxConns = profiles[i].maxConns;
   2405             dataProfiles[i].waitTime = profiles[i].waitTime;
   2406             dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
   2407         }
   2408 
   2409         CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
   2410                 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
   2411 
   2412         freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
   2413                 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
   2414                 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
   2415     } else {
   2416         RIL_DataProfileInfo_v15 *dataProfiles =
   2417             (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
   2418 
   2419         if (dataProfiles == NULL) {
   2420             RLOGE("Memory allocation failed for request %s",
   2421                     requestToString(pRI->pCI->requestNumber));
   2422             sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2423             return Void();
   2424         }
   2425 
   2426         RIL_DataProfileInfo_v15 **dataProfilePtrs =
   2427             (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
   2428         if (dataProfilePtrs == NULL) {
   2429             RLOGE("Memory allocation failed for request %s",
   2430                     requestToString(pRI->pCI->requestNumber));
   2431             free(dataProfiles);
   2432             sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2433             return Void();
   2434         }
   2435 
   2436         for (size_t i = 0; i < num; i++) {
   2437             dataProfilePtrs[i] = &dataProfiles[i];
   2438 
   2439             success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
   2440             if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
   2441                     pRI)) {
   2442                 success = false;
   2443             }
   2444             if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
   2445                     profiles[i].roamingProtocol, pRI)) {
   2446                 success = false;
   2447             }
   2448             if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
   2449                 success = false;
   2450             }
   2451             if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
   2452                     pRI)) {
   2453                 success = false;
   2454             }
   2455 
   2456             if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
   2457                     profiles[i].mvnoMatchData, pRI)) {
   2458                 success = false;
   2459             }
   2460 
   2461             if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
   2462                     dataProfiles[i].mvnoType)) {
   2463                 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
   2464                 success = false;
   2465             }
   2466 
   2467             if (!success) {
   2468                 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
   2469                     &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
   2470                     &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
   2471                     &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
   2472                 return Void();
   2473             }
   2474 
   2475             dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
   2476             dataProfiles[i].authType = (int) profiles[i].authType;
   2477             dataProfiles[i].type = (int) profiles[i].type;
   2478             dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
   2479             dataProfiles[i].maxConns = profiles[i].maxConns;
   2480             dataProfiles[i].waitTime = profiles[i].waitTime;
   2481             dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
   2482             dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
   2483             dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
   2484             dataProfiles[i].mtu = profiles[i].mtu;
   2485         }
   2486 
   2487         CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
   2488                 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
   2489 
   2490         freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
   2491                 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
   2492                 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
   2493                 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
   2494     }
   2495 
   2496     return Void();
   2497 }
   2498 
   2499 Return<void> RadioImpl::requestShutdown(int32_t serial) {
   2500 #if VDBG
   2501     RLOGD("requestShutdown: serial %d", serial);
   2502 #endif
   2503     dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
   2504     return Void();
   2505 }
   2506 
   2507 Return<void> RadioImpl::getRadioCapability(int32_t serial) {
   2508 #if VDBG
   2509     RLOGD("getRadioCapability: serial %d", serial);
   2510 #endif
   2511     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
   2512     return Void();
   2513 }
   2514 
   2515 Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
   2516 #if VDBG
   2517     RLOGD("setRadioCapability: serial %d", serial);
   2518 #endif
   2519     RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
   2520     if (pRI == NULL) {
   2521         return Void();
   2522     }
   2523 
   2524     RIL_RadioCapability rilRc = {};
   2525 
   2526     // TODO : set rilRc.version using HIDL version ?
   2527     rilRc.session = rc.session;
   2528     rilRc.phase = (int) rc.phase;
   2529     rilRc.rat = (int) rc.raf;
   2530     rilRc.status = (int) rc.status;
   2531     strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
   2532 
   2533     CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
   2534 
   2535     return Void();
   2536 }
   2537 
   2538 Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
   2539 #if VDBG
   2540     RLOGD("startLceService: serial %d", serial);
   2541 #endif
   2542     dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
   2543             BOOL_TO_INT(pullMode));
   2544     return Void();
   2545 }
   2546 
   2547 Return<void> RadioImpl::stopLceService(int32_t serial) {
   2548 #if VDBG
   2549     RLOGD("stopLceService: serial %d", serial);
   2550 #endif
   2551     dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
   2552     return Void();
   2553 }
   2554 
   2555 Return<void> RadioImpl::pullLceData(int32_t serial) {
   2556 #if VDBG
   2557     RLOGD("pullLceData: serial %d", serial);
   2558 #endif
   2559     dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
   2560     return Void();
   2561 }
   2562 
   2563 Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
   2564 #if VDBG
   2565     RLOGD("getModemActivityInfo: serial %d", serial);
   2566 #endif
   2567     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
   2568     return Void();
   2569 }
   2570 
   2571 Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
   2572                                            const CarrierRestrictions& carriers) {
   2573 #if VDBG
   2574     RLOGD("setAllowedCarriers: serial %d", serial);
   2575 #endif
   2576     RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   2577             RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
   2578     if (pRI == NULL) {
   2579         return Void();
   2580     }
   2581 
   2582     RIL_CarrierRestrictions cr = {};
   2583     RIL_Carrier *allowedCarriers = NULL;
   2584     RIL_Carrier *excludedCarriers = NULL;
   2585 
   2586     cr.len_allowed_carriers = carriers.allowedCarriers.size();
   2587     allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
   2588     if (allowedCarriers == NULL) {
   2589         RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
   2590                 requestToString(pRI->pCI->requestNumber));
   2591         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2592         return Void();
   2593     }
   2594     cr.allowed_carriers = allowedCarriers;
   2595 
   2596     cr.len_excluded_carriers = carriers.excludedCarriers.size();
   2597     excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
   2598     if (excludedCarriers == NULL) {
   2599         RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
   2600                 requestToString(pRI->pCI->requestNumber));
   2601         sendErrorResponse(pRI, RIL_E_NO_MEMORY);
   2602 #ifdef MEMSET_FREED
   2603         memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
   2604 #endif
   2605         free(allowedCarriers);
   2606         return Void();
   2607     }
   2608     cr.excluded_carriers = excludedCarriers;
   2609 
   2610     for (int i = 0; i < cr.len_allowed_carriers; i++) {
   2611         allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
   2612         allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
   2613         allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
   2614         allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
   2615     }
   2616 
   2617     for (int i = 0; i < cr.len_excluded_carriers; i++) {
   2618         excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
   2619         excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
   2620         excludedCarriers[i].match_type =
   2621                 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
   2622         excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
   2623     }
   2624 
   2625     CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
   2626 
   2627 #ifdef MEMSET_FREED
   2628     memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
   2629     memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
   2630 #endif
   2631     free(allowedCarriers);
   2632     free(excludedCarriers);
   2633     return Void();
   2634 }
   2635 
   2636 Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
   2637 #if VDBG
   2638     RLOGD("getAllowedCarriers: serial %d", serial);
   2639 #endif
   2640     dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
   2641     return Void();
   2642 }
   2643 
   2644 Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
   2645                                         bool state) {
   2646 #if VDBG
   2647     RLOGD("sendDeviceState: serial %d", serial);
   2648 #endif
   2649     if (s_vendorFunctions->version < 15) {
   2650         if (deviceStateType ==  DeviceStateType::LOW_DATA_EXPECTED) {
   2651             RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
   2652             dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
   2653         } else {
   2654             RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   2655                     RIL_REQUEST_SEND_DEVICE_STATE);
   2656             sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
   2657         }
   2658         return Void();
   2659     }
   2660     dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
   2661             BOOL_TO_INT(state));
   2662     return Void();
   2663 }
   2664 
   2665 Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
   2666 #if VDBG
   2667     RLOGD("setIndicationFilter: serial %d", serial);
   2668 #endif
   2669     if (s_vendorFunctions->version < 15) {
   2670         RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
   2671                 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
   2672         sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
   2673         return Void();
   2674     }
   2675     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
   2676     return Void();
   2677 }
   2678 
   2679 Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
   2680 #if VDBG
   2681     RLOGD("setSimCardPower: serial %d", serial);
   2682 #endif
   2683     dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
   2684     return Void();
   2685 }
   2686 
   2687 Return<void> RadioImpl::responseAcknowledgement() {
   2688     android::releaseWakeLock();
   2689     return Void();
   2690 }
   2691 
   2692 Return<void> OemHookImpl::setResponseFunctions(
   2693         const ::android::sp<IOemHookResponse>& oemHookResponseParam,
   2694         const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
   2695 #if VDBG
   2696     RLOGD("OemHookImpl::setResponseFunctions");
   2697 #endif
   2698 
   2699     pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
   2700     int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
   2701     assert(ret == 0);
   2702 
   2703     mOemHookResponse = oemHookResponseParam;
   2704     mOemHookIndication = oemHookIndicationParam;
   2705     mCounterOemHook[mSlotId]++;
   2706 
   2707     ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
   2708     assert(ret == 0);
   2709 
   2710     return Void();
   2711 }
   2712 
   2713 Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
   2714 #if VDBG
   2715     RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
   2716 #endif
   2717     dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
   2718     return Void();
   2719 }
   2720 
   2721 Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
   2722         const hidl_vec<hidl_string>& data) {
   2723 #if VDBG
   2724     RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
   2725 #endif
   2726     dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
   2727     return Void();
   2728 }
   2729 
   2730 /***************************************************************************************************
   2731  * RESPONSE FUNCTIONS
   2732  * Functions above are used for requests going from framework to vendor code. The ones below are
   2733  * responses for those requests coming back from the vendor code.
   2734  **************************************************************************************************/
   2735 
   2736 void radio::acknowledgeRequest(int slotId, int serial) {
   2737     if (radioService[slotId]->mRadioResponse != NULL) {
   2738         Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
   2739         radioService[slotId]->checkReturnStatus(retStatus);
   2740     } else {
   2741         RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
   2742     }
   2743 }
   2744 
   2745 void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
   2746                          RIL_Errno e) {
   2747     responseInfo.serial = serial;
   2748     switch (responseType) {
   2749         case RESPONSE_SOLICITED:
   2750             responseInfo.type = RadioResponseType::SOLICITED;
   2751             break;
   2752         case RESPONSE_SOLICITED_ACK_EXP:
   2753             responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
   2754             break;
   2755     }
   2756     responseInfo.error = (RadioError) e;
   2757 }
   2758 
   2759 int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
   2760                void *response, size_t responseLen) {
   2761     populateResponseInfo(responseInfo, serial, responseType, e);
   2762     int ret = -1;
   2763 
   2764     if (response == NULL && responseLen == 0) {
   2765         // Earlier RILs did not send a response for some cases although the interface
   2766         // expected an integer as response. Do not return error if response is empty. Instead
   2767         // Return -1 in those cases to maintain backward compatibility.
   2768     } else if (response == NULL || responseLen != sizeof(int)) {
   2769         RLOGE("responseIntOrEmpty: Invalid response");
   2770         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   2771     } else {
   2772         int *p_int = (int *) response;
   2773         ret = p_int[0];
   2774     }
   2775     return ret;
   2776 }
   2777 
   2778 int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
   2779                void *response, size_t responseLen) {
   2780     populateResponseInfo(responseInfo, serial, responseType, e);
   2781     int ret = -1;
   2782 
   2783     if (response == NULL || responseLen != sizeof(int)) {
   2784         RLOGE("responseInt: Invalid response");
   2785         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   2786     } else {
   2787         int *p_int = (int *) response;
   2788         ret = p_int[0];
   2789     }
   2790     return ret;
   2791 }
   2792 
   2793 int radio::getIccCardStatusResponse(int slotId,
   2794                                    int responseType, int serial, RIL_Errno e,
   2795                                    void *response, size_t responseLen) {
   2796     if (radioService[slotId]->mRadioResponse != NULL) {
   2797         RadioResponseInfo responseInfo = {};
   2798         populateResponseInfo(responseInfo, serial, responseType, e);
   2799         CardStatus cardStatus = {};
   2800         if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
   2801             RLOGE("getIccCardStatusResponse: Invalid response");
   2802             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   2803         } else {
   2804             RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
   2805             cardStatus.cardState = (CardState) p_cur->card_state;
   2806             cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
   2807             cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
   2808             cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
   2809             cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
   2810 
   2811             RIL_AppStatus *rilAppStatus = p_cur->applications;
   2812             cardStatus.applications.resize(p_cur->num_applications);
   2813             AppStatus *appStatus = cardStatus.applications.data();
   2814 #if VDBG
   2815             RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
   2816 #endif
   2817             for (int i = 0; i < p_cur->num_applications; i++) {
   2818                 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
   2819                 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
   2820                 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
   2821                 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
   2822                 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
   2823                         rilAppStatus[i].app_label_ptr);
   2824                 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
   2825                 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
   2826                 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
   2827             }
   2828         }
   2829 
   2830         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2831                 getIccCardStatusResponse(responseInfo, cardStatus);
   2832         radioService[slotId]->checkReturnStatus(retStatus);
   2833     } else {
   2834         RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   2835     }
   2836 
   2837     return 0;
   2838 }
   2839 
   2840 int radio::supplyIccPinForAppResponse(int slotId,
   2841                                      int responseType, int serial, RIL_Errno e,
   2842                                      void *response, size_t responseLen) {
   2843 #if VDBG
   2844     RLOGD("supplyIccPinForAppResponse: serial %d", serial);
   2845 #endif
   2846 
   2847     if (radioService[slotId]->mRadioResponse != NULL) {
   2848         RadioResponseInfo responseInfo = {};
   2849         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2850         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2851                 supplyIccPinForAppResponse(responseInfo, ret);
   2852         RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
   2853         radioService[slotId]->checkReturnStatus(retStatus);
   2854     } else {
   2855         RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2856                 slotId);
   2857     }
   2858 
   2859     return 0;
   2860 }
   2861 
   2862 int radio::supplyIccPukForAppResponse(int slotId,
   2863                                      int responseType, int serial, RIL_Errno e,
   2864                                      void *response, size_t responseLen) {
   2865 #if VDBG
   2866     RLOGD("supplyIccPukForAppResponse: serial %d", serial);
   2867 #endif
   2868 
   2869     if (radioService[slotId]->mRadioResponse != NULL) {
   2870         RadioResponseInfo responseInfo = {};
   2871         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2872         Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
   2873                 responseInfo, ret);
   2874         radioService[slotId]->checkReturnStatus(retStatus);
   2875     } else {
   2876         RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2877                 slotId);
   2878     }
   2879 
   2880     return 0;
   2881 }
   2882 
   2883 int radio::supplyIccPin2ForAppResponse(int slotId,
   2884                                       int responseType, int serial, RIL_Errno e,
   2885                                       void *response, size_t responseLen) {
   2886 #if VDBG
   2887     RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
   2888 #endif
   2889 
   2890     if (radioService[slotId]->mRadioResponse != NULL) {
   2891         RadioResponseInfo responseInfo = {};
   2892         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2893         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2894                 supplyIccPin2ForAppResponse(responseInfo, ret);
   2895         radioService[slotId]->checkReturnStatus(retStatus);
   2896     } else {
   2897         RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2898                 slotId);
   2899     }
   2900 
   2901     return 0;
   2902 }
   2903 
   2904 int radio::supplyIccPuk2ForAppResponse(int slotId,
   2905                                       int responseType, int serial, RIL_Errno e,
   2906                                       void *response, size_t responseLen) {
   2907 #if VDBG
   2908     RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
   2909 #endif
   2910 
   2911     if (radioService[slotId]->mRadioResponse != NULL) {
   2912         RadioResponseInfo responseInfo = {};
   2913         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2914         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2915                 supplyIccPuk2ForAppResponse(responseInfo, ret);
   2916         radioService[slotId]->checkReturnStatus(retStatus);
   2917     } else {
   2918         RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2919                 slotId);
   2920     }
   2921 
   2922     return 0;
   2923 }
   2924 
   2925 int radio::changeIccPinForAppResponse(int slotId,
   2926                                      int responseType, int serial, RIL_Errno e,
   2927                                      void *response, size_t responseLen) {
   2928 #if VDBG
   2929     RLOGD("changeIccPinForAppResponse: serial %d", serial);
   2930 #endif
   2931 
   2932     if (radioService[slotId]->mRadioResponse != NULL) {
   2933         RadioResponseInfo responseInfo = {};
   2934         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2935         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2936                 changeIccPinForAppResponse(responseInfo, ret);
   2937         radioService[slotId]->checkReturnStatus(retStatus);
   2938     } else {
   2939         RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2940                 slotId);
   2941     }
   2942 
   2943     return 0;
   2944 }
   2945 
   2946 int radio::changeIccPin2ForAppResponse(int slotId,
   2947                                       int responseType, int serial, RIL_Errno e,
   2948                                       void *response, size_t responseLen) {
   2949 #if VDBG
   2950     RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
   2951 #endif
   2952 
   2953     if (radioService[slotId]->mRadioResponse != NULL) {
   2954         RadioResponseInfo responseInfo = {};
   2955         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2956         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2957                 changeIccPin2ForAppResponse(responseInfo, ret);
   2958         radioService[slotId]->checkReturnStatus(retStatus);
   2959     } else {
   2960         RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
   2961                 slotId);
   2962     }
   2963 
   2964     return 0;
   2965 }
   2966 
   2967 int radio::supplyNetworkDepersonalizationResponse(int slotId,
   2968                                                  int responseType, int serial, RIL_Errno e,
   2969                                                  void *response, size_t responseLen) {
   2970 #if VDBG
   2971     RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
   2972 #endif
   2973 
   2974     if (radioService[slotId]->mRadioResponse != NULL) {
   2975         RadioResponseInfo responseInfo = {};
   2976         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   2977         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   2978                 supplyNetworkDepersonalizationResponse(responseInfo, ret);
   2979         radioService[slotId]->checkReturnStatus(retStatus);
   2980     } else {
   2981         RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
   2982                 "NULL", slotId);
   2983     }
   2984 
   2985     return 0;
   2986 }
   2987 
   2988 int radio::getCurrentCallsResponse(int slotId,
   2989                                   int responseType, int serial, RIL_Errno e,
   2990                                   void *response, size_t responseLen) {
   2991 #if VDBG
   2992     RLOGD("getCurrentCallsResponse: serial %d", serial);
   2993 #endif
   2994 
   2995     if (radioService[slotId]->mRadioResponse != NULL) {
   2996         RadioResponseInfo responseInfo = {};
   2997         populateResponseInfo(responseInfo, serial, responseType, e);
   2998 
   2999         hidl_vec<Call> calls;
   3000         if ((response == NULL && responseLen != 0)
   3001                 || (responseLen % sizeof(RIL_Call *)) != 0) {
   3002             RLOGE("getCurrentCallsResponse: Invalid response");
   3003             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3004         } else {
   3005             int num = responseLen / sizeof(RIL_Call *);
   3006             calls.resize(num);
   3007 
   3008             for (int i = 0 ; i < num ; i++) {
   3009                 RIL_Call *p_cur = ((RIL_Call **) response)[i];
   3010                 /* each call info */
   3011                 calls[i].state = (CallState) p_cur->state;
   3012                 calls[i].index = p_cur->index;
   3013                 calls[i].toa = p_cur->toa;
   3014                 calls[i].isMpty = p_cur->isMpty;
   3015                 calls[i].isMT = p_cur->isMT;
   3016                 calls[i].als = p_cur->als;
   3017                 calls[i].isVoice = p_cur->isVoice;
   3018                 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
   3019                 calls[i].number = convertCharPtrToHidlString(p_cur->number);
   3020                 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
   3021                 calls[i].name = convertCharPtrToHidlString(p_cur->name);
   3022                 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
   3023                 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
   3024                     RIL_UUS_Info *uusInfo = p_cur->uusInfo;
   3025                     calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
   3026                     calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
   3027                     // convert uusInfo->uusData to a null-terminated string
   3028                     char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
   3029                     calls[i].uusInfo[0].uusData = nullTermStr;
   3030                     free(nullTermStr);
   3031                 }
   3032             }
   3033         }
   3034 
   3035         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   3036                 getCurrentCallsResponse(responseInfo, calls);
   3037         radioService[slotId]->checkReturnStatus(retStatus);
   3038     } else {
   3039         RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3040     }
   3041 
   3042     return 0;
   3043 }
   3044 
   3045 int radio::dialResponse(int slotId,
   3046                        int responseType, int serial, RIL_Errno e, void *response,
   3047                        size_t responseLen) {
   3048 #if VDBG
   3049     RLOGD("dialResponse: serial %d", serial);
   3050 #endif
   3051 
   3052     if (radioService[slotId]->mRadioResponse != NULL) {
   3053         RadioResponseInfo responseInfo = {};
   3054         populateResponseInfo(responseInfo, serial, responseType, e);
   3055         Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
   3056         radioService[slotId]->checkReturnStatus(retStatus);
   3057     } else {
   3058         RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3059     }
   3060 
   3061     return 0;
   3062 }
   3063 
   3064 int radio::getIMSIForAppResponse(int slotId,
   3065                                 int responseType, int serial, RIL_Errno e, void *response,
   3066                                 size_t responseLen) {
   3067 #if VDBG
   3068     RLOGD("getIMSIForAppResponse: serial %d", serial);
   3069 #endif
   3070 
   3071     if (radioService[slotId]->mRadioResponse != NULL) {
   3072         RadioResponseInfo responseInfo = {};
   3073         populateResponseInfo(responseInfo, serial, responseType, e);
   3074         Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
   3075                 responseInfo, convertCharPtrToHidlString((char *) response));
   3076         radioService[slotId]->checkReturnStatus(retStatus);
   3077     } else {
   3078         RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
   3079                 slotId);
   3080     }
   3081 
   3082     return 0;
   3083 }
   3084 
   3085 int radio::hangupConnectionResponse(int slotId,
   3086                                    int responseType, int serial, RIL_Errno e,
   3087                                    void *response, size_t responseLen) {
   3088 #if VDBG
   3089     RLOGD("hangupConnectionResponse: serial %d", serial);
   3090 #endif
   3091 
   3092     if (radioService[slotId]->mRadioResponse != NULL) {
   3093         RadioResponseInfo responseInfo = {};
   3094         populateResponseInfo(responseInfo, serial, responseType, e);
   3095         Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
   3096                 responseInfo);
   3097         radioService[slotId]->checkReturnStatus(retStatus);
   3098     } else {
   3099         RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
   3100                 slotId);
   3101     }
   3102 
   3103     return 0;
   3104 }
   3105 
   3106 int radio::hangupWaitingOrBackgroundResponse(int slotId,
   3107                                             int responseType, int serial, RIL_Errno e,
   3108                                             void *response, size_t responseLen) {
   3109 #if VDBG
   3110     RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
   3111 #endif
   3112 
   3113     if (radioService[slotId]->mRadioResponse != NULL) {
   3114         RadioResponseInfo responseInfo = {};
   3115         populateResponseInfo(responseInfo, serial, responseType, e);
   3116         Return<void> retStatus =
   3117                 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
   3118                 responseInfo);
   3119         radioService[slotId]->checkReturnStatus(retStatus);
   3120     } else {
   3121         RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
   3122                 slotId);
   3123     }
   3124 
   3125     return 0;
   3126 }
   3127 
   3128 int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
   3129                                                     RIL_Errno e, void *response,
   3130                                                     size_t responseLen) {
   3131 #if VDBG
   3132     RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
   3133 #endif
   3134 
   3135     if (radioService[slotId]->mRadioResponse != NULL) {
   3136         RadioResponseInfo responseInfo = {};
   3137         populateResponseInfo(responseInfo, serial, responseType, e);
   3138         Return<void> retStatus =
   3139                 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
   3140                 responseInfo);
   3141         radioService[slotId]->checkReturnStatus(retStatus);
   3142     } else {
   3143         RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
   3144                 slotId);
   3145     }
   3146 
   3147     return 0;
   3148 }
   3149 
   3150 int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
   3151                                                    RIL_Errno e, void *response,
   3152                                                    size_t responseLen) {
   3153 #if VDBG
   3154     RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
   3155 #endif
   3156 
   3157     if (radioService[slotId]->mRadioResponse != NULL) {
   3158         RadioResponseInfo responseInfo = {};
   3159         populateResponseInfo(responseInfo, serial, responseType, e);
   3160         Return<void> retStatus =
   3161                 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
   3162                 responseInfo);
   3163         radioService[slotId]->checkReturnStatus(retStatus);
   3164     } else {
   3165         RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
   3166                 "== NULL", slotId);
   3167     }
   3168 
   3169     return 0;
   3170 }
   3171 
   3172 int radio::conferenceResponse(int slotId, int responseType,
   3173                              int serial, RIL_Errno e, void *response, size_t responseLen) {
   3174 #if VDBG
   3175     RLOGD("conferenceResponse: serial %d", serial);
   3176 #endif
   3177 
   3178     if (radioService[slotId]->mRadioResponse != NULL) {
   3179         RadioResponseInfo responseInfo = {};
   3180         populateResponseInfo(responseInfo, serial, responseType, e);
   3181         Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
   3182                 responseInfo);
   3183         radioService[slotId]->checkReturnStatus(retStatus);
   3184     } else {
   3185         RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
   3186                 slotId);
   3187     }
   3188 
   3189     return 0;
   3190 }
   3191 
   3192 int radio::rejectCallResponse(int slotId, int responseType,
   3193                              int serial, RIL_Errno e, void *response, size_t responseLen) {
   3194 #if VDBG
   3195     RLOGD("rejectCallResponse: serial %d", serial);
   3196 #endif
   3197 
   3198     if (radioService[slotId]->mRadioResponse != NULL) {
   3199         RadioResponseInfo responseInfo = {};
   3200         populateResponseInfo(responseInfo, serial, responseType, e);
   3201         Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
   3202                 responseInfo);
   3203         radioService[slotId]->checkReturnStatus(retStatus);
   3204     } else {
   3205         RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
   3206                 slotId);
   3207     }
   3208 
   3209     return 0;
   3210 }
   3211 
   3212 int radio::getLastCallFailCauseResponse(int slotId,
   3213                                        int responseType, int serial, RIL_Errno e, void *response,
   3214                                        size_t responseLen) {
   3215 #if VDBG
   3216     RLOGD("getLastCallFailCauseResponse: serial %d", serial);
   3217 #endif
   3218 
   3219     if (radioService[slotId]->mRadioResponse != NULL) {
   3220         RadioResponseInfo responseInfo = {};
   3221         populateResponseInfo(responseInfo, serial, responseType, e);
   3222 
   3223         LastCallFailCauseInfo info = {};
   3224         info.vendorCause = hidl_string();
   3225         if (response == NULL) {
   3226             RLOGE("getCurrentCallsResponse Invalid response: NULL");
   3227             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3228         } else if (responseLen == sizeof(int)) {
   3229             int *pInt = (int *) response;
   3230             info.causeCode = (LastCallFailCause) pInt[0];
   3231         } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo))  {
   3232             RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
   3233             info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
   3234             info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
   3235         } else {
   3236             RLOGE("getCurrentCallsResponse Invalid response: NULL");
   3237             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3238         }
   3239 
   3240         Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
   3241                 responseInfo, info);
   3242         radioService[slotId]->checkReturnStatus(retStatus);
   3243     } else {
   3244         RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
   3245                 slotId);
   3246     }
   3247 
   3248     return 0;
   3249 }
   3250 
   3251 int radio::getSignalStrengthResponse(int slotId,
   3252                                      int responseType, int serial, RIL_Errno e,
   3253                                      void *response, size_t responseLen) {
   3254 #if VDBG
   3255     RLOGD("getSignalStrengthResponse: serial %d", serial);
   3256 #endif
   3257 
   3258     if (radioService[slotId]->mRadioResponse != NULL) {
   3259         RadioResponseInfo responseInfo = {};
   3260         populateResponseInfo(responseInfo, serial, responseType, e);
   3261         SignalStrength signalStrength = {};
   3262         if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
   3263             RLOGE("getSignalStrengthResponse: Invalid response");
   3264             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3265         } else {
   3266             convertRilSignalStrengthToHal(response, responseLen, signalStrength);
   3267         }
   3268 
   3269         Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
   3270                 responseInfo, signalStrength);
   3271         radioService[slotId]->checkReturnStatus(retStatus);
   3272     } else {
   3273         RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
   3274                 slotId);
   3275     }
   3276 
   3277     return 0;
   3278 }
   3279 
   3280 RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
   3281     if (rat == NULL) {
   3282         return RIL_CELL_INFO_TYPE_NONE;
   3283     }
   3284 
   3285     int radioTech = atoi(rat);
   3286 
   3287     switch(radioTech) {
   3288 
   3289         case RADIO_TECH_GPRS:
   3290         case RADIO_TECH_EDGE:
   3291         case RADIO_TECH_GSM: {
   3292             return RIL_CELL_INFO_TYPE_GSM;
   3293         }
   3294 
   3295         case RADIO_TECH_UMTS:
   3296         case RADIO_TECH_HSDPA:
   3297         case RADIO_TECH_HSUPA:
   3298         case RADIO_TECH_HSPA:
   3299         case RADIO_TECH_HSPAP: {
   3300             return RIL_CELL_INFO_TYPE_WCDMA;
   3301         }
   3302 
   3303         case RADIO_TECH_IS95A:
   3304         case RADIO_TECH_IS95B:
   3305         case RADIO_TECH_1xRTT:
   3306         case RADIO_TECH_EVDO_0:
   3307         case RADIO_TECH_EVDO_A:
   3308         case RADIO_TECH_EVDO_B:
   3309         case RADIO_TECH_EHRPD: {
   3310             return RIL_CELL_INFO_TYPE_CDMA;
   3311         }
   3312 
   3313         case RADIO_TECH_LTE:
   3314         case RADIO_TECH_LTE_CA: {
   3315             return RIL_CELL_INFO_TYPE_LTE;
   3316         }
   3317 
   3318         case RADIO_TECH_TD_SCDMA: {
   3319             return RIL_CELL_INFO_TYPE_TD_SCDMA;
   3320         }
   3321 
   3322         default: {
   3323             break;
   3324         }
   3325     }
   3326 
   3327     return RIL_CELL_INFO_TYPE_NONE;
   3328 
   3329 }
   3330 
   3331 void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
   3332 
   3333     cellIdentity.cellIdentityGsm.resize(0);
   3334     cellIdentity.cellIdentityWcdma.resize(0);
   3335     cellIdentity.cellIdentityCdma.resize(0);
   3336     cellIdentity.cellIdentityTdscdma.resize(0);
   3337     cellIdentity.cellIdentityLte.resize(0);
   3338     cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
   3339     switch(rilCellIdentity.cellInfoType) {
   3340 
   3341         case RIL_CELL_INFO_TYPE_GSM: {
   3342             cellIdentity.cellIdentityGsm.resize(1);
   3343             cellIdentity.cellIdentityGsm[0].mcc =
   3344                     std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
   3345             cellIdentity.cellIdentityGsm[0].mnc =
   3346                     std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
   3347             cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
   3348             cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
   3349             cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
   3350             cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
   3351             break;
   3352         }
   3353 
   3354         case RIL_CELL_INFO_TYPE_WCDMA: {
   3355             cellIdentity.cellIdentityWcdma.resize(1);
   3356             cellIdentity.cellIdentityWcdma[0].mcc =
   3357                     std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
   3358             cellIdentity.cellIdentityWcdma[0].mnc =
   3359                     std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
   3360             cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
   3361             cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
   3362             cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
   3363             cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
   3364             break;
   3365         }
   3366 
   3367         case RIL_CELL_INFO_TYPE_CDMA: {
   3368             cellIdentity.cellIdentityCdma.resize(1);
   3369             cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
   3370             cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
   3371             cellIdentity.cellIdentityCdma[0].baseStationId =
   3372                     rilCellIdentity.cellIdentityCdma.basestationId;
   3373             cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
   3374             cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
   3375             break;
   3376         }
   3377 
   3378         case RIL_CELL_INFO_TYPE_LTE: {
   3379             cellIdentity.cellIdentityLte.resize(1);
   3380             cellIdentity.cellIdentityLte[0].mcc =
   3381                     std::to_string(rilCellIdentity.cellIdentityLte.mcc);
   3382             cellIdentity.cellIdentityLte[0].mnc =
   3383                     std::to_string(rilCellIdentity.cellIdentityLte.mnc);
   3384             cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
   3385             cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
   3386             cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
   3387             cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
   3388             break;
   3389         }
   3390 
   3391         case RIL_CELL_INFO_TYPE_TD_SCDMA: {
   3392             cellIdentity.cellIdentityTdscdma.resize(1);
   3393             cellIdentity.cellIdentityTdscdma[0].mcc =
   3394                     std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
   3395             cellIdentity.cellIdentityTdscdma[0].mnc =
   3396                     std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
   3397             cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
   3398             cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
   3399             cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
   3400             break;
   3401         }
   3402 
   3403         default: {
   3404             break;
   3405         }
   3406     }
   3407 }
   3408 
   3409 int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
   3410     if ((response != NULL) &&  (numStrings > index) && (response[index] != NULL)) {
   3411         return atoi(response[index]);
   3412     }
   3413 
   3414     return -1;
   3415 }
   3416 
   3417 int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
   3418     const int hexBase = 16;
   3419     if ((response != NULL) &&  (numStrings > index) && (response[index] != NULL)) {
   3420         return strtol(response[index], NULL, hexBase);
   3421     }
   3422 
   3423     return -1;
   3424 }
   3425 
   3426 /* Fill Cell Identity info from Voice Registration State Response.
   3427  * This fucntion is applicable only for RIL Version < 15.
   3428  * Response is a  "char **".
   3429  * First and Second entries are in hex string format
   3430  * and rest are integers represented in ascii format. */
   3431 void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
   3432         int numStrings, char** response) {
   3433 
   3434     RIL_CellIdentity_v16 rilCellIdentity;
   3435     memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
   3436 
   3437     rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
   3438     switch(rilCellIdentity.cellInfoType) {
   3439 
   3440         case RIL_CELL_INFO_TYPE_GSM: {
   3441             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3442             rilCellIdentity.cellIdentityGsm.lac =
   3443                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3444 
   3445             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3446             rilCellIdentity.cellIdentityGsm.cid =
   3447                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3448             break;
   3449         }
   3450 
   3451         case RIL_CELL_INFO_TYPE_WCDMA: {
   3452             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3453             rilCellIdentity.cellIdentityWcdma.lac =
   3454                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3455 
   3456             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3457             rilCellIdentity.cellIdentityWcdma.cid =
   3458                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3459             rilCellIdentity.cellIdentityWcdma.psc =
   3460                     convertResponseStringEntryToInt(response, 14, numStrings);
   3461             break;
   3462         }
   3463 
   3464         case RIL_CELL_INFO_TYPE_TD_SCDMA:{
   3465             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3466             rilCellIdentity.cellIdentityTdscdma.lac =
   3467                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3468 
   3469             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3470             rilCellIdentity.cellIdentityTdscdma.cid =
   3471                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3472             break;
   3473         }
   3474 
   3475         case RIL_CELL_INFO_TYPE_CDMA:{
   3476             rilCellIdentity.cellIdentityCdma.basestationId =
   3477                     convertResponseStringEntryToInt(response, 4, numStrings);
   3478             rilCellIdentity.cellIdentityCdma.longitude =
   3479                     convertResponseStringEntryToInt(response, 5, numStrings);
   3480             rilCellIdentity.cellIdentityCdma.latitude =
   3481                     convertResponseStringEntryToInt(response, 6, numStrings);
   3482             rilCellIdentity.cellIdentityCdma.systemId =
   3483                     convertResponseStringEntryToInt(response, 8, numStrings);
   3484             rilCellIdentity.cellIdentityCdma.networkId =
   3485                     convertResponseStringEntryToInt(response, 9, numStrings);
   3486             break;
   3487         }
   3488 
   3489         case RIL_CELL_INFO_TYPE_LTE:{
   3490             /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
   3491             rilCellIdentity.cellIdentityLte.tac =
   3492                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3493 
   3494             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3495             rilCellIdentity.cellIdentityLte.ci =
   3496                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3497             break;
   3498         }
   3499 
   3500         default: {
   3501             break;
   3502         }
   3503     }
   3504 
   3505     fillCellIdentityResponse(cellIdentity, rilCellIdentity);
   3506 }
   3507 
   3508 /* Fill Cell Identity info from Data Registration State Response.
   3509  * This fucntion is applicable only for RIL Version < 15.
   3510  * Response is a  "char **".
   3511  * First and Second entries are in hex string format
   3512  * and rest are integers represented in ascii format. */
   3513 void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
   3514         int numStrings, char** response) {
   3515 
   3516     RIL_CellIdentity_v16 rilCellIdentity;
   3517     memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
   3518 
   3519     rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
   3520     switch(rilCellIdentity.cellInfoType) {
   3521         case RIL_CELL_INFO_TYPE_GSM: {
   3522             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3523             rilCellIdentity.cellIdentityGsm.lac =
   3524                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3525 
   3526             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3527             rilCellIdentity.cellIdentityGsm.cid =
   3528                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3529             break;
   3530         }
   3531         case RIL_CELL_INFO_TYPE_WCDMA: {
   3532             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3533             rilCellIdentity.cellIdentityWcdma.lac =
   3534                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3535 
   3536             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3537             rilCellIdentity.cellIdentityWcdma.cid =
   3538                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3539             break;
   3540         }
   3541         case RIL_CELL_INFO_TYPE_TD_SCDMA:{
   3542             /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
   3543             rilCellIdentity.cellIdentityTdscdma.lac =
   3544                     convertResponseHexStringEntryToInt(response, 1, numStrings);
   3545 
   3546             /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
   3547             rilCellIdentity.cellIdentityTdscdma.cid =
   3548                     convertResponseHexStringEntryToInt(response, 2, numStrings);
   3549             break;
   3550         }
   3551         case RIL_CELL_INFO_TYPE_LTE: {
   3552             rilCellIdentity.cellIdentityLte.tac =
   3553                     convertResponseStringEntryToInt(response, 6, numStrings);
   3554             rilCellIdentity.cellIdentityLte.pci =
   3555                     convertResponseStringEntryToInt(response, 7, numStrings);
   3556             rilCellIdentity.cellIdentityLte.ci =
   3557                     convertResponseStringEntryToInt(response, 8, numStrings);
   3558             break;
   3559         }
   3560         default: {
   3561             break;
   3562         }
   3563     }
   3564 
   3565     fillCellIdentityResponse(cellIdentity, rilCellIdentity);
   3566 }
   3567 
   3568 int radio::getVoiceRegistrationStateResponse(int slotId,
   3569                                             int responseType, int serial, RIL_Errno e,
   3570                                             void *response, size_t responseLen) {
   3571 #if VDBG
   3572     RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
   3573 #endif
   3574 
   3575     if (radioService[slotId]->mRadioResponse != NULL) {
   3576         RadioResponseInfo responseInfo = {};
   3577         populateResponseInfo(responseInfo, serial, responseType, e);
   3578 
   3579         VoiceRegStateResult voiceRegResponse = {};
   3580         int numStrings = responseLen / sizeof(char *);
   3581         if (response == NULL) {
   3582                RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
   3583                if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3584         } else if (s_vendorFunctions->version <= 14) {
   3585             if (numStrings != 15) {
   3586                 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
   3587                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3588             } else {
   3589                 char **resp = (char **) response;
   3590                 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
   3591                 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
   3592                 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
   3593                 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
   3594                 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
   3595                 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
   3596                 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
   3597                 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
   3598                         numStrings, resp);
   3599             }
   3600         } else {
   3601             RIL_VoiceRegistrationStateResponse *voiceRegState =
   3602                     (RIL_VoiceRegistrationStateResponse *)response;
   3603 
   3604             if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
   3605                 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
   3606                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3607             } else {
   3608                 voiceRegResponse.regState = (RegState) voiceRegState->regState;
   3609                 voiceRegResponse.rat = voiceRegState->rat;;
   3610                 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
   3611                 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
   3612                 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
   3613                 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
   3614                 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
   3615                 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
   3616                         voiceRegState->cellIdentity);
   3617             }
   3618         }
   3619 
   3620         Return<void> retStatus =
   3621                 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
   3622                 responseInfo, voiceRegResponse);
   3623         radioService[slotId]->checkReturnStatus(retStatus);
   3624     } else {
   3625         RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
   3626                 slotId);
   3627     }
   3628 
   3629     return 0;
   3630 }
   3631 
   3632 int radio::getDataRegistrationStateResponse(int slotId,
   3633                                            int responseType, int serial, RIL_Errno e,
   3634                                            void *response, size_t responseLen) {
   3635 #if VDBG
   3636     RLOGD("getDataRegistrationStateResponse: serial %d", serial);
   3637 #endif
   3638 
   3639     if (radioService[slotId]->mRadioResponse != NULL) {
   3640         RadioResponseInfo responseInfo = {};
   3641         populateResponseInfo(responseInfo, serial, responseType, e);
   3642         DataRegStateResult dataRegResponse = {};
   3643         if (response == NULL) {
   3644             RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
   3645             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3646         } else if (s_vendorFunctions->version <= 14) {
   3647             int numStrings = responseLen / sizeof(char *);
   3648             if ((numStrings != 6) && (numStrings != 11)) {
   3649                 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
   3650                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3651             } else {
   3652                 char **resp = (char **) response;
   3653                 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
   3654                 dataRegResponse.rat =  ATOI_NULL_HANDLED_DEF(resp[3], 0);
   3655                 dataRegResponse.reasonDataDenied =  ATOI_NULL_HANDLED(resp[4]);
   3656                 dataRegResponse.maxDataCalls =  ATOI_NULL_HANDLED_DEF(resp[5], 1);
   3657                 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
   3658                         numStrings, resp);
   3659             }
   3660         } else {
   3661             RIL_DataRegistrationStateResponse *dataRegState =
   3662                     (RIL_DataRegistrationStateResponse *)response;
   3663 
   3664             if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
   3665                 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
   3666                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3667             } else {
   3668                 dataRegResponse.regState = (RegState) dataRegState->regState;
   3669                 dataRegResponse.rat = dataRegState->rat;;
   3670                 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
   3671                 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
   3672                 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
   3673             }
   3674         }
   3675 
   3676         Return<void> retStatus =
   3677                 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
   3678                 dataRegResponse);
   3679         radioService[slotId]->checkReturnStatus(retStatus);
   3680     } else {
   3681         RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
   3682                 slotId);
   3683     }
   3684 
   3685     return 0;
   3686 }
   3687 
   3688 int radio::getOperatorResponse(int slotId,
   3689                               int responseType, int serial, RIL_Errno e, void *response,
   3690                               size_t responseLen) {
   3691 #if VDBG
   3692     RLOGD("getOperatorResponse: serial %d", serial);
   3693 #endif
   3694 
   3695     if (radioService[slotId]->mRadioResponse != NULL) {
   3696         RadioResponseInfo responseInfo = {};
   3697         populateResponseInfo(responseInfo, serial, responseType, e);
   3698         hidl_string longName;
   3699         hidl_string shortName;
   3700         hidl_string numeric;
   3701         int numStrings = responseLen / sizeof(char *);
   3702         if (response == NULL || numStrings != 3) {
   3703             RLOGE("getOperatorResponse Invalid response: NULL");
   3704             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3705 
   3706         } else {
   3707             char **resp = (char **) response;
   3708             longName = convertCharPtrToHidlString(resp[0]);
   3709             shortName = convertCharPtrToHidlString(resp[1]);
   3710             numeric = convertCharPtrToHidlString(resp[2]);
   3711         }
   3712         Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
   3713                 responseInfo, longName, shortName, numeric);
   3714         radioService[slotId]->checkReturnStatus(retStatus);
   3715     } else {
   3716         RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
   3717                 slotId);
   3718     }
   3719 
   3720     return 0;
   3721 }
   3722 
   3723 int radio::setRadioPowerResponse(int slotId,
   3724                                 int responseType, int serial, RIL_Errno e, void *response,
   3725                                 size_t responseLen) {
   3726     RLOGD("setRadioPowerResponse: serial %d", serial);
   3727 
   3728     if (radioService[slotId]->mRadioResponse != NULL) {
   3729         RadioResponseInfo responseInfo = {};
   3730         populateResponseInfo(responseInfo, serial, responseType, e);
   3731         Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
   3732                 responseInfo);
   3733         radioService[slotId]->checkReturnStatus(retStatus);
   3734     } else {
   3735         RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
   3736                 slotId);
   3737     }
   3738 
   3739     return 0;
   3740 }
   3741 
   3742 int radio::sendDtmfResponse(int slotId,
   3743                            int responseType, int serial, RIL_Errno e, void *response,
   3744                            size_t responseLen) {
   3745 #if VDBG
   3746     RLOGD("sendDtmfResponse: serial %d", serial);
   3747 #endif
   3748 
   3749     if (radioService[slotId]->mRadioResponse != NULL) {
   3750         RadioResponseInfo responseInfo = {};
   3751         populateResponseInfo(responseInfo, serial, responseType, e);
   3752         Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
   3753                 responseInfo);
   3754         radioService[slotId]->checkReturnStatus(retStatus);
   3755     } else {
   3756         RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
   3757                 slotId);
   3758     }
   3759 
   3760     return 0;
   3761 }
   3762 
   3763 SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
   3764                                 RIL_Errno e, void *response, size_t responseLen) {
   3765     populateResponseInfo(responseInfo, serial, responseType, e);
   3766     SendSmsResult result = {};
   3767 
   3768     if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
   3769         RLOGE("Invalid response: NULL");
   3770         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3771         result.ackPDU = hidl_string();
   3772     } else {
   3773         RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
   3774         result.messageRef = resp->messageRef;
   3775         result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
   3776         result.errorCode = resp->errorCode;
   3777     }
   3778     return result;
   3779 }
   3780 
   3781 int radio::sendSmsResponse(int slotId,
   3782                           int responseType, int serial, RIL_Errno e, void *response,
   3783                           size_t responseLen) {
   3784 #if VDBG
   3785     RLOGD("sendSmsResponse: serial %d", serial);
   3786 #endif
   3787 
   3788     if (radioService[slotId]->mRadioResponse != NULL) {
   3789         RadioResponseInfo responseInfo = {};
   3790         SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
   3791                 responseLen);
   3792 
   3793         Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
   3794                 result);
   3795         radioService[slotId]->checkReturnStatus(retStatus);
   3796     } else {
   3797         RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3798     }
   3799 
   3800     return 0;
   3801 }
   3802 
   3803 int radio::sendSMSExpectMoreResponse(int slotId,
   3804                                     int responseType, int serial, RIL_Errno e, void *response,
   3805                                     size_t responseLen) {
   3806 #if VDBG
   3807     RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
   3808 #endif
   3809 
   3810     if (radioService[slotId]->mRadioResponse != NULL) {
   3811         RadioResponseInfo responseInfo = {};
   3812         SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
   3813                 responseLen);
   3814 
   3815         Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
   3816                 responseInfo, result);
   3817         radioService[slotId]->checkReturnStatus(retStatus);
   3818     } else {
   3819         RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3820     }
   3821 
   3822     return 0;
   3823 }
   3824 
   3825 int radio::setupDataCallResponse(int slotId,
   3826                                  int responseType, int serial, RIL_Errno e, void *response,
   3827                                  size_t responseLen) {
   3828 #if VDBG
   3829     RLOGD("setupDataCallResponse: serial %d", serial);
   3830 #endif
   3831 
   3832     if (radioService[slotId]->mRadioResponse != NULL) {
   3833         RadioResponseInfo responseInfo = {};
   3834         populateResponseInfo(responseInfo, serial, responseType, e);
   3835 
   3836         SetupDataCallResult result = {};
   3837         if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
   3838             if (response != NULL) {
   3839                 RLOGE("setupDataCallResponse: Invalid response");
   3840                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3841             }
   3842             result.status = DataCallFailCause::ERROR_UNSPECIFIED;
   3843             result.type = hidl_string();
   3844             result.ifname = hidl_string();
   3845             result.addresses = hidl_string();
   3846             result.dnses = hidl_string();
   3847             result.gateways = hidl_string();
   3848             result.pcscf = hidl_string();
   3849         } else {
   3850             convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
   3851         }
   3852 
   3853         Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
   3854                 responseInfo, result);
   3855         radioService[slotId]->checkReturnStatus(retStatus);
   3856     } else {
   3857         RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3858     }
   3859 
   3860     return 0;
   3861 }
   3862 
   3863 IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
   3864                            RIL_Errno e, void *response, size_t responseLen) {
   3865     populateResponseInfo(responseInfo, serial, responseType, e);
   3866     IccIoResult result = {};
   3867 
   3868     if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
   3869         RLOGE("Invalid response: NULL");
   3870         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3871         result.simResponse = hidl_string();
   3872     } else {
   3873         RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
   3874         result.sw1 = resp->sw1;
   3875         result.sw2 = resp->sw2;
   3876         result.simResponse = convertCharPtrToHidlString(resp->simResponse);
   3877     }
   3878     return result;
   3879 }
   3880 
   3881 int radio::iccIOForAppResponse(int slotId,
   3882                       int responseType, int serial, RIL_Errno e, void *response,
   3883                       size_t responseLen) {
   3884 #if VDBG
   3885     RLOGD("iccIOForAppResponse: serial %d", serial);
   3886 #endif
   3887 
   3888     if (radioService[slotId]->mRadioResponse != NULL) {
   3889         RadioResponseInfo responseInfo = {};
   3890         IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
   3891                 responseLen);
   3892 
   3893         Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
   3894                 responseInfo, result);
   3895         radioService[slotId]->checkReturnStatus(retStatus);
   3896     } else {
   3897         RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3898     }
   3899 
   3900     return 0;
   3901 }
   3902 
   3903 int radio::sendUssdResponse(int slotId,
   3904                            int responseType, int serial, RIL_Errno e, void *response,
   3905                            size_t responseLen) {
   3906 #if VDBG
   3907     RLOGD("sendUssdResponse: serial %d", serial);
   3908 #endif
   3909 
   3910     if (radioService[slotId]->mRadioResponse != NULL) {
   3911         RadioResponseInfo responseInfo = {};
   3912         populateResponseInfo(responseInfo, serial, responseType, e);
   3913         Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
   3914                 responseInfo);
   3915         radioService[slotId]->checkReturnStatus(retStatus);
   3916     } else {
   3917         RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
   3918                 slotId);
   3919     }
   3920 
   3921     return 0;
   3922 }
   3923 
   3924 int radio::cancelPendingUssdResponse(int slotId,
   3925                                     int responseType, int serial, RIL_Errno e, void *response,
   3926                                     size_t responseLen) {
   3927 #if VDBG
   3928     RLOGD("cancelPendingUssdResponse: serial %d", serial);
   3929 #endif
   3930 
   3931     if (radioService[slotId]->mRadioResponse != NULL) {
   3932         RadioResponseInfo responseInfo = {};
   3933         populateResponseInfo(responseInfo, serial, responseType, e);
   3934         Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
   3935                 responseInfo);
   3936         radioService[slotId]->checkReturnStatus(retStatus);
   3937     } else {
   3938         RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
   3939                 slotId);
   3940     }
   3941 
   3942     return 0;
   3943 }
   3944 
   3945 int radio::getClirResponse(int slotId,
   3946                               int responseType, int serial, RIL_Errno e, void *response,
   3947                               size_t responseLen) {
   3948 #if VDBG
   3949     RLOGD("getClirResponse: serial %d", serial);
   3950 #endif
   3951 
   3952     if (radioService[slotId]->mRadioResponse != NULL) {
   3953         RadioResponseInfo responseInfo = {};
   3954         populateResponseInfo(responseInfo, serial, responseType, e);
   3955         int n = -1, m = -1;
   3956         int numInts = responseLen / sizeof(int);
   3957         if (response == NULL || numInts != 2) {
   3958             RLOGE("getClirResponse Invalid response: NULL");
   3959             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   3960         } else {
   3961             int *pInt = (int *) response;
   3962             n = pInt[0];
   3963             m = pInt[1];
   3964         }
   3965         Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
   3966                 n, m);
   3967         radioService[slotId]->checkReturnStatus(retStatus);
   3968     } else {
   3969         RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3970     }
   3971 
   3972     return 0;
   3973 }
   3974 
   3975 int radio::setClirResponse(int slotId,
   3976                           int responseType, int serial, RIL_Errno e, void *response,
   3977                           size_t responseLen) {
   3978 #if VDBG
   3979     RLOGD("setClirResponse: serial %d", serial);
   3980 #endif
   3981 
   3982     if (radioService[slotId]->mRadioResponse != NULL) {
   3983         RadioResponseInfo responseInfo = {};
   3984         populateResponseInfo(responseInfo, serial, responseType, e);
   3985         Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
   3986                 responseInfo);
   3987         radioService[slotId]->checkReturnStatus(retStatus);
   3988     } else {
   3989         RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   3990     }
   3991 
   3992     return 0;
   3993 }
   3994 
   3995 int radio::getCallForwardStatusResponse(int slotId,
   3996                                        int responseType, int serial, RIL_Errno e,
   3997                                        void *response, size_t responseLen) {
   3998 #if VDBG
   3999     RLOGD("getCallForwardStatusResponse: serial %d", serial);
   4000 #endif
   4001 
   4002     if (radioService[slotId]->mRadioResponse != NULL) {
   4003         RadioResponseInfo responseInfo = {};
   4004         populateResponseInfo(responseInfo, serial, responseType, e);
   4005         hidl_vec<CallForwardInfo> callForwardInfos;
   4006 
   4007         if ((response == NULL && responseLen != 0)
   4008                 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
   4009             RLOGE("getCallForwardStatusResponse Invalid response: NULL");
   4010             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4011         } else {
   4012             int num = responseLen / sizeof(RIL_CallForwardInfo *);
   4013             callForwardInfos.resize(num);
   4014             for (int i = 0 ; i < num; i++) {
   4015                 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
   4016                 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
   4017                 callForwardInfos[i].reason = resp->reason;
   4018                 callForwardInfos[i].serviceClass = resp->serviceClass;
   4019                 callForwardInfos[i].toa = resp->toa;
   4020                 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
   4021                 callForwardInfos[i].timeSeconds = resp->timeSeconds;
   4022             }
   4023         }
   4024 
   4025         Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
   4026                 responseInfo, callForwardInfos);
   4027         radioService[slotId]->checkReturnStatus(retStatus);
   4028     } else {
   4029         RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
   4030                 slotId);
   4031     }
   4032 
   4033     return 0;
   4034 }
   4035 
   4036 int radio::setCallForwardResponse(int slotId,
   4037                                  int responseType, int serial, RIL_Errno e, void *response,
   4038                                  size_t responseLen) {
   4039 #if VDBG
   4040     RLOGD("setCallForwardResponse: serial %d", serial);
   4041 #endif
   4042 
   4043     if (radioService[slotId]->mRadioResponse != NULL) {
   4044         RadioResponseInfo responseInfo = {};
   4045         populateResponseInfo(responseInfo, serial, responseType, e);
   4046         Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
   4047                 responseInfo);
   4048         radioService[slotId]->checkReturnStatus(retStatus);
   4049     } else {
   4050         RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4051     }
   4052 
   4053     return 0;
   4054 }
   4055 
   4056 int radio::getCallWaitingResponse(int slotId,
   4057                                  int responseType, int serial, RIL_Errno e, void *response,
   4058                                  size_t responseLen) {
   4059 #if VDBG
   4060     RLOGD("getCallWaitingResponse: serial %d", serial);
   4061 #endif
   4062 
   4063     if (radioService[slotId]->mRadioResponse != NULL) {
   4064         RadioResponseInfo responseInfo = {};
   4065         populateResponseInfo(responseInfo, serial, responseType, e);
   4066         bool enable = false;
   4067         int serviceClass = -1;
   4068         int numInts = responseLen / sizeof(int);
   4069         if (response == NULL || numInts != 2) {
   4070             RLOGE("getCallWaitingResponse Invalid response: NULL");
   4071             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4072         } else {
   4073             int *pInt = (int *) response;
   4074             enable = pInt[0] == 1 ? true : false;
   4075             serviceClass = pInt[1];
   4076         }
   4077         Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
   4078                 responseInfo, enable, serviceClass);
   4079         radioService[slotId]->checkReturnStatus(retStatus);
   4080     } else {
   4081         RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4082     }
   4083 
   4084     return 0;
   4085 }
   4086 
   4087 int radio::setCallWaitingResponse(int slotId,
   4088                                  int responseType, int serial, RIL_Errno e, void *response,
   4089                                  size_t responseLen) {
   4090 #if VDBG
   4091     RLOGD("setCallWaitingResponse: serial %d", serial);
   4092 #endif
   4093 
   4094     if (radioService[slotId]->mRadioResponse != NULL) {
   4095         RadioResponseInfo responseInfo = {};
   4096         populateResponseInfo(responseInfo, serial, responseType, e);
   4097         Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
   4098                 responseInfo);
   4099         radioService[slotId]->checkReturnStatus(retStatus);
   4100     } else {
   4101         RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4102     }
   4103 
   4104     return 0;
   4105 }
   4106 
   4107 int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
   4108                                                 int responseType, int serial, RIL_Errno e,
   4109                                                 void *response, size_t responseLen) {
   4110 #if VDBG
   4111     RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
   4112 #endif
   4113 
   4114     if (radioService[slotId]->mRadioResponse != NULL) {
   4115         RadioResponseInfo responseInfo = {};
   4116         populateResponseInfo(responseInfo, serial, responseType, e);
   4117         Return<void> retStatus =
   4118                 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
   4119                 responseInfo);
   4120         radioService[slotId]->checkReturnStatus(retStatus);
   4121     } else {
   4122         RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
   4123                 "== NULL", slotId);
   4124     }
   4125 
   4126     return 0;
   4127 }
   4128 
   4129 int radio::acceptCallResponse(int slotId,
   4130                              int responseType, int serial, RIL_Errno e,
   4131                              void *response, size_t responseLen) {
   4132 #if VDBG
   4133     RLOGD("acceptCallResponse: serial %d", serial);
   4134 #endif
   4135 
   4136     if (radioService[slotId]->mRadioResponse != NULL) {
   4137         RadioResponseInfo responseInfo = {};
   4138         populateResponseInfo(responseInfo, serial, responseType, e);
   4139         Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
   4140                 responseInfo);
   4141         radioService[slotId]->checkReturnStatus(retStatus);
   4142     } else {
   4143         RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
   4144                 slotId);
   4145     }
   4146 
   4147     return 0;
   4148 }
   4149 
   4150 int radio::deactivateDataCallResponse(int slotId,
   4151                                                 int responseType, int serial, RIL_Errno e,
   4152                                                 void *response, size_t responseLen) {
   4153 #if VDBG
   4154     RLOGD("deactivateDataCallResponse: serial %d", serial);
   4155 #endif
   4156 
   4157     if (radioService[slotId]->mRadioResponse != NULL) {
   4158         RadioResponseInfo responseInfo = {};
   4159         populateResponseInfo(responseInfo, serial, responseType, e);
   4160         Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
   4161                 responseInfo);
   4162         radioService[slotId]->checkReturnStatus(retStatus);
   4163     } else {
   4164         RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
   4165                 slotId);
   4166     }
   4167 
   4168     return 0;
   4169 }
   4170 
   4171 int radio::getFacilityLockForAppResponse(int slotId,
   4172                                         int responseType, int serial, RIL_Errno e,
   4173                                         void *response, size_t responseLen) {
   4174 #if VDBG
   4175     RLOGD("getFacilityLockForAppResponse: serial %d", serial);
   4176 #endif
   4177 
   4178     if (radioService[slotId]->mRadioResponse != NULL) {
   4179         RadioResponseInfo responseInfo = {};
   4180         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4181         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   4182                 getFacilityLockForAppResponse(responseInfo, ret);
   4183         radioService[slotId]->checkReturnStatus(retStatus);
   4184     } else {
   4185         RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
   4186                 slotId);
   4187     }
   4188 
   4189     return 0;
   4190 }
   4191 
   4192 int radio::setFacilityLockForAppResponse(int slotId,
   4193                                       int responseType, int serial, RIL_Errno e,
   4194                                       void *response, size_t responseLen) {
   4195 #if VDBG
   4196     RLOGD("setFacilityLockForAppResponse: serial %d", serial);
   4197 #endif
   4198 
   4199     if (radioService[slotId]->mRadioResponse != NULL) {
   4200         RadioResponseInfo responseInfo = {};
   4201         int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
   4202         Return<void> retStatus
   4203                 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
   4204                 ret);
   4205         radioService[slotId]->checkReturnStatus(retStatus);
   4206     } else {
   4207         RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
   4208                 slotId);
   4209     }
   4210 
   4211     return 0;
   4212 }
   4213 
   4214 int radio::setBarringPasswordResponse(int slotId,
   4215                              int responseType, int serial, RIL_Errno e,
   4216                              void *response, size_t responseLen) {
   4217 #if VDBG
   4218     RLOGD("acceptCallResponse: serial %d", serial);
   4219 #endif
   4220 
   4221     if (radioService[slotId]->mRadioResponse != NULL) {
   4222         RadioResponseInfo responseInfo = {};
   4223         populateResponseInfo(responseInfo, serial, responseType, e);
   4224         Return<void> retStatus
   4225                 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
   4226         radioService[slotId]->checkReturnStatus(retStatus);
   4227     } else {
   4228         RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
   4229                 slotId);
   4230     }
   4231 
   4232     return 0;
   4233 }
   4234 
   4235 int radio::getNetworkSelectionModeResponse(int slotId,
   4236                                           int responseType, int serial, RIL_Errno e, void *response,
   4237                                           size_t responseLen) {
   4238 #if VDBG
   4239     RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
   4240 #endif
   4241 
   4242     if (radioService[slotId]->mRadioResponse != NULL) {
   4243         RadioResponseInfo responseInfo = {};
   4244         populateResponseInfo(responseInfo, serial, responseType, e);
   4245         bool manual = false;
   4246         int serviceClass;
   4247         if (response == NULL || responseLen != sizeof(int)) {
   4248             RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
   4249             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4250         } else {
   4251             int *pInt = (int *) response;
   4252             manual = pInt[0] == 1 ? true : false;
   4253         }
   4254         Return<void> retStatus
   4255                 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
   4256                 responseInfo,
   4257                 manual);
   4258         radioService[slotId]->checkReturnStatus(retStatus);
   4259     } else {
   4260         RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
   4261                 slotId);
   4262     }
   4263 
   4264     return 0;
   4265 }
   4266 
   4267 int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
   4268                                                     RIL_Errno e, void *response,
   4269                                                     size_t responseLen) {
   4270 #if VDBG
   4271     RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
   4272 #endif
   4273 
   4274     if (radioService[slotId]->mRadioResponse != NULL) {
   4275         RadioResponseInfo responseInfo = {};
   4276         populateResponseInfo(responseInfo, serial, responseType, e);
   4277         Return<void> retStatus
   4278                 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
   4279                 responseInfo);
   4280         radioService[slotId]->checkReturnStatus(retStatus);
   4281     } else {
   4282         RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
   4283                 "== NULL", slotId);
   4284     }
   4285 
   4286     return 0;
   4287 }
   4288 
   4289 int radio::setNetworkSelectionModeManualResponse(int slotId,
   4290                              int responseType, int serial, RIL_Errno e,
   4291                              void *response, size_t responseLen) {
   4292 #if VDBG
   4293     RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
   4294 #endif
   4295 
   4296     if (radioService[slotId]->mRadioResponse != NULL) {
   4297         RadioResponseInfo responseInfo = {};
   4298         populateResponseInfo(responseInfo, serial, responseType, e);
   4299         Return<void> retStatus
   4300                 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
   4301                 responseInfo);
   4302         radioService[slotId]->checkReturnStatus(retStatus);
   4303     } else {
   4304         RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
   4305                 "== NULL", slotId);
   4306     }
   4307 
   4308     return 0;
   4309 }
   4310 
   4311 int convertOperatorStatusToInt(const char *str) {
   4312     if (strncmp("unknown", str, 9) == 0) {
   4313         return (int) OperatorStatus::UNKNOWN;
   4314     } else if (strncmp("available", str, 9) == 0) {
   4315         return (int) OperatorStatus::AVAILABLE;
   4316     } else if (strncmp("current", str, 9) == 0) {
   4317         return (int) OperatorStatus::CURRENT;
   4318     } else if (strncmp("forbidden", str, 9) == 0) {
   4319         return (int) OperatorStatus::FORBIDDEN;
   4320     } else {
   4321         return -1;
   4322     }
   4323 }
   4324 
   4325 int radio::getAvailableNetworksResponse(int slotId,
   4326                               int responseType, int serial, RIL_Errno e, void *response,
   4327                               size_t responseLen) {
   4328 #if VDBG
   4329     RLOGD("getAvailableNetworksResponse: serial %d", serial);
   4330 #endif
   4331 
   4332     if (radioService[slotId]->mRadioResponse != NULL) {
   4333         RadioResponseInfo responseInfo = {};
   4334         populateResponseInfo(responseInfo, serial, responseType, e);
   4335         hidl_vec<OperatorInfo> networks;
   4336         if ((response == NULL && responseLen != 0)
   4337                 || responseLen % (4 * sizeof(char *))!= 0) {
   4338             RLOGE("getAvailableNetworksResponse Invalid response: NULL");
   4339             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4340         } else {
   4341             char **resp = (char **) response;
   4342             int numStrings = responseLen / sizeof(char *);
   4343             networks.resize(numStrings/4);
   4344             for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
   4345                 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
   4346                 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
   4347                 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
   4348                 int status = convertOperatorStatusToInt(resp[i + 3]);
   4349                 if (status == -1) {
   4350                     if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4351                 } else {
   4352                     networks[j].status = (OperatorStatus) status;
   4353                 }
   4354             }
   4355         }
   4356         Return<void> retStatus
   4357                 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
   4358                 networks);
   4359         radioService[slotId]->checkReturnStatus(retStatus);
   4360     } else {
   4361         RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
   4362                 slotId);
   4363     }
   4364 
   4365     return 0;
   4366 }
   4367 
   4368 int radio::startDtmfResponse(int slotId,
   4369                             int responseType, int serial, RIL_Errno e,
   4370                             void *response, size_t responseLen) {
   4371 #if VDBG
   4372     RLOGD("startDtmfResponse: serial %d", serial);
   4373 #endif
   4374 
   4375     if (radioService[slotId]->mRadioResponse != NULL) {
   4376         RadioResponseInfo responseInfo = {};
   4377         populateResponseInfo(responseInfo, serial, responseType, e);
   4378         Return<void> retStatus
   4379                 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
   4380         radioService[slotId]->checkReturnStatus(retStatus);
   4381     } else {
   4382         RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4383     }
   4384 
   4385     return 0;
   4386 }
   4387 
   4388 int radio::stopDtmfResponse(int slotId,
   4389                            int responseType, int serial, RIL_Errno e,
   4390                            void *response, size_t responseLen) {
   4391 #if VDBG
   4392     RLOGD("stopDtmfResponse: serial %d", serial);
   4393 #endif
   4394 
   4395     if (radioService[slotId]->mRadioResponse != NULL) {
   4396         RadioResponseInfo responseInfo = {};
   4397         populateResponseInfo(responseInfo, serial, responseType, e);
   4398         Return<void> retStatus
   4399                 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
   4400         radioService[slotId]->checkReturnStatus(retStatus);
   4401     } else {
   4402         RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4403     }
   4404 
   4405     return 0;
   4406 }
   4407 
   4408 int radio::getBasebandVersionResponse(int slotId,
   4409                                      int responseType, int serial, RIL_Errno e,
   4410                                      void *response, size_t responseLen) {
   4411 #if VDBG
   4412     RLOGD("getBasebandVersionResponse: serial %d", serial);
   4413 #endif
   4414 
   4415     if (radioService[slotId]->mRadioResponse != NULL) {
   4416         RadioResponseInfo responseInfo = {};
   4417         populateResponseInfo(responseInfo, serial, responseType, e);
   4418         Return<void> retStatus
   4419                 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
   4420                 convertCharPtrToHidlString((char *) response));
   4421         radioService[slotId]->checkReturnStatus(retStatus);
   4422     } else {
   4423         RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4424     }
   4425 
   4426     return 0;
   4427 }
   4428 
   4429 int radio::separateConnectionResponse(int slotId,
   4430                                      int responseType, int serial, RIL_Errno e,
   4431                                      void *response, size_t responseLen) {
   4432 #if VDBG
   4433     RLOGD("separateConnectionResponse: serial %d", serial);
   4434 #endif
   4435 
   4436     if (radioService[slotId]->mRadioResponse != NULL) {
   4437         RadioResponseInfo responseInfo = {};
   4438         populateResponseInfo(responseInfo, serial, responseType, e);
   4439         Return<void> retStatus
   4440                 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
   4441         radioService[slotId]->checkReturnStatus(retStatus);
   4442     } else {
   4443         RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
   4444                 slotId);
   4445     }
   4446 
   4447     return 0;
   4448 }
   4449 
   4450 int radio::setMuteResponse(int slotId,
   4451                           int responseType, int serial, RIL_Errno e,
   4452                           void *response, size_t responseLen) {
   4453 #if VDBG
   4454     RLOGD("setMuteResponse: serial %d", serial);
   4455 #endif
   4456 
   4457     if (radioService[slotId]->mRadioResponse != NULL) {
   4458         RadioResponseInfo responseInfo = {};
   4459         populateResponseInfo(responseInfo, serial, responseType, e);
   4460         Return<void> retStatus
   4461                 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
   4462         radioService[slotId]->checkReturnStatus(retStatus);
   4463     } else {
   4464         RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4465     }
   4466 
   4467     return 0;
   4468 }
   4469 
   4470 int radio::getMuteResponse(int slotId,
   4471                           int responseType, int serial, RIL_Errno e, void *response,
   4472                           size_t responseLen) {
   4473 #if VDBG
   4474     RLOGD("getMuteResponse: serial %d", serial);
   4475 #endif
   4476 
   4477     if (radioService[slotId]->mRadioResponse != NULL) {
   4478         RadioResponseInfo responseInfo = {};
   4479         populateResponseInfo(responseInfo, serial, responseType, e);
   4480         bool enable = false;
   4481         int serviceClass;
   4482         if (response == NULL || responseLen != sizeof(int)) {
   4483             RLOGE("getMuteResponse Invalid response: NULL");
   4484             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4485         } else {
   4486             int *pInt = (int *) response;
   4487             enable = pInt[0] == 1 ? true : false;
   4488         }
   4489         Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
   4490                 enable);
   4491         radioService[slotId]->checkReturnStatus(retStatus);
   4492     } else {
   4493         RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4494     }
   4495 
   4496     return 0;
   4497 }
   4498 
   4499 int radio::getClipResponse(int slotId,
   4500                           int responseType, int serial, RIL_Errno e,
   4501                           void *response, size_t responseLen) {
   4502 #if VDBG
   4503     RLOGD("getClipResponse: serial %d", serial);
   4504 #endif
   4505 
   4506     if (radioService[slotId]->mRadioResponse != NULL) {
   4507         RadioResponseInfo responseInfo = {};
   4508         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4509         Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
   4510                 (ClipStatus) ret);
   4511         radioService[slotId]->checkReturnStatus(retStatus);
   4512     } else {
   4513         RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4514     }
   4515 
   4516     return 0;
   4517 }
   4518 
   4519 int radio::getDataCallListResponse(int slotId,
   4520                                    int responseType, int serial, RIL_Errno e,
   4521                                    void *response, size_t responseLen) {
   4522 #if VDBG
   4523     RLOGD("getDataCallListResponse: serial %d", serial);
   4524 #endif
   4525 
   4526     if (radioService[slotId]->mRadioResponse != NULL) {
   4527         RadioResponseInfo responseInfo = {};
   4528         populateResponseInfo(responseInfo, serial, responseType, e);
   4529 
   4530         hidl_vec<SetupDataCallResult> ret;
   4531         if ((response == NULL && responseLen != 0)
   4532                 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
   4533             RLOGE("getDataCallListResponse: invalid response");
   4534             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4535         } else {
   4536             convertRilDataCallListToHal(response, responseLen, ret);
   4537         }
   4538 
   4539         Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
   4540                 responseInfo, ret);
   4541         radioService[slotId]->checkReturnStatus(retStatus);
   4542     } else {
   4543         RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4544     }
   4545 
   4546     return 0;
   4547 }
   4548 
   4549 int radio::setSuppServiceNotificationsResponse(int slotId,
   4550                                               int responseType, int serial, RIL_Errno e,
   4551                                               void *response, size_t responseLen) {
   4552 #if VDBG
   4553     RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
   4554 #endif
   4555 
   4556     if (radioService[slotId]->mRadioResponse != NULL) {
   4557         RadioResponseInfo responseInfo = {};
   4558         populateResponseInfo(responseInfo, serial, responseType, e);
   4559         Return<void> retStatus
   4560                 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
   4561                 responseInfo);
   4562         radioService[slotId]->checkReturnStatus(retStatus);
   4563     } else {
   4564         RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
   4565                 "== NULL", slotId);
   4566     }
   4567 
   4568     return 0;
   4569 }
   4570 
   4571 int radio::deleteSmsOnSimResponse(int slotId,
   4572                                  int responseType, int serial, RIL_Errno e,
   4573                                  void *response, size_t responseLen) {
   4574 #if VDBG
   4575     RLOGD("deleteSmsOnSimResponse: serial %d", serial);
   4576 #endif
   4577 
   4578     if (radioService[slotId]->mRadioResponse != NULL) {
   4579         RadioResponseInfo responseInfo = {};
   4580         populateResponseInfo(responseInfo, serial, responseType, e);
   4581         Return<void> retStatus
   4582                 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
   4583         radioService[slotId]->checkReturnStatus(retStatus);
   4584     } else {
   4585         RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4586     }
   4587 
   4588     return 0;
   4589 }
   4590 
   4591 int radio::setBandModeResponse(int slotId,
   4592                               int responseType, int serial, RIL_Errno e,
   4593                               void *response, size_t responseLen) {
   4594 #if VDBG
   4595     RLOGD("setBandModeResponse: serial %d", serial);
   4596 #endif
   4597 
   4598     if (radioService[slotId]->mRadioResponse != NULL) {
   4599         RadioResponseInfo responseInfo = {};
   4600         populateResponseInfo(responseInfo, serial, responseType, e);
   4601         Return<void> retStatus
   4602                 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
   4603         radioService[slotId]->checkReturnStatus(retStatus);
   4604     } else {
   4605         RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4606     }
   4607 
   4608     return 0;
   4609 }
   4610 
   4611 int radio::writeSmsToSimResponse(int slotId,
   4612                                 int responseType, int serial, RIL_Errno e,
   4613                                 void *response, size_t responseLen) {
   4614 #if VDBG
   4615     RLOGD("writeSmsToSimResponse: serial %d", serial);
   4616 #endif
   4617 
   4618     if (radioService[slotId]->mRadioResponse != NULL) {
   4619         RadioResponseInfo responseInfo = {};
   4620         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4621         Return<void> retStatus
   4622                 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
   4623         radioService[slotId]->checkReturnStatus(retStatus);
   4624     } else {
   4625         RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4626     }
   4627 
   4628     return 0;
   4629 }
   4630 
   4631 int radio::getAvailableBandModesResponse(int slotId,
   4632                                         int responseType, int serial, RIL_Errno e, void *response,
   4633                                         size_t responseLen) {
   4634 #if VDBG
   4635     RLOGD("getAvailableBandModesResponse: serial %d", serial);
   4636 #endif
   4637 
   4638     if (radioService[slotId]->mRadioResponse != NULL) {
   4639         RadioResponseInfo responseInfo = {};
   4640         populateResponseInfo(responseInfo, serial, responseType, e);
   4641         hidl_vec<RadioBandMode> modes;
   4642         if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
   4643             RLOGE("getAvailableBandModesResponse Invalid response: NULL");
   4644             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4645         } else {
   4646             int *pInt = (int *) response;
   4647             int numInts = responseLen / sizeof(int);
   4648             modes.resize(numInts);
   4649             for (int i = 0; i < numInts; i++) {
   4650                 modes[i] = (RadioBandMode) pInt[i];
   4651             }
   4652         }
   4653         Return<void> retStatus
   4654                 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
   4655                 modes);
   4656         radioService[slotId]->checkReturnStatus(retStatus);
   4657     } else {
   4658         RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
   4659                 slotId);
   4660     }
   4661 
   4662     return 0;
   4663 }
   4664 
   4665 int radio::sendEnvelopeResponse(int slotId,
   4666                                int responseType, int serial, RIL_Errno e,
   4667                                void *response, size_t responseLen) {
   4668 #if VDBG
   4669     RLOGD("sendEnvelopeResponse: serial %d", serial);
   4670 #endif
   4671 
   4672     if (radioService[slotId]->mRadioResponse != NULL) {
   4673         RadioResponseInfo responseInfo = {};
   4674         populateResponseInfo(responseInfo, serial, responseType, e);
   4675         Return<void> retStatus
   4676                 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
   4677                 convertCharPtrToHidlString((char *) response));
   4678         radioService[slotId]->checkReturnStatus(retStatus);
   4679     } else {
   4680         RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4681     }
   4682 
   4683     return 0;
   4684 }
   4685 
   4686 int radio::sendTerminalResponseToSimResponse(int slotId,
   4687                                             int responseType, int serial, RIL_Errno e,
   4688                                             void *response, size_t responseLen) {
   4689 #if VDBG
   4690     RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
   4691 #endif
   4692 
   4693     if (radioService[slotId]->mRadioResponse != NULL) {
   4694         RadioResponseInfo responseInfo = {};
   4695         populateResponseInfo(responseInfo, serial, responseType, e);
   4696         Return<void> retStatus
   4697                 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
   4698                 responseInfo);
   4699         radioService[slotId]->checkReturnStatus(retStatus);
   4700     } else {
   4701         RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
   4702                 slotId);
   4703     }
   4704 
   4705     return 0;
   4706 }
   4707 
   4708 int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
   4709                                                    int responseType, int serial,
   4710                                                    RIL_Errno e, void *response,
   4711                                                    size_t responseLen) {
   4712 #if VDBG
   4713     RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
   4714 #endif
   4715 
   4716     if (radioService[slotId]->mRadioResponse != NULL) {
   4717         RadioResponseInfo responseInfo = {};
   4718         populateResponseInfo(responseInfo, serial, responseType, e);
   4719         Return<void> retStatus
   4720                 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
   4721                 responseInfo);
   4722         radioService[slotId]->checkReturnStatus(retStatus);
   4723     } else {
   4724         RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
   4725                 "== NULL", slotId);
   4726     }
   4727 
   4728     return 0;
   4729 }
   4730 
   4731 int radio::explicitCallTransferResponse(int slotId,
   4732                                        int responseType, int serial, RIL_Errno e,
   4733                                        void *response, size_t responseLen) {
   4734 #if VDBG
   4735     RLOGD("explicitCallTransferResponse: serial %d", serial);
   4736 #endif
   4737 
   4738     if (radioService[slotId]->mRadioResponse != NULL) {
   4739         RadioResponseInfo responseInfo = {};
   4740         populateResponseInfo(responseInfo, serial, responseType, e);
   4741         Return<void> retStatus
   4742                 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
   4743         radioService[slotId]->checkReturnStatus(retStatus);
   4744     } else {
   4745         RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
   4746                 slotId);
   4747     }
   4748 
   4749     return 0;
   4750 }
   4751 
   4752 int radio::setPreferredNetworkTypeResponse(int slotId,
   4753                                  int responseType, int serial, RIL_Errno e,
   4754                                  void *response, size_t responseLen) {
   4755 #if VDBG
   4756     RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
   4757 #endif
   4758 
   4759     if (radioService[slotId]->mRadioResponse != NULL) {
   4760         RadioResponseInfo responseInfo = {};
   4761         populateResponseInfo(responseInfo, serial, responseType, e);
   4762         Return<void> retStatus
   4763                 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
   4764                 responseInfo);
   4765         radioService[slotId]->checkReturnStatus(retStatus);
   4766     } else {
   4767         RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
   4768                 slotId);
   4769     }
   4770 
   4771     return 0;
   4772 }
   4773 
   4774 
   4775 int radio::getPreferredNetworkTypeResponse(int slotId,
   4776                                           int responseType, int serial, RIL_Errno e,
   4777                                           void *response, size_t responseLen) {
   4778 #if VDBG
   4779     RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
   4780 #endif
   4781 
   4782     if (radioService[slotId]->mRadioResponse != NULL) {
   4783         RadioResponseInfo responseInfo = {};
   4784         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4785         Return<void> retStatus
   4786                 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
   4787                 responseInfo, (PreferredNetworkType) ret);
   4788         radioService[slotId]->checkReturnStatus(retStatus);
   4789     } else {
   4790         RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
   4791                 slotId);
   4792     }
   4793 
   4794     return 0;
   4795 }
   4796 
   4797 int radio::getNeighboringCidsResponse(int slotId,
   4798                                      int responseType, int serial, RIL_Errno e,
   4799                                      void *response, size_t responseLen) {
   4800 #if VDBG
   4801     RLOGD("getNeighboringCidsResponse: serial %d", serial);
   4802 #endif
   4803 
   4804     if (radioService[slotId]->mRadioResponse != NULL) {
   4805         RadioResponseInfo responseInfo = {};
   4806         populateResponseInfo(responseInfo, serial, responseType, e);
   4807         hidl_vec<NeighboringCell> cells;
   4808 
   4809         if ((response == NULL && responseLen != 0)
   4810                 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
   4811             RLOGE("getNeighboringCidsResponse Invalid response: NULL");
   4812             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   4813         } else {
   4814             int num = responseLen / sizeof(RIL_NeighboringCell *);
   4815             cells.resize(num);
   4816             for (int i = 0 ; i < num; i++) {
   4817                 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
   4818                 cells[i].cid = convertCharPtrToHidlString(resp->cid);
   4819                 cells[i].rssi = resp->rssi;
   4820             }
   4821         }
   4822 
   4823         Return<void> retStatus
   4824                 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
   4825                 cells);
   4826         radioService[slotId]->checkReturnStatus(retStatus);
   4827     } else {
   4828         RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
   4829                 slotId);
   4830     }
   4831 
   4832     return 0;
   4833 }
   4834 
   4835 int radio::setLocationUpdatesResponse(int slotId,
   4836                                      int responseType, int serial, RIL_Errno e,
   4837                                      void *response, size_t responseLen) {
   4838 #if VDBG
   4839     RLOGD("setLocationUpdatesResponse: serial %d", serial);
   4840 #endif
   4841 
   4842     if (radioService[slotId]->mRadioResponse != NULL) {
   4843         RadioResponseInfo responseInfo = {};
   4844         populateResponseInfo(responseInfo, serial, responseType, e);
   4845         Return<void> retStatus
   4846                 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
   4847         radioService[slotId]->checkReturnStatus(retStatus);
   4848     } else {
   4849         RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
   4850                 slotId);
   4851     }
   4852 
   4853     return 0;
   4854 }
   4855 
   4856 int radio::setCdmaSubscriptionSourceResponse(int slotId,
   4857                                  int responseType, int serial, RIL_Errno e,
   4858                                  void *response, size_t responseLen) {
   4859 #if VDBG
   4860     RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
   4861 #endif
   4862 
   4863     if (radioService[slotId]->mRadioResponse != NULL) {
   4864         RadioResponseInfo responseInfo = {};
   4865         populateResponseInfo(responseInfo, serial, responseType, e);
   4866         Return<void> retStatus
   4867                 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
   4868                 responseInfo);
   4869         radioService[slotId]->checkReturnStatus(retStatus);
   4870     } else {
   4871         RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
   4872                 slotId);
   4873     }
   4874 
   4875     return 0;
   4876 }
   4877 
   4878 int radio::setCdmaRoamingPreferenceResponse(int slotId,
   4879                                  int responseType, int serial, RIL_Errno e,
   4880                                  void *response, size_t responseLen) {
   4881 #if VDBG
   4882     RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
   4883 #endif
   4884 
   4885     if (radioService[slotId]->mRadioResponse != NULL) {
   4886         RadioResponseInfo responseInfo = {};
   4887         populateResponseInfo(responseInfo, serial, responseType, e);
   4888         Return<void> retStatus
   4889                 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
   4890                 responseInfo);
   4891         radioService[slotId]->checkReturnStatus(retStatus);
   4892     } else {
   4893         RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
   4894                 slotId);
   4895     }
   4896 
   4897     return 0;
   4898 }
   4899 
   4900 int radio::getCdmaRoamingPreferenceResponse(int slotId,
   4901                                            int responseType, int serial, RIL_Errno e,
   4902                                            void *response, size_t responseLen) {
   4903 #if VDBG
   4904     RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
   4905 #endif
   4906 
   4907     if (radioService[slotId]->mRadioResponse != NULL) {
   4908         RadioResponseInfo responseInfo = {};
   4909         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4910         Return<void> retStatus
   4911                 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
   4912                 responseInfo, (CdmaRoamingType) ret);
   4913         radioService[slotId]->checkReturnStatus(retStatus);
   4914     } else {
   4915         RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
   4916                 slotId);
   4917     }
   4918 
   4919     return 0;
   4920 }
   4921 
   4922 int radio::setTTYModeResponse(int slotId,
   4923                              int responseType, int serial, RIL_Errno e,
   4924                              void *response, size_t responseLen) {
   4925 #if VDBG
   4926     RLOGD("setTTYModeResponse: serial %d", serial);
   4927 #endif
   4928 
   4929     if (radioService[slotId]->mRadioResponse != NULL) {
   4930         RadioResponseInfo responseInfo = {};
   4931         populateResponseInfo(responseInfo, serial, responseType, e);
   4932         Return<void> retStatus
   4933                 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
   4934         radioService[slotId]->checkReturnStatus(retStatus);
   4935     } else {
   4936         RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4937     }
   4938 
   4939     return 0;
   4940 }
   4941 
   4942 int radio::getTTYModeResponse(int slotId,
   4943                              int responseType, int serial, RIL_Errno e,
   4944                              void *response, size_t responseLen) {
   4945 #if VDBG
   4946     RLOGD("getTTYModeResponse: serial %d", serial);
   4947 #endif
   4948 
   4949     if (radioService[slotId]->mRadioResponse != NULL) {
   4950         RadioResponseInfo responseInfo = {};
   4951         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   4952         Return<void> retStatus
   4953                 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
   4954                 (TtyMode) ret);
   4955         radioService[slotId]->checkReturnStatus(retStatus);
   4956     } else {
   4957         RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   4958     }
   4959 
   4960     return 0;
   4961 }
   4962 
   4963 int radio::setPreferredVoicePrivacyResponse(int slotId,
   4964                                  int responseType, int serial, RIL_Errno e,
   4965                                  void *response, size_t responseLen) {
   4966 #if VDBG
   4967     RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
   4968 #endif
   4969 
   4970     if (radioService[slotId]->mRadioResponse != NULL) {
   4971         RadioResponseInfo responseInfo = {};
   4972         populateResponseInfo(responseInfo, serial, responseType, e);
   4973         Return<void> retStatus
   4974                 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
   4975                 responseInfo);
   4976         radioService[slotId]->checkReturnStatus(retStatus);
   4977     } else {
   4978         RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
   4979                 slotId);
   4980     }
   4981 
   4982     return 0;
   4983 }
   4984 
   4985 int radio::getPreferredVoicePrivacyResponse(int slotId,
   4986                                            int responseType, int serial, RIL_Errno e,
   4987                                            void *response, size_t responseLen) {
   4988 #if VDBG
   4989     RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
   4990 #endif
   4991 
   4992     if (radioService[slotId]->mRadioResponse != NULL) {
   4993         RadioResponseInfo responseInfo = {};
   4994         populateResponseInfo(responseInfo, serial, responseType, e);
   4995         bool enable = false;
   4996         int numInts = responseLen / sizeof(int);
   4997         if (response == NULL || numInts != 1) {
   4998             RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
   4999             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5000         } else {
   5001             int *pInt = (int *) response;
   5002             enable = pInt[0] == 1 ? true : false;
   5003         }
   5004         Return<void> retStatus
   5005                 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
   5006                 responseInfo, enable);
   5007         radioService[slotId]->checkReturnStatus(retStatus);
   5008     } else {
   5009         RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
   5010                 slotId);
   5011     }
   5012 
   5013     return 0;
   5014 }
   5015 
   5016 int radio::sendCDMAFeatureCodeResponse(int slotId,
   5017                                  int responseType, int serial, RIL_Errno e,
   5018                                  void *response, size_t responseLen) {
   5019 #if VDBG
   5020     RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
   5021 #endif
   5022 
   5023     if (radioService[slotId]->mRadioResponse != NULL) {
   5024         RadioResponseInfo responseInfo = {};
   5025         populateResponseInfo(responseInfo, serial, responseType, e);
   5026         Return<void> retStatus
   5027                 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
   5028         radioService[slotId]->checkReturnStatus(retStatus);
   5029     } else {
   5030         RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
   5031                 slotId);
   5032     }
   5033 
   5034     return 0;
   5035 }
   5036 
   5037 int radio::sendBurstDtmfResponse(int slotId,
   5038                                  int responseType, int serial, RIL_Errno e,
   5039                                  void *response, size_t responseLen) {
   5040 #if VDBG
   5041     RLOGD("sendBurstDtmfResponse: serial %d", serial);
   5042 #endif
   5043 
   5044     if (radioService[slotId]->mRadioResponse != NULL) {
   5045         RadioResponseInfo responseInfo = {};
   5046         populateResponseInfo(responseInfo, serial, responseType, e);
   5047         Return<void> retStatus
   5048                 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
   5049         radioService[slotId]->checkReturnStatus(retStatus);
   5050     } else {
   5051         RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5052     }
   5053 
   5054     return 0;
   5055 }
   5056 
   5057 int radio::sendCdmaSmsResponse(int slotId,
   5058                               int responseType, int serial, RIL_Errno e, void *response,
   5059                               size_t responseLen) {
   5060 #if VDBG
   5061     RLOGD("sendCdmaSmsResponse: serial %d", serial);
   5062 #endif
   5063 
   5064     if (radioService[slotId]->mRadioResponse != NULL) {
   5065         RadioResponseInfo responseInfo = {};
   5066         SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
   5067                 responseLen);
   5068 
   5069         Return<void> retStatus
   5070                 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
   5071         radioService[slotId]->checkReturnStatus(retStatus);
   5072     } else {
   5073         RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5074     }
   5075 
   5076     return 0;
   5077 }
   5078 
   5079 int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
   5080                                                  int responseType, int serial, RIL_Errno e,
   5081                                                  void *response, size_t responseLen) {
   5082 #if VDBG
   5083     RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
   5084 #endif
   5085 
   5086     if (radioService[slotId]->mRadioResponse != NULL) {
   5087         RadioResponseInfo responseInfo = {};
   5088         populateResponseInfo(responseInfo, serial, responseType, e);
   5089         Return<void> retStatus
   5090                 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
   5091                 responseInfo);
   5092         radioService[slotId]->checkReturnStatus(retStatus);
   5093     } else {
   5094         RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
   5095                 "== NULL", slotId);
   5096     }
   5097 
   5098     return 0;
   5099 }
   5100 
   5101 int radio::getGsmBroadcastConfigResponse(int slotId,
   5102                                         int responseType, int serial, RIL_Errno e,
   5103                                         void *response, size_t responseLen) {
   5104 #if VDBG
   5105     RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
   5106 #endif
   5107 
   5108     if (radioService[slotId]->mRadioResponse != NULL) {
   5109         RadioResponseInfo responseInfo = {};
   5110         populateResponseInfo(responseInfo, serial, responseType, e);
   5111         hidl_vec<GsmBroadcastSmsConfigInfo> configs;
   5112 
   5113         if ((response == NULL && responseLen != 0)
   5114                 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
   5115             RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
   5116             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5117         } else {
   5118             int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
   5119             configs.resize(num);
   5120             for (int i = 0 ; i < num; i++) {
   5121                 RIL_GSM_BroadcastSmsConfigInfo *resp =
   5122                         ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
   5123                 configs[i].fromServiceId = resp->fromServiceId;
   5124                 configs[i].toServiceId = resp->toServiceId;
   5125                 configs[i].fromCodeScheme = resp->fromCodeScheme;
   5126                 configs[i].toCodeScheme = resp->toCodeScheme;
   5127                 configs[i].selected = resp->selected == 1 ? true : false;
   5128             }
   5129         }
   5130 
   5131         Return<void> retStatus
   5132                 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
   5133                 configs);
   5134         radioService[slotId]->checkReturnStatus(retStatus);
   5135     } else {
   5136         RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
   5137                 slotId);
   5138     }
   5139 
   5140     return 0;
   5141 }
   5142 
   5143 int radio::setGsmBroadcastConfigResponse(int slotId,
   5144                                         int responseType, int serial, RIL_Errno e,
   5145                                         void *response, size_t responseLen) {
   5146 #if VDBG
   5147     RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
   5148 #endif
   5149 
   5150     if (radioService[slotId]->mRadioResponse != NULL) {
   5151         RadioResponseInfo responseInfo = {};
   5152         populateResponseInfo(responseInfo, serial, responseType, e);
   5153         Return<void> retStatus
   5154                 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
   5155         radioService[slotId]->checkReturnStatus(retStatus);
   5156     } else {
   5157         RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
   5158                 slotId);
   5159     }
   5160 
   5161     return 0;
   5162 }
   5163 
   5164 int radio::setGsmBroadcastActivationResponse(int slotId,
   5165                                             int responseType, int serial, RIL_Errno e,
   5166                                             void *response, size_t responseLen) {
   5167 #if VDBG
   5168     RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
   5169 #endif
   5170 
   5171     if (radioService[slotId]->mRadioResponse != NULL) {
   5172         RadioResponseInfo responseInfo = {};
   5173         populateResponseInfo(responseInfo, serial, responseType, e);
   5174         Return<void> retStatus
   5175                 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
   5176                 responseInfo);
   5177         radioService[slotId]->checkReturnStatus(retStatus);
   5178     } else {
   5179         RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
   5180                 slotId);
   5181     }
   5182 
   5183     return 0;
   5184 }
   5185 
   5186 int radio::getCdmaBroadcastConfigResponse(int slotId,
   5187                                          int responseType, int serial, RIL_Errno e,
   5188                                          void *response, size_t responseLen) {
   5189 #if VDBG
   5190     RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
   5191 #endif
   5192 
   5193     if (radioService[slotId]->mRadioResponse != NULL) {
   5194         RadioResponseInfo responseInfo = {};
   5195         populateResponseInfo(responseInfo, serial, responseType, e);
   5196         hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
   5197 
   5198         if ((response == NULL && responseLen != 0)
   5199                 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
   5200             RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
   5201             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5202         } else {
   5203             int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
   5204             configs.resize(num);
   5205             for (int i = 0 ; i < num; i++) {
   5206                 RIL_CDMA_BroadcastSmsConfigInfo *resp =
   5207                         ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
   5208                 configs[i].serviceCategory = resp->service_category;
   5209                 configs[i].language = resp->language;
   5210                 configs[i].selected = resp->selected == 1 ? true : false;
   5211             }
   5212         }
   5213 
   5214         Return<void> retStatus
   5215                 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
   5216                 configs);
   5217         radioService[slotId]->checkReturnStatus(retStatus);
   5218     } else {
   5219         RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
   5220                 slotId);
   5221     }
   5222 
   5223     return 0;
   5224 }
   5225 
   5226 int radio::setCdmaBroadcastConfigResponse(int slotId,
   5227                                          int responseType, int serial, RIL_Errno e,
   5228                                          void *response, size_t responseLen) {
   5229 #if VDBG
   5230     RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
   5231 #endif
   5232 
   5233     if (radioService[slotId]->mRadioResponse != NULL) {
   5234         RadioResponseInfo responseInfo = {};
   5235         populateResponseInfo(responseInfo, serial, responseType, e);
   5236         Return<void> retStatus
   5237                 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
   5238                 responseInfo);
   5239         radioService[slotId]->checkReturnStatus(retStatus);
   5240     } else {
   5241         RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
   5242                 slotId);
   5243     }
   5244 
   5245     return 0;
   5246 }
   5247 
   5248 int radio::setCdmaBroadcastActivationResponse(int slotId,
   5249                                              int responseType, int serial, RIL_Errno e,
   5250                                              void *response, size_t responseLen) {
   5251 #if VDBG
   5252     RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
   5253 #endif
   5254 
   5255     if (radioService[slotId]->mRadioResponse != NULL) {
   5256         RadioResponseInfo responseInfo = {};
   5257         populateResponseInfo(responseInfo, serial, responseType, e);
   5258         Return<void> retStatus
   5259                 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
   5260                 responseInfo);
   5261         radioService[slotId]->checkReturnStatus(retStatus);
   5262     } else {
   5263         RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
   5264                 slotId);
   5265     }
   5266 
   5267     return 0;
   5268 }
   5269 
   5270 int radio::getCDMASubscriptionResponse(int slotId,
   5271                                       int responseType, int serial, RIL_Errno e, void *response,
   5272                                       size_t responseLen) {
   5273 #if VDBG
   5274     RLOGD("getCDMASubscriptionResponse: serial %d", serial);
   5275 #endif
   5276 
   5277     if (radioService[slotId]->mRadioResponse != NULL) {
   5278         RadioResponseInfo responseInfo = {};
   5279         populateResponseInfo(responseInfo, serial, responseType, e);
   5280 
   5281         int numStrings = responseLen / sizeof(char *);
   5282         hidl_string emptyString;
   5283         if (response == NULL || numStrings != 5) {
   5284             RLOGE("getOperatorResponse Invalid response: NULL");
   5285             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5286             Return<void> retStatus
   5287                     = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
   5288                     responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
   5289             radioService[slotId]->checkReturnStatus(retStatus);
   5290         } else {
   5291             char **resp = (char **) response;
   5292             Return<void> retStatus
   5293                     = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
   5294                     responseInfo,
   5295                     convertCharPtrToHidlString(resp[0]),
   5296                     convertCharPtrToHidlString(resp[1]),
   5297                     convertCharPtrToHidlString(resp[2]),
   5298                     convertCharPtrToHidlString(resp[3]),
   5299                     convertCharPtrToHidlString(resp[4]));
   5300             radioService[slotId]->checkReturnStatus(retStatus);
   5301         }
   5302     } else {
   5303         RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
   5304                 slotId);
   5305     }
   5306 
   5307     return 0;
   5308 }
   5309 
   5310 int radio::writeSmsToRuimResponse(int slotId,
   5311                                  int responseType, int serial, RIL_Errno e,
   5312                                  void *response, size_t responseLen) {
   5313 #if VDBG
   5314     RLOGD("writeSmsToRuimResponse: serial %d", serial);
   5315 #endif
   5316 
   5317     if (radioService[slotId]->mRadioResponse != NULL) {
   5318         RadioResponseInfo responseInfo = {};
   5319         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   5320         Return<void> retStatus
   5321                 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
   5322         radioService[slotId]->checkReturnStatus(retStatus);
   5323     } else {
   5324         RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5325     }
   5326 
   5327     return 0;
   5328 }
   5329 
   5330 int radio::deleteSmsOnRuimResponse(int slotId,
   5331                                   int responseType, int serial, RIL_Errno e,
   5332                                   void *response, size_t responseLen) {
   5333 #if VDBG
   5334     RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
   5335 #endif
   5336 
   5337     if (radioService[slotId]->mRadioResponse != NULL) {
   5338         RadioResponseInfo responseInfo = {};
   5339         populateResponseInfo(responseInfo, serial, responseType, e);
   5340         Return<void> retStatus
   5341                 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
   5342         radioService[slotId]->checkReturnStatus(retStatus);
   5343     } else {
   5344         RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5345     }
   5346 
   5347     return 0;
   5348 }
   5349 
   5350 int radio::getDeviceIdentityResponse(int slotId,
   5351                                     int responseType, int serial, RIL_Errno e, void *response,
   5352                                     size_t responseLen) {
   5353 #if VDBG
   5354     RLOGD("getDeviceIdentityResponse: serial %d", serial);
   5355 #endif
   5356 
   5357     if (radioService[slotId]->mRadioResponse != NULL) {
   5358         RadioResponseInfo responseInfo = {};
   5359         populateResponseInfo(responseInfo, serial, responseType, e);
   5360 
   5361         int numStrings = responseLen / sizeof(char *);
   5362         hidl_string emptyString;
   5363         if (response == NULL || numStrings != 4) {
   5364             RLOGE("getDeviceIdentityResponse Invalid response: NULL");
   5365             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5366             Return<void> retStatus
   5367                     = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
   5368                     emptyString, emptyString, emptyString, emptyString);
   5369             radioService[slotId]->checkReturnStatus(retStatus);
   5370         } else {
   5371             char **resp = (char **) response;
   5372             Return<void> retStatus
   5373                     = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
   5374                     convertCharPtrToHidlString(resp[0]),
   5375                     convertCharPtrToHidlString(resp[1]),
   5376                     convertCharPtrToHidlString(resp[2]),
   5377                     convertCharPtrToHidlString(resp[3]));
   5378             radioService[slotId]->checkReturnStatus(retStatus);
   5379         }
   5380     } else {
   5381         RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
   5382                 slotId);
   5383     }
   5384 
   5385     return 0;
   5386 }
   5387 
   5388 int radio::exitEmergencyCallbackModeResponse(int slotId,
   5389                                             int responseType, int serial, RIL_Errno e,
   5390                                             void *response, size_t responseLen) {
   5391 #if VDBG
   5392     RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
   5393 #endif
   5394 
   5395     if (radioService[slotId]->mRadioResponse != NULL) {
   5396         RadioResponseInfo responseInfo = {};
   5397         populateResponseInfo(responseInfo, serial, responseType, e);
   5398         Return<void> retStatus
   5399                 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
   5400                 responseInfo);
   5401         radioService[slotId]->checkReturnStatus(retStatus);
   5402     } else {
   5403         RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
   5404                 slotId);
   5405     }
   5406 
   5407     return 0;
   5408 }
   5409 
   5410 int radio::getSmscAddressResponse(int slotId,
   5411                                   int responseType, int serial, RIL_Errno e,
   5412                                   void *response, size_t responseLen) {
   5413 #if VDBG
   5414     RLOGD("getSmscAddressResponse: serial %d", serial);
   5415 #endif
   5416 
   5417     if (radioService[slotId]->mRadioResponse != NULL) {
   5418         RadioResponseInfo responseInfo = {};
   5419         populateResponseInfo(responseInfo, serial, responseType, e);
   5420         Return<void> retStatus
   5421                 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
   5422                 convertCharPtrToHidlString((char *) response));
   5423         radioService[slotId]->checkReturnStatus(retStatus);
   5424     } else {
   5425         RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5426     }
   5427 
   5428     return 0;
   5429 }
   5430 
   5431 int radio::setSmscAddressResponse(int slotId,
   5432                                              int responseType, int serial, RIL_Errno e,
   5433                                              void *response, size_t responseLen) {
   5434 #if VDBG
   5435     RLOGD("setSmscAddressResponse: serial %d", serial);
   5436 #endif
   5437 
   5438     if (radioService[slotId]->mRadioResponse != NULL) {
   5439         RadioResponseInfo responseInfo = {};
   5440         populateResponseInfo(responseInfo, serial, responseType, e);
   5441         Return<void> retStatus
   5442                 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
   5443         radioService[slotId]->checkReturnStatus(retStatus);
   5444     } else {
   5445         RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5446     }
   5447 
   5448     return 0;
   5449 }
   5450 
   5451 int radio::reportSmsMemoryStatusResponse(int slotId,
   5452                                         int responseType, int serial, RIL_Errno e,
   5453                                         void *response, size_t responseLen) {
   5454 #if VDBG
   5455     RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
   5456 #endif
   5457 
   5458     if (radioService[slotId]->mRadioResponse != NULL) {
   5459         RadioResponseInfo responseInfo = {};
   5460         populateResponseInfo(responseInfo, serial, responseType, e);
   5461         Return<void> retStatus
   5462                 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
   5463         radioService[slotId]->checkReturnStatus(retStatus);
   5464     } else {
   5465         RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
   5466                 slotId);
   5467     }
   5468 
   5469     return 0;
   5470 }
   5471 
   5472 int radio::reportStkServiceIsRunningResponse(int slotId,
   5473                                              int responseType, int serial, RIL_Errno e,
   5474                                              void *response, size_t responseLen) {
   5475 #if VDBG
   5476     RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
   5477 #endif
   5478 
   5479     if (radioService[slotId]->mRadioResponse != NULL) {
   5480         RadioResponseInfo responseInfo = {};
   5481         populateResponseInfo(responseInfo, serial, responseType, e);
   5482         Return<void> retStatus = radioService[slotId]->mRadioResponse->
   5483                 reportStkServiceIsRunningResponse(responseInfo);
   5484         radioService[slotId]->checkReturnStatus(retStatus);
   5485     } else {
   5486         RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
   5487                 slotId);
   5488     }
   5489 
   5490     return 0;
   5491 }
   5492 
   5493 int radio::getCdmaSubscriptionSourceResponse(int slotId,
   5494                                             int responseType, int serial, RIL_Errno e,
   5495                                             void *response, size_t responseLen) {
   5496 #if VDBG
   5497     RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
   5498 #endif
   5499 
   5500     if (radioService[slotId]->mRadioResponse != NULL) {
   5501         RadioResponseInfo responseInfo = {};
   5502         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   5503         Return<void> retStatus
   5504                 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
   5505                 responseInfo, (CdmaSubscriptionSource) ret);
   5506         radioService[slotId]->checkReturnStatus(retStatus);
   5507     } else {
   5508         RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
   5509                 slotId);
   5510     }
   5511 
   5512     return 0;
   5513 }
   5514 
   5515 int radio::requestIsimAuthenticationResponse(int slotId,
   5516                                             int responseType, int serial, RIL_Errno e,
   5517                                             void *response, size_t responseLen) {
   5518 #if VDBG
   5519     RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
   5520 #endif
   5521 
   5522     if (radioService[slotId]->mRadioResponse != NULL) {
   5523         RadioResponseInfo responseInfo = {};
   5524         populateResponseInfo(responseInfo, serial, responseType, e);
   5525         Return<void> retStatus
   5526                 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
   5527                 responseInfo,
   5528                 convertCharPtrToHidlString((char *) response));
   5529         radioService[slotId]->checkReturnStatus(retStatus);
   5530     } else {
   5531         RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
   5532                 slotId);
   5533     }
   5534 
   5535     return 0;
   5536 }
   5537 
   5538 int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
   5539                                                    int responseType,
   5540                                                    int serial, RIL_Errno e, void *response,
   5541                                                    size_t responseLen) {
   5542 #if VDBG
   5543     RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
   5544 #endif
   5545 
   5546     if (radioService[slotId]->mRadioResponse != NULL) {
   5547         RadioResponseInfo responseInfo = {};
   5548         populateResponseInfo(responseInfo, serial, responseType, e);
   5549         Return<void> retStatus
   5550                 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
   5551                 responseInfo);
   5552         radioService[slotId]->checkReturnStatus(retStatus);
   5553     } else {
   5554         RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
   5555                 "== NULL", slotId);
   5556     }
   5557 
   5558     return 0;
   5559 }
   5560 
   5561 int radio::sendEnvelopeWithStatusResponse(int slotId,
   5562                                          int responseType, int serial, RIL_Errno e, void *response,
   5563                                          size_t responseLen) {
   5564 #if VDBG
   5565     RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
   5566 #endif
   5567 
   5568     if (radioService[slotId]->mRadioResponse != NULL) {
   5569         RadioResponseInfo responseInfo = {};
   5570         IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
   5571                 response, responseLen);
   5572 
   5573         Return<void> retStatus
   5574                 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
   5575                 result);
   5576         radioService[slotId]->checkReturnStatus(retStatus);
   5577     } else {
   5578         RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
   5579                 slotId);
   5580     }
   5581 
   5582     return 0;
   5583 }
   5584 
   5585 int radio::getVoiceRadioTechnologyResponse(int slotId,
   5586                                           int responseType, int serial, RIL_Errno e,
   5587                                           void *response, size_t responseLen) {
   5588 #if VDBG
   5589     RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
   5590 #endif
   5591 
   5592     if (radioService[slotId]->mRadioResponse != NULL) {
   5593         RadioResponseInfo responseInfo = {};
   5594         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   5595         Return<void> retStatus
   5596                 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
   5597                 responseInfo, (RadioTechnology) ret);
   5598         radioService[slotId]->checkReturnStatus(retStatus);
   5599     } else {
   5600         RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
   5601                 slotId);
   5602     }
   5603 
   5604     return 0;
   5605 }
   5606 
   5607 int radio::getCellInfoListResponse(int slotId,
   5608                                    int responseType,
   5609                                    int serial, RIL_Errno e, void *response,
   5610                                    size_t responseLen) {
   5611 #if VDBG
   5612     RLOGD("getCellInfoListResponse: serial %d", serial);
   5613 #endif
   5614 
   5615     if (radioService[slotId]->mRadioResponse != NULL) {
   5616         RadioResponseInfo responseInfo = {};
   5617         populateResponseInfo(responseInfo, serial, responseType, e);
   5618 
   5619         hidl_vec<CellInfo> ret;
   5620         if ((response == NULL && responseLen != 0)
   5621                 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
   5622             RLOGE("getCellInfoListResponse: Invalid response");
   5623             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5624         } else {
   5625             convertRilCellInfoListToHal(response, responseLen, ret);
   5626         }
   5627 
   5628         Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
   5629                 responseInfo, ret);
   5630         radioService[slotId]->checkReturnStatus(retStatus);
   5631     } else {
   5632         RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5633     }
   5634 
   5635     return 0;
   5636 }
   5637 
   5638 int radio::setCellInfoListRateResponse(int slotId,
   5639                                        int responseType,
   5640                                        int serial, RIL_Errno e, void *response,
   5641                                        size_t responseLen) {
   5642 #if VDBG
   5643     RLOGD("setCellInfoListRateResponse: serial %d", serial);
   5644 #endif
   5645 
   5646     if (radioService[slotId]->mRadioResponse != NULL) {
   5647         RadioResponseInfo responseInfo = {};
   5648         populateResponseInfo(responseInfo, serial, responseType, e);
   5649         Return<void> retStatus
   5650                 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
   5651         radioService[slotId]->checkReturnStatus(retStatus);
   5652     } else {
   5653         RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
   5654                 slotId);
   5655     }
   5656 
   5657     return 0;
   5658 }
   5659 
   5660 int radio::setInitialAttachApnResponse(int slotId,
   5661                                        int responseType, int serial, RIL_Errno e,
   5662                                        void *response, size_t responseLen) {
   5663 #if VDBG
   5664     RLOGD("setInitialAttachApnResponse: serial %d", serial);
   5665 #endif
   5666 
   5667     if (radioService[slotId]->mRadioResponse != NULL) {
   5668         RadioResponseInfo responseInfo = {};
   5669         populateResponseInfo(responseInfo, serial, responseType, e);
   5670         Return<void> retStatus
   5671                 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
   5672         radioService[slotId]->checkReturnStatus(retStatus);
   5673     } else {
   5674         RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
   5675                 slotId);
   5676     }
   5677 
   5678     return 0;
   5679 }
   5680 
   5681 int radio::getImsRegistrationStateResponse(int slotId,
   5682                                            int responseType, int serial, RIL_Errno e,
   5683                                            void *response, size_t responseLen) {
   5684 #if VDBG
   5685     RLOGD("getImsRegistrationStateResponse: serial %d", serial);
   5686 #endif
   5687 
   5688     if (radioService[slotId]->mRadioResponse != NULL) {
   5689         RadioResponseInfo responseInfo = {};
   5690         populateResponseInfo(responseInfo, serial, responseType, e);
   5691         bool isRegistered = false;
   5692         int ratFamily = 0;
   5693         int numInts = responseLen / sizeof(int);
   5694         if (response == NULL || numInts != 2) {
   5695             RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
   5696             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5697         } else {
   5698             int *pInt = (int *) response;
   5699             isRegistered = pInt[0] == 1 ? true : false;
   5700             ratFamily = pInt[1];
   5701         }
   5702         Return<void> retStatus
   5703                 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
   5704                 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
   5705         radioService[slotId]->checkReturnStatus(retStatus);
   5706     } else {
   5707         RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
   5708                 slotId);
   5709     }
   5710 
   5711     return 0;
   5712 }
   5713 
   5714 int radio::sendImsSmsResponse(int slotId,
   5715                               int responseType, int serial, RIL_Errno e, void *response,
   5716                               size_t responseLen) {
   5717 #if VDBG
   5718     RLOGD("sendImsSmsResponse: serial %d", serial);
   5719 #endif
   5720 
   5721     if (radioService[slotId]->mRadioResponse != NULL) {
   5722         RadioResponseInfo responseInfo = {};
   5723         SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
   5724                 responseLen);
   5725 
   5726         Return<void> retStatus
   5727                 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
   5728         radioService[slotId]->checkReturnStatus(retStatus);
   5729     } else {
   5730         RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5731     }
   5732 
   5733     return 0;
   5734 }
   5735 
   5736 int radio::iccTransmitApduBasicChannelResponse(int slotId,
   5737                                                int responseType, int serial, RIL_Errno e,
   5738                                                void *response, size_t responseLen) {
   5739 #if VDBG
   5740     RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
   5741 #endif
   5742 
   5743     if (radioService[slotId]->mRadioResponse != NULL) {
   5744         RadioResponseInfo responseInfo = {};
   5745         IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
   5746                 responseLen);
   5747 
   5748         Return<void> retStatus
   5749                 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
   5750                 responseInfo, result);
   5751         radioService[slotId]->checkReturnStatus(retStatus);
   5752     } else {
   5753         RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
   5754                 "== NULL", slotId);
   5755     }
   5756 
   5757     return 0;
   5758 }
   5759 
   5760 int radio::iccOpenLogicalChannelResponse(int slotId,
   5761                                          int responseType, int serial, RIL_Errno e, void *response,
   5762                                          size_t responseLen) {
   5763 #if VDBG
   5764     RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
   5765 #endif
   5766 
   5767     if (radioService[slotId]->mRadioResponse != NULL) {
   5768         RadioResponseInfo responseInfo = {};
   5769         populateResponseInfo(responseInfo, serial, responseType, e);
   5770         int channelId = -1;
   5771         hidl_vec<int8_t> selectResponse;
   5772         int numInts = responseLen / sizeof(int);
   5773         if (response == NULL || responseLen % sizeof(int) != 0) {
   5774             RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
   5775             if (response != NULL) {
   5776                 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5777             }
   5778         } else {
   5779             int *pInt = (int *) response;
   5780             channelId = pInt[0];
   5781             selectResponse.resize(numInts - 1);
   5782             for (int i = 1; i < numInts; i++) {
   5783                 selectResponse[i - 1] = (int8_t) pInt[i];
   5784             }
   5785         }
   5786         Return<void> retStatus
   5787                 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
   5788                 channelId, selectResponse);
   5789         radioService[slotId]->checkReturnStatus(retStatus);
   5790     } else {
   5791         RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
   5792                 slotId);
   5793     }
   5794 
   5795     return 0;
   5796 }
   5797 
   5798 int radio::iccCloseLogicalChannelResponse(int slotId,
   5799                                           int responseType, int serial, RIL_Errno e,
   5800                                           void *response, size_t responseLen) {
   5801 #if VDBG
   5802     RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
   5803 #endif
   5804 
   5805     if (radioService[slotId]->mRadioResponse != NULL) {
   5806         RadioResponseInfo responseInfo = {};
   5807         populateResponseInfo(responseInfo, serial, responseType, e);
   5808         Return<void> retStatus
   5809                 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
   5810                 responseInfo);
   5811         radioService[slotId]->checkReturnStatus(retStatus);
   5812     } else {
   5813         RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
   5814                 slotId);
   5815     }
   5816 
   5817     return 0;
   5818 }
   5819 
   5820 int radio::iccTransmitApduLogicalChannelResponse(int slotId,
   5821                                                  int responseType, int serial, RIL_Errno e,
   5822                                                  void *response, size_t responseLen) {
   5823 #if VDBG
   5824     RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
   5825 #endif
   5826 
   5827     if (radioService[slotId]->mRadioResponse != NULL) {
   5828         RadioResponseInfo responseInfo = {};
   5829         IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
   5830                 responseLen);
   5831 
   5832         Return<void> retStatus
   5833                 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
   5834                 responseInfo, result);
   5835         radioService[slotId]->checkReturnStatus(retStatus);
   5836     } else {
   5837         RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
   5838                 "== NULL", slotId);
   5839     }
   5840 
   5841     return 0;
   5842 }
   5843 
   5844 int radio::nvReadItemResponse(int slotId,
   5845                               int responseType, int serial, RIL_Errno e,
   5846                               void *response, size_t responseLen) {
   5847 #if VDBG
   5848     RLOGD("nvReadItemResponse: serial %d", serial);
   5849 #endif
   5850 
   5851     if (radioService[slotId]->mRadioResponse != NULL) {
   5852         RadioResponseInfo responseInfo = {};
   5853         populateResponseInfo(responseInfo, serial, responseType, e);
   5854         Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
   5855                 responseInfo,
   5856                 convertCharPtrToHidlString((char *) response));
   5857         radioService[slotId]->checkReturnStatus(retStatus);
   5858     } else {
   5859         RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5860     }
   5861 
   5862     return 0;
   5863 }
   5864 
   5865 int radio::nvWriteItemResponse(int slotId,
   5866                                int responseType, int serial, RIL_Errno e,
   5867                                void *response, size_t responseLen) {
   5868 #if VDBG
   5869     RLOGD("nvWriteItemResponse: serial %d", serial);
   5870 #endif
   5871 
   5872     if (radioService[slotId]->mRadioResponse != NULL) {
   5873         RadioResponseInfo responseInfo = {};
   5874         populateResponseInfo(responseInfo, serial, responseType, e);
   5875         Return<void> retStatus
   5876                 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
   5877         radioService[slotId]->checkReturnStatus(retStatus);
   5878     } else {
   5879         RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5880     }
   5881 
   5882     return 0;
   5883 }
   5884 
   5885 int radio::nvWriteCdmaPrlResponse(int slotId,
   5886                                   int responseType, int serial, RIL_Errno e,
   5887                                   void *response, size_t responseLen) {
   5888 #if VDBG
   5889     RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
   5890 #endif
   5891 
   5892     if (radioService[slotId]->mRadioResponse != NULL) {
   5893         RadioResponseInfo responseInfo = {};
   5894         populateResponseInfo(responseInfo, serial, responseType, e);
   5895         Return<void> retStatus
   5896                 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
   5897         radioService[slotId]->checkReturnStatus(retStatus);
   5898     } else {
   5899         RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5900     }
   5901 
   5902     return 0;
   5903 }
   5904 
   5905 int radio::nvResetConfigResponse(int slotId,
   5906                                  int responseType, int serial, RIL_Errno e,
   5907                                  void *response, size_t responseLen) {
   5908 #if VDBG
   5909     RLOGD("nvResetConfigResponse: serial %d", serial);
   5910 #endif
   5911 
   5912     if (radioService[slotId]->mRadioResponse != NULL) {
   5913         RadioResponseInfo responseInfo = {};
   5914         populateResponseInfo(responseInfo, serial, responseType, e);
   5915         Return<void> retStatus
   5916                 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
   5917         radioService[slotId]->checkReturnStatus(retStatus);
   5918     } else {
   5919         RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5920     }
   5921 
   5922     return 0;
   5923 }
   5924 
   5925 int radio::setUiccSubscriptionResponse(int slotId,
   5926                                        int responseType, int serial, RIL_Errno e,
   5927                                        void *response, size_t responseLen) {
   5928 #if VDBG
   5929     RLOGD("setUiccSubscriptionResponse: serial %d", serial);
   5930 #endif
   5931 
   5932     if (radioService[slotId]->mRadioResponse != NULL) {
   5933         RadioResponseInfo responseInfo = {};
   5934         populateResponseInfo(responseInfo, serial, responseType, e);
   5935         Return<void> retStatus
   5936                 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
   5937         radioService[slotId]->checkReturnStatus(retStatus);
   5938     } else {
   5939         RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
   5940                 slotId);
   5941     }
   5942 
   5943     return 0;
   5944 }
   5945 
   5946 int radio::setDataAllowedResponse(int slotId,
   5947                                   int responseType, int serial, RIL_Errno e,
   5948                                   void *response, size_t responseLen) {
   5949 #if VDBG
   5950     RLOGD("setDataAllowedResponse: serial %d", serial);
   5951 #endif
   5952 
   5953     if (radioService[slotId]->mRadioResponse != NULL) {
   5954         RadioResponseInfo responseInfo = {};
   5955         populateResponseInfo(responseInfo, serial, responseType, e);
   5956         Return<void> retStatus
   5957                 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
   5958         radioService[slotId]->checkReturnStatus(retStatus);
   5959     } else {
   5960         RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5961     }
   5962 
   5963     return 0;
   5964 }
   5965 
   5966 int radio::getHardwareConfigResponse(int slotId,
   5967                                      int responseType, int serial, RIL_Errno e,
   5968                                      void *response, size_t responseLen) {
   5969 #if VDBG
   5970     RLOGD("getHardwareConfigResponse: serial %d", serial);
   5971 #endif
   5972 
   5973     if (radioService[slotId]->mRadioResponse != NULL) {
   5974         RadioResponseInfo responseInfo = {};
   5975         populateResponseInfo(responseInfo, serial, responseType, e);
   5976 
   5977         hidl_vec<HardwareConfig> result;
   5978         if ((response == NULL && responseLen != 0)
   5979                 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
   5980             RLOGE("hardwareConfigChangedInd: invalid response");
   5981             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   5982         } else {
   5983             convertRilHardwareConfigListToHal(response, responseLen, result);
   5984         }
   5985 
   5986         Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
   5987                 responseInfo, result);
   5988         radioService[slotId]->checkReturnStatus(retStatus);
   5989     } else {
   5990         RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   5991     }
   5992 
   5993     return 0;
   5994 }
   5995 
   5996 int radio::requestIccSimAuthenticationResponse(int slotId,
   5997                                                int responseType, int serial, RIL_Errno e,
   5998                                                void *response, size_t responseLen) {
   5999 #if VDBG
   6000     RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
   6001 #endif
   6002 
   6003     if (radioService[slotId]->mRadioResponse != NULL) {
   6004         RadioResponseInfo responseInfo = {};
   6005         IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
   6006                 responseLen);
   6007 
   6008         Return<void> retStatus
   6009                 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
   6010                 responseInfo, result);
   6011         radioService[slotId]->checkReturnStatus(retStatus);
   6012     } else {
   6013         RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
   6014                 "== NULL", slotId);
   6015     }
   6016 
   6017     return 0;
   6018 }
   6019 
   6020 int radio::setDataProfileResponse(int slotId,
   6021                                   int responseType, int serial, RIL_Errno e,
   6022                                   void *response, size_t responseLen) {
   6023 #if VDBG
   6024     RLOGD("setDataProfileResponse: serial %d", serial);
   6025 #endif
   6026 
   6027     if (radioService[slotId]->mRadioResponse != NULL) {
   6028         RadioResponseInfo responseInfo = {};
   6029         populateResponseInfo(responseInfo, serial, responseType, e);
   6030         Return<void> retStatus
   6031                 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
   6032         radioService[slotId]->checkReturnStatus(retStatus);
   6033     } else {
   6034         RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6035     }
   6036 
   6037     return 0;
   6038 }
   6039 
   6040 int radio::requestShutdownResponse(int slotId,
   6041                                   int responseType, int serial, RIL_Errno e,
   6042                                   void *response, size_t responseLen) {
   6043 #if VDBG
   6044     RLOGD("requestShutdownResponse: serial %d", serial);
   6045 #endif
   6046 
   6047     if (radioService[slotId]->mRadioResponse != NULL) {
   6048         RadioResponseInfo responseInfo = {};
   6049         populateResponseInfo(responseInfo, serial, responseType, e);
   6050         Return<void> retStatus
   6051                 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
   6052         radioService[slotId]->checkReturnStatus(retStatus);
   6053     } else {
   6054         RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6055     }
   6056 
   6057     return 0;
   6058 }
   6059 
   6060 void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
   6061         int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
   6062     populateResponseInfo(responseInfo, serial, responseType, e);
   6063 
   6064     if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
   6065         RLOGE("responseRadioCapability: Invalid response");
   6066         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6067         rc.logicalModemUuid = hidl_string();
   6068     } else {
   6069         convertRilRadioCapabilityToHal(response, responseLen, rc);
   6070     }
   6071 }
   6072 
   6073 int radio::getRadioCapabilityResponse(int slotId,
   6074                                      int responseType, int serial, RIL_Errno e,
   6075                                      void *response, size_t responseLen) {
   6076 #if VDBG
   6077     RLOGD("getRadioCapabilityResponse: serial %d", serial);
   6078 #endif
   6079 
   6080     if (radioService[slotId]->mRadioResponse != NULL) {
   6081         RadioResponseInfo responseInfo = {};
   6082         RadioCapability result = {};
   6083         responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
   6084                 result);
   6085         Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
   6086                 responseInfo, result);
   6087         radioService[slotId]->checkReturnStatus(retStatus);
   6088     } else {
   6089         RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6090     }
   6091 
   6092     return 0;
   6093 }
   6094 
   6095 int radio::setRadioCapabilityResponse(int slotId,
   6096                                      int responseType, int serial, RIL_Errno e,
   6097                                      void *response, size_t responseLen) {
   6098 #if VDBG
   6099     RLOGD("setRadioCapabilityResponse: serial %d", serial);
   6100 #endif
   6101 
   6102     if (radioService[slotId]->mRadioResponse != NULL) {
   6103         RadioResponseInfo responseInfo = {};
   6104         RadioCapability result = {};
   6105         responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
   6106                 result);
   6107         Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
   6108                 responseInfo, result);
   6109         radioService[slotId]->checkReturnStatus(retStatus);
   6110     } else {
   6111         RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6112     }
   6113 
   6114     return 0;
   6115 }
   6116 
   6117 LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
   6118                                     RIL_Errno e, void *response, size_t responseLen) {
   6119     populateResponseInfo(responseInfo, serial, responseType, e);
   6120     LceStatusInfo result = {};
   6121 
   6122     if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
   6123         RLOGE("Invalid response: NULL");
   6124         if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6125     } else {
   6126         RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
   6127         result.lceStatus = (LceStatus) resp->lce_status;
   6128         result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
   6129     }
   6130     return result;
   6131 }
   6132 
   6133 int radio::startLceServiceResponse(int slotId,
   6134                                    int responseType, int serial, RIL_Errno e,
   6135                                    void *response, size_t responseLen) {
   6136 #if VDBG
   6137     RLOGD("startLceServiceResponse: serial %d", serial);
   6138 #endif
   6139 
   6140     if (radioService[slotId]->mRadioResponse != NULL) {
   6141         RadioResponseInfo responseInfo = {};
   6142         LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
   6143                 response, responseLen);
   6144 
   6145         Return<void> retStatus
   6146                 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
   6147                 result);
   6148         radioService[slotId]->checkReturnStatus(retStatus);
   6149     } else {
   6150         RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6151     }
   6152 
   6153     return 0;
   6154 }
   6155 
   6156 int radio::stopLceServiceResponse(int slotId,
   6157                                   int responseType, int serial, RIL_Errno e,
   6158                                   void *response, size_t responseLen) {
   6159 #if VDBG
   6160     RLOGD("stopLceServiceResponse: serial %d", serial);
   6161 #endif
   6162 
   6163     if (radioService[slotId]->mRadioResponse != NULL) {
   6164         RadioResponseInfo responseInfo = {};
   6165         LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
   6166                 response, responseLen);
   6167 
   6168         Return<void> retStatus
   6169                 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
   6170                 result);
   6171         radioService[slotId]->checkReturnStatus(retStatus);
   6172     } else {
   6173         RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6174     }
   6175 
   6176     return 0;
   6177 }
   6178 
   6179 int radio::pullLceDataResponse(int slotId,
   6180                                int responseType, int serial, RIL_Errno e,
   6181                                void *response, size_t responseLen) {
   6182 #if VDBG
   6183     RLOGD("pullLceDataResponse: serial %d", serial);
   6184 #endif
   6185 
   6186     if (radioService[slotId]->mRadioResponse != NULL) {
   6187         RadioResponseInfo responseInfo = {};
   6188         populateResponseInfo(responseInfo, serial, responseType, e);
   6189 
   6190         LceDataInfo result = {};
   6191         if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
   6192             RLOGE("pullLceDataResponse: Invalid response");
   6193             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6194         } else {
   6195             convertRilLceDataInfoToHal(response, responseLen, result);
   6196         }
   6197 
   6198         Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
   6199                 responseInfo, result);
   6200         radioService[slotId]->checkReturnStatus(retStatus);
   6201     } else {
   6202         RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6203     }
   6204 
   6205     return 0;
   6206 }
   6207 
   6208 int radio::getModemActivityInfoResponse(int slotId,
   6209                                         int responseType, int serial, RIL_Errno e,
   6210                                         void *response, size_t responseLen) {
   6211 #if VDBG
   6212     RLOGD("getModemActivityInfoResponse: serial %d", serial);
   6213 #endif
   6214 
   6215     if (radioService[slotId]->mRadioResponse != NULL) {
   6216         RadioResponseInfo responseInfo = {};
   6217         populateResponseInfo(responseInfo, serial, responseType, e);
   6218         ActivityStatsInfo info;
   6219         if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
   6220             RLOGE("getModemActivityInfoResponse Invalid response: NULL");
   6221             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6222         } else {
   6223             RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
   6224             info.sleepModeTimeMs = resp->sleep_mode_time_ms;
   6225             info.idleModeTimeMs = resp->idle_mode_time_ms;
   6226             for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
   6227                 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
   6228             }
   6229             info.rxModeTimeMs = resp->rx_mode_time_ms;
   6230         }
   6231 
   6232         Return<void> retStatus
   6233                 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
   6234                 info);
   6235         radioService[slotId]->checkReturnStatus(retStatus);
   6236     } else {
   6237         RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
   6238                 slotId);
   6239     }
   6240 
   6241     return 0;
   6242 }
   6243 
   6244 int radio::setAllowedCarriersResponse(int slotId,
   6245                                       int responseType, int serial, RIL_Errno e,
   6246                                       void *response, size_t responseLen) {
   6247 #if VDBG
   6248     RLOGD("setAllowedCarriersResponse: serial %d", serial);
   6249 #endif
   6250 
   6251     if (radioService[slotId]->mRadioResponse != NULL) {
   6252         RadioResponseInfo responseInfo = {};
   6253         int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
   6254         Return<void> retStatus
   6255                 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
   6256                 ret);
   6257         radioService[slotId]->checkReturnStatus(retStatus);
   6258     } else {
   6259         RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
   6260                 slotId);
   6261     }
   6262 
   6263     return 0;
   6264 }
   6265 
   6266 int radio::getAllowedCarriersResponse(int slotId,
   6267                                       int responseType, int serial, RIL_Errno e,
   6268                                       void *response, size_t responseLen) {
   6269 #if VDBG
   6270     RLOGD("getAllowedCarriersResponse: serial %d", serial);
   6271 #endif
   6272 
   6273     if (radioService[slotId]->mRadioResponse != NULL) {
   6274         RadioResponseInfo responseInfo = {};
   6275         populateResponseInfo(responseInfo, serial, responseType, e);
   6276         CarrierRestrictions carrierInfo = {};
   6277         bool allAllowed = true;
   6278         if (response == NULL) {
   6279 #if VDBG
   6280             RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
   6281 #endif
   6282             carrierInfo.allowedCarriers.resize(0);
   6283             carrierInfo.excludedCarriers.resize(0);
   6284         } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
   6285             RLOGE("getAllowedCarriersResponse Invalid response");
   6286             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6287         } else {
   6288             RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
   6289             if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
   6290                 allAllowed = false;
   6291             }
   6292 
   6293             carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
   6294             for(int i = 0; i < pCr->len_allowed_carriers; i++) {
   6295                 RIL_Carrier *carrier = pCr->allowed_carriers + i;
   6296                 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
   6297                 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
   6298                 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
   6299                 carrierInfo.allowedCarriers[i].matchData =
   6300                         convertCharPtrToHidlString(carrier->match_data);
   6301             }
   6302 
   6303             carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
   6304             for(int i = 0; i < pCr->len_excluded_carriers; i++) {
   6305                 RIL_Carrier *carrier = pCr->excluded_carriers + i;
   6306                 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
   6307                 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
   6308                 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
   6309                 carrierInfo.excludedCarriers[i].matchData =
   6310                         convertCharPtrToHidlString(carrier->match_data);
   6311             }
   6312         }
   6313 
   6314         Return<void> retStatus
   6315                 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
   6316                 allAllowed, carrierInfo);
   6317         radioService[slotId]->checkReturnStatus(retStatus);
   6318     } else {
   6319         RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
   6320                 slotId);
   6321     }
   6322 
   6323     return 0;
   6324 }
   6325 
   6326 int radio::sendDeviceStateResponse(int slotId,
   6327                               int responseType, int serial, RIL_Errno e,
   6328                               void *response, size_t responselen) {
   6329 #if VDBG
   6330     RLOGD("sendDeviceStateResponse: serial %d", serial);
   6331 #endif
   6332 
   6333     if (radioService[slotId]->mRadioResponse != NULL) {
   6334         RadioResponseInfo responseInfo = {};
   6335         populateResponseInfo(responseInfo, serial, responseType, e);
   6336         Return<void> retStatus
   6337                 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
   6338         radioService[slotId]->checkReturnStatus(retStatus);
   6339     } else {
   6340         RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6341     }
   6342 
   6343     return 0;
   6344 }
   6345 
   6346 int radio::setIndicationFilterResponse(int slotId,
   6347                               int responseType, int serial, RIL_Errno e,
   6348                               void *response, size_t responselen) {
   6349 #if VDBG
   6350     RLOGD("setIndicationFilterResponse: serial %d", serial);
   6351 #endif
   6352 
   6353     if (radioService[slotId]->mRadioResponse != NULL) {
   6354         RadioResponseInfo responseInfo = {};
   6355         populateResponseInfo(responseInfo, serial, responseType, e);
   6356         Return<void> retStatus
   6357                 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
   6358         radioService[slotId]->checkReturnStatus(retStatus);
   6359     } else {
   6360         RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
   6361                 slotId);
   6362     }
   6363 
   6364     return 0;
   6365 }
   6366 
   6367 
   6368 int radio::setSimCardPowerResponse(int slotId,
   6369                                    int responseType, int serial, RIL_Errno e,
   6370                                    void *response, size_t responseLen) {
   6371 #if VDBG
   6372     RLOGD("setSimCardPowerResponse: serial %d", serial);
   6373 #endif
   6374 
   6375     if (radioService[slotId]->mRadioResponse != NULL) {
   6376         RadioResponseInfo responseInfo = {};
   6377         populateResponseInfo(responseInfo, serial, responseType, e);
   6378         Return<void> retStatus
   6379                 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
   6380         radioService[slotId]->checkReturnStatus(retStatus);
   6381     } else {
   6382         RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL", slotId);
   6383     }
   6384 
   6385     return 0;
   6386 }
   6387 
   6388 int radio::sendRequestRawResponse(int slotId,
   6389                                   int responseType, int serial, RIL_Errno e,
   6390                                   void *response, size_t responseLen) {
   6391 #if VDBG
   6392    RLOGD("sendRequestRawResponse: serial %d", serial);
   6393 #endif
   6394 
   6395     if (oemHookService[slotId]->mOemHookResponse != NULL) {
   6396         RadioResponseInfo responseInfo = {};
   6397         populateResponseInfo(responseInfo, serial, responseType, e);
   6398         hidl_vec<uint8_t> data;
   6399 
   6400         if (response == NULL) {
   6401             RLOGE("sendRequestRawResponse: Invalid response");
   6402             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6403         } else {
   6404             data.setToExternal((uint8_t *) response, responseLen);
   6405         }
   6406         Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
   6407                 sendRequestRawResponse(responseInfo, data);
   6408         checkReturnStatus(slotId, retStatus, false);
   6409     } else {
   6410         RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
   6411                 slotId);
   6412     }
   6413 
   6414     return 0;
   6415 }
   6416 
   6417 int radio::sendRequestStringsResponse(int slotId,
   6418                                       int responseType, int serial, RIL_Errno e,
   6419                                       void *response, size_t responseLen) {
   6420 #if VDBG
   6421     RLOGD("sendRequestStringsResponse: serial %d", serial);
   6422 #endif
   6423 
   6424     if (oemHookService[slotId]->mOemHookResponse != NULL) {
   6425         RadioResponseInfo responseInfo = {};
   6426         populateResponseInfo(responseInfo, serial, responseType, e);
   6427         hidl_vec<hidl_string> data;
   6428 
   6429         if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
   6430             RLOGE("sendRequestStringsResponse Invalid response: NULL");
   6431             if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
   6432         } else {
   6433             char **resp = (char **) response;
   6434             int numStrings = responseLen / sizeof(char *);
   6435             data.resize(numStrings);
   6436             for (int i = 0; i < numStrings; i++) {
   6437                 data[i] = convertCharPtrToHidlString(resp[i]);
   6438             }
   6439         }
   6440         Return<void> retStatus
   6441                 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
   6442                 responseInfo, data);
   6443         checkReturnStatus(slotId, retStatus, false);
   6444     } else {
   6445         RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
   6446                 "NULL", slotId);
   6447     }
   6448 
   6449     return 0;
   6450 }
   6451 
   6452 // Radio Indication functions
   6453 
   6454 RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
   6455     return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
   6456             (RadioIndicationType::UNSOLICITED_ACK_EXP);
   6457 }
   6458 
   6459 int radio::radioStateChangedInd(int slotId,
   6460                                  int indicationType, int token, RIL_Errno e, void *response,
   6461                                  size_t responseLen) {
   6462     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6463         RadioState radioState =
   6464                 (RadioState) CALL_ONSTATEREQUEST(slotId);
   6465         RLOGD("radioStateChangedInd: radioState %d", radioState);
   6466         Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
   6467                 convertIntToRadioIndicationType(indicationType), radioState);
   6468         radioService[slotId]->checkReturnStatus(retStatus);
   6469     } else {
   6470         RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6471     }
   6472 
   6473     return 0;
   6474 }
   6475 
   6476 int radio::callStateChangedInd(int slotId,
   6477                                int indicationType, int token, RIL_Errno e, void *response,
   6478                                size_t responseLen) {
   6479     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6480 #if VDBG
   6481         RLOGD("callStateChangedInd");
   6482 #endif
   6483         Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
   6484                 convertIntToRadioIndicationType(indicationType));
   6485         radioService[slotId]->checkReturnStatus(retStatus);
   6486     } else {
   6487         RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6488     }
   6489 
   6490     return 0;
   6491 }
   6492 
   6493 int radio::networkStateChangedInd(int slotId,
   6494                                   int indicationType, int token, RIL_Errno e, void *response,
   6495                                   size_t responseLen) {
   6496     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6497 #if VDBG
   6498         RLOGD("networkStateChangedInd");
   6499 #endif
   6500         Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
   6501                 convertIntToRadioIndicationType(indicationType));
   6502         radioService[slotId]->checkReturnStatus(retStatus);
   6503     } else {
   6504         RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
   6505                 slotId);
   6506     }
   6507 
   6508     return 0;
   6509 }
   6510 
   6511 uint8_t hexCharToInt(uint8_t c) {
   6512     if (c >= '0' && c <= '9') return (c - '0');
   6513     if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
   6514     if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
   6515 
   6516     return INVALID_HEX_CHAR;
   6517 }
   6518 
   6519 uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
   6520     if (responseLen % 2 != 0) {
   6521         return NULL;
   6522     }
   6523 
   6524     uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
   6525     if (bytes == NULL) {
   6526         RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
   6527         return NULL;
   6528     }
   6529     uint8_t *hexString = (uint8_t *)response;
   6530 
   6531     for (size_t i = 0; i < responseLen; i += 2) {
   6532         uint8_t hexChar1 = hexCharToInt(hexString[i]);
   6533         uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
   6534 
   6535         if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
   6536             RLOGE("convertHexStringToBytes: invalid hex char %d %d",
   6537                     hexString[i], hexString[i + 1]);
   6538             free(bytes);
   6539             return NULL;
   6540         }
   6541         bytes[i/2] = ((hexChar1 << 4) | hexChar2);
   6542     }
   6543 
   6544     return bytes;
   6545 }
   6546 
   6547 int radio::newSmsInd(int slotId, int indicationType,
   6548                      int token, RIL_Errno e, void *response, size_t responseLen) {
   6549     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6550         if (response == NULL || responseLen == 0) {
   6551             RLOGE("newSmsInd: invalid response");
   6552             return 0;
   6553         }
   6554 
   6555         uint8_t *bytes = convertHexStringToBytes(response, responseLen);
   6556         if (bytes == NULL) {
   6557             RLOGE("newSmsInd: convertHexStringToBytes failed");
   6558             return 0;
   6559         }
   6560 
   6561         hidl_vec<uint8_t> pdu;
   6562         pdu.setToExternal(bytes, responseLen/2);
   6563 #if VDBG
   6564         RLOGD("newSmsInd");
   6565 #endif
   6566         Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
   6567                 convertIntToRadioIndicationType(indicationType), pdu);
   6568         radioService[slotId]->checkReturnStatus(retStatus);
   6569         free(bytes);
   6570     } else {
   6571         RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6572     }
   6573 
   6574     return 0;
   6575 }
   6576 
   6577 int radio::newSmsStatusReportInd(int slotId,
   6578                                  int indicationType, int token, RIL_Errno e, void *response,
   6579                                  size_t responseLen) {
   6580     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6581         if (response == NULL || responseLen == 0) {
   6582             RLOGE("newSmsStatusReportInd: invalid response");
   6583             return 0;
   6584         }
   6585 
   6586         uint8_t *bytes = convertHexStringToBytes(response, responseLen);
   6587         if (bytes == NULL) {
   6588             RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
   6589             return 0;
   6590         }
   6591 
   6592         hidl_vec<uint8_t> pdu;
   6593         pdu.setToExternal(bytes, responseLen/2);
   6594 #if VDBG
   6595         RLOGD("newSmsStatusReportInd");
   6596 #endif
   6597         Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
   6598                 convertIntToRadioIndicationType(indicationType), pdu);
   6599         radioService[slotId]->checkReturnStatus(retStatus);
   6600         free(bytes);
   6601     } else {
   6602         RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6603     }
   6604 
   6605     return 0;
   6606 }
   6607 
   6608 int radio::newSmsOnSimInd(int slotId, int indicationType,
   6609                           int token, RIL_Errno e, void *response, size_t responseLen) {
   6610     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6611         if (response == NULL || responseLen != sizeof(int)) {
   6612             RLOGE("newSmsOnSimInd: invalid response");
   6613             return 0;
   6614         }
   6615         int32_t recordNumber = ((int32_t *) response)[0];
   6616 #if VDBG
   6617         RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
   6618 #endif
   6619         Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
   6620                 convertIntToRadioIndicationType(indicationType), recordNumber);
   6621         radioService[slotId]->checkReturnStatus(retStatus);
   6622     } else {
   6623         RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6624     }
   6625 
   6626     return 0;
   6627 }
   6628 
   6629 int radio::onUssdInd(int slotId, int indicationType,
   6630                      int token, RIL_Errno e, void *response, size_t responseLen) {
   6631     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6632         if (response == NULL || responseLen != 2 * sizeof(char *)) {
   6633             RLOGE("onUssdInd: invalid response");
   6634             return 0;
   6635         }
   6636         char **strings = (char **) response;
   6637         char *mode = strings[0];
   6638         hidl_string msg = convertCharPtrToHidlString(strings[1]);
   6639         UssdModeType modeType = (UssdModeType) atoi(mode);
   6640 #if VDBG
   6641         RLOGD("onUssdInd: mode %s", mode);
   6642 #endif
   6643         Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
   6644                 convertIntToRadioIndicationType(indicationType), modeType, msg);
   6645         radioService[slotId]->checkReturnStatus(retStatus);
   6646     } else {
   6647         RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6648     }
   6649 
   6650     return 0;
   6651 }
   6652 
   6653 int radio::nitzTimeReceivedInd(int slotId,
   6654                                int indicationType, int token, RIL_Errno e, void *response,
   6655                                size_t responseLen) {
   6656     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6657         if (response == NULL || responseLen == 0) {
   6658             RLOGE("nitzTimeReceivedInd: invalid response");
   6659             return 0;
   6660         }
   6661         hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
   6662         int64_t timeReceived = android::elapsedRealtime();
   6663 #if VDBG
   6664         RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
   6665                 timeReceived);
   6666 #endif
   6667         Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
   6668                 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
   6669         radioService[slotId]->checkReturnStatus(retStatus);
   6670     } else {
   6671         RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6672         return -1;
   6673     }
   6674 
   6675     return 0;
   6676 }
   6677 
   6678 void convertRilSignalStrengthToHal(void *response, size_t responseLen,
   6679         SignalStrength& signalStrength) {
   6680     RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
   6681 
   6682     // Fixup LTE for backwards compatibility
   6683     // signalStrength: -1 -> 99
   6684     if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
   6685         rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
   6686     }
   6687     // rsrp: -1 -> INT_MAX all other negative value to positive.
   6688     // So remap here
   6689     if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
   6690         rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
   6691     } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
   6692         rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
   6693     }
   6694     // rsrq: -1 -> INT_MAX
   6695     if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
   6696         rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
   6697     }
   6698     // Not remapping rssnr is already using INT_MAX
   6699     // cqi: -1 -> INT_MAX
   6700     if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
   6701         rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
   6702     }
   6703 
   6704     signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
   6705     signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
   6706     signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
   6707     signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
   6708     signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
   6709     signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
   6710     signalStrength.evdo.signalNoiseRatio =
   6711             rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
   6712     signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
   6713     signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
   6714     signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
   6715     signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
   6716     signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
   6717     signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
   6718     signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
   6719 }
   6720 
   6721 int radio::currentSignalStrengthInd(int slotId,
   6722                                     int indicationType, int token, RIL_Errno e,
   6723                                     void *response, size_t responseLen) {
   6724     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6725         if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
   6726             RLOGE("currentSignalStrengthInd: invalid response");
   6727             return 0;
   6728         }
   6729 
   6730         SignalStrength signalStrength = {};
   6731         convertRilSignalStrengthToHal(response, responseLen, signalStrength);
   6732 
   6733 #if VDBG
   6734         RLOGD("currentSignalStrengthInd");
   6735 #endif
   6736         Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
   6737                 convertIntToRadioIndicationType(indicationType), signalStrength);
   6738         radioService[slotId]->checkReturnStatus(retStatus);
   6739     } else {
   6740         RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
   6741                 slotId);
   6742     }
   6743 
   6744     return 0;
   6745 }
   6746 
   6747 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
   6748         SetupDataCallResult& dcResult) {
   6749     dcResult.status = (DataCallFailCause) dcResponse->status;
   6750     dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
   6751     dcResult.cid = dcResponse->cid;
   6752     dcResult.active = dcResponse->active;
   6753     dcResult.type = convertCharPtrToHidlString(dcResponse->type);
   6754     dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
   6755     dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
   6756     dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
   6757     dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
   6758     dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
   6759     dcResult.mtu = dcResponse->mtu;
   6760 }
   6761 
   6762 void convertRilDataCallListToHal(void *response, size_t responseLen,
   6763         hidl_vec<SetupDataCallResult>& dcResultList) {
   6764     int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
   6765 
   6766     RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
   6767     dcResultList.resize(num);
   6768     for (int i = 0; i < num; i++) {
   6769         convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
   6770     }
   6771 }
   6772 
   6773 int radio::dataCallListChangedInd(int slotId,
   6774                                   int indicationType, int token, RIL_Errno e, void *response,
   6775                                   size_t responseLen) {
   6776     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6777         if ((response == NULL && responseLen != 0)
   6778                 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
   6779             RLOGE("dataCallListChangedInd: invalid response");
   6780             return 0;
   6781         }
   6782         hidl_vec<SetupDataCallResult> dcList;
   6783         convertRilDataCallListToHal(response, responseLen, dcList);
   6784 #if VDBG
   6785         RLOGD("dataCallListChangedInd");
   6786 #endif
   6787         Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
   6788                 convertIntToRadioIndicationType(indicationType), dcList);
   6789         radioService[slotId]->checkReturnStatus(retStatus);
   6790     } else {
   6791         RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6792     }
   6793 
   6794     return 0;
   6795 }
   6796 
   6797 int radio::suppSvcNotifyInd(int slotId, int indicationType,
   6798                             int token, RIL_Errno e, void *response, size_t responseLen) {
   6799     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6800         if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
   6801             RLOGE("suppSvcNotifyInd: invalid response");
   6802             return 0;
   6803         }
   6804 
   6805         SuppSvcNotification suppSvc = {};
   6806         RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
   6807         suppSvc.isMT = ssn->notificationType;
   6808         suppSvc.code = ssn->code;
   6809         suppSvc.index = ssn->index;
   6810         suppSvc.type = ssn->type;
   6811         suppSvc.number = convertCharPtrToHidlString(ssn->number);
   6812 
   6813 #if VDBG
   6814         RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
   6815                 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
   6816 #endif
   6817         Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
   6818                 convertIntToRadioIndicationType(indicationType), suppSvc);
   6819         radioService[slotId]->checkReturnStatus(retStatus);
   6820     } else {
   6821         RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6822     }
   6823 
   6824     return 0;
   6825 }
   6826 
   6827 int radio::stkSessionEndInd(int slotId, int indicationType,
   6828                             int token, RIL_Errno e, void *response, size_t responseLen) {
   6829     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6830 #if VDBG
   6831         RLOGD("stkSessionEndInd");
   6832 #endif
   6833         Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
   6834                 convertIntToRadioIndicationType(indicationType));
   6835         radioService[slotId]->checkReturnStatus(retStatus);
   6836     } else {
   6837         RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6838     }
   6839 
   6840     return 0;
   6841 }
   6842 
   6843 int radio::stkProactiveCommandInd(int slotId,
   6844                                   int indicationType, int token, RIL_Errno e, void *response,
   6845                                   size_t responseLen) {
   6846     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6847         if (response == NULL || responseLen == 0) {
   6848             RLOGE("stkProactiveCommandInd: invalid response");
   6849             return 0;
   6850         }
   6851 #if VDBG
   6852         RLOGD("stkProactiveCommandInd");
   6853 #endif
   6854         Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
   6855                 convertIntToRadioIndicationType(indicationType),
   6856                 convertCharPtrToHidlString((char *) response));
   6857         radioService[slotId]->checkReturnStatus(retStatus);
   6858     } else {
   6859         RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6860     }
   6861 
   6862     return 0;
   6863 }
   6864 
   6865 int radio::stkEventNotifyInd(int slotId, int indicationType,
   6866                              int token, RIL_Errno e, void *response, size_t responseLen) {
   6867     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6868         if (response == NULL || responseLen == 0) {
   6869             RLOGE("stkEventNotifyInd: invalid response");
   6870             return 0;
   6871         }
   6872 #if VDBG
   6873         RLOGD("stkEventNotifyInd");
   6874 #endif
   6875         Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
   6876                 convertIntToRadioIndicationType(indicationType),
   6877                 convertCharPtrToHidlString((char *) response));
   6878         radioService[slotId]->checkReturnStatus(retStatus);
   6879     } else {
   6880         RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6881     }
   6882 
   6883     return 0;
   6884 }
   6885 
   6886 int radio::stkCallSetupInd(int slotId, int indicationType,
   6887                            int token, RIL_Errno e, void *response, size_t responseLen) {
   6888     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6889         if (response == NULL || responseLen != sizeof(int)) {
   6890             RLOGE("stkCallSetupInd: invalid response");
   6891             return 0;
   6892         }
   6893         int32_t timeout = ((int32_t *) response)[0];
   6894 #if VDBG
   6895         RLOGD("stkCallSetupInd: timeout %d", timeout);
   6896 #endif
   6897         Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
   6898                 convertIntToRadioIndicationType(indicationType), timeout);
   6899         radioService[slotId]->checkReturnStatus(retStatus);
   6900     } else {
   6901         RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6902     }
   6903 
   6904     return 0;
   6905 }
   6906 
   6907 int radio::simSmsStorageFullInd(int slotId,
   6908                                 int indicationType, int token, RIL_Errno e, void *response,
   6909                                 size_t responseLen) {
   6910     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6911 #if VDBG
   6912         RLOGD("simSmsStorageFullInd");
   6913 #endif
   6914         Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
   6915                 convertIntToRadioIndicationType(indicationType));
   6916         radioService[slotId]->checkReturnStatus(retStatus);
   6917     } else {
   6918         RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6919     }
   6920 
   6921     return 0;
   6922 }
   6923 
   6924 int radio::simRefreshInd(int slotId, int indicationType,
   6925                          int token, RIL_Errno e, void *response, size_t responseLen) {
   6926     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6927         if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
   6928             RLOGE("simRefreshInd: invalid response");
   6929             return 0;
   6930         }
   6931 
   6932         SimRefreshResult refreshResult = {};
   6933         RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
   6934         refreshResult.type =
   6935                 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
   6936         refreshResult.efId = simRefreshResponse->ef_id;
   6937         refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
   6938 
   6939 #if VDBG
   6940         RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
   6941 #endif
   6942         Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
   6943                 convertIntToRadioIndicationType(indicationType), refreshResult);
   6944         radioService[slotId]->checkReturnStatus(retStatus);
   6945     } else {
   6946         RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6947     }
   6948 
   6949     return 0;
   6950 }
   6951 
   6952 void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
   6953         CdmaSignalInfoRecord& record) {
   6954     record.isPresent = signalInfoRecord->isPresent;
   6955     record.signalType = signalInfoRecord->signalType;
   6956     record.alertPitch = signalInfoRecord->alertPitch;
   6957     record.signal = signalInfoRecord->signal;
   6958 }
   6959 
   6960 int radio::callRingInd(int slotId, int indicationType,
   6961                        int token, RIL_Errno e, void *response, size_t responseLen) {
   6962     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6963         bool isGsm;
   6964         CdmaSignalInfoRecord record = {};
   6965         if (response == NULL || responseLen == 0) {
   6966             isGsm = true;
   6967         } else {
   6968             isGsm = false;
   6969             if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
   6970                 RLOGE("callRingInd: invalid response");
   6971                 return 0;
   6972             }
   6973             convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
   6974         }
   6975 
   6976 #if VDBG
   6977         RLOGD("callRingInd: isGsm %d", isGsm);
   6978 #endif
   6979         Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
   6980                 convertIntToRadioIndicationType(indicationType), isGsm, record);
   6981         radioService[slotId]->checkReturnStatus(retStatus);
   6982     } else {
   6983         RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
   6984     }
   6985 
   6986     return 0;
   6987 }
   6988 
   6989 int radio::simStatusChangedInd(int slotId,
   6990                                int indicationType, int token, RIL_Errno e, void *response,
   6991                                size_t responseLen) {
   6992     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   6993 #if VDBG
   6994         RLOGD("simStatusChangedInd");
   6995 #endif
   6996         Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
   6997                 convertIntToRadioIndicationType(indicationType));
   6998         radioService[slotId]->checkReturnStatus(retStatus);
   6999     } else {
   7000         RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7001     }
   7002 
   7003     return 0;
   7004 }
   7005 
   7006 int radio::cdmaNewSmsInd(int slotId, int indicationType,
   7007                          int token, RIL_Errno e, void *response, size_t responseLen) {
   7008     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7009         if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
   7010             RLOGE("cdmaNewSmsInd: invalid response");
   7011             return 0;
   7012         }
   7013 
   7014         CdmaSmsMessage msg = {};
   7015         RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
   7016         msg.teleserviceId = rilMsg->uTeleserviceID;
   7017         msg.isServicePresent = rilMsg->bIsServicePresent;
   7018         msg.serviceCategory = rilMsg->uServicecategory;
   7019         msg.address.digitMode =
   7020                 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
   7021         msg.address.numberMode =
   7022                 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
   7023         msg.address.numberType =
   7024                 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
   7025         msg.address.numberPlan =
   7026                 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
   7027 
   7028         int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   7029         msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
   7030 
   7031         msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
   7032                 rilMsg->sSubAddress.subaddressType;
   7033         msg.subAddress.odd = rilMsg->sSubAddress.odd;
   7034 
   7035         digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   7036         msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
   7037 
   7038         digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   7039         msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
   7040 
   7041 #if VDBG
   7042         RLOGD("cdmaNewSmsInd");
   7043 #endif
   7044         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
   7045                 convertIntToRadioIndicationType(indicationType), msg);
   7046         radioService[slotId]->checkReturnStatus(retStatus);
   7047     } else {
   7048         RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7049     }
   7050 
   7051     return 0;
   7052 }
   7053 
   7054 int radio::newBroadcastSmsInd(int slotId,
   7055                               int indicationType, int token, RIL_Errno e, void *response,
   7056                               size_t responseLen) {
   7057     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7058         if (response == NULL || responseLen == 0) {
   7059             RLOGE("newBroadcastSmsInd: invalid response");
   7060             return 0;
   7061         }
   7062 
   7063         hidl_vec<uint8_t> data;
   7064         data.setToExternal((uint8_t *) response, responseLen);
   7065 #if VDBG
   7066         RLOGD("newBroadcastSmsInd");
   7067 #endif
   7068         Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
   7069                 convertIntToRadioIndicationType(indicationType), data);
   7070         radioService[slotId]->checkReturnStatus(retStatus);
   7071     } else {
   7072         RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7073     }
   7074 
   7075     return 0;
   7076 }
   7077 
   7078 int radio::cdmaRuimSmsStorageFullInd(int slotId,
   7079                                      int indicationType, int token, RIL_Errno e, void *response,
   7080                                      size_t responseLen) {
   7081     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7082 #if VDBG
   7083         RLOGD("cdmaRuimSmsStorageFullInd");
   7084 #endif
   7085         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
   7086                 convertIntToRadioIndicationType(indicationType));
   7087         radioService[slotId]->checkReturnStatus(retStatus);
   7088     } else {
   7089         RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
   7090                 slotId);
   7091     }
   7092 
   7093     return 0;
   7094 }
   7095 
   7096 int radio::restrictedStateChangedInd(int slotId,
   7097                                      int indicationType, int token, RIL_Errno e, void *response,
   7098                                      size_t responseLen) {
   7099     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7100         if (response == NULL || responseLen != sizeof(int)) {
   7101             RLOGE("restrictedStateChangedInd: invalid response");
   7102             return 0;
   7103         }
   7104         int32_t state = ((int32_t *) response)[0];
   7105 #if VDBG
   7106         RLOGD("restrictedStateChangedInd: state %d", state);
   7107 #endif
   7108         Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
   7109                 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
   7110         radioService[slotId]->checkReturnStatus(retStatus);
   7111     } else {
   7112         RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
   7113                 slotId);
   7114     }
   7115 
   7116     return 0;
   7117 }
   7118 
   7119 int radio::enterEmergencyCallbackModeInd(int slotId,
   7120                                          int indicationType, int token, RIL_Errno e, void *response,
   7121                                          size_t responseLen) {
   7122     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7123 #if VDBG
   7124         RLOGD("enterEmergencyCallbackModeInd");
   7125 #endif
   7126         Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
   7127                 convertIntToRadioIndicationType(indicationType));
   7128         radioService[slotId]->checkReturnStatus(retStatus);
   7129     } else {
   7130         RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
   7131                 slotId);
   7132     }
   7133 
   7134     return 0;
   7135 }
   7136 
   7137 int radio::cdmaCallWaitingInd(int slotId,
   7138                               int indicationType, int token, RIL_Errno e, void *response,
   7139                               size_t responseLen) {
   7140     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7141         if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
   7142             RLOGE("cdmaCallWaitingInd: invalid response");
   7143             return 0;
   7144         }
   7145 
   7146         CdmaCallWaiting callWaitingRecord = {};
   7147         RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
   7148         callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
   7149         callWaitingRecord.numberPresentation =
   7150                 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
   7151         callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
   7152         convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
   7153                 callWaitingRecord.signalInfoRecord);
   7154         callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
   7155         callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
   7156 
   7157 #if VDBG
   7158         RLOGD("cdmaCallWaitingInd");
   7159 #endif
   7160         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
   7161                 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
   7162         radioService[slotId]->checkReturnStatus(retStatus);
   7163     } else {
   7164         RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7165     }
   7166 
   7167     return 0;
   7168 }
   7169 
   7170 int radio::cdmaOtaProvisionStatusInd(int slotId,
   7171                                      int indicationType, int token, RIL_Errno e, void *response,
   7172                                      size_t responseLen) {
   7173     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7174         if (response == NULL || responseLen != sizeof(int)) {
   7175             RLOGE("cdmaOtaProvisionStatusInd: invalid response");
   7176             return 0;
   7177         }
   7178         int32_t status = ((int32_t *) response)[0];
   7179 #if VDBG
   7180         RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
   7181 #endif
   7182         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
   7183                 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
   7184         radioService[slotId]->checkReturnStatus(retStatus);
   7185     } else {
   7186         RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
   7187                 slotId);
   7188     }
   7189 
   7190     return 0;
   7191 }
   7192 
   7193 int radio::cdmaInfoRecInd(int slotId,
   7194                           int indicationType, int token, RIL_Errno e, void *response,
   7195                           size_t responseLen) {
   7196     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7197         if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
   7198             RLOGE("cdmaInfoRecInd: invalid response");
   7199             return 0;
   7200         }
   7201 
   7202         CdmaInformationRecords records = {};
   7203         RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
   7204 
   7205         char* string8 = NULL;
   7206         int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
   7207         if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
   7208             RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
   7209                     "additional ones", recordsRil->numberOfInfoRecs,
   7210                     RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
   7211         }
   7212         records.infoRec.resize(num);
   7213         for (int i = 0 ; i < num ; i++) {
   7214             CdmaInformationRecord *record = &records.infoRec[i];
   7215             RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
   7216             record->name = (CdmaInfoRecName) infoRec->name;
   7217             // All vectors should be size 0 except one which will be size 1. Set everything to
   7218             // size 0 initially.
   7219             record->display.resize(0);
   7220             record->number.resize(0);
   7221             record->signal.resize(0);
   7222             record->redir.resize(0);
   7223             record->lineCtrl.resize(0);
   7224             record->clir.resize(0);
   7225             record->audioCtrl.resize(0);
   7226             switch (infoRec->name) {
   7227                 case RIL_CDMA_DISPLAY_INFO_REC:
   7228                 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
   7229                     if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
   7230                         RLOGE("cdmaInfoRecInd: invalid display info response length %d "
   7231                                 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
   7232                                 CDMA_ALPHA_INFO_BUFFER_LENGTH);
   7233                         return 0;
   7234                     }
   7235                     string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
   7236                     if (string8 == NULL) {
   7237                         RLOGE("cdmaInfoRecInd: Memory allocation failed for "
   7238                                 "responseCdmaInformationRecords");
   7239                         return 0;
   7240                     }
   7241                     memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
   7242                     string8[(int)infoRec->rec.display.alpha_len] = '\0';
   7243 
   7244                     record->display.resize(1);
   7245                     record->display[0].alphaBuf = string8;
   7246                     free(string8);
   7247                     string8 = NULL;
   7248                     break;
   7249                 }
   7250 
   7251                 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
   7252                 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
   7253                 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
   7254                     if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   7255                         RLOGE("cdmaInfoRecInd: invalid display info response length %d "
   7256                                 "expected not more than %d", (int) infoRec->rec.number.len,
   7257                                 CDMA_NUMBER_INFO_BUFFER_LENGTH);
   7258                         return 0;
   7259                     }
   7260                     string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
   7261                     if (string8 == NULL) {
   7262                         RLOGE("cdmaInfoRecInd: Memory allocation failed for "
   7263                                 "responseCdmaInformationRecords");
   7264                         return 0;
   7265                     }
   7266                     memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
   7267                     string8[(int)infoRec->rec.number.len] = '\0';
   7268 
   7269                     record->number.resize(1);
   7270                     record->number[0].number = string8;
   7271                     free(string8);
   7272                     string8 = NULL;
   7273                     record->number[0].numberType = infoRec->rec.number.number_type;
   7274                     record->number[0].numberPlan = infoRec->rec.number.number_plan;
   7275                     record->number[0].pi = infoRec->rec.number.pi;
   7276                     record->number[0].si = infoRec->rec.number.si;
   7277                     break;
   7278                 }
   7279 
   7280                 case RIL_CDMA_SIGNAL_INFO_REC: {
   7281                     record->signal.resize(1);
   7282                     record->signal[0].isPresent = infoRec->rec.signal.isPresent;
   7283                     record->signal[0].signalType = infoRec->rec.signal.signalType;
   7284                     record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
   7285                     record->signal[0].signal = infoRec->rec.signal.signal;
   7286                     break;
   7287                 }
   7288 
   7289                 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
   7290                     if (infoRec->rec.redir.redirectingNumber.len >
   7291                                                   CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   7292                         RLOGE("cdmaInfoRecInd: invalid display info response length %d "
   7293                                 "expected not more than %d\n",
   7294                                 (int)infoRec->rec.redir.redirectingNumber.len,
   7295                                 CDMA_NUMBER_INFO_BUFFER_LENGTH);
   7296                         return 0;
   7297                     }
   7298                     string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
   7299                             sizeof(char));
   7300                     if (string8 == NULL) {
   7301                         RLOGE("cdmaInfoRecInd: Memory allocation failed for "
   7302                                 "responseCdmaInformationRecords");
   7303                         return 0;
   7304                     }
   7305                     memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
   7306                             infoRec->rec.redir.redirectingNumber.len);
   7307                     string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
   7308 
   7309                     record->redir.resize(1);
   7310                     record->redir[0].redirectingNumber.number = string8;
   7311                     free(string8);
   7312                     string8 = NULL;
   7313                     record->redir[0].redirectingNumber.numberType =
   7314                             infoRec->rec.redir.redirectingNumber.number_type;
   7315                     record->redir[0].redirectingNumber.numberPlan =
   7316                             infoRec->rec.redir.redirectingNumber.number_plan;
   7317                     record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
   7318                     record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
   7319                     record->redir[0].redirectingReason =
   7320                             (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
   7321                     break;
   7322                 }
   7323 
   7324                 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
   7325                     record->lineCtrl.resize(1);
   7326                     record->lineCtrl[0].lineCtrlPolarityIncluded =
   7327                             infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
   7328                     record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
   7329                     record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
   7330                     record->lineCtrl[0].lineCtrlPowerDenial =
   7331                             infoRec->rec.lineCtrl.lineCtrlPowerDenial;
   7332                     break;
   7333                 }
   7334 
   7335                 case RIL_CDMA_T53_CLIR_INFO_REC: {
   7336                     record->clir.resize(1);
   7337                     record->clir[0].cause = infoRec->rec.clir.cause;
   7338                     break;
   7339                 }
   7340 
   7341                 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
   7342                     record->audioCtrl.resize(1);
   7343                     record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
   7344                     record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
   7345                     break;
   7346                 }
   7347 
   7348                 case RIL_CDMA_T53_RELEASE_INFO_REC:
   7349                     RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
   7350                     return 0;
   7351 
   7352                 default:
   7353                     RLOGE("cdmaInfoRecInd: Incorrect name value");
   7354                     return 0;
   7355             }
   7356         }
   7357 
   7358 #if VDBG
   7359         RLOGD("cdmaInfoRecInd");
   7360 #endif
   7361         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
   7362                 convertIntToRadioIndicationType(indicationType), records);
   7363         radioService[slotId]->checkReturnStatus(retStatus);
   7364     } else {
   7365         RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7366     }
   7367 
   7368     return 0;
   7369 }
   7370 
   7371 int radio::indicateRingbackToneInd(int slotId,
   7372                                    int indicationType, int token, RIL_Errno e, void *response,
   7373                                    size_t responseLen) {
   7374     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7375         if (response == NULL || responseLen != sizeof(int)) {
   7376             RLOGE("indicateRingbackToneInd: invalid response");
   7377             return 0;
   7378         }
   7379         bool start = ((int32_t *) response)[0];
   7380 #if VDBG
   7381         RLOGD("indicateRingbackToneInd: start %d", start);
   7382 #endif
   7383         Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
   7384                 convertIntToRadioIndicationType(indicationType), start);
   7385         radioService[slotId]->checkReturnStatus(retStatus);
   7386     } else {
   7387         RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7388     }
   7389 
   7390     return 0;
   7391 }
   7392 
   7393 int radio::resendIncallMuteInd(int slotId,
   7394                                int indicationType, int token, RIL_Errno e, void *response,
   7395                                size_t responseLen) {
   7396     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7397 #if VDBG
   7398         RLOGD("resendIncallMuteInd");
   7399 #endif
   7400         Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
   7401                 convertIntToRadioIndicationType(indicationType));
   7402         radioService[slotId]->checkReturnStatus(retStatus);
   7403     } else {
   7404         RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7405     }
   7406 
   7407     return 0;
   7408 }
   7409 
   7410 int radio::cdmaSubscriptionSourceChangedInd(int slotId,
   7411                                             int indicationType, int token, RIL_Errno e,
   7412                                             void *response, size_t responseLen) {
   7413     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7414         if (response == NULL || responseLen != sizeof(int)) {
   7415             RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
   7416             return 0;
   7417         }
   7418         int32_t cdmaSource = ((int32_t *) response)[0];
   7419 #if VDBG
   7420         RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
   7421 #endif
   7422         Return<void> retStatus = radioService[slotId]->mRadioIndication->
   7423                 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
   7424                 (CdmaSubscriptionSource) cdmaSource);
   7425         radioService[slotId]->checkReturnStatus(retStatus);
   7426     } else {
   7427         RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
   7428                 slotId);
   7429     }
   7430 
   7431     return 0;
   7432 }
   7433 
   7434 int radio::cdmaPrlChangedInd(int slotId,
   7435                              int indicationType, int token, RIL_Errno e, void *response,
   7436                              size_t responseLen) {
   7437     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7438         if (response == NULL || responseLen != sizeof(int)) {
   7439             RLOGE("cdmaPrlChangedInd: invalid response");
   7440             return 0;
   7441         }
   7442         int32_t version = ((int32_t *) response)[0];
   7443 #if VDBG
   7444         RLOGD("cdmaPrlChangedInd: version %d", version);
   7445 #endif
   7446         Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
   7447                 convertIntToRadioIndicationType(indicationType), version);
   7448         radioService[slotId]->checkReturnStatus(retStatus);
   7449     } else {
   7450         RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7451     }
   7452 
   7453     return 0;
   7454 }
   7455 
   7456 int radio::exitEmergencyCallbackModeInd(int slotId,
   7457                                         int indicationType, int token, RIL_Errno e, void *response,
   7458                                         size_t responseLen) {
   7459     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7460 #if VDBG
   7461         RLOGD("exitEmergencyCallbackModeInd");
   7462 #endif
   7463         Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
   7464                 convertIntToRadioIndicationType(indicationType));
   7465         radioService[slotId]->checkReturnStatus(retStatus);
   7466     } else {
   7467         RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
   7468                 slotId);
   7469     }
   7470 
   7471     return 0;
   7472 }
   7473 
   7474 int radio::rilConnectedInd(int slotId,
   7475                            int indicationType, int token, RIL_Errno e, void *response,
   7476                            size_t responseLen) {
   7477     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7478         RLOGD("rilConnectedInd");
   7479         Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
   7480                 convertIntToRadioIndicationType(indicationType));
   7481         radioService[slotId]->checkReturnStatus(retStatus);
   7482     } else {
   7483         RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7484     }
   7485 
   7486     return 0;
   7487 }
   7488 
   7489 int radio::voiceRadioTechChangedInd(int slotId,
   7490                                     int indicationType, int token, RIL_Errno e, void *response,
   7491                                     size_t responseLen) {
   7492     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7493         if (response == NULL || responseLen != sizeof(int)) {
   7494             RLOGE("voiceRadioTechChangedInd: invalid response");
   7495             return 0;
   7496         }
   7497         int32_t rat = ((int32_t *) response)[0];
   7498 #if VDBG
   7499         RLOGD("voiceRadioTechChangedInd: rat %d", rat);
   7500 #endif
   7501         Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
   7502                 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
   7503         radioService[slotId]->checkReturnStatus(retStatus);
   7504     } else {
   7505         RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
   7506                 slotId);
   7507     }
   7508 
   7509     return 0;
   7510 }
   7511 
   7512 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
   7513     int num = responseLen / sizeof(RIL_CellInfo_v12);
   7514     records.resize(num);
   7515 
   7516     RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
   7517     for (int i = 0; i < num; i++) {
   7518         records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
   7519         records[i].registered = rillCellInfo->registered;
   7520         records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
   7521         records[i].timeStamp = rillCellInfo->timeStamp;
   7522         // All vectors should be size 0 except one which will be size 1. Set everything to
   7523         // size 0 initially.
   7524         records[i].gsm.resize(0);
   7525         records[i].wcdma.resize(0);
   7526         records[i].cdma.resize(0);
   7527         records[i].lte.resize(0);
   7528         records[i].tdscdma.resize(0);
   7529         switch(rillCellInfo->cellInfoType) {
   7530             case RIL_CELL_INFO_TYPE_GSM: {
   7531                 records[i].gsm.resize(1);
   7532                 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
   7533                 cellInfoGsm->cellIdentityGsm.mcc =
   7534                         std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
   7535                 cellInfoGsm->cellIdentityGsm.mnc =
   7536                         std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
   7537                 cellInfoGsm->cellIdentityGsm.lac =
   7538                         rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
   7539                 cellInfoGsm->cellIdentityGsm.cid =
   7540                         rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
   7541                 cellInfoGsm->cellIdentityGsm.arfcn =
   7542                         rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
   7543                 cellInfoGsm->cellIdentityGsm.bsic =
   7544                         rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
   7545                 cellInfoGsm->signalStrengthGsm.signalStrength =
   7546                         rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
   7547                 cellInfoGsm->signalStrengthGsm.bitErrorRate =
   7548                         rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
   7549                 cellInfoGsm->signalStrengthGsm.timingAdvance =
   7550                         rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
   7551                 break;
   7552             }
   7553 
   7554             case RIL_CELL_INFO_TYPE_WCDMA: {
   7555                 records[i].wcdma.resize(1);
   7556                 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
   7557                 cellInfoWcdma->cellIdentityWcdma.mcc =
   7558                         std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
   7559                 cellInfoWcdma->cellIdentityWcdma.mnc =
   7560                         std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
   7561                 cellInfoWcdma->cellIdentityWcdma.lac =
   7562                         rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
   7563                 cellInfoWcdma->cellIdentityWcdma.cid =
   7564                         rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
   7565                 cellInfoWcdma->cellIdentityWcdma.psc =
   7566                         rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
   7567                 cellInfoWcdma->cellIdentityWcdma.uarfcn =
   7568                         rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
   7569                 cellInfoWcdma->signalStrengthWcdma.signalStrength =
   7570                         rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
   7571                 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
   7572                         rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
   7573                 break;
   7574             }
   7575 
   7576             case RIL_CELL_INFO_TYPE_CDMA: {
   7577                 records[i].cdma.resize(1);
   7578                 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
   7579                 cellInfoCdma->cellIdentityCdma.networkId =
   7580                         rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
   7581                 cellInfoCdma->cellIdentityCdma.systemId =
   7582                         rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
   7583                 cellInfoCdma->cellIdentityCdma.baseStationId =
   7584                         rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
   7585                 cellInfoCdma->cellIdentityCdma.longitude =
   7586                         rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
   7587                 cellInfoCdma->cellIdentityCdma.latitude =
   7588                         rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
   7589                 cellInfoCdma->signalStrengthCdma.dbm =
   7590                         rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
   7591                 cellInfoCdma->signalStrengthCdma.ecio =
   7592                         rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
   7593                 cellInfoCdma->signalStrengthEvdo.dbm =
   7594                         rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
   7595                 cellInfoCdma->signalStrengthEvdo.ecio =
   7596                         rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
   7597                 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
   7598                         rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
   7599                 break;
   7600             }
   7601 
   7602             case RIL_CELL_INFO_TYPE_LTE: {
   7603                 records[i].lte.resize(1);
   7604                 CellInfoLte *cellInfoLte = &records[i].lte[0];
   7605                 cellInfoLte->cellIdentityLte.mcc =
   7606                         std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
   7607                 cellInfoLte->cellIdentityLte.mnc =
   7608                         std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
   7609                 cellInfoLte->cellIdentityLte.ci =
   7610                         rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
   7611                 cellInfoLte->cellIdentityLte.pci =
   7612                         rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
   7613                 cellInfoLte->cellIdentityLte.tac =
   7614                         rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
   7615                 cellInfoLte->cellIdentityLte.earfcn =
   7616                         rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
   7617                 cellInfoLte->signalStrengthLte.signalStrength =
   7618                         rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
   7619                 cellInfoLte->signalStrengthLte.rsrp =
   7620                         rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
   7621                 cellInfoLte->signalStrengthLte.rsrq =
   7622                         rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
   7623                 cellInfoLte->signalStrengthLte.rssnr =
   7624                         rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
   7625                 cellInfoLte->signalStrengthLte.cqi =
   7626                         rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
   7627                 cellInfoLte->signalStrengthLte.timingAdvance =
   7628                         rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
   7629                 break;
   7630             }
   7631 
   7632             case RIL_CELL_INFO_TYPE_TD_SCDMA: {
   7633                 records[i].tdscdma.resize(1);
   7634                 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
   7635                 cellInfoTdscdma->cellIdentityTdscdma.mcc =
   7636                         std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
   7637                 cellInfoTdscdma->cellIdentityTdscdma.mnc =
   7638                         std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
   7639                 cellInfoTdscdma->cellIdentityTdscdma.lac =
   7640                         rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
   7641                 cellInfoTdscdma->cellIdentityTdscdma.cid =
   7642                         rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
   7643                 cellInfoTdscdma->cellIdentityTdscdma.cpid =
   7644                         rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
   7645                 cellInfoTdscdma->signalStrengthTdscdma.rscp =
   7646                         rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
   7647                 break;
   7648             }
   7649             default: {
   7650                 break;
   7651             }
   7652         }
   7653         rillCellInfo += 1;
   7654     }
   7655 }
   7656 
   7657 int radio::cellInfoListInd(int slotId,
   7658                            int indicationType, int token, RIL_Errno e, void *response,
   7659                            size_t responseLen) {
   7660     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7661         if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
   7662             RLOGE("cellInfoListInd: invalid response");
   7663             return 0;
   7664         }
   7665 
   7666         hidl_vec<CellInfo> records;
   7667         convertRilCellInfoListToHal(response, responseLen, records);
   7668 
   7669 #if VDBG
   7670         RLOGD("cellInfoListInd");
   7671 #endif
   7672         Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
   7673                 convertIntToRadioIndicationType(indicationType), records);
   7674         radioService[slotId]->checkReturnStatus(retStatus);
   7675     } else {
   7676         RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7677     }
   7678 
   7679     return 0;
   7680 }
   7681 
   7682 int radio::imsNetworkStateChangedInd(int slotId,
   7683                                      int indicationType, int token, RIL_Errno e, void *response,
   7684                                      size_t responseLen) {
   7685     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7686 #if VDBG
   7687         RLOGD("imsNetworkStateChangedInd");
   7688 #endif
   7689         Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
   7690                 convertIntToRadioIndicationType(indicationType));
   7691         radioService[slotId]->checkReturnStatus(retStatus);
   7692     } else {
   7693         RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
   7694                 slotId);
   7695     }
   7696 
   7697     return 0;
   7698 }
   7699 
   7700 int radio::subscriptionStatusChangedInd(int slotId,
   7701                                         int indicationType, int token, RIL_Errno e, void *response,
   7702                                         size_t responseLen) {
   7703     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7704         if (response == NULL || responseLen != sizeof(int)) {
   7705             RLOGE("subscriptionStatusChangedInd: invalid response");
   7706             return 0;
   7707         }
   7708         bool activate = ((int32_t *) response)[0];
   7709 #if VDBG
   7710         RLOGD("subscriptionStatusChangedInd: activate %d", activate);
   7711 #endif
   7712         Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
   7713                 convertIntToRadioIndicationType(indicationType), activate);
   7714         radioService[slotId]->checkReturnStatus(retStatus);
   7715     } else {
   7716         RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
   7717                 slotId);
   7718     }
   7719 
   7720     return 0;
   7721 }
   7722 
   7723 int radio::srvccStateNotifyInd(int slotId,
   7724                                int indicationType, int token, RIL_Errno e, void *response,
   7725                                size_t responseLen) {
   7726     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7727         if (response == NULL || responseLen != sizeof(int)) {
   7728             RLOGE("srvccStateNotifyInd: invalid response");
   7729             return 0;
   7730         }
   7731         int32_t state = ((int32_t *) response)[0];
   7732 #if VDBG
   7733         RLOGD("srvccStateNotifyInd: rat %d", state);
   7734 #endif
   7735         Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
   7736                 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
   7737         radioService[slotId]->checkReturnStatus(retStatus);
   7738     } else {
   7739         RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7740     }
   7741 
   7742     return 0;
   7743 }
   7744 
   7745 void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
   7746         hidl_vec<HardwareConfig>& records) {
   7747     int num = responseLen / sizeof(RIL_HardwareConfig);
   7748     records.resize(num);
   7749 
   7750     RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
   7751     for (int i = 0; i < num; i++) {
   7752         records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
   7753         records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
   7754         records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
   7755         switch (rilHardwareConfig[i].type) {
   7756             case RIL_HARDWARE_CONFIG_MODEM: {
   7757                 records[i].modem.resize(1);
   7758                 records[i].sim.resize(0);
   7759                 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
   7760                 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
   7761                 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
   7762                 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
   7763                 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
   7764                 break;
   7765             }
   7766 
   7767             case RIL_HARDWARE_CONFIG_SIM: {
   7768                 records[i].sim.resize(1);
   7769                 records[i].modem.resize(0);
   7770                 records[i].sim[0].modemUuid =
   7771                         convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
   7772                 break;
   7773             }
   7774         }
   7775     }
   7776 }
   7777 
   7778 int radio::hardwareConfigChangedInd(int slotId,
   7779                                     int indicationType, int token, RIL_Errno e, void *response,
   7780                                     size_t responseLen) {
   7781     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7782         if ((response == NULL && responseLen != 0)
   7783                 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
   7784             RLOGE("hardwareConfigChangedInd: invalid response");
   7785             return 0;
   7786         }
   7787 
   7788         hidl_vec<HardwareConfig> configs;
   7789         convertRilHardwareConfigListToHal(response, responseLen, configs);
   7790 
   7791 #if VDBG
   7792         RLOGD("hardwareConfigChangedInd");
   7793 #endif
   7794         Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
   7795                 convertIntToRadioIndicationType(indicationType), configs);
   7796         radioService[slotId]->checkReturnStatus(retStatus);
   7797     } else {
   7798         RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
   7799                 slotId);
   7800     }
   7801 
   7802     return 0;
   7803 }
   7804 
   7805 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
   7806     RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
   7807     rc.session = rilRadioCapability->session;
   7808     rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
   7809     rc.raf = rilRadioCapability->rat;
   7810     rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
   7811     rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
   7812 }
   7813 
   7814 int radio::radioCapabilityIndicationInd(int slotId,
   7815                                         int indicationType, int token, RIL_Errno e, void *response,
   7816                                         size_t responseLen) {
   7817     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7818         if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
   7819             RLOGE("radioCapabilityIndicationInd: invalid response");
   7820             return 0;
   7821         }
   7822 
   7823         RadioCapability rc = {};
   7824         convertRilRadioCapabilityToHal(response, responseLen, rc);
   7825 
   7826 #if VDBG
   7827         RLOGD("radioCapabilityIndicationInd");
   7828 #endif
   7829         Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
   7830                 convertIntToRadioIndicationType(indicationType), rc);
   7831         radioService[slotId]->checkReturnStatus(retStatus);
   7832     } else {
   7833         RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
   7834                 slotId);
   7835     }
   7836 
   7837     return 0;
   7838 }
   7839 
   7840 bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
   7841     if ((reqType == SS_INTERROGATION) &&
   7842         (serType == SS_CFU ||
   7843          serType == SS_CF_BUSY ||
   7844          serType == SS_CF_NO_REPLY ||
   7845          serType == SS_CF_NOT_REACHABLE ||
   7846          serType == SS_CF_ALL ||
   7847          serType == SS_CF_ALL_CONDITIONAL)) {
   7848         return true;
   7849     }
   7850     return false;
   7851 }
   7852 
   7853 int radio::onSupplementaryServiceIndicationInd(int slotId,
   7854                                                int indicationType, int token, RIL_Errno e,
   7855                                                void *response, size_t responseLen) {
   7856     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7857         if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
   7858             RLOGE("onSupplementaryServiceIndicationInd: invalid response");
   7859             return 0;
   7860         }
   7861 
   7862         RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
   7863         StkCcUnsolSsResult ss = {};
   7864         ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
   7865         ss.requestType = (SsRequestType) rilSsResponse->requestType;
   7866         ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
   7867         ss.serviceClass = rilSsResponse->serviceClass;
   7868         ss.result = (RadioError) rilSsResponse->result;
   7869 
   7870         if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
   7871 #if VDBG
   7872             RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
   7873                     rilSsResponse->cfData.numValidIndexes);
   7874 #endif
   7875             if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
   7876                 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
   7877                         "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
   7878                 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
   7879             }
   7880 
   7881             ss.cfData.resize(1);
   7882             ss.ssInfo.resize(0);
   7883 
   7884             /* number of call info's */
   7885             ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
   7886 
   7887             for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
   7888                  RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
   7889                  CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
   7890 
   7891                  cfInfo->status = (CallForwardInfoStatus) cf.status;
   7892                  cfInfo->reason = cf.reason;
   7893                  cfInfo->serviceClass = cf.serviceClass;
   7894                  cfInfo->toa = cf.toa;
   7895                  cfInfo->number = convertCharPtrToHidlString(cf.number);
   7896                  cfInfo->timeSeconds = cf.timeSeconds;
   7897 #if VDBG
   7898                  RLOGD("onSupplementaryServiceIndicationInd: "
   7899                         "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
   7900                         cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
   7901 #endif
   7902             }
   7903         } else {
   7904             ss.ssInfo.resize(1);
   7905             ss.cfData.resize(0);
   7906 
   7907             /* each int */
   7908             ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
   7909             for (int i = 0; i < SS_INFO_MAX; i++) {
   7910 #if VDBG
   7911                  RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
   7912                         rilSsResponse->ssInfo[i]);
   7913 #endif
   7914                  ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
   7915             }
   7916         }
   7917 
   7918 #if VDBG
   7919         RLOGD("onSupplementaryServiceIndicationInd");
   7920 #endif
   7921         Return<void> retStatus = radioService[slotId]->mRadioIndication->
   7922                 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
   7923                 ss);
   7924         radioService[slotId]->checkReturnStatus(retStatus);
   7925     } else {
   7926         RLOGE("onSupplementaryServiceIndicationInd: "
   7927                 "radioService[%d]->mRadioIndication == NULL", slotId);
   7928     }
   7929 
   7930     return 0;
   7931 }
   7932 
   7933 int radio::stkCallControlAlphaNotifyInd(int slotId,
   7934                                         int indicationType, int token, RIL_Errno e, void *response,
   7935                                         size_t responseLen) {
   7936     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7937         if (response == NULL || responseLen == 0) {
   7938             RLOGE("stkCallControlAlphaNotifyInd: invalid response");
   7939             return 0;
   7940         }
   7941 #if VDBG
   7942         RLOGD("stkCallControlAlphaNotifyInd");
   7943 #endif
   7944         Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
   7945                 convertIntToRadioIndicationType(indicationType),
   7946                 convertCharPtrToHidlString((char *) response));
   7947         radioService[slotId]->checkReturnStatus(retStatus);
   7948     } else {
   7949         RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
   7950                 slotId);
   7951     }
   7952 
   7953     return 0;
   7954 }
   7955 
   7956 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
   7957     RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
   7958     lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
   7959     lce.confidenceLevel = rilLceDataInfo->confidence_level;
   7960     lce.lceSuspended = rilLceDataInfo->lce_suspended;
   7961 }
   7962 
   7963 int radio::lceDataInd(int slotId,
   7964                       int indicationType, int token, RIL_Errno e, void *response,
   7965                       size_t responseLen) {
   7966     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7967         if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
   7968             RLOGE("lceDataInd: invalid response");
   7969             return 0;
   7970         }
   7971 
   7972         LceDataInfo lce = {};
   7973         convertRilLceDataInfoToHal(response, responseLen, lce);
   7974 #if VDBG
   7975         RLOGD("lceDataInd");
   7976 #endif
   7977         Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
   7978                 convertIntToRadioIndicationType(indicationType), lce);
   7979         radioService[slotId]->checkReturnStatus(retStatus);
   7980     } else {
   7981         RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
   7982     }
   7983 
   7984     return 0;
   7985 }
   7986 
   7987 int radio::pcoDataInd(int slotId,
   7988                       int indicationType, int token, RIL_Errno e, void *response,
   7989                       size_t responseLen) {
   7990     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   7991         if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
   7992             RLOGE("pcoDataInd: invalid response");
   7993             return 0;
   7994         }
   7995 
   7996         PcoDataInfo pco = {};
   7997         RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
   7998         pco.cid = rilPcoData->cid;
   7999         pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
   8000         pco.pcoId = rilPcoData->pco_id;
   8001         pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
   8002 
   8003 #if VDBG
   8004         RLOGD("pcoDataInd");
   8005 #endif
   8006         Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
   8007                 convertIntToRadioIndicationType(indicationType), pco);
   8008         radioService[slotId]->checkReturnStatus(retStatus);
   8009     } else {
   8010         RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
   8011     }
   8012 
   8013     return 0;
   8014 }
   8015 
   8016 int radio::modemResetInd(int slotId,
   8017                          int indicationType, int token, RIL_Errno e, void *response,
   8018                          size_t responseLen) {
   8019     if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
   8020         if (response == NULL || responseLen == 0) {
   8021             RLOGE("modemResetInd: invalid response");
   8022             return 0;
   8023         }
   8024 #if VDBG
   8025         RLOGD("modemResetInd");
   8026 #endif
   8027         Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
   8028                 convertIntToRadioIndicationType(indicationType),
   8029                 convertCharPtrToHidlString((char *) response));
   8030         radioService[slotId]->checkReturnStatus(retStatus);
   8031     } else {
   8032         RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
   8033     }
   8034 
   8035     return 0;
   8036 }
   8037 
   8038 int radio::oemHookRawInd(int slotId,
   8039                          int indicationType, int token, RIL_Errno e, void *response,
   8040                          size_t responseLen) {
   8041     if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
   8042         if (response == NULL || responseLen == 0) {
   8043             RLOGE("oemHookRawInd: invalid response");
   8044             return 0;
   8045         }
   8046 
   8047         hidl_vec<uint8_t> data;
   8048         data.setToExternal((uint8_t *) response, responseLen);
   8049 #if VDBG
   8050         RLOGD("oemHookRawInd");
   8051 #endif
   8052         Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
   8053                 convertIntToRadioIndicationType(indicationType), data);
   8054         checkReturnStatus(slotId, retStatus, false);
   8055     } else {
   8056         RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
   8057     }
   8058 
   8059     return 0;
   8060 }
   8061 
   8062 void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
   8063     using namespace android::hardware;
   8064     int simCount = 1;
   8065     const char *serviceNames[] = {
   8066             android::RIL_getServiceName()
   8067             #if (SIM_COUNT >= 2)
   8068             , RIL2_SERVICE_NAME
   8069             #if (SIM_COUNT >= 3)
   8070             , RIL3_SERVICE_NAME
   8071             #if (SIM_COUNT >= 4)
   8072             , RIL4_SERVICE_NAME
   8073             #endif
   8074             #endif
   8075             #endif
   8076             };
   8077 
   8078     #if (SIM_COUNT >= 2)
   8079     simCount = SIM_COUNT;
   8080     #endif
   8081 
   8082     configureRpcThreadpool(1, true /* callerWillJoin */);
   8083     for (int i = 0; i < simCount; i++) {
   8084         pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
   8085         int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
   8086         assert(ret == 0);
   8087 
   8088         radioService[i] = new RadioImpl;
   8089         radioService[i]->mSlotId = i;
   8090         oemHookService[i] = new OemHookImpl;
   8091         oemHookService[i]->mSlotId = i;
   8092         RLOGD("registerService: starting IRadio %s", serviceNames[i]);
   8093         android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
   8094         status = oemHookService[i]->registerAsService(serviceNames[i]);
   8095 
   8096         ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
   8097         assert(ret == 0);
   8098     }
   8099 
   8100     s_vendorFunctions = callbacks;
   8101     s_commands = commands;
   8102 }
   8103 
   8104 void rilc_thread_pool() {
   8105     joinRpcThreadpool();
   8106 }
   8107 
   8108 pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
   8109     pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
   8110 
   8111     #if (SIM_COUNT >= 2)
   8112     if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
   8113     #if (SIM_COUNT >= 3)
   8114     if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
   8115     #if (SIM_COUNT >= 4)
   8116     if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
   8117     #endif
   8118     #endif
   8119     #endif
   8120 
   8121     return radioServiceRwlockPtr;
   8122 }
   8123