blob: 29c2f38b6264305ae4a045f31e1bf0a3130c691c [file] [log] [blame]
Amit Mahajan2056e962016-11-29 16:48:54 -08001/*
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
Amit Mahajan34b33aa2017-03-01 11:13:15 -080017#define LOG_TAG "RIL_SAP"
18
Amit Mahajan2056e962016-11-29 16:48:54 -080019#include <android/hardware/radio/1.0/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
27using namespace android::hardware::radio::V1_0;
28using ::android::hardware::Return;
Amit Mahajan2056e962016-11-29 16:48:54 -080029using ::android::hardware::hidl_vec;
30using ::android::hardware::hidl_array;
31using ::android::hardware::Void;
32using android::CommandInfo;
33using android::RequestInfo;
34using android::requestToString;
35using android::sp;
36
37struct SapImpl;
38
39#if (SIM_COUNT >= 2)
40sp<SapImpl> sapService[SIM_COUNT];
41#else
42sp<SapImpl> sapService[1];
43#endif
44
45struct SapImpl : public 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, ...);
Amit Mahajane40b5ac2017-02-13 11:58:11 -080073
74 void checkReturnStatus(Return<void>& ret);
Amit Mahajan2056e962016-11-29 16:48:54 -080075};
76
Amit Mahajane40b5ac2017-02-13 11:58:11 -080077void SapImpl::checkReturnStatus(Return<void>& ret) {
78 if (ret.isOk() == false) {
Steven Morelandb9a6eee2017-03-28 08:55:58 -070079 RLOGE("checkReturnStatus: unable to call response/indication callback: %s",
80 ret.description().c_str());
Amit Mahajane40b5ac2017-02-13 11:58:11 -080081 // 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
Amit Mahajan2056e962016-11-29 16:48:54 -080088Return<void> SapImpl::setCallback(const ::android::sp<ISapCallback>& sapCallbackParam) {
89 RLOGD("SapImpl::setCallback for slotId %d", slotId);
90 sapCallback = sapCallbackParam;
Amit Mahajan7db975b2017-03-13 17:01:05 -070091 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -080092}
93
94MsgHeader* 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
107Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700112 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800113 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700124 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800125 }
126 free(msg->payload);
127 free(reqPtr);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700128 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800129}
130
131void 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);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800139 Return<void> retStatus;
Amit Mahajan2056e962016-11-29 16:48:54 -0800140 switch(msgId) {
141 case MsgId_RIL_SIM_SAP_CONNECT:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800142 retStatus = sapCallback->connectResponse(token, SapConnectRsp::CONNECT_FAILURE, 0);
143 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800144
145 case MsgId_RIL_SIM_SAP_DISCONNECT:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800146 retStatus = sapCallback->disconnectResponse(token);
147 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800148
149 case MsgId_RIL_SIM_SAP_APDU: {
150 hidl_vec<uint8_t> apduRsp;
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800151 retStatus = sapCallback->apduResponse(token, SapResultCode::GENERIC_FAILURE, apduRsp);
152 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800153 }
154
155 case MsgId_RIL_SIM_SAP_TRANSFER_ATR: {
156 hidl_vec<uint8_t> atr;
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800157 retStatus = sapCallback->transferAtrResponse(token, SapResultCode::GENERIC_FAILURE,
158 atr);
159 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800160 }
161
162 case MsgId_RIL_SIM_SAP_POWER:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800163 retStatus = sapCallback->powerResponse(token, SapResultCode::GENERIC_FAILURE);
164 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800165
166 case MsgId_RIL_SIM_SAP_RESET_SIM:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800167 retStatus = sapCallback->resetSimResponse(token, SapResultCode::GENERIC_FAILURE);
168 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800169
170 case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800171 retStatus = sapCallback->transferCardReaderStatusResponse(token,
172 SapResultCode::GENERIC_FAILURE, 0);
173 break;
Amit Mahajan2056e962016-11-29 16:48:54 -0800174
175 case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800176 retStatus = sapCallback->transferProtocolResponse(token, SapResultCode::NOT_SUPPORTED);
177 break;
178
Wei Wang100ac9b2017-02-03 14:18:07 -0800179 default:
180 return;
Amit Mahajan2056e962016-11-29 16:48:54 -0800181 }
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800182 sapService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2056e962016-11-29 16:48:54 -0800183}
184
185Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700191 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800192 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700203 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800204 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700210 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800211 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700218 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800219 }
220 /***** Encode RIL_SIM_SAP_CONNECT_REQ done *****/
221
222 /* encoded req is payload */
223 return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
224}
225
226Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700232 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800233 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700243 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800244 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700250 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800251 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700259 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800260 }
261 /***** Encode RIL_SIM_SAP_DISCONNECT_REQ done *****/
262
263 /* encoded req is payload */
264 return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
265}
266
267Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700273 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800274 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700286 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800287 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700296 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800297 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700303 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800304 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700312 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800313 }
314 /***** Encode RIL_SIM_SAP_APDU_REQ done *****/
315
316 /* encoded req is payload */
317 return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
318}
319
320Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700326 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800327 }
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)) {
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800335 RLOGE("SapImpl::transferAtrReq: Error getting encoded size for "
336 "RIL_SIM_SAP_TRANSFER_ATR_REQ");
Amit Mahajan2056e962016-11-29 16:48:54 -0800337 sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_ATR, token, 1, msg);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700338 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800339 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700345 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800346 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700354 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800355 }
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
362Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700368 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800369 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700380 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800381 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700387 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800388 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700396 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800397 }
398 /***** Encode RIL_SIM_SAP_POWER_REQ done *****/
399
400 /* encoded req is payload */
401 return addPayloadAndDispatchRequest(msg, stream.bytes_written, buffer);
402}
403
404Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700410 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800411 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700421 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800422 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700428 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800429 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700437 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800438 }
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
445Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700451 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800452 }
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)) {
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800461 RLOGE("SapImpl::transferCardReaderStatusReq: Error getting encoded size for "
462 "RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_REQ");
Amit Mahajan2056e962016-11-29 16:48:54 -0800463 sendFailedResponse(MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS, token, 1, msg);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700464 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800465 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700471 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800472 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700481 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800482 }
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
489Return<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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700495 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800496 }
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)) {
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800505 RLOGE("SapImpl::setTransferProtocolReq: Error getting encoded size for "
506 "RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_REQ");
Amit Mahajan2056e962016-11-29 16:48:54 -0800507 sendFailedResponse(MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL, token, 1, msg);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700508 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800509 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700515 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800516 }
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);
Amit Mahajan7db975b2017-03-13 17:01:05 -0700525 return Void();
Amit Mahajan2056e962016-11-29 16:48:54 -0800526 }
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
533void *sapDecodeMessage(MsgId msgId, MsgType msgType, uint8_t *payloadPtr, size_t payloadLen) {
534 void *responsePtr = NULL;
535 bool decodeStatus = false;
536 pb_istream_t stream;
537
538 /* Create the stream */
539 stream = pb_istream_from_buffer((uint8_t *)payloadPtr, payloadLen);
540
541 /* Decode based on the message id */
542 switch (msgId)
543 {
544 case MsgId_RIL_SIM_SAP_CONNECT:
545 responsePtr = malloc(sizeof(RIL_SIM_SAP_CONNECT_RSP));
546 if (responsePtr) {
547 if (!pb_decode(&stream, RIL_SIM_SAP_CONNECT_RSP_fields, responsePtr)) {
548 RLOGE("Error decoding RIL_SIM_SAP_CONNECT_RSP");
549 return NULL;
550 }
551 }
552 break;
553
554 case MsgId_RIL_SIM_SAP_DISCONNECT:
555 if (msgType == MsgType_RESPONSE) {
556 responsePtr = malloc(sizeof(RIL_SIM_SAP_DISCONNECT_RSP));
557 if (responsePtr) {
558 if (!pb_decode(&stream, RIL_SIM_SAP_DISCONNECT_RSP_fields, responsePtr)) {
559 RLOGE("Error decoding RIL_SIM_SAP_DISCONNECT_RSP");
560 return NULL;
561 }
562 }
563 } else {
564 responsePtr = malloc(sizeof(RIL_SIM_SAP_DISCONNECT_IND));
565 if (responsePtr) {
566 if (!pb_decode(&stream, RIL_SIM_SAP_DISCONNECT_IND_fields, responsePtr)) {
567 RLOGE("Error decoding RIL_SIM_SAP_DISCONNECT_IND");
568 return NULL;
569 }
570 }
571 }
572 break;
573
574 case MsgId_RIL_SIM_SAP_APDU:
575 responsePtr = malloc(sizeof(RIL_SIM_SAP_APDU_RSP));
576 if (responsePtr) {
577 if (!pb_decode(&stream, RIL_SIM_SAP_APDU_RSP_fields, responsePtr)) {
578 RLOGE("Error decoding RIL_SIM_SAP_APDU_RSP");
579 return NULL;
580 }
581 }
582 break;
583
584 case MsgId_RIL_SIM_SAP_TRANSFER_ATR:
585 responsePtr = malloc(sizeof(RIL_SIM_SAP_TRANSFER_ATR_RSP));
586 if (responsePtr) {
587 if (!pb_decode(&stream, RIL_SIM_SAP_TRANSFER_ATR_RSP_fields, responsePtr)) {
588 RLOGE("Error decoding RIL_SIM_SAP_TRANSFER_ATR_RSP");
589 return NULL;
590 }
591 }
592 break;
593
594 case MsgId_RIL_SIM_SAP_POWER:
595 responsePtr = malloc(sizeof(RIL_SIM_SAP_POWER_RSP));
596 if (responsePtr) {
597 if (!pb_decode(&stream, RIL_SIM_SAP_POWER_RSP_fields, responsePtr)) {
598 RLOGE("Error decoding RIL_SIM_SAP_POWER_RSP");
599 return NULL;
600 }
601 }
602 break;
603
604 case MsgId_RIL_SIM_SAP_RESET_SIM:
605 responsePtr = malloc(sizeof(RIL_SIM_SAP_RESET_SIM_RSP));
606 if (responsePtr) {
607 if (!pb_decode(&stream, RIL_SIM_SAP_RESET_SIM_RSP_fields, responsePtr)) {
608 RLOGE("Error decoding RIL_SIM_SAP_RESET_SIM_RSP");
609 return NULL;
610 }
611 }
612 break;
613
614 case MsgId_RIL_SIM_SAP_STATUS:
615 responsePtr = malloc(sizeof(RIL_SIM_SAP_STATUS_IND));
616 if (responsePtr) {
617 if (!pb_decode(&stream, RIL_SIM_SAP_STATUS_IND_fields, responsePtr)) {
618 RLOGE("Error decoding RIL_SIM_SAP_STATUS_IND");
619 return NULL;
620 }
621 }
622 break;
623
624 case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS:
625 responsePtr = malloc(sizeof(RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP));
626 if (responsePtr) {
627 if (!pb_decode(&stream, RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_fields,
628 responsePtr)) {
629 RLOGE("Error decoding RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP");
630 return NULL;
631 }
632 }
633 break;
634
635 case MsgId_RIL_SIM_SAP_ERROR_RESP:
636 responsePtr = malloc(sizeof(RIL_SIM_SAP_ERROR_RSP));
637 if (responsePtr) {
638 if (!pb_decode(&stream, RIL_SIM_SAP_ERROR_RSP_fields, responsePtr)) {
639 RLOGE("Error decoding RIL_SIM_SAP_ERROR_RSP");
640 return NULL;
641 }
642 }
643 break;
644
645 case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL:
646 responsePtr = malloc(sizeof(RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP));
647 if (responsePtr) {
648 if (!pb_decode(&stream, RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP_fields,
649 responsePtr)) {
650 RLOGE("Error decoding RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP");
651 return NULL;
652 }
653 }
654 break;
655
656 default:
657 break;
658 }
659 return responsePtr;
660} /* sapDecodeMessage */
661
662sp<SapImpl> getSapImpl(RilSapSocket *sapSocket) {
663 switch (sapSocket->getSocketId()) {
664 case RIL_SOCKET_1:
665 RLOGD("getSapImpl: returning sapService[0]");
666 return sapService[0];
667 #if (SIM_COUNT >= 2)
668 case RIL_SOCKET_2:
669 return sapService[1];
670 #if (SIM_COUNT >= 3)
671 case RIL_SOCKET_3:
672 return sapService[2];
673 #if (SIM_COUNT >= 4)
674 case RIL_SOCKET_4:
675 return sapService[3];
676 #endif
677 #endif
678 #endif
679 default:
680 return NULL;
681 }
682}
683
684SapResultCode convertApduResponseProtoToHal(RIL_SIM_SAP_APDU_RSP_Response responseProto) {
685 switch(responseProto) {
686 case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SUCCESS:
687 return SapResultCode::SUCCESS;
688 case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_GENERIC_FAILURE:
689 return SapResultCode::GENERIC_FAILURE;
690 case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_NOT_READY:
691 return SapResultCode::CARD_NOT_ACCESSSIBLE;
692 case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
693 return SapResultCode::CARD_ALREADY_POWERED_OFF;
694 case RIL_SIM_SAP_APDU_RSP_Response_RIL_E_SIM_ABSENT:
695 return SapResultCode::CARD_REMOVED;
Wei Wang100ac9b2017-02-03 14:18:07 -0800696 default:
697 return SapResultCode::GENERIC_FAILURE;
Amit Mahajan2056e962016-11-29 16:48:54 -0800698 }
Amit Mahajan2056e962016-11-29 16:48:54 -0800699}
700
701SapResultCode convertTransferAtrResponseProtoToHal(
702 RIL_SIM_SAP_TRANSFER_ATR_RSP_Response responseProto) {
703 switch(responseProto) {
704 case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SUCCESS:
705 return SapResultCode::SUCCESS;
706 case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_GENERIC_FAILURE:
707 return SapResultCode::GENERIC_FAILURE;
708 case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
709 return SapResultCode::CARD_ALREADY_POWERED_OFF;
710 case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_ABSENT:
711 return SapResultCode::CARD_REMOVED;
712 case RIL_SIM_SAP_TRANSFER_ATR_RSP_Response_RIL_E_SIM_DATA_NOT_AVAILABLE:
713 return SapResultCode::DATA_NOT_AVAILABLE;
Wei Wang100ac9b2017-02-03 14:18:07 -0800714 default:
715 return SapResultCode::GENERIC_FAILURE;
Amit Mahajan2056e962016-11-29 16:48:54 -0800716 }
Amit Mahajan2056e962016-11-29 16:48:54 -0800717}
718
719SapResultCode convertPowerResponseProtoToHal(RIL_SIM_SAP_POWER_RSP_Response responseProto) {
720 switch(responseProto) {
721 case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SUCCESS:
722 return SapResultCode::SUCCESS;
723 case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_GENERIC_FAILURE:
724 return SapResultCode::GENERIC_FAILURE;
725 case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ABSENT:
726 return SapResultCode::CARD_REMOVED;
727 case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
728 return SapResultCode::CARD_ALREADY_POWERED_OFF;
729 case RIL_SIM_SAP_POWER_RSP_Response_RIL_E_SIM_ALREADY_POWERED_ON:
730 return SapResultCode::CARD_ALREADY_POWERED_ON;
Wei Wang100ac9b2017-02-03 14:18:07 -0800731 default:
732 return SapResultCode::GENERIC_FAILURE;
Amit Mahajan2056e962016-11-29 16:48:54 -0800733 }
Amit Mahajan2056e962016-11-29 16:48:54 -0800734}
735
736SapResultCode convertResetSimResponseProtoToHal(RIL_SIM_SAP_RESET_SIM_RSP_Response responseProto) {
737 switch(responseProto) {
738 case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SUCCESS:
739 return SapResultCode::SUCCESS;
740 case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_GENERIC_FAILURE:
741 return SapResultCode::GENERIC_FAILURE;
742 case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_ABSENT:
743 return SapResultCode::CARD_REMOVED;
744 case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_NOT_READY:
745 return SapResultCode::CARD_NOT_ACCESSSIBLE;
746 case RIL_SIM_SAP_RESET_SIM_RSP_Response_RIL_E_SIM_ALREADY_POWERED_OFF:
747 return SapResultCode::CARD_ALREADY_POWERED_OFF;
748 }
749 return SapResultCode::GENERIC_FAILURE;
750}
751
752SapResultCode convertTransferCardReaderStatusResponseProtoToHal(
753 RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response responseProto) {
754 switch(responseProto) {
755 case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_SUCCESS:
756 return SapResultCode::SUCCESS;
757 case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_GENERIC_FAILURE:
758 return SapResultCode::GENERIC_FAILURE;
759 case RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP_Response_RIL_E_SIM_DATA_NOT_AVAILABLE:
760 return SapResultCode::DATA_NOT_AVAILABLE;
761 }
762 return SapResultCode::GENERIC_FAILURE;
763}
764
765void processResponse(MsgHeader *rsp, RilSapSocket *sapSocket, MsgType msgType) {
766 MsgId msgId = rsp->id;
767 uint8_t *data = rsp->payload->bytes;
768 size_t dataLen = rsp->payload->size;
769
770 void *messagePtr = sapDecodeMessage(msgId, msgType, data, dataLen);
771
772 sp<SapImpl> sapImpl = getSapImpl(sapSocket);
773 if (sapImpl->sapCallback == NULL) {
774 RLOGE("processResponse: sapCallback == NULL; msgId = %d; msgType = %d",
775 msgId, msgType);
776 return;
777 }
778
779 RLOGD("processResponse: sapCallback != NULL; msgId = %d; msgType = %d",
780 msgId, msgType);
781
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800782 Return<void> retStatus;
Amit Mahajan2056e962016-11-29 16:48:54 -0800783 switch (msgId) {
784 case MsgId_RIL_SIM_SAP_CONNECT: {
785 RIL_SIM_SAP_CONNECT_RSP *connectRsp = (RIL_SIM_SAP_CONNECT_RSP *)messagePtr;
786 RLOGD("processResponse: calling sapCallback->connectResponse %d %d %d",
787 rsp->token,
788 connectRsp->response,
789 connectRsp->max_message_size);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800790 retStatus = sapImpl->sapCallback->connectResponse(rsp->token,
Amit Mahajan2056e962016-11-29 16:48:54 -0800791 (SapConnectRsp)connectRsp->response,
792 connectRsp->max_message_size);
793 break;
794 }
795
796 case MsgId_RIL_SIM_SAP_DISCONNECT:
797 if (msgType == MsgType_RESPONSE) {
798 RLOGD("processResponse: calling sapCallback->disconnectResponse %d", rsp->token);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800799 retStatus = sapImpl->sapCallback->disconnectResponse(rsp->token);
Amit Mahajan2056e962016-11-29 16:48:54 -0800800 } else {
801 RIL_SIM_SAP_DISCONNECT_IND *disconnectInd =
802 (RIL_SIM_SAP_DISCONNECT_IND *)messagePtr;
803 RLOGD("processResponse: calling sapCallback->disconnectIndication %d %d",
804 rsp->token, disconnectInd->disconnectType);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800805 retStatus = sapImpl->sapCallback->disconnectIndication(rsp->token,
Amit Mahajan2056e962016-11-29 16:48:54 -0800806 (SapDisconnectType)disconnectInd->disconnectType);
807 }
808 break;
809
810 case MsgId_RIL_SIM_SAP_APDU: {
811 RIL_SIM_SAP_APDU_RSP *apduRsp = (RIL_SIM_SAP_APDU_RSP *)messagePtr;
812 SapResultCode apduResponse = convertApduResponseProtoToHal(apduRsp->response);
813 RLOGD("processResponse: calling sapCallback->apduResponse %d %d",
814 rsp->token, apduResponse);
815 hidl_vec<uint8_t> apduRspVec;
816 if (apduRsp->apduResponse != NULL && apduRsp->apduResponse->size > 0) {
817 apduRspVec.setToExternal(apduRsp->apduResponse->bytes, apduRsp->apduResponse->size);
818 }
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800819 retStatus = sapImpl->sapCallback->apduResponse(rsp->token, apduResponse, apduRspVec);
Amit Mahajan2056e962016-11-29 16:48:54 -0800820 break;
821 }
822
823 case MsgId_RIL_SIM_SAP_TRANSFER_ATR: {
824 RIL_SIM_SAP_TRANSFER_ATR_RSP *transferAtrRsp =
825 (RIL_SIM_SAP_TRANSFER_ATR_RSP *)messagePtr;
826 SapResultCode transferAtrResponse =
827 convertTransferAtrResponseProtoToHal(transferAtrRsp->response);
828 RLOGD("processResponse: calling sapCallback->transferAtrResponse %d %d",
829 rsp->token, transferAtrResponse);
830 hidl_vec<uint8_t> transferAtrRspVec;
831 if (transferAtrRsp->atr != NULL && transferAtrRsp->atr->size > 0) {
832 transferAtrRspVec.setToExternal(transferAtrRsp->atr->bytes,
833 transferAtrRsp->atr->size);
834 }
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800835 retStatus = sapImpl->sapCallback->transferAtrResponse(rsp->token, transferAtrResponse,
Amit Mahajan2056e962016-11-29 16:48:54 -0800836 transferAtrRspVec);
837 break;
838 }
839
840 case MsgId_RIL_SIM_SAP_POWER: {
841 SapResultCode powerResponse = convertPowerResponseProtoToHal(
842 ((RIL_SIM_SAP_POWER_RSP *)messagePtr)->response);
843 RLOGD("processResponse: calling sapCallback->powerResponse %d %d",
844 rsp->token, powerResponse);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800845 retStatus = sapImpl->sapCallback->powerResponse(rsp->token, powerResponse);
Amit Mahajan2056e962016-11-29 16:48:54 -0800846 break;
847 }
848
849 case MsgId_RIL_SIM_SAP_RESET_SIM: {
850 SapResultCode resetSimResponse = convertResetSimResponseProtoToHal(
851 ((RIL_SIM_SAP_RESET_SIM_RSP *)messagePtr)->response);
852 RLOGD("processResponse: calling sapCallback->resetSimResponse %d %d",
853 rsp->token, resetSimResponse);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800854 retStatus = sapImpl->sapCallback->resetSimResponse(rsp->token, resetSimResponse);
Amit Mahajan2056e962016-11-29 16:48:54 -0800855 break;
856 }
857
858 case MsgId_RIL_SIM_SAP_STATUS: {
859 RIL_SIM_SAP_STATUS_IND *statusInd = (RIL_SIM_SAP_STATUS_IND *)messagePtr;
860 RLOGD("processResponse: calling sapCallback->statusIndication %d %d",
861 rsp->token, statusInd->statusChange);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800862 retStatus = sapImpl->sapCallback->statusIndication(rsp->token,
863 (SapStatus)statusInd->statusChange);
Amit Mahajan2056e962016-11-29 16:48:54 -0800864 break;
865 }
866
867 case MsgId_RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS: {
868 RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP *transferStatusRsp =
869 (RIL_SIM_SAP_TRANSFER_CARD_READER_STATUS_RSP *)messagePtr;
870 SapResultCode transferCardReaderStatusResponse =
871 convertTransferCardReaderStatusResponseProtoToHal(
872 transferStatusRsp->response);
873 RLOGD("processResponse: calling sapCallback->transferCardReaderStatusResponse %d %d %d",
874 rsp->token,
875 transferCardReaderStatusResponse,
876 transferStatusRsp->CardReaderStatus);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800877 retStatus = sapImpl->sapCallback->transferCardReaderStatusResponse(rsp->token,
Amit Mahajan2056e962016-11-29 16:48:54 -0800878 transferCardReaderStatusResponse,
879 transferStatusRsp->CardReaderStatus);
880 break;
881 }
882
883 case MsgId_RIL_SIM_SAP_ERROR_RESP: {
884 RLOGD("processResponse: calling sapCallback->errorResponse %d", rsp->token);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800885 retStatus = sapImpl->sapCallback->errorResponse(rsp->token);
Amit Mahajan2056e962016-11-29 16:48:54 -0800886 break;
887 }
888
889 case MsgId_RIL_SIM_SAP_SET_TRANSFER_PROTOCOL: {
890 SapResultCode setTransferProtocolResponse;
891 if (((RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP *)messagePtr)->response ==
892 RIL_SIM_SAP_SET_TRANSFER_PROTOCOL_RSP_Response_RIL_E_SUCCESS) {
893 setTransferProtocolResponse = SapResultCode::SUCCESS;
894 } else {
895 setTransferProtocolResponse = SapResultCode::NOT_SUPPORTED;
896 }
897 RLOGD("processResponse: calling sapCallback->transferProtocolResponse %d %d",
898 rsp->token, setTransferProtocolResponse);
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800899 retStatus = sapImpl->sapCallback->transferProtocolResponse(rsp->token,
900 setTransferProtocolResponse);
Amit Mahajan2056e962016-11-29 16:48:54 -0800901 break;
902 }
903
904 default:
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800905 return;
Amit Mahajan2056e962016-11-29 16:48:54 -0800906 }
Amit Mahajane40b5ac2017-02-13 11:58:11 -0800907 sapImpl->checkReturnStatus(retStatus);
Amit Mahajan2056e962016-11-29 16:48:54 -0800908}
909
910void sap::processResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {
911 processResponse(rsp, sapSocket, MsgType_RESPONSE);
912}
913
914void sap::processUnsolResponse(MsgHeader *rsp, RilSapSocket *sapSocket) {
915 processResponse(rsp, sapSocket, MsgType_UNSOL_RESPONSE);
916}
917
918void sap::registerService(RIL_RadioFunctions *callbacks) {
919 using namespace android::hardware;
920 int simCount = 1;
Wei Wang100ac9b2017-02-03 14:18:07 -0800921 const char *serviceNames[] = {
Amit Mahajan2056e962016-11-29 16:48:54 -0800922 "sap_uim_socket1"
923 #if (SIM_COUNT >= 2)
924 , "sap_uim_socket2"
925 #if (SIM_COUNT >= 3)
926 , "sap_uim_socket3"
927 #if (SIM_COUNT >= 4)
928 , "sap_uim_socket4"
929 #endif
930 #endif
931 #endif
932 };
933
934 RIL_SOCKET_ID socketIds[] = {
935 RIL_SOCKET_1
936 #if (SIM_COUNT >= 2)
937 , RIL_SOCKET_2
938 #if (SIM_COUNT >= 3)
939 , RIL_SOCKET_3
940 #if (SIM_COUNT >= 4)
941 , RIL_SOCKET_4
942 #endif
943 #endif
944 #endif
945 };
946 #if (SIM_COUNT >= 2)
947 simCount = SIM_COUNT;
948 #endif
949
950 for (int i = 0; i < simCount; i++) {
951 sapService[i] = new SapImpl;
952 sapService[i]->slotId = i;
953 sapService[i]->rilSocketId = socketIds[i];
954 RLOGD("registerService: starting ISap %s for slotId %d", serviceNames[i], i);
955 android::status_t status = sapService[i]->registerAsService(serviceNames[i]);
956 RLOGD("registerService: started ISap %s status %d", serviceNames[i], status);
957 }
Wei Wang100ac9b2017-02-03 14:18:07 -0800958}