4 * Copyright (c) 2012 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"
34 static void on_response_sap_connect(GObject *source_object, GAsyncResult *res, gpointer user_data)
37 GDBusConnection *conn = NULL;
38 GVariant *dbus_result;
40 struct tapi_resp_data *evt_cb_data = user_data;
41 TelSimSapConnectionStatus_t result = TAPI_SIM_SAP_CONNECTION_STATUS_OK;
42 gint max_msg_size = 0;
46 conn = G_DBUS_CONNECTION (source_object);
47 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
51 if (evt_cb_data->cb_fn) {
52 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
62 g_variant_get(dbus_result, "(ii)", &result, &max_msg_size);
64 if (evt_cb_data->cb_fn) {
65 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&max_msg_size, evt_cb_data->user_data);
71 EXPORT_API int tel_req_sap_connect(TapiHandle *handle, int max_msg_size, tapi_response_cb callback, void *user_data)
73 struct tapi_resp_data *evt_cb_data = NULL;
74 GVariant *param = NULL;
76 dbg("Func Entrance w/ max_msg_size[%d]",max_msg_size);
78 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
80 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
82 param = g_variant_new("(i)", max_msg_size);
83 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
84 DBUS_TELEPHONY_SAP_INTERFACE, "Connect", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
85 handle->ca, on_response_sap_connect, evt_cb_data);
87 return TAPI_API_SUCCESS;
90 static void on_response_sap_disconnect(GObject *source_object, GAsyncResult *res, gpointer user_data)
93 GDBusConnection *conn = NULL;
94 GVariant *dbus_result;
96 struct tapi_resp_data *evt_cb_data = user_data;
97 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
101 conn = G_DBUS_CONNECTION (source_object);
102 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
106 if (evt_cb_data->cb_fn) {
107 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
117 g_variant_get(dbus_result, "(i)", &result);
119 if (evt_cb_data->cb_fn) {
120 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
126 EXPORT_API int tel_req_sap_disconnect(TapiHandle *handle, tapi_response_cb callback, void *user_data)
128 struct tapi_resp_data *evt_cb_data = NULL;
130 dbg("Func Entrance ");
132 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
134 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
136 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
137 DBUS_TELEPHONY_SAP_INTERFACE, "Disconnect", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
138 handle->ca, on_response_sap_disconnect, evt_cb_data);
140 return TAPI_API_SUCCESS;
143 static void on_response_sap_connection_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
145 GError *error = NULL;
146 GDBusConnection *conn = NULL;
147 GVariant *dbus_result;
149 struct tapi_resp_data *evt_cb_data = user_data;
150 TelSimSapStatusInfo_t result = TAPI_SIM_SAP_STATUS_UNKNOWN;
152 dbg("Func Entrance");
154 conn = G_DBUS_CONNECTION (source_object);
155 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
159 if (evt_cb_data->cb_fn) {
160 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
170 g_variant_get(dbus_result, "(i)", &result);
172 if (evt_cb_data->cb_fn) {
173 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
179 EXPORT_API int tel_req_sap_connection_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
181 struct tapi_resp_data *evt_cb_data = NULL;
183 dbg("Func Entrance");
185 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
187 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
189 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
190 DBUS_TELEPHONY_SAP_INTERFACE, "GetStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
191 handle->ca, on_response_sap_connection_status, evt_cb_data);
193 return TAPI_API_SUCCESS;
196 static void on_response_sap_transfer_atr(GObject *source_object, GAsyncResult *res, gpointer user_data)
198 GError *error = NULL;
199 GDBusConnection *conn = NULL;
200 GVariant *dbus_result;
202 GVariantIter *iter = NULL;
203 GVariant *param_gv = NULL;
204 GVariant *inner_gv = NULL;
208 struct tapi_resp_data *evt_cb_data = user_data;
209 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
210 TelSapAtrInfo_t r_atr;
212 dbg("Func Entrance");
213 memset(&r_atr, 0, sizeof(TelSapAtrInfo_t));
215 conn = G_DBUS_CONNECTION (source_object);
216 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
220 if (evt_cb_data->cb_fn) {
221 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
231 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
232 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
233 inner_gv = g_variant_get_variant(param_gv);
235 g_variant_get(inner_gv, "ay", &iter);
236 while (g_variant_iter_loop(iter, "y", &rt_i)) {
237 r_atr.atr_data[i] = rt_i;
240 r_atr.atr_len = (int) i;
241 g_variant_iter_free(iter);
242 g_variant_unref(inner_gv);
243 g_variant_unref(param_gv);
244 /* for(i=0; i < (int)r_atr.atr_len; i++)
245 dbg("r_atr[%d][0x%02x]",i, r_atr.atr_data[i]);*/
247 if (evt_cb_data->cb_fn) {
248 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_atr, evt_cb_data->user_data);
254 EXPORT_API int tel_req_sap_transfer_atr(TapiHandle *handle, tapi_response_cb callback, void *user_data)
256 struct tapi_resp_data *evt_cb_data = NULL;
258 dbg("Func Entrance");
260 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
262 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
264 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
265 DBUS_TELEPHONY_SAP_INTERFACE, "GetATR", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
266 handle->ca, on_response_sap_transfer_atr, evt_cb_data);
268 return TAPI_API_SUCCESS;
271 static void on_response_sap_transfer_apdu(GObject *source_object, GAsyncResult *res, gpointer user_data)
273 GError *error = NULL;
274 GDBusConnection *conn = NULL;
275 GVariant *dbus_result;
277 GVariantIter *iter = NULL;
278 GVariant *param_gv = NULL;
279 GVariant *inner_gv = NULL;
283 struct tapi_resp_data *evt_cb_data = user_data;
284 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
285 TelSapApduData_t r_apdu;
287 dbg("Func Entrance");
288 memset(&r_apdu, 0, sizeof(TelSapApduData_t));
290 conn = G_DBUS_CONNECTION (source_object);
291 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
295 if (evt_cb_data->cb_fn) {
296 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
306 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
307 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
308 inner_gv = g_variant_get_variant(param_gv);
310 g_variant_get(inner_gv, "ay", &iter);
311 while (g_variant_iter_loop(iter, "y", &rt_i)) {
312 r_apdu.apdu_data[i] = rt_i;
315 r_apdu.apdu_len = (int) i;
316 g_variant_iter_free(iter);
317 g_variant_unref(inner_gv);
318 g_variant_unref(param_gv);
319 /* for(i=0; i < (int)r_apdu.apdu_len; i++)
320 dbg("apdu[%d][0x%02x]",i, r_apdu.apdu_data[i]);*/
322 if (evt_cb_data->cb_fn) {
323 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_apdu, evt_cb_data->user_data);
329 EXPORT_API int tel_req_sap_transfer_apdu(TapiHandle *handle, TelSapApduData_t *apdu_data, tapi_response_cb callback, void *user_data)
331 struct tapi_resp_data *evt_cb_data = NULL;
332 GVariantBuilder *builder = NULL;
333 GVariant *param = NULL;
334 GVariant *inner_gv = NULL;
337 dbg("Func Entrance");
339 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
340 TAPI_RET_ERR_NUM_IF_FAIL(apdu_data, TAPI_API_INVALID_PTR);
342 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
344 builder = g_variant_builder_new(G_VARIANT_TYPE ("ay"));
345 for (i = 0; i < apdu_data->apdu_len; i++) {
346 dbg("apdu_data->apdu_data[%d][0x%02x]", i,apdu_data->apdu_data[i]);
347 g_variant_builder_add(builder, "y", apdu_data->apdu_data[i]);
349 inner_gv = g_variant_builder_end(builder);
350 param = g_variant_new("(v)", inner_gv);
351 /*g_variant_builder_unref (builder);*/
353 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
354 DBUS_TELEPHONY_SAP_INTERFACE, "TransferAPDU", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
355 handle->ca, on_response_sap_transfer_apdu, evt_cb_data);
357 return TAPI_API_SUCCESS;
360 static void on_response_sap_transport_protocol(GObject *source_object, GAsyncResult *res, gpointer user_data)
362 GError *error = NULL;
363 GDBusConnection *conn = NULL;
364 GVariant *dbus_result;
366 struct tapi_resp_data *evt_cb_data = user_data;
367 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
369 dbg("Func Entrance");
371 conn = G_DBUS_CONNECTION (source_object);
372 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
376 if (evt_cb_data->cb_fn) {
377 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
387 g_variant_get(dbus_result, "(i)", &result);
389 if (evt_cb_data->cb_fn) {
390 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
396 EXPORT_API int tel_req_sap_transport_protocol(TapiHandle *handle, TelSimSapProtocol_t protocol, tapi_response_cb callback, void *user_data)
398 struct tapi_resp_data *evt_cb_data = NULL;
399 GVariant *param = NULL;
401 dbg("Func Entrance w/ protocol[%d]", protocol);
403 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
405 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
407 param = g_variant_new("(i)", protocol);
408 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
409 DBUS_TELEPHONY_SAP_INTERFACE, "SetProtocol", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
410 handle->ca, on_response_sap_transport_protocol, evt_cb_data);
412 return TAPI_API_SUCCESS;
415 static void on_response_sap_power_operation(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;
424 dbg("Func Entrance");
426 conn = G_DBUS_CONNECTION (source_object);
427 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
431 if (evt_cb_data->cb_fn) {
432 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
442 g_variant_get(dbus_result, "(i)", &result);
444 if (evt_cb_data->cb_fn) {
445 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
451 EXPORT_API int tel_req_sap_power_operation(TapiHandle *handle, TelSimSapPowerMode_t power_mode, tapi_response_cb callback, void *user_data)
453 struct tapi_resp_data *evt_cb_data = NULL;
454 GVariant *param = NULL;
456 dbg("Func Entrance w/ power_mode[%d]", power_mode);
458 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
460 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
462 switch (power_mode) {
463 case TAPI_SIM_SAP_POWER_SIM_ON_REQ:
466 case TAPI_SIM_SAP_POWER_SIM_OFF_REQ:
469 case TAPI_SIM_SAP_RESET_SIM_REQ:
473 dbg("not handed value[%d]", power_mode);
477 param = g_variant_new("(i)", mode);
478 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
479 DBUS_TELEPHONY_SAP_INTERFACE, "SetPower", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
480 handle->ca, on_response_sap_power_operation, evt_cb_data);
482 return TAPI_API_SUCCESS;
485 static void on_response_sap_cardreader_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
487 GError *error = NULL;
488 GDBusConnection *conn = NULL;
489 GVariant *dbus_result;
491 struct tapi_resp_data *evt_cb_data = user_data;
492 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
493 TelSimSapCardStatus_t reader_status = TAPI_SIM_SAP_CARD_STATUS_UNKNOWN;
495 dbg("Func Entrance");
497 conn = G_DBUS_CONNECTION (source_object);
498 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
502 if (evt_cb_data->cb_fn) {
503 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
513 g_variant_get(dbus_result, "(ii)", &result, &reader_status);
515 if (evt_cb_data->cb_fn) {
516 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&reader_status, evt_cb_data->user_data);
522 EXPORT_API int tel_req_sap_cardreader_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
524 struct tapi_resp_data *evt_cb_data = NULL;
526 dbg("Func Entrance ");
528 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
530 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
532 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
533 DBUS_TELEPHONY_SAP_INTERFACE, "GetCardReaderStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
534 handle->ca, on_response_sap_cardreader_status, evt_cb_data);
536 return TAPI_API_SUCCESS;