4 * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
5 * Copyright (c) 2013 Intel Corporation. All rights reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
26 #include "tapi_private.h"
31 void on_sap_signal_emit_handler(TelephonySap *sap, gchar *sender_name,
32 gchar *signal_name, GVariant *parameters,
35 TapiEvtCbData *evt_cb_data = NULL;
36 TelHandle *handle = user_data;
42 err("handle is null");
46 evt_id = g_strdup_printf("%s:%s", TELEPHONY_SAP_INTERFACE,
49 evt_cb_data = g_hash_table_lookup(handle->evt_table, evt_id);
50 if (evt_cb_data == NULL) {
51 warn("evt_cb_data is null for the signal[%s]", signal_name);
56 if (!g_strcmp0(signal_name, "Status")) {
57 TelSapCardStatus status;
59 g_variant_get(parameters, "(i)", &status);
60 dbg("signal[%s] status[%d]", signal_name, status);
62 EVT_CALLBACK_CALL(handle, evt_cb_data, evt_id, &status);
64 err("Unsupported signal %s", signal_name);
69 static void on_response_sap_req_connect(GObject *source_object,
70 GAsyncResult *res, gpointer user_data)
72 TapiRespCbData *rsp_cb_data = user_data;
73 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
74 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
75 unsigned int max_msg_size;
80 telephony_sap_call_req_connect_finish(handle->sap_proxy,
81 (int *)&result, &max_msg_size, res, &error);
83 CHECK_DEINIT(error, rsp_cb_data, result);
85 RESP_CALLBACK_CALL(rsp_cb_data, result, &max_msg_size);
88 EXPORT_API TelReturn tapi_sap_req_connect(TelHandle *handle,
89 unsigned int max_msg_size,
90 TapiResponseCb callback, void *user_data)
92 TapiRespCbData *rsp_cb_data;
96 g_return_val_if_fail(handle != NULL && callback != NULL,
97 TEL_RETURN_INVALID_PARAMETER);
99 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
101 telephony_sap_call_req_connect(handle->sap_proxy, max_msg_size, NULL,
102 on_response_sap_req_connect, rsp_cb_data);
104 return TEL_RETURN_SUCCESS;
107 static void on_response_sap_req_disconnect(GObject *source_object,
108 GAsyncResult *res, gpointer user_data)
110 TapiRespCbData *rsp_cb_data = user_data;
111 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
112 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
113 GError *error = NULL;
117 telephony_sap_call_req_disconnect_finish(handle->sap_proxy,
118 (int *)&result, res, &error);
120 CHECK_DEINIT(error, rsp_cb_data, result);
122 RESP_CALLBACK_CALL(rsp_cb_data, result, NULL);
125 EXPORT_API TelReturn tapi_sap_req_disconnect(TelHandle *handle,
126 TapiResponseCb callback, void *user_data)
128 TapiRespCbData *rsp_cb_data;
132 g_return_val_if_fail(handle != NULL && callback != NULL,
133 TEL_RETURN_INVALID_PARAMETER);
135 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
137 telephony_sap_call_req_disconnect(handle->sap_proxy, NULL,
138 on_response_sap_req_disconnect, rsp_cb_data);
140 return TEL_RETURN_SUCCESS;
143 static void on_response_sap_get_atr(GObject *source_object,
144 GAsyncResult *res, gpointer user_data)
146 TapiRespCbData *rsp_cb_data = user_data;
147 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
148 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
150 char *content = NULL;
151 GError *error = NULL;
153 guchar *binary_content;
157 telephony_sap_call_get_atr_finish(handle->sap_proxy,
158 (int *)&result, &content, res, &error);
160 CHECK_DEINIT(error, rsp_cb_data, result);
162 if (result != TEL_SAP_RESULT_SUCCESS) {
163 RESP_CALLBACK_CALL(rsp_cb_data, result, NULL);
168 binary_content = g_base64_decode(content, &atr.atr_len);
170 if (atr.atr_len > TEL_SAP_ATR_LEN_MAX) {
171 err("ATR length is too long");
172 RESP_CALLBACK_CALL(rsp_cb_data,
173 TEL_SAP_RESULT_FAILURE_NO_REASON, NULL);
175 g_free(binary_content);
179 memcpy(atr.atr, binary_content, atr.atr_len);
181 RESP_CALLBACK_CALL(rsp_cb_data, result, &atr);
183 g_free(binary_content);
186 EXPORT_API TelReturn tapi_sap_get_atr(TelHandle *handle,
187 TapiResponseCb callback, void *user_data)
189 TapiRespCbData *rsp_cb_data;
193 g_return_val_if_fail(handle != NULL && callback != NULL,
194 TEL_RETURN_INVALID_PARAMETER);
196 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
198 telephony_sap_call_get_atr(handle->sap_proxy, NULL,
199 on_response_sap_get_atr, rsp_cb_data);
201 return TEL_RETURN_SUCCESS;
204 static void on_response_sap_req_transfer_apdu(GObject *source_object,
205 GAsyncResult *res, gpointer user_data)
207 TapiRespCbData *rsp_cb_data = user_data;
208 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
209 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
212 GError *error = NULL;
218 telephony_sap_call_req_transfer_apdu_finish(handle->sap_proxy,
219 (int *)&result, &pdu, res, &error);
221 CHECK_DEINIT(error, rsp_cb_data, result);
223 if (result != TEL_SAP_RESULT_SUCCESS) {
224 RESP_CALLBACK_CALL(rsp_cb_data, result, NULL);
229 binary_pdu = g_base64_decode(pdu, &rsp.apdu_resp_len);
231 if (rsp.apdu_resp_len > TEL_SAP_APDU_RESP_LEN_MAX) {
232 err("Req Transfer APDU response pdu length is too long");
233 RESP_CALLBACK_CALL(rsp_cb_data,
234 TEL_SAP_RESULT_FAILURE_NO_REASON, NULL);
240 memcpy(rsp.apdu_resp, binary_pdu, rsp.apdu_resp_len);
242 RESP_CALLBACK_CALL(rsp_cb_data, result, &rsp);
247 EXPORT_API TelReturn tapi_sap_req_transfer_apdu(TelHandle *handle,
248 TelSapApdu *apdu, TapiResponseCb callback,
251 TapiRespCbData *rsp_cb_data;
256 g_return_val_if_fail(handle != NULL && apdu != NULL &&
257 apdu->apdu_len < TEL_SAP_APDU_LEN_MAX &&
258 callback != NULL, TEL_RETURN_INVALID_PARAMETER);
260 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
262 encoded_apdu = g_base64_encode(apdu->apdu, apdu->apdu_len);
263 telephony_sap_call_req_transfer_apdu(handle->sap_proxy,
265 on_response_sap_req_transfer_apdu, rsp_cb_data);
267 g_free(encoded_apdu);
268 return TEL_RETURN_SUCCESS;
271 static void on_response_sap_req_transport_protocol(GObject *source_object,
272 GAsyncResult *res, gpointer user_data)
274 TapiRespCbData *rsp_cb_data = user_data;
275 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
276 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
277 GError *error = NULL;
281 telephony_sap_call_req_transport_protocol_finish(handle->sap_proxy,
282 (int *)&result, res, &error);
284 CHECK_DEINIT(error, rsp_cb_data, result);
286 RESP_CALLBACK_CALL(rsp_cb_data, result, NULL);
289 EXPORT_API TelReturn tapi_sap_req_transport_protocol(TelHandle *handle,
290 TelSimSapProtocol protocol,
291 TapiResponseCb callback, void *user_data)
293 TapiRespCbData *rsp_cb_data;
297 g_return_val_if_fail(handle != NULL &&
298 protocol <= TEL_SIM_SAP_PROTOCOL_T1 && callback != NULL,
299 TEL_RETURN_INVALID_PARAMETER);
301 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
303 telephony_sap_call_req_transport_protocol(handle->sap_proxy, protocol,
304 NULL, on_response_sap_req_transport_protocol, rsp_cb_data);
306 return TEL_RETURN_SUCCESS;
309 static void on_response_sap_req_power_operation(GObject *source_object,
310 GAsyncResult *res, gpointer user_data)
312 TapiRespCbData *rsp_cb_data = user_data;
313 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
314 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
315 GError *error = NULL;
319 telephony_sap_call_req_power_operation_finish(handle->sap_proxy,
320 (int *)&result, res, &error);
322 CHECK_DEINIT(error, rsp_cb_data, result);
324 RESP_CALLBACK_CALL(rsp_cb_data, result, NULL);
327 EXPORT_API TelReturn tapi_sap_req_power_operation(TelHandle *handle,
328 TelSapPowerMode mode,
329 TapiResponseCb callback, void *user_data)
331 TapiRespCbData *rsp_cb_data;
335 g_return_val_if_fail(handle != NULL && mode <= TEL_SAP_SIM_RESET_REQ &&
337 TEL_RETURN_INVALID_PARAMETER);
339 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
341 telephony_sap_call_req_power_operation(handle->sap_proxy, mode,
342 NULL, on_response_sap_req_power_operation, rsp_cb_data);
344 return TEL_RETURN_SUCCESS;
347 static void on_response_sap_get_card_reader_status(GObject *source_object,
348 GAsyncResult *res, gpointer user_data)
350 TapiRespCbData *rsp_cb_data = user_data;
351 TelHandle *handle = GET_TAPI_HANDLE(rsp_cb_data);
352 TelSapResult result = TEL_SAP_RESULT_FAILURE_NO_REASON;
354 GError *error = NULL;
358 telephony_sap_call_get_card_reader_status_finish(handle->sap_proxy,
359 (int *)&result, (int *)&status, res, &error);
361 CHECK_DEINIT(error, rsp_cb_data, result);
363 RESP_CALLBACK_CALL(rsp_cb_data, result, &status);
366 EXPORT_API TelReturn tapi_sap_get_cardreader_status(TelHandle *handle,
367 TapiResponseCb callback, void *user_data)
369 TapiRespCbData *rsp_cb_data;
373 g_return_val_if_fail(handle != NULL && callback != NULL,
374 TEL_RETURN_INVALID_PARAMETER);
376 MAKE_RESP_CB_DATA(rsp_cb_data, handle, callback, user_data);
378 telephony_sap_call_get_card_reader_status(handle->sap_proxy, NULL,
379 on_response_sap_get_card_reader_status, rsp_cb_data);
381 return TEL_RETURN_SUCCESS;