4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include "tapi_common.h"
27 #include "TapiUtility.h"
35 static void on_response_sap_connect(GObject *source_object, GAsyncResult *res, gpointer user_data)
38 GDBusConnection *conn = NULL;
39 GVariant *dbus_result;
41 struct tapi_resp_data *evt_cb_data = user_data;
42 TelSimSapConnectionStatus_t result = TAPI_SIM_SAP_CONNECTION_STATUS_OK;
43 gint max_msg_size = 0;
47 conn = G_DBUS_CONNECTION(source_object);
48 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
49 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
51 g_variant_get(dbus_result, "(ii)", &result, &max_msg_size);
53 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &max_msg_size);
56 g_variant_unref(dbus_result);
59 EXPORT_API int tel_req_sap_connect(TapiHandle *handle, int max_msg_size, tapi_response_cb callback, void *user_data)
61 struct tapi_resp_data *evt_cb_data = NULL;
62 GVariant *param = NULL;
64 dbg("Func Entrance w/ max_msg_size[%d]", max_msg_size);
66 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
68 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
70 param = g_variant_new("(i)", max_msg_size);
71 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
73 DBUS_TELEPHONY_SAP_INTERFACE,
75 param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
76 handle->ca, on_response_sap_connect, evt_cb_data);
78 return TAPI_API_SUCCESS;
81 static void on_response_sap_disconnect(GObject *source_object, GAsyncResult *res, gpointer user_data)
84 GDBusConnection *conn = NULL;
85 GVariant *dbus_result;
87 struct tapi_resp_data *evt_cb_data = user_data;
88 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
92 conn = G_DBUS_CONNECTION(source_object);
93 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
94 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
96 g_variant_get(dbus_result, "(i)", &result);
98 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
101 g_variant_unref(dbus_result);
104 EXPORT_API int tel_req_sap_disconnect(TapiHandle *handle, tapi_response_cb callback, void *user_data)
106 struct tapi_resp_data *evt_cb_data = NULL;
108 dbg("Func Entrance ");
110 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
112 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
114 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
116 DBUS_TELEPHONY_SAP_INTERFACE,
118 NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
119 handle->ca, on_response_sap_disconnect, evt_cb_data);
121 return TAPI_API_SUCCESS;
124 static void on_response_sap_connection_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
126 GError *error = NULL;
127 GDBusConnection *conn = NULL;
128 GVariant *dbus_result;
130 struct tapi_resp_data *evt_cb_data = user_data;
131 TelSimSapStatusInfo_t result = TAPI_SIM_SAP_STATUS_UNKNOWN;
133 dbg("Func Entrance");
135 conn = G_DBUS_CONNECTION(source_object);
136 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
137 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
139 g_variant_get(dbus_result, "(i)", &result);
141 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
144 g_variant_unref(dbus_result);
147 EXPORT_API int tel_req_sap_connection_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
149 struct tapi_resp_data *evt_cb_data = NULL;
151 dbg("Func Entrance");
153 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
155 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
157 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
159 DBUS_TELEPHONY_SAP_INTERFACE,
161 NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
162 handle->ca, on_response_sap_connection_status, evt_cb_data);
164 return TAPI_API_SUCCESS;
167 static void on_response_sap_transfer_atr(GObject *source_object, GAsyncResult *res, gpointer user_data)
169 GError *error = NULL;
170 GDBusConnection *conn = NULL;
171 GVariant *dbus_result;
173 GVariantIter *iter = NULL;
174 GVariant *param_gv = NULL;
175 GVariant *inner_gv = NULL;
179 struct tapi_resp_data *evt_cb_data = user_data;
180 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
181 TelSapAtrInfo_t r_atr;
183 dbg("Func Entrance");
184 memset(&r_atr, 0, sizeof(TelSapAtrInfo_t));
186 conn = G_DBUS_CONNECTION(source_object);
187 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
188 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
190 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
191 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
192 inner_gv = g_variant_get_variant(param_gv);
194 g_variant_get(inner_gv, "ay", &iter);
195 while (g_variant_iter_loop(iter, "y", &rt_i)) {
196 r_atr.atr_data[i] = rt_i;
199 r_atr.atr_len = (int) i;
200 g_variant_iter_free(iter);
201 g_variant_unref(inner_gv);
202 g_variant_unref(param_gv);
204 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &r_atr);
207 g_variant_unref(dbus_result);
210 EXPORT_API int tel_req_sap_transfer_atr(TapiHandle *handle, tapi_response_cb callback, void *user_data)
212 struct tapi_resp_data *evt_cb_data = NULL;
214 dbg("Func Entrance");
216 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
218 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
220 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
222 DBUS_TELEPHONY_SAP_INTERFACE,
224 NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
225 handle->ca, on_response_sap_transfer_atr, evt_cb_data);
227 return TAPI_API_SUCCESS;
230 static void on_response_sap_transfer_apdu(GObject *source_object, GAsyncResult *res, gpointer user_data)
232 GError *error = NULL;
233 GDBusConnection *conn = NULL;
234 GVariant *dbus_result;
236 GVariantIter *iter = NULL;
237 GVariant *param_gv = NULL;
238 GVariant *inner_gv = NULL;
242 struct tapi_resp_data *evt_cb_data = user_data;
243 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
244 TelSapApduData_t r_apdu;
246 dbg("Func Entrance");
247 memset(&r_apdu, 0, sizeof(TelSapApduData_t));
249 conn = G_DBUS_CONNECTION(source_object);
250 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
251 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
253 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
254 inner_gv = g_variant_get_variant(param_gv);
256 g_variant_get(inner_gv, "ay", &iter);
257 while (g_variant_iter_loop(iter, "y", &rt_i)) {
258 r_apdu.apdu_data[i] = rt_i;
261 r_apdu.apdu_len = (int) i;
262 g_variant_iter_free(iter);
263 g_variant_unref(inner_gv);
264 g_variant_unref(param_gv);
266 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &r_apdu);
269 g_variant_unref(dbus_result);
272 EXPORT_API int tel_req_sap_transfer_apdu(TapiHandle *handle, TelSapApduData_t *apdu_data, tapi_response_cb callback, void *user_data)
274 struct tapi_resp_data *evt_cb_data = NULL;
275 GVariantBuilder builder;
276 GVariant *param = NULL;
277 GVariant *inner_gv = NULL;
280 dbg("Func Entrance");
282 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
283 TAPI_RET_ERR_NUM_IF_FAIL(apdu_data, TAPI_API_INVALID_PTR);
285 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
287 g_variant_builder_init(&builder, G_VARIANT_TYPE("ay"));
288 for (i = 0; i < apdu_data->apdu_len; i++) {
289 dbg("apdu_data->apdu_data[%d][0x%02x]", i, apdu_data->apdu_data[i]);
290 g_variant_builder_add(&builder, "y", apdu_data->apdu_data[i]);
292 inner_gv = g_variant_builder_end(&builder);
293 param = g_variant_new("(v)", inner_gv);
295 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
297 DBUS_TELEPHONY_SAP_INTERFACE,
299 param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
300 handle->ca, on_response_sap_transfer_apdu, evt_cb_data);
302 return TAPI_API_SUCCESS;
305 static void on_response_sap_transport_protocol(GObject *source_object, GAsyncResult *res, gpointer user_data)
307 GError *error = NULL;
308 GDBusConnection *conn = NULL;
309 GVariant *dbus_result;
311 struct tapi_resp_data *evt_cb_data = user_data;
312 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
314 dbg("Func Entrance");
316 conn = G_DBUS_CONNECTION(source_object);
317 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
318 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
320 g_variant_get(dbus_result, "(i)", &result);
322 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
325 g_variant_unref(dbus_result);
328 EXPORT_API int tel_req_sap_transport_protocol(TapiHandle *handle,
329 TelSimSapProtocol_t protocol, tapi_response_cb callback, void *user_data)
331 struct tapi_resp_data *evt_cb_data = NULL;
332 GVariant *param = NULL;
334 dbg("Func Entrance w/ protocol[%d]", protocol);
336 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
338 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
340 param = g_variant_new("(i)", protocol);
341 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
343 DBUS_TELEPHONY_SAP_INTERFACE,
345 param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
346 handle->ca, on_response_sap_transport_protocol, evt_cb_data);
348 return TAPI_API_SUCCESS;
351 static void on_response_sap_power_operation(GObject *source_object, GAsyncResult *res, gpointer user_data)
353 GError *error = NULL;
354 GDBusConnection *conn = NULL;
355 GVariant *dbus_result;
357 struct tapi_resp_data *evt_cb_data = user_data;
358 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
360 dbg("Func Entrance");
362 conn = G_DBUS_CONNECTION(source_object);
363 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
364 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
366 g_variant_get(dbus_result, "(i)", &result);
368 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
371 g_variant_unref(dbus_result);
374 EXPORT_API int tel_req_sap_power_operation(TapiHandle *handle,
375 TelSimSapPowerMode_t power_mode, tapi_response_cb callback, void *user_data)
377 struct tapi_resp_data *evt_cb_data = NULL;
378 GVariant *param = NULL;
380 dbg("Func Entrance w/ power_mode[%d]", power_mode);
382 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
384 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
386 switch (power_mode) {
387 case TAPI_SIM_SAP_POWER_SIM_ON_REQ:
391 case TAPI_SIM_SAP_POWER_SIM_OFF_REQ:
395 case TAPI_SIM_SAP_RESET_SIM_REQ:
400 dbg("not handed value[%d]", power_mode);
404 param = g_variant_new("(i)", mode);
405 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
407 DBUS_TELEPHONY_SAP_INTERFACE,
409 param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
410 handle->ca, on_response_sap_power_operation, evt_cb_data);
412 return TAPI_API_SUCCESS;
415 static void on_response_sap_cardreader_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
417 GError *error = NULL;
418 GDBusConnection *conn = NULL;
419 GVariant *dbus_result;
421 struct tapi_resp_data *evt_cb_data = user_data;
422 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
423 TelSimSapCardStatus_t reader_status = TAPI_SIM_SAP_CARD_STATUS_UNKNOWN;
425 dbg("Func Entrance");
427 conn = G_DBUS_CONNECTION(source_object);
428 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
429 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
431 g_variant_get(dbus_result, "(ii)", &result, &reader_status);
433 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &reader_status);
436 g_variant_unref(dbus_result);
439 EXPORT_API int tel_req_sap_cardreader_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
441 struct tapi_resp_data *evt_cb_data = NULL;
443 dbg("Func Entrance ");
445 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
447 TAPI_MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
449 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
451 DBUS_TELEPHONY_SAP_INTERFACE,
452 "GetCardReaderStatus",
453 NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
454 handle->ca, on_response_sap_cardreader_status, evt_cb_data);
456 return TAPI_API_SUCCESS;