127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty/*
227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* Copyright (C) 2014 The Android Open Source Project
327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty*
427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* Licensed under the Apache License, Version 2.0 (the "License");
527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* you may not use this file except in compliance with the License.
627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* You may obtain a copy of the License at
727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty*
827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty*     http://www.apache.org/licenses/LICENSE-2.0
927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty*
1027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* Unless required by applicable law or agreed to in writing, software
1127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* distributed under the License is distributed on an "AS IS" BASIS,
1227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* See the License for the specific language governing permissions and
1427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty* limitations under the License.
1527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty*/
1627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
1727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#define __STDC_LIMIT_MACROS
1827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include <stdint.h>
1927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#define RIL_SHLIB
2027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include "telephony/ril.h"
2127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include "RilSapSocket.h"
2227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include "pb_decode.h"
2327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include "pb_encode.h"
24f0c8ca7f09ed9a827e5c79e019526e8f2c77eeb4Sanket Padawe#undef LOG_TAG
2527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#define LOG_TAG "RIL_UIM_SOCKET"
2627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include <utils/Log.h>
2727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#include <arpa/inet.h>
281b1ec2dc592aa12d4bb5a3755658f1bbfcd1b171Vinit Deshpande#include <errno.h>
29c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan#include <sap_service.h>
3027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
31d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiakstatic RilSapSocket::RilSapSocketList *head = NULL;
3227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
3327976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyextern "C" void
3427976c479473bb772703fe4caa100e535e635e84Dheeraj ShettyRIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
3527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        const struct timeval *relativeTime);
3627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
3727976c479473bb772703fe4caa100e535e635e84Dheeraj Shettystruct RIL_Env RilSapSocket::uimRilEnv = {
3827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        .OnRequestComplete = RilSapSocket::sOnRequestComplete,
3927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        .OnUnsolicitedResponse = RilSapSocket::sOnUnsolicitedResponse,
4027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        .RequestTimedCallback = RIL_requestTimedCallback
4127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty};
4227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
4327976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::sOnRequestComplete (RIL_Token t,
4427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_Errno e,
4527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        void *response,
4627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        size_t responselen) {
4727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocket *sap_socket;
4827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    SapSocketRequest *request = (SapSocketRequest*) t;
4927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
5027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RLOGD("Socket id:%d", request->socketId);
5127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
5227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    sap_socket = getSocketById(request->socketId);
5327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
5427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    if (sap_socket) {
5527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        sap_socket->onRequestComplete(t,e,response,responselen);
5627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    } else {
5727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RLOGE("Invalid socket id");
58d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        if (request->curr->payload) {
59d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            free(request->curr->payload);
60d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        }
6127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        free(request->curr);
6227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        free(request);
6327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
6427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
6527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
6627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#if defined(ANDROID_MULTI_SIM)
6727976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::sOnUnsolicitedResponse(int unsolResponse,
6827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        const void *data,
6927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        size_t datalen,
7027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_SOCKET_ID socketId) {
7127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocket *sap_socket = getSocketById(socketId);
7227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    if (sap_socket) {
7327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
7427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
7527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
7627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#else
7727976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::sOnUnsolicitedResponse(int unsolResponse,
7827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty       const void *data,
7927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty       size_t datalen) {
8027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocket *sap_socket = getSocketById(RIL_SOCKET_1);
81b97624bca6d4cbe11fdf39f7868436e306f7dc33Naina Nalluri    if(sap_socket){
82b97624bca6d4cbe11fdf39f7868436e306f7dc33Naina Nalluri        sap_socket->onUnsolicitedResponse(unsolResponse, (void *)data, datalen);
83b97624bca6d4cbe11fdf39f7868436e306f7dc33Naina Nalluri    }
8427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
8527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#endif
8627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
8727976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::printList() {
8827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocketList *current = head;
8927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RLOGD("Printing socket list");
9027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    while(NULL != current) {
9127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RLOGD("SocketName:%s",current->socket->name);
9227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RLOGD("Socket id:%d",current->socket->id);
9327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        current = current->next;
9427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
9527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
9627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
9727976c479473bb772703fe4caa100e535e635e84Dheeraj ShettyRilSapSocket *RilSapSocket::getSocketById(RIL_SOCKET_ID socketId) {
9827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocket *sap_socket;
9927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocketList *current = head;
10027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
10127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RLOGD("Entered getSocketById");
10227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    printList();
10327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
10427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    while(NULL != current) {
10527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(socketId == current->socket->id) {
10627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            sap_socket = current->socket;
10727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            return sap_socket;
10827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
10927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        current = current->next;
11027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
11127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    return NULL;
11227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
11327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
11427976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::initSapSocket(const char *socketName,
11527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_RadioFunctions *uimFuncs) {
11627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
11735e9310a95df4fad4457d3cc91638bcae64fa415Amit Mahajan    if (strcmp(socketName, RIL1_SERVICE_NAME) == 0) {
11827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(!SocketExists(socketName)) {
11927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            addSocketToList(socketName, RIL_SOCKET_1, uimFuncs);
12027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
12127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
12227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
12327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#if (SIM_COUNT >= 2)
12435e9310a95df4fad4457d3cc91638bcae64fa415Amit Mahajan    if (strcmp(socketName, RIL2_SERVICE_NAME) == 0) {
12527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(!SocketExists(socketName)) {
12627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            addSocketToList(socketName, RIL_SOCKET_2, uimFuncs);
12727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
12827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
12927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#endif
13027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
13127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#if (SIM_COUNT >= 3)
13235e9310a95df4fad4457d3cc91638bcae64fa415Amit Mahajan    if (strcmp(socketName, RIL3_SERVICE_NAME) == 0) {
13327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(!SocketExists(socketName)) {
13427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            addSocketToList(socketName, RIL_SOCKET_3, uimFuncs);
13527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
13627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
13727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#endif
13827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
13927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#if (SIM_COUNT >= 4)
14035e9310a95df4fad4457d3cc91638bcae64fa415Amit Mahajan    if (strcmp(socketName, RIL4_SERVICE_NAME) == 0) {
14127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(!SocketExists(socketName)) {
14227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            addSocketToList(socketName, RIL_SOCKET_4, uimFuncs);
14327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
14427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
14527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#endif
14627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
14727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
14827976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::addSocketToList(const char *socketName, RIL_SOCKET_ID socketid,
14927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_RadioFunctions *uimFuncs) {
15027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocket* socket = NULL;
15127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocketList *current;
15227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
15327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    if(!SocketExists(socketName)) {
15427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        socket = new RilSapSocket(socketName, socketid, uimFuncs);
155d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        RilSapSocketList* listItem = (RilSapSocketList*)malloc(sizeof(RilSapSocketList));
156d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        if (!listItem) {
157d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            RLOGE("addSocketToList: OOM");
1580c04956323491500b8f7628a5f3abbc553b77e19Yunlian Jiang            delete socket;
159d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            return;
160d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        }
16127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        listItem->socket = socket;
16227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        listItem->next = NULL;
16327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
16427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RLOGD("Adding socket with id: %d", socket->id);
16527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
16627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(NULL == head) {
16727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            head = listItem;
16827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            head->next = NULL;
16927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
17027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        else {
17127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            current = head;
17227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            while(NULL != current->next) {
17327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty                current = current->next;
17427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            }
17527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            current->next = listItem;
17627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
17727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
17827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
17927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
18027976c479473bb772703fe4caa100e535e635e84Dheeraj Shettybool RilSapSocket::SocketExists(const char *socketName) {
18127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    RilSapSocketList* current = head;
18227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
18327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    while(NULL != current) {
18427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        if(strcmp(current->socket->name, socketName) == 0) {
18527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty            return true;
18627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        }
18727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        current = current->next;
18827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
18927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    return false;
19027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
19127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
19227976c479473bb772703fe4caa100e535e635e84Dheeraj ShettyRilSapSocket::RilSapSocket(const char *socketName,
19327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_SOCKET_ID socketId,
19427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RIL_RadioFunctions *inputUimFuncs):
19527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        RilSocket(socketName, socketId) {
19627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    if (inputUimFuncs) {
19727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        uimFuncs = inputUimFuncs;
19827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
19927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
20027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
20127976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::dispatchRequest(MsgHeader *req) {
202d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    // SapSocketRequest will be deallocated in onRequestComplete()
20327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    SapSocketRequest* currRequest=(SapSocketRequest*)malloc(sizeof(SapSocketRequest));
204d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    if (!currRequest) {
205d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        RLOGE("dispatchRequest: OOM");
206d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        // Free MsgHeader allocated in pushRecord()
207d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        free(req);
208d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        return;
209d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    }
21027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    currRequest->token = req->token;
21127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    currRequest->curr = req;
21227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    currRequest->p_next = NULL;
21327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    currRequest->socketId = id;
21427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
21527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    pendingResponseQueue.enqueue(currRequest);
21627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
21727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    if (uimFuncs) {
218c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan        RLOGI("RilSapSocket::dispatchRequest [%d] > SAP REQUEST type: %d. id: %d. error: %d, \
219c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                token 0x%p",
220c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                req->token,
221c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                req->type,
222c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                req->id,
223c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                req->error,
224c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                currRequest );
22527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
22627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#if defined(ANDROID_MULTI_SIM)
22727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        uimFuncs->onRequest(req->id, req->payload->bytes, req->payload->size, currRequest, id);
22827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#else
22927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        uimFuncs->onRequest(req->id, req->payload->bytes, req->payload->size, currRequest);
23027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty#endif
23127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
23227976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
23327976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
23427976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::onRequestComplete(RIL_Token t, RIL_Errno e, void *response,
23527976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        size_t response_len) {
23627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    SapSocketRequest* request= (SapSocketRequest*)t;
23727976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    MsgHeader *hdr = request->curr;
23827976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
239638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    MsgHeader rsp;
240638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    rsp.token = request->curr->token;
241638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    rsp.type = MsgType_RESPONSE;
242638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    rsp.id = request->curr->id;
243638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    rsp.error = (Error)e;
244638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    rsp.payload = (pb_bytes_array_t *)calloc(1, sizeof(pb_bytes_array_t) + response_len);
245638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    if (!rsp.payload) {
246638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe        RLOGE("onRequestComplete: OOM");
247638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe    } else {
248638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe        if (response && response_len > 0) {
249d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            memcpy(rsp.payload->bytes, response, response_len);
250d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            rsp.payload->size = response_len;
251638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe        } else {
252638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe            rsp.payload->size = 0;
253638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe        }
25427976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
255c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan        RLOGE("RilSapSocket::onRequestComplete: Token:%d, MessageId:%d ril token 0x%p",
256c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan                hdr->token, hdr->id, t);
257d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak
258c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan        sap::processResponse(&rsp, this);
259638a723ac3b12068e4e5ca44e640db382c0d46ebSanket Padawe        free(rsp.payload);
260d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    }
26127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
262d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    // Deallocate SapSocketRequest
263d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    if(!pendingResponseQueue.checkAndDequeue(hdr->id, hdr->token)) {
264d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        RLOGE("Token:%d, MessageId:%d", hdr->token, hdr->id);
265d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        RLOGE ("RilSapSocket::onRequestComplete: invalid Token or Message Id");
26627976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
267d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak
268d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    // Deallocate MsgHeader
269d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    free(hdr);
27027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty}
27127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty
27227976c479473bb772703fe4caa100e535e635e84Dheeraj Shettyvoid RilSapSocket::onUnsolicitedResponse(int unsolResponse, void *data, size_t datalen) {
273d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak    if (data && datalen > 0) {
274d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        pb_bytes_array_t *payload = (pb_bytes_array_t *)calloc(1,
275d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak                sizeof(pb_bytes_array_t) + datalen);
276d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        if (!payload) {
277d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            RLOGE("onUnsolicitedResponse: OOM");
278d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak            return;
279d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        }
28027976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        memcpy(payload->bytes, data, datalen);
28127976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty        payload->size = datalen;
282d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        MsgHeader rsp;
283d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        rsp.payload = payload;
284d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        rsp.type = MsgType_UNSOL_RESPONSE;
285d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        rsp.id = (MsgId)unsolResponse;
286d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        rsp.error = Error_RIL_E_SUCCESS;
287c2c71858445ae70310d11c15efaf035b4fdfcf3cAmit Mahajan        sap::processUnsolResponse(&rsp, this);
288d33397bed7bab16991d2a9d83d84d157b1e02b29Pavel Zhamaitsiak        free(payload);
28927976c479473bb772703fe4caa100e535e635e84Dheeraj Shetty    }
2904cc508a73ca9860956d3d14e400c79d095ad95efAmit Mahajan}