Initialize Tizen 2.3
[framework/telephony/libslp-tapi.git] / wearable / src / tapi_sap.c
1 /*
2  * libslp-tapi
3  *
4  * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Ja-young Gu <jygu@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  */
20
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "tapi_common.h"
27 #include "TapiUtility.h"
28 #include "TelSim.h"
29
30 #include "common.h"
31 #include "tapi_log.h"
32 #include "ITapiSap.h"
33
34 static void on_response_sap_connect(GObject *source_object, GAsyncResult *res, gpointer user_data)
35 {
36         GError *error = NULL;
37         GDBusConnection *conn = NULL;
38         GVariant *dbus_result;
39
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;
43
44         dbg("Func Entrance");
45
46         conn = G_DBUS_CONNECTION (source_object);
47         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
48         CHECK_DEINIT(error);
49
50         if (!dbus_result) {
51                 if (evt_cb_data->cb_fn) {
52                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
53                 }
54
55                 if (error)
56                         g_error_free(error);
57
58                 g_free(evt_cb_data);
59                 return;
60         }
61
62         g_variant_get(dbus_result, "(ii)", &result, &max_msg_size);
63
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);
66         }
67
68         g_free(evt_cb_data);
69 }
70
71 EXPORT_API int tel_req_sap_connect(TapiHandle *handle, int max_msg_size, tapi_response_cb callback, void *user_data)
72 {
73         struct tapi_resp_data *evt_cb_data = NULL;
74         GVariant *param = NULL;
75
76         dbg("Func Entrance w/ max_msg_size[%d]",max_msg_size);
77
78         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
79
80         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
81
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);
86
87         return TAPI_API_SUCCESS;
88 }
89
90 static void on_response_sap_disconnect(GObject *source_object, GAsyncResult *res, gpointer user_data)
91 {
92         GError *error = NULL;
93         GDBusConnection *conn = NULL;
94         GVariant *dbus_result;
95
96         struct tapi_resp_data *evt_cb_data = user_data;
97         TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
98
99         dbg("Func Entrance");
100
101         conn = G_DBUS_CONNECTION (source_object);
102         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
103         CHECK_DEINIT(error);
104
105         if (!dbus_result) {
106                 if (evt_cb_data->cb_fn) {
107                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
108                 }
109
110                 if (error)
111                         g_error_free(error);
112
113                 g_free(evt_cb_data);
114                 return;
115         }
116
117         g_variant_get(dbus_result, "(i)", &result);
118
119         if (evt_cb_data->cb_fn) {
120                 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
121         }
122
123         g_free(evt_cb_data);
124 }
125
126 EXPORT_API int tel_req_sap_disconnect(TapiHandle *handle, tapi_response_cb callback, void *user_data)
127 {
128         struct tapi_resp_data *evt_cb_data = NULL;
129
130         dbg("Func Entrance ");
131
132         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
133
134         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
135
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);
139
140         return TAPI_API_SUCCESS;
141 }
142
143 static void on_response_sap_connection_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
144 {
145         GError *error = NULL;
146         GDBusConnection *conn = NULL;
147         GVariant *dbus_result;
148
149         struct tapi_resp_data *evt_cb_data = user_data;
150         TelSimSapStatusInfo_t result = TAPI_SIM_SAP_STATUS_UNKNOWN;
151
152         dbg("Func Entrance");
153
154         conn = G_DBUS_CONNECTION (source_object);
155         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
156         CHECK_DEINIT(error);
157
158         if (!dbus_result) {
159                 if (evt_cb_data->cb_fn) {
160                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
161                 }
162
163                 if (error)
164                         g_error_free(error);
165
166                 g_free(evt_cb_data);
167                 return;
168         }
169
170         g_variant_get(dbus_result, "(i)", &result);
171
172         if (evt_cb_data->cb_fn) {
173                 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
174         }
175
176         g_free(evt_cb_data);
177 }
178
179 EXPORT_API int tel_req_sap_connection_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
180 {
181         struct tapi_resp_data *evt_cb_data = NULL;
182
183         dbg("Func Entrance");
184
185         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
186
187         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
188
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);
192
193         return TAPI_API_SUCCESS;
194 }
195
196 static void on_response_sap_transfer_atr(GObject *source_object, GAsyncResult *res, gpointer user_data)
197 {
198         GError *error = NULL;
199         GDBusConnection *conn = NULL;
200         GVariant *dbus_result;
201
202         GVariantIter *iter = NULL;
203         GVariant *param_gv = NULL;
204         GVariant *inner_gv = NULL;
205         guchar rt_i;
206         int i = 0;
207
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;
211
212         dbg("Func Entrance");
213         memset(&r_atr, 0, sizeof(TelSapAtrInfo_t));
214
215         conn = G_DBUS_CONNECTION (source_object);
216         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
217         CHECK_DEINIT(error);
218
219         if (!dbus_result) {
220                 if (evt_cb_data->cb_fn) {
221                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
222                 }
223
224                 if (error)
225                         g_error_free(error);
226
227                 g_free(evt_cb_data);
228                 return;
229         }
230
231         /*      dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
232         g_variant_get(dbus_result, "(i@v)", &result, &param_gv);
233         inner_gv = g_variant_get_variant(param_gv);
234
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;
238                 i++;
239         }
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]);*/
246
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);
249         }
250
251         g_free(evt_cb_data);
252 }
253
254 EXPORT_API int tel_req_sap_transfer_atr(TapiHandle *handle, tapi_response_cb callback, void *user_data)
255 {
256         struct tapi_resp_data *evt_cb_data = NULL;
257
258         dbg("Func Entrance");
259
260         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
261
262         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
263
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);
267
268         return TAPI_API_SUCCESS;
269 }
270
271 static void on_response_sap_transfer_apdu(GObject *source_object, GAsyncResult *res, gpointer user_data)
272 {
273         GError *error = NULL;
274         GDBusConnection *conn = NULL;
275         GVariant *dbus_result;
276
277         GVariantIter *iter = NULL;
278         GVariant *param_gv = NULL;
279         GVariant *inner_gv = NULL;
280         guchar rt_i;
281         int i = 0;
282
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;
286
287         dbg("Func Entrance");
288         memset(&r_apdu, 0, sizeof(TelSapApduData_t));
289
290         conn = G_DBUS_CONNECTION (source_object);
291         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
292         CHECK_DEINIT(error);
293
294         if (!dbus_result) {
295                 if (evt_cb_data->cb_fn) {
296                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
297                 }
298
299                 if (error)
300                         g_error_free(error);
301
302                 g_free(evt_cb_data);
303                 return;
304         }
305
306         /*      dbg("dbus_result type_format(%s)", g_variant_get_type_string(dbus_result));*/
307         g_variant_get(dbus_result, "(i@v)", &result, &param_gv);
308         inner_gv = g_variant_get_variant(param_gv);
309
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;
313                 i++;
314         }
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]);*/
321
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);
324         }
325
326         g_free(evt_cb_data);
327 }
328
329 EXPORT_API int tel_req_sap_transfer_apdu(TapiHandle *handle, TelSapApduData_t *apdu_data, tapi_response_cb callback, void *user_data)
330 {
331         struct tapi_resp_data *evt_cb_data = NULL;
332         GVariantBuilder *builder = NULL;
333         GVariant *param = NULL;
334         GVariant *inner_gv = NULL;
335         int i = 0;
336
337         dbg("Func Entrance");
338
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);
341
342         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
343
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]);
348         }
349         inner_gv = g_variant_builder_end(builder);
350         param = g_variant_new("(v)", inner_gv);
351         /*g_variant_builder_unref (builder);*/
352
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);
356
357         return TAPI_API_SUCCESS;
358 }
359
360 static void on_response_sap_transport_protocol(GObject *source_object, GAsyncResult *res, gpointer user_data)
361 {
362         GError *error = NULL;
363         GDBusConnection *conn = NULL;
364         GVariant *dbus_result;
365
366         struct tapi_resp_data *evt_cb_data = user_data;
367         TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
368
369         dbg("Func Entrance");
370
371         conn = G_DBUS_CONNECTION (source_object);
372         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
373         CHECK_DEINIT(error);
374
375         if (!dbus_result) {
376                 if (evt_cb_data->cb_fn) {
377                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
378                 }
379
380                 if (error)
381                         g_error_free(error);
382
383                 g_free(evt_cb_data);
384                 return;
385         }
386
387         g_variant_get(dbus_result, "(i)", &result);
388
389         if (evt_cb_data->cb_fn) {
390                 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
391         }
392
393         g_free(evt_cb_data);
394 }
395
396 EXPORT_API int tel_req_sap_transport_protocol(TapiHandle *handle, TelSimSapProtocol_t protocol, tapi_response_cb callback, void *user_data)
397 {
398         struct tapi_resp_data *evt_cb_data = NULL;
399         GVariant *param = NULL;
400
401         dbg("Func Entrance w/ protocol[%d]", protocol);
402
403         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
404
405         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
406
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);
411
412         return TAPI_API_SUCCESS;
413 }
414
415 static void on_response_sap_power_operation(GObject *source_object, GAsyncResult *res, gpointer user_data)
416 {
417         GError *error = NULL;
418         GDBusConnection *conn = NULL;
419         GVariant *dbus_result;
420
421         struct tapi_resp_data *evt_cb_data = user_data;
422         TelSimSapResultCode_t result = TAPI_SIM_SAP_RESULT_CODE_OK;
423
424         dbg("Func Entrance");
425
426         conn = G_DBUS_CONNECTION (source_object);
427         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
428         CHECK_DEINIT(error);
429
430         if (!dbus_result) {
431                 if (evt_cb_data->cb_fn) {
432                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
433                 }
434
435                 if (error)
436                         g_error_free(error);
437
438                 g_free(evt_cb_data);
439                 return;
440         }
441
442         g_variant_get(dbus_result, "(i)", &result);
443
444         if (evt_cb_data->cb_fn) {
445                 evt_cb_data->cb_fn(evt_cb_data->handle, result, NULL, evt_cb_data->user_data);
446         }
447
448         g_free(evt_cb_data);
449 }
450
451 EXPORT_API int tel_req_sap_power_operation(TapiHandle *handle, TelSimSapPowerMode_t power_mode, tapi_response_cb callback, void *user_data)
452 {
453         struct tapi_resp_data *evt_cb_data = NULL;
454         GVariant *param = NULL;
455         gint mode = 0;
456         dbg("Func Entrance w/ power_mode[%d]", power_mode);
457
458         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
459
460         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
461
462         switch (power_mode) {
463                 case TAPI_SIM_SAP_POWER_SIM_ON_REQ:
464                         mode = 0;
465                         break;
466                 case TAPI_SIM_SAP_POWER_SIM_OFF_REQ:
467                         mode =1;
468                         break;
469                 case TAPI_SIM_SAP_RESET_SIM_REQ:
470                         mode = 2;
471                         break;
472                 default:
473                         dbg("not handed value[%d]", power_mode);
474                         break;
475         }
476
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);
481
482         return TAPI_API_SUCCESS;
483 }
484
485 static void on_response_sap_cardreader_status(GObject *source_object, GAsyncResult *res, gpointer user_data)
486 {
487         GError *error = NULL;
488         GDBusConnection *conn = NULL;
489         GVariant *dbus_result;
490
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;
494
495         dbg("Func Entrance");
496
497         conn = G_DBUS_CONNECTION (source_object);
498         dbus_result = g_dbus_connection_call_finish(conn, res, &error);
499         CHECK_DEINIT(error);
500
501         if (!dbus_result) {
502                 if (evt_cb_data->cb_fn) {
503                         evt_cb_data->cb_fn(evt_cb_data->handle, -1, NULL, evt_cb_data->user_data);
504                 }
505
506                 if (error)
507                         g_error_free(error);
508
509                 g_free(evt_cb_data);
510                 return;
511         }
512
513         g_variant_get(dbus_result, "(ii)", &result, &reader_status);
514
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);
517         }
518
519         g_free(evt_cb_data);
520 }
521
522 EXPORT_API int tel_req_sap_cardreader_status(TapiHandle *handle, tapi_response_cb callback, void *user_data)
523 {
524         struct tapi_resp_data *evt_cb_data = NULL;
525
526         dbg("Func Entrance ");
527
528         TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
529
530         MAKE_RESP_CB_DATA(evt_cb_data, handle, callback, user_data);
531
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);
535
536         return TAPI_API_SUCCESS;
537 }