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}