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 "RIL_SAP"
     18 
     19 #include <android/hardware/radio/1.1/ISap.h>
     20 
     21 #include <hwbinder/IPCThreadState.h>
     22 #include <hwbinder/ProcessState.h>
     23 #include <sap_service.h>
     24 #include "pb_decode.h"
     25 #include "pb_encode.h"
     26 
     27 using namespace android::hardware::radio::V1_0;
     28 using ::android::hardware::Return;
     29 using ::android::hardware::hidl_vec;
     30 using ::android::hardware::hidl_array;
     31 using ::android::hardware::Void;
     32 using android::CommandInfo;
     33 using android::RequestInfo;
     34 using android::requestToString;
     35 using android::sp;
     36 
     37 struct SapImpl;
     38 
     39 #if (SIM_COUNT >= 2)
     40 sp<SapImpl> sapService[SIM_COUNT];
     41 #else
     42 sp<SapImpl> sapService[1];
     43 #endif
     44 
     45 struct SapImpl : public android::hardware::radio::V1_1::ISap {
     46     int32_t slotId;
     47     sp<ISapCallback> sapCallback;
     48     RIL_SOCKET_ID rilSocketId;
     49 
     50     Return<void> setCallback(const ::android::sp<ISapCallback>& sapCallbackParam);
     51 
     52     Return<void> connectReq(int32_t token, int32_t maxMsgSize);
     53 
     54     Return<void> disconnectReq(int32_t token);
     55 
     56     Return<void> apduReq(int32_t token, SapApduType type, const hidl_vec<uint8_t>& command);
     57 
     58     Return<void> transferAtrReq(int32_t token);
     59 
     60     Return<void> powerReq(int32_t token, bool state);
     61 
     62     Return<void> resetSimReq(int32_t token);
     63 
     64     Return<void> transferCardReaderStatusReq(int32_t token);
     65 
     66     Return<void> setTransferProtocolReq(int32_t token, SapTransferProtocol transferProtocol);
     67 
     68     MsgHeader* createMsgHeader(MsgId msgId, int32_t token);
     69 
     70     Return<void> addPayloadAndDispatchRequest(MsgHeader *msg, uint16_t reqLen, uint8_t *reqPtr);
     71 
     72     void sendFailedResponse(MsgId msgId, int32_t token, int numPointers, ...);
     73 
     74     void checkReturnStatus(Return<void>& ret);
     75 };
     76 
     77 void SapImpl::checkReturnStatus(Return<void>& ret) {
     78     if (ret.isOk() == false) {
     79         RLOGE("checkReturnStatus: unable to call response/indication callback: %s",
     80                 ret.description().c_str());
     81         // Remote process (SapRilReceiver.java) hosting the callback must be dead. Reset the
     82         // callback object; there's no other recovery to be done here. When the client process is
     83         // back up, it will call setCallback()
     84         sapCallback = NULL;
     85     }
     86 }
     87 
     88 Return<void> SapImpl::setCallback(const ::android::sp<ISapCallback>& sapCallbackParam) {
     89     RLOGD("SapImpl::setCallback for slotId %d", slotId);
     90     sapCallback = sapCallbackParam;
     91     return Void();
     92 }
     93 
     94 MsgHeader* SapImpl::createMsgHeader(MsgId msgId, int32_t token) {
     95     // Memory for msg will be freed by RilSapSocket::onRequestComplete()
     96     MsgHeader *msg = (MsgHeader *)calloc(1, sizeof(MsgHeader));
     97     if (msg == NULL) {
     98         return NULL;
     99     }
    100     msg->token = token;
    101     msg->type = MsgType_REQUEST;
    102     msg->id = msgId;
    103     msg->error = Error_RIL_E_SUCCESS;
    104     return msg;
    105 }
    106 
    107 Return<void> SapImpl::addPayloadAndDispatchRequest(MsgHeader *msg, uint16_t reqLen,
    108         uint8_t *reqPtr) {
    109     msg->payload = (pb_bytes_array_t *)malloc(sizeof(pb_bytes_array_t) - 1 + reqLen);
    110     if (msg->payload == NULL) {
    111         sendFailedResponse(msg->id, msg->token, 2, reqPtr, msg);
    112         return Void();
    113     }
    114     msg->payload->size = reqLen;
    115     memcpy(msg->payload->bytes, reqPtr, reqLen);
    116 
    117     RilSapSocket *sapSocket = RilSapSocket::getSocketById(rilSocketId);
    118     if (sapSocket) {
    119         RLOGD("SapImpl::addPayloadAndDispatchRequest: calling dispatchRequest");
    120         sapSocket->dispatchRequest(msg);
    121     } else {
    122         RLOGE("SapImpl::addPayloadAndDispatchRequest: sapSocket is null");
    123         sendFailedResponse(msg->id, msg->token, 3, msg->payload, reqPtr, msg);
    124         return Void();
    125     }
    126     free(msg->payload);
    127     free(reqPtr);
    128     return Void();
    129 }
    130 
    131 void SapImpl::sendFailedResponse(MsgId msgId, int32_t token, int numPointers, ...) {
    132     va_list ap;
    133     va_start(ap, numPointers);
    134     for (int i = 0; i < numPointers; i++) {
    135         void *ptr = va_arg(ap, void *);
    136         if (ptr) free(ptr);
    137     }
    138     va_end(ap);
    139     Return<void> retStatus;
    140     switch(msgId) {
    141         case MsgId_RIL_SIM_SAP_CONNECT:
    142             retStatus = sapCallback->connectResponse(token, SapConnectRsp::CONNECT_FAILURE, 0);
    143             break;
    144 
    145         case MsgId_RIL_SIM_SAP_DISCONNECT:
    146             retStatus = sapCallback->disconnectResponse(token);
    147             break;
    148 
    149         case MsgId_RIL_SIM_SAP_APDU: {
    150             hidl_vec<uint8_t> apduRsp;
    151             retStatus = sapCallback->apduResponse(token, SapResultCode::GENERIC_FAILURE, apduRsp);
    152             break;
    153         }
    154 
    155         case MsgId_RIL_SIM_SAP_TRANSFER_ATR: {
    156             hidl_vec<uint8_t> atr;
    157             retStatus = sapCallback->transferAtrResponse(token, SapResultCode::GENERIC_FAILURE,
    158                     atr);
    159             break;
    160         }
    161 
    162         case MsgId_RIL_SIM_SAP_POWER:
    163             retStatus = sapCallback->powerResponse(token, SapResultCode::GENERIC_FAILURE);
    164             break;
    165 
    166         case MsgId_RIL_SIM_SAP_RESET_SIM:
    167             retStatus = sapCallback->resetSimResponse(token, SapResultCode::GENERIC_FAILURE);
    168             break;
    169 
    170         case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS:
    171             retStatus = sapCallback->transferCardReaderStatusResponse(token,
    172                     SapResultCode::GENERIC_FAILURE, 0);
    173             break;
    174 
    175         case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL:
    176             retStatus = sapCallback->transferProtocolResponse(token, SapResultCode::NOT_SUPPORTED);
    177             break;
    178 
    179         default:
    180             return;
    181     }
    182     sapService[slotId]->checkReturnStatus(retStatus);
    183 }
    184 
    185 Return<void> SapImpl::connectReq(int32_t token, int32_t maxMsgSize) {
    186     RLOGD("SapImpl::connectReq");
    187     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_CONNECT, token);
    188     if (msg == NULL) {
    189         RLOGE("SapImpl::connectReq: Error allocating memory for msg");
    190         sendFailedResponse(MsgId_RIL_SIM_SAP_CONNECT, token, 0);
    191         return Void();
    192     }
    193 
    194     /***** Encode RIL_SIM_SAP_CONNECT_REQ *****/
    195     RIL_SIM_SAP_CONNECT_REQ req;
    196     memset(&req, 0, sizeof(RIL_SIM_SAP_CONNECT_REQ));
    197     req.max_message_size = maxMsgSize;
    198 
    199     size_t encodedSize = 0;
    200     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_CONNECT_REQ_fields, &req)) {
    201         RLOGE("SapImpl::connectReq: Error getting encoded size for RIL_SIM_SAP_CONNECT_REQ");
    202         sendFailedResponse(MsgId_RIL_SIM_SAP_CONNECT, token, 1, msg);
    203         return Void();
    204     }
    205 
    206     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    207     if (buffer == NULL) {
    208         RLOGE("SapImpl::connectReq: Error allocating memory for buffer");
    209         sendFailedResponse(MsgId_RIL_SIM_SAP_CONNECT, token, 1, msg);
    210         return Void();
    211     }
    212     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    213 
    214     RLOGD("SapImpl::connectReq calling pb_encode");
    215     if (!pb_encode(&stream, RIL_SIM_SAP_CONNECT_REQ_fields, &req)) {
    216         RLOGE("SapImpl::connectReq: Error encoding RIL_SIM_SAP_CONNECT_REQ");
    217         sendFailedResponse(MsgId_RIL_SIM_SAP_CONNECT, token, 2, buffer, msg);
    218         return Void();
    219     }
    220     /***** Encode RIL_SIM_SAP_CONNECT_REQ done *****/
    221 
    222     /* encoded req is payload */
    223     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    224 }
    225 
    226 Return<void> SapImpl::disconnectReq(int32_t token) {
    227     RLOGD("SapImpl::disconnectReq");
    228     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_DISCONNECT, token);
    229     if (msg == NULL) {
    230         RLOGE("SapImpl::disconnectReq: Error allocating memory for msg");
    231         sendFailedResponse(MsgId_RIL_SIM_SAP_DISCONNECT, token, 0);
    232         return Void();
    233     }
    234 
    235     /***** Encode RIL_SIM_SAP_DISCONNECT_REQ *****/
    236     RIL_SIM_SAP_DISCONNECT_REQ req;
    237     memset(&req, 0, sizeof(RIL_SIM_SAP_DISCONNECT_REQ));
    238 
    239     size_t encodedSize = 0;
    240     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_DISCONNECT_REQ_fields, &req)) {
    241         RLOGE("SapImpl::disconnectReq: Error getting encoded size for RIL_SIM_SAP_DISCONNECT_REQ");
    242         sendFailedResponse(MsgId_RIL_SIM_SAP_DISCONNECT, token, 1, msg);
    243         return Void();
    244     }
    245 
    246     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    247     if (buffer == NULL) {
    248         RLOGE("SapImpl::disconnectReq: Error allocating memory for buffer");
    249         sendFailedResponse(MsgId_RIL_SIM_SAP_DISCONNECT, token, 1, msg);
    250         return Void();
    251     }
    252 
    253     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    254 
    255     RLOGD("SapImpl::disconnectReq calling pb_encode");
    256     if (!pb_encode(&stream, RIL_SIM_SAP_DISCONNECT_REQ_fields, &req)) {
    257         RLOGE("SapImpl::disconnectReq: Error encoding RIL_SIM_SAP_DISCONNECT_REQ");
    258         sendFailedResponse(MsgId_RIL_SIM_SAP_DISCONNECT, token, 2, buffer, msg);
    259         return Void();
    260     }
    261     /***** Encode RIL_SIM_SAP_DISCONNECT_REQ done *****/
    262 
    263     /* encoded req is payload */
    264     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    265 }
    266 
    267 Return<void> SapImpl::apduReq(int32_t token, SapApduType type, const hidl_vec<uint8_t>& command) {
    268     RLOGD("SapImpl::apduReq");
    269     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_APDU, token);
    270     if (msg == NULL) {
    271         RLOGE("SapImpl::apduReq: Error allocating memory for msg");
    272         sendFailedResponse(MsgId_RIL_SIM_SAP_APDU, token, 0);
    273         return Void();
    274     }
    275 
    276     /***** Encode RIL_SIM_SAP_APDU_REQ *****/
    277     RIL_SIM_SAP_APDU_REQ req;
    278     memset(&req, 0, sizeof(RIL_SIM_SAP_APDU_REQ));
    279     req.type = (RIL_SIM_SAP_APDU_REQ_Type)type;
    280 
    281     if (command.size() > 0) {
    282         req.command = (pb_bytes_array_t *)malloc(sizeof(pb_bytes_array_t) - 1 + command.size());
    283         if (req.command == NULL) {
    284             RLOGE("SapImpl::apduReq: Error allocating memory for req.command");
    285             sendFailedResponse(MsgId_RIL_SIM_SAP_APDU, token, 1, msg);
    286             return Void();
    287         }
    288         req.command->size = command.size();
    289         memcpy(req.command->bytes, command.data(), command.size());
    290     }
    291 
    292     size_t encodedSize = 0;
    293     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_APDU_REQ_fields, &req)) {
    294         RLOGE("SapImpl::apduReq: Error getting encoded size for RIL_SIM_SAP_APDU_REQ");
    295         sendFailedResponse(MsgId_RIL_SIM_SAP_APDU, token, 2, req.command, msg);
    296         return Void();
    297     }
    298 
    299     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    300     if (buffer == NULL) {
    301         RLOGE("SapImpl::apduReq: Error allocating memory for buffer");
    302         sendFailedResponse(MsgId_RIL_SIM_SAP_APDU, token, 2, req.command, msg);
    303         return Void();
    304     }
    305 
    306     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    307 
    308     RLOGD("SapImpl::apduReq calling pb_encode");
    309     if (!pb_encode(&stream, RIL_SIM_SAP_APDU_REQ_fields, &req)) {
    310         RLOGE("SapImpl::apduReq: Error encoding RIL_SIM_SAP_APDU_REQ");
    311         sendFailedResponse(MsgId_RIL_SIM_SAP_APDU, token, 3, req.command, buffer, msg);
    312         return Void();
    313     }
    314     /***** Encode RIL_SIM_SAP_APDU_REQ done *****/
    315 
    316     /* encoded req is payload */
    317     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    318 }
    319 
    320 Return<void> SapImpl::transferAtrReq(int32_t token) {
    321     RLOGD("SapImpl::transferAtrReq");
    322     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token);
    323     if (msg == NULL) {
    324         RLOGE("SapImpl::transferAtrReq: Error allocating memory for msg");
    325         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 0);
    326         return Void();
    327     }
    328 
    329     /***** Encode RIL_SIM_SAP_TRANSFER_ATR_REQ *****/
    330     RIL_SIM_SAP_TRANSFER_ATR_REQ req;
    331     memset(&req, 0, sizeof(RIL_SIM_SAP_TRANSFER_ATR_REQ));
    332 
    333     size_t encodedSize = 0;
    334     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_TRANSFER_ATR_REQ_fields, &req)) {
    335         RLOGE("SapImpl::transferAtrReq: Error getting encoded size for "
    336                 "RIL_SIM_SAP_TRANSFER_ATR_REQ");
    337         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 1, msg);
    338         return Void();
    339     }
    340 
    341     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    342     if (buffer == NULL) {
    343         RLOGE("SapImpl::transferAtrReq: Error allocating memory for buffer");
    344         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 1, msg);
    345         return Void();
    346     }
    347 
    348     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    349 
    350     RLOGD("SapImpl::transferAtrReq calling pb_encode");
    351     if (!pb_encode(&stream, RIL_SIM_SAP_TRANSFER_ATR_REQ_fields, &req)) {
    352         RLOGE("SapImpl::transferAtrReq: Error encoding RIL_SIM_SAP_TRANSFER_ATR_REQ");
    353         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 2, buffer, msg);
    354         return Void();
    355     }
    356     /***** Encode RIL_SIM_SAP_TRANSFER_ATR_REQ done *****/
    357 
    358     /* encoded req is payload */
    359     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    360 }
    361 
    362 Return<void> SapImpl::powerReq(int32_t token, bool state) {
    363     RLOGD("SapImpl::powerReq");
    364     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_POWER, token);
    365     if (msg == NULL) {
    366         RLOGE("SapImpl::powerReq: Error allocating memory for msg");
    367         sendFailedResponse(MsgId_RIL_SIM_SAP_POWER, token, 0);
    368         return Void();
    369     }
    370 
    371     /***** Encode RIL_SIM_SAP_POWER_REQ *****/
    372     RIL_SIM_SAP_POWER_REQ req;
    373     memset(&req, 0, sizeof(RIL_SIM_SAP_POWER_REQ));
    374     req.state = state;
    375 
    376     size_t encodedSize = 0;
    377     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_POWER_REQ_fields, &req)) {
    378         RLOGE("SapImpl::powerReq: Error getting encoded size for RIL_SIM_SAP_POWER_REQ");
    379         sendFailedResponse(MsgId_RIL_SIM_SAP_POWER, token, 1, msg);
    380         return Void();
    381     }
    382 
    383     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    384     if (buffer == NULL) {
    385         RLOGE("SapImpl::powerReq: Error allocating memory for buffer");
    386         sendFailedResponse(MsgId_RIL_SIM_SAP_POWER, token, 1, msg);
    387         return Void();
    388     }
    389 
    390     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    391 
    392     RLOGD("SapImpl::powerReq calling pb_encode");
    393     if (!pb_encode(&stream, RIL_SIM_SAP_POWER_REQ_fields, &req)) {
    394         RLOGE("SapImpl::powerReq: Error encoding RIL_SIM_SAP_POWER_REQ");
    395         sendFailedResponse(MsgId_RIL_SIM_SAP_POWER, token, 2, buffer, msg);
    396         return Void();
    397     }
    398     /***** Encode RIL_SIM_SAP_POWER_REQ done *****/
    399 
    400     /* encoded req is payload */
    401     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    402 }
    403 
    404 Return<void> SapImpl::resetSimReq(int32_t token) {
    405     RLOGD("SapImpl::resetSimReq");
    406     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_RESET_SIM, token);
    407     if (msg == NULL) {
    408         RLOGE("SapImpl::resetSimReq: Error allocating memory for msg");
    409         sendFailedResponse(MsgId_RIL_SIM_SAP_RESET_SIM, token, 0);
    410         return Void();
    411     }
    412 
    413     /***** Encode RIL_SIM_SAP_RESET_SIM_REQ *****/
    414     RIL_SIM_SAP_RESET_SIM_REQ req;
    415     memset(&req, 0, sizeof(RIL_SIM_SAP_RESET_SIM_REQ));
    416 
    417     size_t encodedSize = 0;
    418     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_RESET_SIM_REQ_fields, &req)) {
    419         RLOGE("SapImpl::resetSimReq: Error getting encoded size for RIL_SIM_SAP_RESET_SIM_REQ");
    420         sendFailedResponse(MsgId_RIL_SIM_SAP_RESET_SIM, token, 1, msg);
    421         return Void();
    422     }
    423 
    424     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    425     if (buffer == NULL) {
    426         RLOGE("SapImpl::resetSimReq: Error allocating memory for buffer");
    427         sendFailedResponse(MsgId_RIL_SIM_SAP_RESET_SIM, token, 1, msg);
    428         return Void();
    429     }
    430 
    431     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    432 
    433     RLOGD("SapImpl::resetSimReq calling pb_encode");
    434     if (!pb_encode(&stream, RIL_SIM_SAP_RESET_SIM_REQ_fields, &req)) {
    435         RLOGE("SapImpl::resetSimReq: Error encoding RIL_SIM_SAP_RESET_SIM_REQ");
    436         sendFailedResponse(MsgId_RIL_SIM_SAP_RESET_SIM, token, 2, buffer, msg);
    437         return Void();
    438     }
    439     /***** Encode RIL_SIM_SAP_RESET_SIM_REQ done *****/
    440 
    441     /* encoded req is payload */
    442     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    443 }
    444 
    445 Return<void> SapImpl::transferCardReaderStatusReq(int32_t token) {
    446     RLOGD("SapImpl::transferCardReaderStatusReq");
    447     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token);
    448     if (msg == NULL) {
    449         RLOGE("SapImpl::transferCardReaderStatusReq: Error allocating memory for msg");
    450         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 0);
    451         return Void();
    452     }
    453 
    454     /***** Encode RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ *****/
    455     RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ req;
    456     memset(&req, 0, sizeof(RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ));
    457 
    458     size_t encodedSize = 0;
    459     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ_fields,
    460             &req)) {
    461         RLOGE("SapImpl::transferCardReaderStatusReq: Error getting encoded size for "
    462                 "RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ");
    463         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 1, msg);
    464         return Void();
    465     }
    466 
    467     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    468     if (buffer == NULL) {
    469         RLOGE("SapImpl::transferCardReaderStatusReq: Error allocating memory for buffer");
    470         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 1, msg);
    471         return Void();
    472     }
    473 
    474     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    475 
    476     RLOGD("SapImpl::transferCardReaderStatusReq calling pb_encode");
    477     if (!pb_encode(&stream, RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ_fields, &req)) {
    478         RLOGE("SapImpl::transferCardReaderStatusReq: Error encoding "
    479                 "RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ");
    480         sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 2, buffer, msg);
    481         return Void();
    482     }
    483     /***** Encode RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ done *****/
    484 
    485     /* encoded req is payload */
    486     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    487 }
    488 
    489 Return<void> SapImpl::setTransferProtocolReq(int32_t token, SapTransferProtocol transferProtocol) {
    490     RLOGD("SapImpl::setTransferProtocolReq");
    491     MsgHeader *msg = createMsgHeader(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token);
    492     if (msg == NULL) {
    493         RLOGE("SapImpl::setTransferProtocolReq: Error allocating memory for msg");
    494         sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 0);
    495         return Void();
    496     }
    497 
    498     /***** Encode RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ *****/
    499     RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ req;
    500     memset(&req, 0, sizeof(RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ));
    501     req.protocol = (RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ_Protocol)transferProtocol;
    502 
    503     size_t encodedSize = 0;
    504     if (!pb_get_encoded_size(&encodedSize, RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ_fields, &req)) {
    505         RLOGE("SapImpl::setTransferProtocolReq: Error getting encoded size for "
    506                 "RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ");
    507         sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 1, msg);
    508         return Void();
    509     }
    510 
    511     uint8_t *buffer = (uint8_t *)calloc(1, encodedSize);
    512     if (buffer == NULL) {
    513         RLOGE("SapImpl::setTransferProtocolReq: Error allocating memory for buffer");
    514         sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 1, msg);
    515         return Void();
    516     }
    517 
    518     pb_ostream_t stream = pb_ostream_from_buffer(buffer, encodedSize);
    519 
    520     RLOGD("SapImpl::setTransferProtocolReq calling pb_encode");
    521     if (!pb_encode(&stream, RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ_fields, &req)) {
    522         RLOGE("SapImpl::setTransferProtocolReq: Error encoding "
    523                 "RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ");
    524         sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 2, buffer, msg);
    525         return Void();
    526     }
    527     /***** Encode RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ done *****/
    528 
    529     /* encoded req is payload */
    530     return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
    531 }
    532 
    533 void *sapDecodeMessage(MsgId msgId, MsgType msgType, uint8_t *payloadPtr, size_t payloadLen) {
    534     void *responsePtr = NULL;
    535     pb_istream_t stream;
    536 
    537     /* Create the stream */
    538     stream = pb_istream_from_buffer((uint8_t *)payloadPtr, payloadLen);
    539 
    540     /* Decode based on the message id */
    541     switch (msgId)
    542     {
    543         case MsgId_RIL_SIM_SAP_CONNECT:
    544             responsePtr = malloc(sizeof(RIL_SIM_SAP_CONNECT_RSP));
    545             if (responsePtr) {
    546                 if (!pb_decode(&stream, RIL_SIM_SAP_CONNECT_RSP_fields, responsePtr)) {
    547                     RLOGE("Error decoding RIL_SIM_SAP_CONNECT_RSP");
    548                     return NULL;
    549                 }
    550             }
    551             break;
    552 
    553         case MsgId_RIL_SIM_SAP_DISCONNECT:
    554             if (msgType == MsgType_RESPONSE) {
    555                 responsePtr = malloc(sizeof(RIL_SIM_SAP_DISCONNECT_RSP));
    556                 if (responsePtr) {
    557                     if (!pb_decode(&stream, RIL_SIM_SAP_DISCONNECT_RSP_fields, responsePtr)) {
    558                         RLOGE("Error decoding RIL_SIM_SAP_DISCONNECT_RSP");
    559                         return NULL;
    560                     }
    561                 }
    562             } else {
    563                 responsePtr = malloc(sizeof(RIL_SIM_SAP_DISCONNECT_IND));
    564                 if (responsePtr) {
    565                     if (!pb_decode(&stream, RIL_SIM_SAP_DISCONNECT_IND_fields, responsePtr)) {
    566                         RLOGE("Error decoding RIL_SIM_SAP_DISCONNECT_IND");
    567                         return NULL;
    568                     }
    569                 }
    570             }
    571             break;
    572 
    573         case MsgId_RIL_SIM_SAP_APDU:
    574             responsePtr = malloc(sizeof(RIL_SIM_SAP_APDU_RSP));
    575             if (responsePtr) {
    576                 if (!pb_decode(&stream, RIL_SIM_SAP_APDU_RSP_fields, responsePtr)) {
    577                     RLOGE("Error decoding RIL_SIM_SAP_APDU_RSP");
    578                     return NULL;
    579                 }
    580             }
    581             break;
    582 
    583         case MsgId_RIL_SIM_SAP_TRANSFER_ATR:
    584             responsePtr = malloc(sizeof(RIL_SIM_SAP_TRANSFER_ATR_RSP));
    585             if (responsePtr) {
    586                 if (!pb_decode(&stream, RIL_SIM_SAP_TRANSFER_ATR_RSP_fields, responsePtr)) {
    587                     RLOGE("Error decoding RIL_SIM_SAP_TRANSFER_ATR_RSP");
    588                     return NULL;
    589                 }
    590             }
    591             break;
    592 
    593         case MsgId_RIL_SIM_SAP_POWER:
    594             responsePtr = malloc(sizeof(RIL_SIM_SAP_POWER_RSP));
    595             if (responsePtr) {
    596                 if (!pb_decode(&stream, RIL_SIM_SAP_POWER_RSP_fields, responsePtr)) {
    597                     RLOGE("Error decoding RIL_SIM_SAP_POWER_RSP");
    598                     return NULL;
    599                 }
    600             }
    601             break;
    602 
    603         case MsgId_RIL_SIM_SAP_RESET_SIM:
    604             responsePtr = malloc(sizeof(RIL_SIM_SAP_RESET_SIM_RSP));
    605             if (responsePtr) {
    606                 if (!pb_decode(&stream, RIL_SIM_SAP_RESET_SIM_RSP_fields, responsePtr)) {
    607                     RLOGE("Error decoding RIL_SIM_SAP_RESET_SIM_RSP");
    608                     return NULL;
    609                 }
    610             }
    611             break;
    612 
    613         case MsgId_RIL_SIM_SAP_STATUS:
    614             responsePtr = malloc(sizeof(RIL_SIM_SAP_STATUS_IND));
    615             if (responsePtr) {
    616                 if (!pb_decode(&stream, RIL_SIM_SAP_STATUS_IND_fields, responsePtr)) {
    617                     RLOGE("Error decoding RIL_SIM_SAP_STATUS_IND");
    618                     return NULL;
    619                 }
    620             }
    621             break;
    622 
    623         case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS:
    624             responsePtr = malloc(sizeof(RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP));
    625             if (responsePtr) {
    626                 if (!pb_decode(&stream, RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_fields,
    627                         responsePtr)) {
    628                     RLOGE("Error decoding RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP");
    629                     return NULL;
    630                 }
    631             }
    632             break;
    633 
    634         case MsgId_RIL_SIM_SAP_ERROR_RESP:
    635             responsePtr = malloc(sizeof(RIL_SIM_SAP_ERROR_RSP));
    636             if (responsePtr) {
    637                 if (!pb_decode(&stream, RIL_SIM_SAP_ERROR_RSP_fields, responsePtr)) {
    638                     RLOGE("Error decoding RIL_SIM_SAP_ERROR_RSP");
    639                     return NULL;
    640                 }
    641             }
    642             break;
    643 
    644         case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL:
    645             responsePtr = malloc(sizeof(RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP));
    646             if (responsePtr) {
    647                 if (!pb_decode(&stream, RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP_fields,
    648                         responsePtr)) {
    649                     RLOGE("Error decoding RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP");
    650                     return NULL;
    651                 }
    652             }
    653             break;
    654 
    655         default:
    656             break;
    657     }
    658     return responsePtr;
    659 } /* sapDecodeMessage */
    660 
    661 sp<SapImpl> getSapImpl(RilSapSocket *sapSocket) {
    662     switch (sapSocket->getSocketId()) {
    663         case RIL_SOCKET_1:
    664             RLOGD("getSapImpl: returning sapService[0]");
    665             return sapService[0];
    666         #if (SIM_COUNT >= 2)
    667         case RIL_SOCKET_2:
    668             return sapService[1];
    669         #if (SIM_COUNT >= 3)
    670         case RIL_SOCKET_3:
    671             return sapService[2];
    672         #if (SIM_COUNT >= 4)
    673         case RIL_SOCKET_4:
    674             return sapService[3];
    675         #endif
    676         #endif
    677         #endif
    678         default:
    679             return NULL;
    680     }
    681 }
    682 
    683 SapResultCode convertApduResponseProtoToHal(RIL_SIM_SAP_APDU_RSP_Response responseProto) {
    684     switch(responseProto) {
    685         case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SUCCESS:
    686             return SapResultCode::SUCCESS;
    687         case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_GENERIC_FAILURE:
    688             return SapResultCode::GENERIC_FAILURE;
    689         case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_NOT_READY:
    690             return SapResultCode::CARD_NOT_ACCESSSIBLE;
    691         case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
    692             return SapResultCode::CARD_ALREADY_POWERED_OFF;
    693         case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_ABSENT:
    694             return SapResultCode::CARD_REMOVED;
    695         default:
    696             return SapResultCode::GENERIC_FAILURE;
    697     }
    698 }
    699 
    700 SapResultCode convertTransferAtrResponseProtoToHal(
    701         RIL_SIM_SAP_TRANSFER_ATR_RSP_Response responseProto) {
    702     switch(responseProto) {
    703         case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SUCCESS:
    704             return SapResultCode::SUCCESS;
    705         case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_GENERIC_FAILURE:
    706             return SapResultCode::GENERIC_FAILURE;
    707         case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
    708             return SapResultCode::CARD_ALREADY_POWERED_OFF;
    709         case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_ABSENT:
    710             return SapResultCode::CARD_REMOVED;
    711         case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_DATA_NOT_AVAILABLE:
    712             return SapResultCode::DATA_NOT_AVAILABLE;
    713         default:
    714             return SapResultCode::GENERIC_FAILURE;
    715     }
    716 }
    717 
    718 SapResultCode convertPowerResponseProtoToHal(RIL_SIM_SAP_POWER_RSP_Response responseProto) {
    719     switch(responseProto) {
    720         case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SUCCESS:
    721             return SapResultCode::SUCCESS;
    722         case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_GENERIC_FAILURE:
    723             return SapResultCode::GENERIC_FAILURE;
    724         case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ABSENT:
    725             return SapResultCode::CARD_REMOVED;
    726         case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
    727             return SapResultCode::CARD_ALREADY_POWERED_OFF;
    728         case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ALREADY_POWERED_ON:
    729             return SapResultCode::CARD_ALREADY_POWERED_ON;
    730         default:
    731             return SapResultCode::GENERIC_FAILURE;
    732     }
    733 }
    734 
    735 SapResultCode convertResetSimResponseProtoToHal(RIL_SIM_SAP_RESET_SIM_RSP_Response responseProto) {
    736     switch(responseProto) {
    737         case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SUCCESS:
    738             return SapResultCode::SUCCESS;
    739         case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_GENERIC_FAILURE:
    740             return SapResultCode::GENERIC_FAILURE;
    741         case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_ABSENT:
    742             return SapResultCode::CARD_REMOVED;
    743         case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_NOT_READY:
    744             return SapResultCode::CARD_NOT_ACCESSSIBLE;
    745         case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
    746             return SapResultCode::CARD_ALREADY_POWERED_OFF;
    747     }
    748     return SapResultCode::GENERIC_FAILURE;
    749 }
    750 
    751 SapResultCode convertTransferCardReaderStatusResponseProtoToHal(
    752         RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response responseProto) {
    753     switch(responseProto) {
    754         case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_SUCCESS:
    755             return SapResultCode::SUCCESS;
    756         case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_GENERIC_FAILURE:
    757             return SapResultCode::GENERIC_FAILURE;
    758         case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_SIM_DATA_NOT_AVAILABLE:
    759             return SapResultCode::DATA_NOT_AVAILABLE;
    760     }
    761     return SapResultCode::GENERIC_FAILURE;
    762 }
    763 
    764 void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) {
    765     MsgId msgId = rsp->id;
    766     uint8_t *data = rsp->payload->bytes;
    767     size_t dataLen = rsp->payload->size;
    768 
    769     void *messagePtr = sapDecodeMessage(msgId, msgType, data, dataLen);
    770 
    771     sp<SapImpl> sapImpl = getSapImpl(sapSocket);
    772     if (sapImpl->sapCallback == NULL) {
    773         RLOGE("processResponse: sapCallback == NULL; msgId = %d; msgType = %d",
    774                 msgId, msgType);
    775         return;
    776     }
    777 
    778     if (messagePtr == NULL) {
    779         RLOGE("processResponse: *messagePtr == NULL; msgId = %d; msgType = %d",
    780                 msgId, msgType);
    781         sapImpl->sendFailedResponse(msgId, rsp->token, 0);
    782         return;
    783     }
    784 
    785     RLOGD("processResponse: sapCallback != NULL; msgId = %d; msgType = %d",
    786             msgId, msgType);
    787 
    788     Return<void> retStatus;
    789     switch (msgId) {
    790         case MsgId_RIL_SIM_SAP_CONNECT: {
    791             RIL_SIM_SAP_CONNECT_RSP *connectRsp = (RIL_SIM_SAP_CONNECT_RSP *)messagePtr;
    792             RLOGD("processResponse: calling sapCallback->connectResponse %d %d %d",
    793                     rsp->token,
    794                     connectRsp->response,
    795                     connectRsp->max_message_size);
    796             retStatus = sapImpl->sapCallback->connectResponse(rsp->token,
    797                     (SapConnectRsp)connectRsp->response,
    798                     connectRsp->max_message_size);
    799             break;
    800         }
    801 
    802         case MsgId_RIL_SIM_SAP_DISCONNECT:
    803             if (msgType == MsgType_RESPONSE) {
    804                 RLOGD("processResponse: calling sapCallback->disconnectResponse %d", rsp->token);
    805                 retStatus = sapImpl->sapCallback->disconnectResponse(rsp->token);
    806             } else {
    807                 RIL_SIM_SAP_DISCONNECT_IND *disconnectInd =
    808                         (RIL_SIM_SAP_DISCONNECT_IND *)messagePtr;
    809                 RLOGD("processResponse: calling sapCallback->disconnectIndication %d %d",
    810                         rsp->token, disconnectInd->disconnectType);
    811                 retStatus = sapImpl->sapCallback->disconnectIndication(rsp->token,
    812                         (SapDisconnectType)disconnectInd->disconnectType);
    813             }
    814             break;
    815 
    816         case MsgId_RIL_SIM_SAP_APDU: {
    817             RIL_SIM_SAP_APDU_RSP *apduRsp = (RIL_SIM_SAP_APDU_RSP *)messagePtr;
    818             SapResultCode apduResponse = convertApduResponseProtoToHal(apduRsp->response);
    819             RLOGD("processResponse: calling sapCallback->apduResponse %d %d",
    820                     rsp->token, apduResponse);
    821             hidl_vec<uint8_t> apduRspVec;
    822             if (apduRsp->apduResponse != NULL && apduRsp->apduResponse->size > 0) {
    823                 apduRspVec.setToExternal(apduRsp->apduResponse->bytes, apduRsp->apduResponse->size);
    824             }
    825             retStatus = sapImpl->sapCallback->apduResponse(rsp->token, apduResponse, apduRspVec);
    826             break;
    827         }
    828 
    829         case MsgId_RIL_SIM_SAP_TRANSFER_ATR: {
    830             RIL_SIM_SAP_TRANSFER_ATR_RSP *transferAtrRsp =
    831                 (RIL_SIM_SAP_TRANSFER_ATR_RSP *)messagePtr;
    832             SapResultCode transferAtrResponse =
    833                 convertTransferAtrResponseProtoToHal(transferAtrRsp->response);
    834             RLOGD("processResponse: calling sapCallback->transferAtrResponse %d %d",
    835                     rsp->token, transferAtrResponse);
    836             hidl_vec<uint8_t> transferAtrRspVec;
    837             if (transferAtrRsp->atr != NULL && transferAtrRsp->atr->size > 0) {
    838                 transferAtrRspVec.setToExternal(transferAtrRsp->atr->bytes,
    839                         transferAtrRsp->atr->size);
    840             }
    841             retStatus = sapImpl->sapCallback->transferAtrResponse(rsp->token, transferAtrResponse,
    842                     transferAtrRspVec);
    843             break;
    844         }
    845 
    846         case MsgId_RIL_SIM_SAP_POWER: {
    847             SapResultCode powerResponse = convertPowerResponseProtoToHal(
    848                     ((RIL_SIM_SAP_POWER_RSP *)messagePtr)->response);
    849             RLOGD("processResponse: calling sapCallback->powerResponse %d %d",
    850                     rsp->token, powerResponse);
    851             retStatus = sapImpl->sapCallback->powerResponse(rsp->token, powerResponse);
    852             break;
    853         }
    854 
    855         case MsgId_RIL_SIM_SAP_RESET_SIM: {
    856             SapResultCode resetSimResponse = convertResetSimResponseProtoToHal(
    857                     ((RIL_SIM_SAP_RESET_SIM_RSP *)messagePtr)->response);
    858             RLOGD("processResponse: calling sapCallback->resetSimResponse %d %d",
    859                     rsp->token, resetSimResponse);
    860             retStatus = sapImpl->sapCallback->resetSimResponse(rsp->token, resetSimResponse);
    861             break;
    862         }
    863 
    864         case MsgId_RIL_SIM_SAP_STATUS: {
    865             RIL_SIM_SAP_STATUS_IND *statusInd = (RIL_SIM_SAP_STATUS_IND *)messagePtr;
    866             RLOGD("processResponse: calling sapCallback->statusIndication %d %d",
    867                     rsp->token, statusInd->statusChange);
    868             retStatus = sapImpl->sapCallback->statusIndication(rsp->token,
    869                     (SapStatus)statusInd->statusChange);
    870             break;
    871         }
    872 
    873         case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS: {
    874             RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP *transferStatusRsp =
    875                     (RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP *)messagePtr;
    876             SapResultCode transferCardReaderStatusResponse =
    877                     convertTransferCardReaderStatusResponseProtoToHal(
    878                     transferStatusRsp->response);
    879             RLOGD("processResponse: calling sapCallback->transferCardReaderStatusResponse %d %d %d",
    880                     rsp->token,
    881                     transferCardReaderStatusResponse,
    882                     transferStatusRsp->CardReaderStatus);
    883             retStatus = sapImpl->sapCallback->transferCardReaderStatusResponse(rsp->token,
    884                     transferCardReaderStatusResponse,
    885                     transferStatusRsp->CardReaderStatus);
    886             break;
    887         }
    888 
    889         case MsgId_RIL_SIM_SAP_ERROR_RESP: {
    890             RLOGD("processResponse: calling sapCallback->errorResponse %d", rsp->token);
    891             retStatus = sapImpl->sapCallback->errorResponse(rsp->token);
    892             break;
    893         }
    894 
    895         case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL: {
    896             SapResultCode setTransferProtocolResponse;
    897             if (((RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP *)messagePtr)->response ==
    898                     RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP_Response_RIL_E_SUCCESS) {
    899                 setTransferProtocolResponse = SapResultCode::SUCCESS;
    900             } else {
    901                 setTransferProtocolResponse = SapResultCode::NOT_SUPPORTED;
    902             }
    903             RLOGD("processResponse: calling sapCallback->transferProtocolResponse %d %d",
    904                     rsp->token, setTransferProtocolResponse);
    905             retStatus = sapImpl->sapCallback->transferProtocolResponse(rsp->token,
    906                     setTransferProtocolResponse);
    907             break;
    908         }
    909 
    910         default:
    911             return;
    912     }
    913     sapImpl->checkReturnStatus(retStatus);
    914 }
    915 
    916 void sap::processResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {
    917     processResponse(rsp, sapSocket, MsgType_RESPONSE);
    918 }
    919 
    920 void sap::processUnsolResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {
    921     processResponse(rsp, sapSocket, MsgType_UNSOL_RESPONSE);
    922 }
    923 
    924 void sap::registerService(RIL_RadioFunctions *callbacks) {
    925     using namespace android::hardware;
    926     int simCount = 1;
    927     const char *serviceNames[] = {
    928         android::RIL_getServiceName()
    929         #if (SIM_COUNT >= 2)
    930         , RIL2_SERVICE_NAME
    931         #if (SIM_COUNT >= 3)
    932         , RIL3_SERVICE_NAME
    933         #if (SIM_COUNT >= 4)
    934         , RIL4_SERVICE_NAME
    935         #endif
    936         #endif
    937         #endif
    938     };
    939 
    940     RIL_SOCKET_ID socketIds[] = {
    941         RIL_SOCKET_1
    942         #if (SIM_COUNT >= 2)
    943         , RIL_SOCKET_2
    944         #if (SIM_COUNT >= 3)
    945         , RIL_SOCKET_3
    946         #if (SIM_COUNT >= 4)
    947         , RIL_SOCKET_4
    948         #endif
    949         #endif
    950         #endif
    951     };
    952     #if (SIM_COUNT >= 2)
    953     simCount = SIM_COUNT;
    954     #endif
    955 
    956     for (int i = 0; i < simCount; i++) {
    957         sapService[i] = new SapImpl;
    958         sapService[i]->slotId = i;
    959         sapService[i]->rilSocketId = socketIds[i];
    960         RLOGD("registerService: starting ISap %s for slotId %d", serviceNames[i], i);
    961         android::status_t status = sapService[i]->registerAsService(serviceNames[i]);
    962         RLOGD("registerService: started ISap %s status %d", serviceNames[i], status);
    963     }
    964 }
    965