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 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
80 param = g_variant_new("(i)", max_msg_size);
81 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
82 DBUS_TELEPHONY_SAP_INTERFACE, "Connect", param, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
83 handle->ca, on_response_sap_connect, evt_cb_data);
85 return TAPI_API_SUCCESS;
88 static void on_response_sap_disconnect(GObject *source_object, GAsyncResult *res, gpointer user_data)
91 GDBusConnection *conn = NULL;
92 GVariant *dbus_result;
94 struct tapi_resp_data *evt_cb_data = user_data;
95 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
99 conn = G_DBUS_CONNECTION (source_object);
100 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
104 if (evt_cb_data->cb_fn) {
105 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
115 g_variant_get(dbus_result, "(i)", &result);
117 if (evt_cb_data->cb_fn) {
118 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
124 EXPORT_API int tel_req_sap_disconnect(TapiHandle *handle, tapi_response_cb callback, void *user_data)
126 struct tapi_resp_data *evt_cb_data = NULL;
128 dbg("Func Entrance ");
130 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
132 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
133 DBUS_TELEPHONY_SAP_INTERFACE, "Disconnect", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
134 handle->ca, on_response_sap_disconnect, evt_cb_data);
136 return TAPI_API_SUCCESS;
139 static void on_response_sap_connection_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
141 GError *error = NULL;
142 GDBusConnection *conn = NULL;
143 GVariant *dbus_result;
145 struct tapi_resp_data *evt_cb_data = user_data;
146 TelSimSapStatusInfo_t result = TAPI_SIM_SAP_STATUS_UNKNOWN;
148 dbg("Func Entrance");
150 conn = G_DBUS_CONNECTION (source_object);
151 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
155 if (evt_cb_data->cb_fn) {
156 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
166 g_variant_get(dbus_result, "(i)", &result);
168 if (evt_cb_data->cb_fn) {
169 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
175 EXPORT_API int tel_req_sap_connection_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
177 struct tapi_resp_data *evt_cb_data = NULL;
179 dbg("Func Entrance");
181 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
183 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
184 DBUS_TELEPHONY_SAP_INTERFACE, "GetStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
185 handle->ca, on_response_sap_connection_status, evt_cb_data);
187 return TAPI_API_SUCCESS;
190 static void on_response_sap_transfer_atr(GObject *source_object, GAsyncResult *res, gpointer user_data)
192 GError *error = NULL;
193 GDBusConnection *conn = NULL;
194 GVariant *dbus_result;
196 GVariantIter *iter = NULL;
197 GVariant *param_gv = NULL;
198 GVariant *inner_gv = NULL;
202 struct tapi_resp_data *evt_cb_data = user_data;
203 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
204 TelSapAtrInfo_t r_atr;
206 dbg("Func Entrance");
207 memset(&r_atr, 0, sizeof(TelSapAtrInfo_t));
209 conn = G_DBUS_CONNECTION (source_object);
210 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
214 if (evt_cb_data->cb_fn) {
215 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
225 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
226 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
227 inner_gv = g_variant_get_variant(param_gv);
229 g_variant_get(inner_gv, "ay", &iter);
230 while (g_variant_iter_loop(iter, "y", &rt_i)) {
231 r_atr.atr_data[i] = rt_i;
234 r_atr.atr_len = (int) i;
235 g_variant_iter_free(iter);
236 g_variant_unref(inner_gv);
237 g_variant_unref(param_gv);
238 /* for(i=0; i < (int)r_atr.atr_len; i++)
239 dbg("r_atr[%d][0x%02x]",i, r_atr.atr_data[i]);*/
241 if (evt_cb_data->cb_fn) {
242 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_atr, evt_cb_data->user_data);
248 EXPORT_API int tel_req_sap_transfer_atr(TapiHandle *handle, tapi_response_cb callback, void *user_data)
250 struct tapi_resp_data *evt_cb_data = NULL;
252 dbg("Func Entrance");
254 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
256 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
257 DBUS_TELEPHONY_SAP_INTERFACE, "GetATR", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
258 handle->ca, on_response_sap_transfer_atr, evt_cb_data);
260 return TAPI_API_SUCCESS;
263 static void on_response_sap_transfer_apdu(GObject *source_object, GAsyncResult *res, gpointer user_data)
265 GError *error = NULL;
266 GDBusConnection *conn = NULL;
267 GVariant *dbus_result;
269 GVariantIter *iter = NULL;
270 GVariant *param_gv = NULL;
271 GVariant *inner_gv = NULL;
275 struct tapi_resp_data *evt_cb_data = user_data;
276 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
277 TelSapApduData_t r_apdu;
279 dbg("Func Entrance");
280 memset(&r_apdu, 0, sizeof(TelSapApduData_t));
282 conn = G_DBUS_CONNECTION (source_object);
283 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
287 if (evt_cb_data->cb_fn) {
288 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
298 /* dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
299 g_variant_get(dbus_result, "(i@v)", &result, ¶m_gv);
300 inner_gv = g_variant_get_variant(param_gv);
302 g_variant_get(inner_gv, "ay", &iter);
303 while (g_variant_iter_loop(iter, "y", &rt_i)) {
304 r_apdu.apdu_data[i] = rt_i;
307 r_apdu.apdu_len = (int) i;
308 g_variant_iter_free(iter);
309 g_variant_unref(inner_gv);
310 g_variant_unref(param_gv);
311 /* for(i=0; i < (int)r_apdu.apdu_len; i++)
312 dbg("apdu[%d][0x%02x]",i, r_apdu.apdu_data[i]);*/
314 if (evt_cb_data->cb_fn) {
315 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&r_apdu, evt_cb_data->user_data);
321 EXPORT_API int tel_req_sap_transfer_apdu(TapiHandle *handle, TelSapApduData_t *apdu_data, tapi_response_cb callback, void *user_data)
323 struct tapi_resp_data *evt_cb_data = NULL;
324 GVariantBuilder *builder = NULL;
325 GVariant *param = NULL;
326 GVariant *inner_gv = NULL;
329 dbg("Func Entrance");
330 TAPI_RETURN_VAL_IF_FAIL(apdu_data, TAPI_API_INVALID_PTR);
332 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
334 builder = g_variant_builder_new(G_VARIANT_TYPE ("ay"));
335 for (i = 0; i < apdu_data->apdu_len; i++) {
336 dbg("apdu_data->apdu_data[%d][0x%02x]", i,apdu_data->apdu_data[i]);
337 g_variant_builder_add(builder, "y", apdu_data->apdu_data[i]);
339 inner_gv = g_variant_builder_end(builder);
340 param = g_variant_new("(v)", inner_gv);
341 /*g_variant_builder_unref (builder);*/
343 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
344 DBUS_TELEPHONY_SAP_INTERFACE, "TransferAPDU", param, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
345 handle->ca, on_response_sap_transfer_apdu, evt_cb_data);
347 return TAPI_API_SUCCESS;
350 static void on_response_sap_transport_protocol(GObject *source_object, GAsyncResult *res, gpointer user_data)
352 GError *error = NULL;
353 GDBusConnection *conn = NULL;
354 GVariant *dbus_result;
356 struct tapi_resp_data *evt_cb_data = user_data;
357 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
359 dbg("Func Entrance");
361 conn = G_DBUS_CONNECTION (source_object);
362 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
366 if (evt_cb_data->cb_fn) {
367 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
377 g_variant_get(dbus_result, "(i)", &result);
379 if (evt_cb_data->cb_fn) {
380 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
386 EXPORT_API int tel_req_sap_transport_protocol(TapiHandle *handle, TelSimSapProtocol_t protocol, tapi_response_cb callback, void *user_data)
388 struct tapi_resp_data *evt_cb_data = NULL;
389 GVariant *param = NULL;
391 dbg("Func Entrance w/ protocol[%d]", protocol);
393 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
395 param = g_variant_new("(i)", protocol);
396 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
397 DBUS_TELEPHONY_SAP_INTERFACE, "SetProtocol", param, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
398 handle->ca, on_response_sap_transport_protocol, evt_cb_data);
400 return TAPI_API_SUCCESS;
403 static void on_response_sap_power_operation(GObject *source_object, GAsyncResult *res, gpointer user_data)
405 GError *error = NULL;
406 GDBusConnection *conn = NULL;
407 GVariant *dbus_result;
409 struct tapi_resp_data *evt_cb_data = user_data;
410 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
412 dbg("Func Entrance");
414 conn = G_DBUS_CONNECTION (source_object);
415 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
419 if (evt_cb_data->cb_fn) {
420 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
430 g_variant_get(dbus_result, "(i)", &result);
432 if (evt_cb_data->cb_fn) {
433 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
439 EXPORT_API int tel_req_sap_power_operation(TapiHandle *handle, TelSimSapPowerMode_t power_mode, tapi_response_cb callback, void *user_data)
441 struct tapi_resp_data *evt_cb_data = NULL;
442 GVariant *param = NULL;
444 dbg("Func Entrance w/ power_mode[%d]", power_mode);
446 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
448 switch (power_mode) {
449 case TAPI_SIM_SAP_POWER_SIM_ON_REQ:
452 case TAPI_SIM_SAP_POWER_SIM_OFF_REQ:
455 case TAPI_SIM_SAP_RESET_SIM_REQ:
459 dbg("not handed value[%d]", power_mode);
463 param = g_variant_new("(i)", mode);
464 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
465 DBUS_TELEPHONY_SAP_INTERFACE, "SetPower", param, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
466 handle->ca, on_response_sap_power_operation, evt_cb_data);
468 return TAPI_API_SUCCESS;
471 static void on_response_sap_cardreader_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
473 GError *error = NULL;
474 GDBusConnection *conn = NULL;
475 GVariant *dbus_result;
477 struct tapi_resp_data *evt_cb_data = user_data;
478 TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
479 TelSimSapCardStatus_t reader_status = TAPI_SIM_SAP_CARD_STATUS_UNKNOWN;
481 dbg("Func Entrance");
483 conn = G_DBUS_CONNECTION (source_object);
484 dbus_result = g_dbus_connection_call_finish(conn, res, &error);
488 if (evt_cb_data->cb_fn) {
489 evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
499 g_variant_get(dbus_result, "(ii)", &result, &reader_status);
501 if (evt_cb_data->cb_fn) {
502 evt_cb_data->cb_fn(evt_cb_data->handle, result, (void*)&reader_status, evt_cb_data->user_data);
508 EXPORT_API int tel_req_sap_cardreader_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
510 struct tapi_resp_data *evt_cb_data = NULL;
512 dbg("Func Entrance ");
514 MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
516 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE, handle->path,
517 DBUS_TELEPHONY_SAP_INTERFACE, "GetCardReaderStatus", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1,
518 handle->ca, on_response_sap_cardreader_status, evt_cb_data);
520 return TAPI_API_SUCCESS;