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"
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);
50 g_variant_get(dbus_result, "(ii)", &result, &max_msg_size);
52 if (evt_cb_data->cb_fn) {
53 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&max_msg_size, evt_cb_data->user_data);
57 g_variant_unref(dbus_result);
60 EXPORT_API int tel_req_sap_connect(TapiHandle *handle, int max_msg_size, tapi_response_cb callback, void *user_data)
62 struct tapi_resp_data *evt_cb_data = NULL;
63 GVariant *param = NULL;
65 dbg("Func Entrance w/ max_msg_size[%d]",max_msg_size);
67 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
69 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
71 param = g_variant_new("(i)", max_msg_size);
72 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
73 DBUS_TELEPHONY_SAP_INTERFACE, "Connect", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
74 handle->ca, on_response_sap_connect, evt_cb_data);
76 return TAPI_API_SUCCESS;
79 static void on_response_sap_disconnect(GObject *source_object, GAsyncResult *res, gpointer user_data)
82 GDBusConnection *conn = NULL;
83 GVariant *dbus_result;
85 struct tapi_resp_data *evt_cb_data = user_data;
86 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
90 conn = G_DBUS_CONNECTION (source_object);
91 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
94 g_variant_get(dbus_result, "(i)", &result);
96 if (evt_cb_data->cb_fn) {
97 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
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 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
114 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
115 DBUS_TELEPHONY_SAP_INTERFACE, "Disconnect", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
116 handle->ca, on_response_sap_disconnect, evt_cb_data);
118 return TAPI_API_SUCCESS;
121 static void on_response_sap_connection_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
123 GError *error = NULL;
124 GDBusConnection *conn = NULL;
125 GVariant *dbus_result;
127 struct tapi_resp_data *evt_cb_data = user_data;
128 TelSimSapStatusInfo_t result = TAPI_SIM_SAP_STATUS_UNKNOWN;
130 dbg("Func Entrance");
132 conn = G_DBUS_CONNECTION (source_object);
133 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
136 g_variant_get(dbus_result, "(i)", &result);
138 if (evt_cb_data->cb_fn) {
139 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
143 g_variant_unref(dbus_result);
146 EXPORT_API int tel_req_sap_connection_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
148 struct tapi_resp_data *evt_cb_data = NULL;
150 dbg("Func Entrance");
152 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
154 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
156 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
157 DBUS_TELEPHONY_SAP_INTERFACE, "GetStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
158 handle->ca, on_response_sap_connection_status, evt_cb_data);
160 return TAPI_API_SUCCESS;
163 static void on_response_sap_transfer_atr(GObject *source_object, GAsyncResult *res, gpointer user_data)
165 GError *error = NULL;
166 GDBusConnection *conn = NULL;
167 GVariant *dbus_result;
169 GVariantIter *iter = NULL;
170 GVariant *param_gv = NULL;
171 GVariant *inner_gv = NULL;
175 struct tapi_resp_data *evt_cb_data = user_data;
176 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
177 TelSapAtrInfo_t r_atr;
179 dbg("Func Entrance");
180 memset(&r_atr, 0, sizeof(TelSapAtrInfo_t));
182 conn = G_DBUS_CONNECTION (source_object);
183 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
186 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
187 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
188 inner_gv = g_variant_get_variant(param_gv);
190 g_variant_get(inner_gv, "ay", &iter);
191 while (g_variant_iter_loop(iter, "y", &rt_i)) {
192 r_atr.atr_data[i] = rt_i;
195 r_atr.atr_len = (int) i;
196 g_variant_iter_free(iter);
197 g_variant_unref(inner_gv);
198 g_variant_unref(param_gv);
199 /* for(i=0; i < (int)r_atr.atr_len; i++)
200 dbg("r_atr[%d][0x%02x]",i, r_atr.atr_data[i]);*/
202 if (evt_cb_data->cb_fn) {
203 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_atr, evt_cb_data->user_data);
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 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
220 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
221 DBUS_TELEPHONY_SAP_INTERFACE, "GetATR", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
222 handle->ca, on_response_sap_transfer_atr, evt_cb_data);
224 return TAPI_API_SUCCESS;
227 static void on_response_sap_transfer_apdu(GObject *source_object, GAsyncResult *res, gpointer user_data)
229 GError *error = NULL;
230 GDBusConnection *conn = NULL;
231 GVariant *dbus_result;
233 GVariantIter *iter = NULL;
234 GVariant *param_gv = NULL;
235 GVariant *inner_gv = NULL;
239 struct tapi_resp_data *evt_cb_data = user_data;
240 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
241 TelSapApduData_t r_apdu;
243 dbg("Func Entrance");
244 memset(&r_apdu, 0, sizeof(TelSapApduData_t));
246 conn = G_DBUS_CONNECTION (source_object);
247 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
250 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
251 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
252 inner_gv = g_variant_get_variant(param_gv);
254 g_variant_get(inner_gv, "ay", &iter);
255 while (g_variant_iter_loop(iter, "y", &rt_i)) {
256 r_apdu.apdu_data[i] = rt_i;
259 r_apdu.apdu_len = (int) i;
260 g_variant_iter_free(iter);
261 g_variant_unref(inner_gv);
262 g_variant_unref(param_gv);
263 /* for(i=0; i < (int)r_apdu.apdu_len; i++)
264 dbg("apdu[%d][0x%02x]",i, r_apdu.apdu_data[i]);*/
266 if (evt_cb_data->cb_fn) {
267 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_apdu, evt_cb_data->user_data);
271 g_variant_unref(dbus_result);
274 EXPORT_API int tel_req_sap_transfer_apdu(TapiHandle *handle, TelSapApduData_t *apdu_data, tapi_response_cb callback, void *user_data)
276 struct tapi_resp_data *evt_cb_data = NULL;
277 GVariantBuilder builder;
278 GVariant *param = NULL;
279 GVariant *inner_gv = NULL;
282 dbg("Func Entrance");
284 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
285 TAPI_RET_ERR_NUM_IF_FAIL(apdu_data, TAPI_API_INVALID_PTR);
287 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
289 g_variant_builder_init(&builder, G_VARIANT_TYPE ("ay"));
290 for (i = 0; i < apdu_data->apdu_len; i++) {
291 dbg("apdu_data->apdu_data[%d][0x%02x]", i,apdu_data->apdu_data[i]);
292 g_variant_builder_add(&builder, "y", apdu_data->apdu_data[i]);
294 inner_gv = g_variant_builder_end(&builder);
295 param = g_variant_new("(v)", inner_gv);
296 /*g_variant_builder_unref (builder);*/
298 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
299 DBUS_TELEPHONY_SAP_INTERFACE, "TransferAPDU", 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);
320 g_variant_get(dbus_result, "(i)", &result);
322 if (evt_cb_data->cb_fn) {
323 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
327 g_variant_unref(dbus_result);
330 EXPORT_API int tel_req_sap_transport_protocol(TapiHandle *handle, TelSimSapProtocol_t protocol, tapi_response_cb callback, void *user_data)
332 struct tapi_resp_data *evt_cb_data = NULL;
333 GVariant *param = NULL;
335 dbg("Func Entrance w/ protocol[%d]", protocol);
337 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
339 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
341 param = g_variant_new("(i)", protocol);
342 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
343 DBUS_TELEPHONY_SAP_INTERFACE, "SetProtocol", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
344 handle->ca, on_response_sap_transport_protocol, evt_cb_data);
346 return TAPI_API_SUCCESS;
349 static void on_response_sap_power_operation(GObject *source_object, GAsyncResult *res, gpointer user_data)
351 GError *error = NULL;
352 GDBusConnection *conn = NULL;
353 GVariant *dbus_result;
355 struct tapi_resp_data *evt_cb_data = user_data;
356 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
358 dbg("Func Entrance");
360 conn = G_DBUS_CONNECTION (source_object);
361 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
364 g_variant_get(dbus_result, "(i)", &result);
366 if (evt_cb_data->cb_fn) {
367 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
371 g_variant_unref(dbus_result);
374 EXPORT_API int tel_req_sap_power_operation(TapiHandle *handle, TelSimSapPowerMode_t power_mode, tapi_response_cb callback, void *user_data)
376 struct tapi_resp_data *evt_cb_data = NULL;
377 GVariant *param = NULL;
379 dbg("Func Entrance w/ power_mode[%d]", power_mode);
381 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
383 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
385 switch (power_mode) {
386 case TAPI_SIM_SAP_POWER_SIM_ON_REQ:
389 case TAPI_SIM_SAP_POWER_SIM_OFF_REQ:
392 case TAPI_SIM_SAP_RESET_SIM_REQ:
396 dbg("not handed value[%d]", power_mode);
400 param = g_variant_new("(i)", mode);
401 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
402 DBUS_TELEPHONY_SAP_INTERFACE, "SetPower", param, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
403 handle->ca, on_response_sap_power_operation, evt_cb_data);
405 return TAPI_API_SUCCESS;
408 static void on_response_sap_cardreader_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
410 GError *error = NULL;
411 GDBusConnection *conn = NULL;
412 GVariant *dbus_result;
414 struct tapi_resp_data *evt_cb_data = user_data;
415 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
416 TelSimSapCardStatus_t reader_status = TAPI_SIM_SAP_CARD_STATUS_UNKNOWN;
418 dbg("Func Entrance");
420 conn = G_DBUS_CONNECTION (source_object);
421 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
424 g_variant_get(dbus_result, "(ii)", &result, &reader_status);
426 if (evt_cb_data->cb_fn) {
427 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&reader_status, evt_cb_data->user_data);
431 g_variant_unref(dbus_result);
434 EXPORT_API int tel_req_sap_cardreader_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
436 struct tapi_resp_data *evt_cb_data = NULL;
438 dbg("Func Entrance ");
440 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
442 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
444 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
445 DBUS_TELEPHONY_SAP_INTERFACE, "GetCardReaderStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, TAPI_DEFAULT_TIMEOUT,
446 handle->ca, on_response_sap_cardreader_status, evt_cb_data);
448 return TAPI_API_SUCCESS;