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.
30 #include <communicator.h>
31 #include <core_object.h>
33 #include <user_request.h>
38 #include "generated-code.h"
41 static gboolean on_sap_connect(TelephonySap *sap, GDBusMethodInvocation *invocation,
42 gint arg_req_max_size, gpointer user_data)
44 struct custom_data *ctx = user_data;
45 UserRequest *ur = NULL;
47 struct treq_sap_req_connect req_conn;
49 if (!check_access_control (invocation, AC_SAP, "x"))
52 ur = MAKE_UR(ctx, sap, invocation);
53 memset(&req_conn, 0, sizeof(struct treq_sap_req_connect));
55 req_conn.max_msg_size = (unsigned short)arg_req_max_size;
57 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_connect), &req_conn);
58 tcore_user_request_set_command(ur, TREQ_SAP_REQ_CONNECT);
59 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
60 if(ret != TCORE_RETURN_SUCCESS) {
61 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
62 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
63 tcore_user_request_unref(ur);
69 static gboolean on_sap_disconnect(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
71 struct custom_data *ctx = user_data;
72 UserRequest *ur = NULL;
75 if (!check_access_control (invocation, AC_SAP, "x"))
78 ur = MAKE_UR(ctx, sap, invocation);
80 tcore_user_request_set_command(ur, TREQ_SAP_REQ_DISCONNECT);
81 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
82 if(ret != TCORE_RETURN_SUCCESS) {
83 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
84 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
85 tcore_user_request_unref(ur);
91 static gboolean on_sap_get_status(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
93 struct custom_data *ctx = user_data;
94 UserRequest *ur = NULL;
97 if (!check_access_control (invocation, AC_SAP, "r"))
100 ur = MAKE_UR(ctx, sap, invocation);
102 tcore_user_request_set_command(ur, TREQ_SAP_REQ_STATUS);
103 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
104 if(ret != TCORE_RETURN_SUCCESS) {
105 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
106 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
107 tcore_user_request_unref(ur);
113 static gboolean on_sap_get_atr(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
115 struct custom_data *ctx = user_data;
116 UserRequest *ur = NULL;
119 if (!check_access_control (invocation, AC_SAP, "r"))
122 ur = MAKE_UR(ctx, sap, invocation);
124 tcore_user_request_set_command(ur, TREQ_SAP_REQ_ATR);
125 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
126 if(ret != TCORE_RETURN_SUCCESS) {
127 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
128 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
129 tcore_user_request_unref(ur);
135 static gboolean on_sap_transfer_apdu(TelephonySap *sap, GDBusMethodInvocation *invocation,
136 GVariant *arg_req_apdu, gpointer user_data)
138 struct custom_data *ctx = user_data;
139 UserRequest *ur = NULL;
140 struct treq_sap_transfer_apdu t_apdu;
142 GVariantIter *iter = NULL;
143 GVariant *inner_gv = NULL;
147 dbg("Func Entrance");
149 if (!check_access_control (invocation, AC_SAP, "x"))
152 memset(&t_apdu, 0, sizeof(struct treq_sap_transfer_apdu));
154 inner_gv = g_variant_get_variant(arg_req_apdu);
156 g_variant_get(inner_gv, "ay", &iter);
157 while ( g_variant_iter_loop (iter, "y", &rt_i)) {
158 t_apdu.apdu_data[i] = rt_i;
161 t_apdu.apdu_length = (unsigned int)i;
162 g_variant_iter_free(iter);
163 g_variant_unref(inner_gv);
164 g_variant_unref(arg_req_apdu);
166 for(i=0; i < (int)t_apdu.apdu_length; i++)
167 dbg("apdu[%d][0x%02x]",i, t_apdu.apdu_data[i]);
169 ur = MAKE_UR(ctx, sap, invocation);
170 tcore_user_request_set_data(ur, sizeof(struct treq_sap_transfer_apdu), &t_apdu);
171 tcore_user_request_set_command(ur, TREQ_SAP_TRANSFER_APDU);
172 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
173 if(ret != TCORE_RETURN_SUCCESS) {
174 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
175 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
176 tcore_user_request_unref(ur);
182 static gboolean on_sap_set_protocol(TelephonySap *sap, GDBusMethodInvocation *invocation,
183 gint arg_protocol, gpointer user_data)
185 struct custom_data *ctx = user_data;
186 UserRequest *ur = NULL;
188 struct treq_sap_set_protocol set_protocol;
190 if (!check_access_control (invocation, AC_SAP, "w"))
193 ur = MAKE_UR(ctx, sap, invocation);
194 memset(&set_protocol, 0, sizeof(struct treq_sap_set_protocol));
196 set_protocol.protocol = arg_protocol;
198 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_protocol), &set_protocol);
199 tcore_user_request_set_command(ur, TREQ_SAP_SET_PROTOCOL);
200 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
201 if(ret != TCORE_RETURN_SUCCESS) {
202 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
203 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
204 tcore_user_request_unref(ur);
210 static gboolean on_sap_set_power(TelephonySap *sap, GDBusMethodInvocation *invocation,
211 gint arg_mode, gpointer user_data)
213 struct custom_data *ctx = user_data;
214 UserRequest *ur = NULL;
216 struct treq_sap_set_power set_power;
218 if (!check_access_control (invocation, AC_SAP, "w"))
221 ur = MAKE_UR(ctx, sap, invocation);
222 memset(&set_power, 0, sizeof(struct treq_sap_set_power));
224 set_power.mode = arg_mode;
226 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_power), &set_power);
227 tcore_user_request_set_command(ur, TREQ_SAP_SET_POWER);
228 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
229 if(ret != TCORE_RETURN_SUCCESS) {
230 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
231 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
232 tcore_user_request_unref(ur);
238 static gboolean on_sap_get_card_reader_status(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
240 struct custom_data *ctx = user_data;
241 UserRequest *ur = NULL;
244 if (!check_access_control (invocation, AC_SAP, "r"))
247 ur = MAKE_UR(ctx, sap, invocation);
249 tcore_user_request_set_command(ur, TREQ_SAP_REQ_CARDREADERSTATUS);
250 ret = tcore_communicator_dispatch_request(ctx->comm, ur);
251 if(ret != TCORE_RETURN_SUCCESS) {
252 FAIL_RESPONSE (invocation, DEFAULT_MSG_REQ_FAILED);
253 dbg("[ error ] tcore_communicator_dispatch_request() : (0x%x)", ret);
254 tcore_user_request_unref(ur);
260 gboolean dbus_plugin_setup_sap_interface(TelephonyObjectSkeleton *object, struct custom_data *ctx)
264 sap = telephony_sap_skeleton_new();
265 telephony_object_skeleton_set_sap(object, sap);
268 dbg("sap = %p", sap);
270 g_signal_connect (sap,
272 G_CALLBACK (on_sap_connect),
275 g_signal_connect (sap,
277 G_CALLBACK (on_sap_disconnect),
280 g_signal_connect (sap,
282 G_CALLBACK (on_sap_get_status),
285 g_signal_connect (sap,
287 G_CALLBACK (on_sap_get_atr),
290 g_signal_connect (sap,
291 "handle-transfer-apdu",
292 G_CALLBACK (on_sap_transfer_apdu),
295 g_signal_connect (sap,
296 "handle-set-protocol",
297 G_CALLBACK (on_sap_set_protocol),
300 g_signal_connect (sap,
302 G_CALLBACK (on_sap_set_power),
305 g_signal_connect (sap,
306 "handle-get-card-reader-status",
307 G_CALLBACK (on_sap_get_card_reader_status),
313 gboolean dbus_plugin_sap_response(struct custom_data *ctx, UserRequest *ur,
314 struct dbus_request_info *dbus_info, enum tcore_response_command command,
315 unsigned int data_len, const void *data)
317 const struct tresp_sap_req_connect *sap_conn = data;
318 const struct tresp_sap_req_disconnect *sap_disconn = data;
319 const struct tresp_sap_req_status *sap_status = data;
320 const struct tresp_sap_req_atr *sap_atr = data;
321 const struct tresp_sap_transfer_apdu *sap_apdu = data;
322 const struct tresp_sap_set_protocol *sap_protocol = data;
323 const struct tresp_sap_set_power *sap_power = data;
324 const struct tresp_sap_req_cardreaderstatus *sap_reader = data;
326 dbg("application Command = [0x%x], data_len = %d",command, data_len);
329 case TRESP_SAP_REQ_CONNECT:
330 dbg("dbus comm - TRESP_SAP_REQ_CONNECT");
331 telephony_sap_complete_connect(dbus_info->interface_object, dbus_info->invocation,
332 sap_conn->status, sap_conn->max_msg_size);
335 case TRESP_SAP_REQ_DISCONNECT:
336 dbg("dbus comm - TRESP_SAP_REQ_DISCONNECT");
337 telephony_sap_complete_disconnect(dbus_info->interface_object, dbus_info->invocation,
338 sap_disconn->result);
341 case TRESP_SAP_REQ_STATUS:
342 dbg("dbus comm - TRESP_SAP_REQ_STATUS");
343 telephony_sap_complete_get_status(dbus_info->interface_object, dbus_info->invocation,
347 case TRESP_SAP_REQ_ATR: {
348 GVariantBuilder builder;
349 GVariant * atr_gv = NULL;
350 GVariant *inner_gv = NULL;
353 dbg("dbus comm - TRESP_SAP_REQ_ATR");
354 g_variant_builder_init(&builder, G_VARIANT_TYPE ("ay"));
355 for(i = 0; i < (int)sap_atr->atr_length; i++) {
356 dbg("sap_atr->atr[%d][0x%02x]", i,sap_atr->atr[i]);
357 g_variant_builder_add (&builder, "y", sap_atr->atr[i]);
359 inner_gv = g_variant_builder_end(&builder);
360 atr_gv = g_variant_new("v", inner_gv);
362 telephony_sap_complete_get_atr(dbus_info->interface_object, dbus_info->invocation,
363 sap_atr->result, atr_gv);
367 case TRESP_SAP_TRANSFER_APDU: {
368 GVariantBuilder builder;
369 GVariant * apdu_gv = NULL;
370 GVariant *inner_gv = NULL;
373 dbg("dbus comm - TRESP_SAP_TRANSFER_APDU");
374 g_variant_builder_init(&builder, G_VARIANT_TYPE ("ay"));
375 for(i = 0; i < (int)sap_apdu->resp_apdu_length; i++) {
376 dbg("sap_apdu->resp_adpdu[%d][0x%02x]", i,sap_apdu->resp_adpdu[i]);
377 g_variant_builder_add (&builder, "y", sap_apdu->resp_adpdu[i]);
379 inner_gv = g_variant_builder_end(&builder);
380 apdu_gv = g_variant_new("v", inner_gv);
382 telephony_sap_complete_transfer_apdu(dbus_info->interface_object, dbus_info->invocation,
383 sap_apdu->result, apdu_gv);
387 case TRESP_SAP_SET_PROTOCOL:
388 dbg("dbus comm - TRESP_SAP_SET_PROTOCOL");
389 telephony_sap_complete_set_protocol(dbus_info->interface_object, dbus_info->invocation,
390 sap_protocol->result);
393 case TRESP_SAP_SET_POWER:
394 dbg("dbus comm - TRESP_SAP_SET_POWER");
395 telephony_sap_complete_set_power(dbus_info->interface_object, dbus_info->invocation,
399 case TRESP_SAP_REQ_CARDREADERSTATUS:
400 dbg("dbus comm - TRESP_SAP_REQ_CARDREADERSTATUS");
401 telephony_sap_complete_get_card_reader_status(dbus_info->interface_object, dbus_info->invocation,
402 sap_reader->result, sap_reader->reader_status);
406 dbg("not handled command[%d]", command);
413 gboolean dbus_plugin_sap_notification(struct custom_data *ctx, CoreObject *source,
414 TelephonyObjectSkeleton *object, enum tcore_notification_command command,
415 unsigned int data_len, const void *data)
418 const struct tnoti_sap_status_changed *n_sap_status = data;
419 const struct tnoti_sap_disconnect *n_sap_disconn = data;
422 dbg("object is NULL");
426 sap = telephony_object_peek_sap(TELEPHONY_OBJECT(object));
429 case TNOTI_SAP_STATUS:
430 dbg("notified sap_status[%d]", n_sap_status->status);
431 telephony_sap_emit_status(sap, n_sap_status->status);
433 case TNOTI_SAP_DISCONNECT:
434 dbg("notified sap_disconnect type[%d]", n_sap_disconn->type);
435 telephony_sap_emit_disconnect(sap, n_sap_disconn->type);
438 dbg("not handled command[%d]", command);