2 * tel-plugin-socket-communicator
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.
25 #include <glib-object.h>
31 #include <communicator.h>
32 #include <core_object.h>
34 #include <user_request.h>
39 #include "generated-code.h"
42 #define g_variant_iter_free0( iter ) \
44 g_variant_iter_free( iter );\
49 static gboolean on_sap_connect(TelephonySap *sap, GDBusMethodInvocation *invocation,
50 gint arg_req_max_size, gpointer user_data)
52 struct custom_data *ctx = user_data;
53 UserRequest *ur = NULL;
55 struct treq_sap_req_connect req_conn;
57 ur = MAKE_UR(ctx, sap, invocation);
58 memset(&req_conn, 0, sizeof(struct treq_sap_req_connect));
60 req_conn.max_msg_size = (unsigned short)arg_req_max_size;
62 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_connect), &req_conn);
63 tcore_user_request_set_command(ur, TREQ_SAP_REQ_CONNECT);
64 tcore_communicator_dispatch_request(ctx->comm, 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;
74 struct treq_sap_req_disconnect req_disconn;
76 ur = MAKE_UR(ctx, sap, invocation);
77 memset(&req_disconn, 0, sizeof(struct treq_sap_req_disconnect));
79 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_disconnect), &req_disconn);
80 tcore_user_request_set_command(ur, TREQ_SAP_REQ_DISCONNECT);
81 tcore_communicator_dispatch_request(ctx->comm, ur);
86 static gboolean on_sap_get_status(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
88 struct custom_data *ctx = user_data;
89 UserRequest *ur = NULL;
91 struct treq_sap_req_status req_status;
93 ur = MAKE_UR(ctx, sap, invocation);
94 memset(&req_status, 0, sizeof(struct treq_sap_req_status));
96 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_status), &req_status);
97 tcore_user_request_set_command(ur, TREQ_SAP_REQ_STATUS);
98 tcore_communicator_dispatch_request(ctx->comm, ur);
103 static gboolean on_sap_get_atr(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
105 struct custom_data *ctx = user_data;
106 UserRequest *ur = NULL;
108 struct treq_sap_req_atr req_atr;
110 ur = MAKE_UR(ctx, sap, invocation);
111 memset(&req_atr, 0, sizeof(struct treq_sap_req_atr));
113 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_atr), &req_atr);
114 tcore_user_request_set_command(ur, TREQ_SAP_REQ_ATR);
115 tcore_communicator_dispatch_request(ctx->comm, ur);
120 static gboolean on_sap_transfer_apdu(TelephonySap *sap, GDBusMethodInvocation *invocation,
121 GVariant *arg_req_apdu, gpointer user_data)
123 struct custom_data *ctx = user_data;
124 UserRequest *ur = NULL;
125 struct treq_sap_transfer_apdu t_apdu;
127 GVariantIter *iter = NULL;
128 GVariant *inner_gv = NULL;
132 dbg("Func Entrance");
133 memset(&t_apdu, 0, sizeof(struct treq_sap_transfer_apdu));
135 inner_gv = g_variant_get_variant(arg_req_apdu);
137 g_variant_get(inner_gv, "ay", &iter);
138 while ( g_variant_iter_loop (iter, "y", &rt_i)) {
139 t_apdu.apdu_data[i] = rt_i;
142 t_apdu.apdu_length = (unsigned int)i;
143 g_variant_iter_free0(iter);
144 g_variant_unref(inner_gv);
145 g_variant_unref(arg_req_apdu);
147 for(i=0; i < (int)t_apdu.apdu_length; i++)
148 dbg("apdu[%d][0x%02x]",i, t_apdu.apdu_data[i]);
150 ur = MAKE_UR(ctx, sap, invocation);
151 tcore_user_request_set_data(ur, sizeof(struct treq_sap_transfer_apdu), &t_apdu);
152 tcore_user_request_set_command(ur, TREQ_SAP_TRANSFER_APDU);
153 tcore_communicator_dispatch_request(ctx->comm, ur);
158 static gboolean on_sap_set_protocol(TelephonySap *sap, GDBusMethodInvocation *invocation,
159 gint arg_protocol, gpointer user_data)
161 struct custom_data *ctx = user_data;
162 UserRequest *ur = NULL;
164 struct treq_sap_set_protocol set_protocol;
166 ur = MAKE_UR(ctx, sap, invocation);
167 memset(&set_protocol, 0, sizeof(struct treq_sap_set_protocol));
169 set_protocol.protocol = arg_protocol;
171 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_protocol), &set_protocol);
172 tcore_user_request_set_command(ur, TREQ_SAP_SET_PROTOCOL);
173 tcore_communicator_dispatch_request(ctx->comm, ur);
178 static gboolean on_sap_set_power(TelephonySap *sap, GDBusMethodInvocation *invocation,
179 gint arg_mode, gpointer user_data)
181 struct custom_data *ctx = user_data;
182 UserRequest *ur = NULL;
184 struct treq_sap_set_power set_power;
186 ur = MAKE_UR(ctx, sap, invocation);
187 memset(&set_power, 0, sizeof(struct treq_sap_set_power));
189 set_power.mode = arg_mode;
191 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_power), &set_power);
192 tcore_user_request_set_command(ur, TREQ_SAP_SET_POWER);
193 tcore_communicator_dispatch_request(ctx->comm, ur);
198 static gboolean on_sap_get_card_reader_status(TelephonySap *sap, GDBusMethodInvocation *invocation, gpointer user_data)
200 struct custom_data *ctx = user_data;
201 UserRequest *ur = NULL;
203 struct treq_sap_req_cardreaderstatus req_reader;
205 ur = MAKE_UR(ctx, sap, invocation);
206 memset(&req_reader, 0, sizeof(struct treq_sap_req_cardreaderstatus));
208 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_cardreaderstatus), &req_reader);
209 tcore_user_request_set_command(ur, TREQ_SAP_REQ_CARDREADERSTATUS);
210 tcore_communicator_dispatch_request(ctx->comm, ur);
215 gboolean dbus_plugin_setup_sap_interface(TelephonyObjectSkeleton *object, struct custom_data *ctx)
219 sap = telephony_sap_skeleton_new();
220 telephony_object_skeleton_set_sap(object, sap);
223 dbg("sap = %p", sap);
225 g_signal_connect (sap,
227 G_CALLBACK (on_sap_connect),
230 g_signal_connect (sap,
232 G_CALLBACK (on_sap_disconnect),
235 g_signal_connect (sap,
237 G_CALLBACK (on_sap_get_status),
240 g_signal_connect (sap,
242 G_CALLBACK (on_sap_get_atr),
245 g_signal_connect (sap,
246 "handle-transfer-apdu",
247 G_CALLBACK (on_sap_transfer_apdu),
250 g_signal_connect (sap,
251 "handle-set-protocol",
252 G_CALLBACK (on_sap_set_protocol),
255 g_signal_connect (sap,
257 G_CALLBACK (on_sap_set_power),
260 g_signal_connect (sap,
261 "handle-get-card-reader-status",
262 G_CALLBACK (on_sap_get_card_reader_status),
268 gboolean dbus_plugin_sap_response(struct custom_data *ctx, UserRequest *ur,
269 struct dbus_request_info *dbus_info, enum tcore_response_command command,
270 unsigned int data_len, const void *data)
272 const struct tresp_sap_req_connect *sap_conn = data;
273 const struct tresp_sap_req_disconnect *sap_disconn = data;
274 const struct tresp_sap_req_status *sap_status = data;
275 const struct tresp_sap_req_atr *sap_atr = data;
276 const struct tresp_sap_transfer_apdu *sap_apdu = data;
277 const struct tresp_sap_set_protocol *sap_protocol = data;
278 const struct tresp_sap_set_power *sap_power = data;
279 const struct tresp_sap_req_cardreaderstatus *sap_reader = data;
281 dbg("application Command = [0x%x], data_len = %d",command, data_len);
284 case TRESP_SAP_REQ_CONNECT:
285 dbg("dbus comm - TRESP_SAP_REQ_CONNECT");
286 telephony_sap_complete_connect(dbus_info->interface_object, dbus_info->invocation,
287 sap_conn->status, sap_conn->max_msg_size);
290 case TRESP_SAP_REQ_DISCONNECT:
291 dbg("dbus comm - TRESP_SAP_REQ_DISCONNECT");
292 telephony_sap_complete_disconnect(dbus_info->interface_object, dbus_info->invocation,
293 sap_disconn->result);
296 case TRESP_SAP_REQ_STATUS:
297 dbg("dbus comm - TRESP_SAP_REQ_STATUS");
298 telephony_sap_complete_get_status(dbus_info->interface_object, dbus_info->invocation,
302 case TRESP_SAP_REQ_ATR: {
303 GVariantBuilder *builder = NULL;
304 GVariant * atr_gv = NULL;
305 GVariant *inner_gv = NULL;
308 dbg("dbus comm - TRESP_SAP_REQ_ATR");
309 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
310 for(i = 0; i < (int)sap_atr->atr_length; i++) {
311 dbg("sap_atr->atr[%d][0x%02x]", i,sap_atr->atr[i]);
312 g_variant_builder_add (builder, "y", sap_atr->atr[i]);
314 inner_gv = g_variant_builder_end(builder);
315 /* g_variant_builder_unref (builder);*/
316 atr_gv = g_variant_new("v", inner_gv);
318 telephony_sap_complete_get_atr(dbus_info->interface_object, dbus_info->invocation,
319 sap_atr->result, atr_gv);
323 case TRESP_SAP_TRANSFER_APDU: {
324 GVariantBuilder *builder = NULL;
325 GVariant * apdu_gv = NULL;
326 GVariant *inner_gv = NULL;
329 dbg("dbus comm - TRESP_SAP_TRANSFER_APDU");
330 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
331 for(i = 0; i < (int)sap_apdu->resp_apdu_length; i++) {
332 dbg("sap_apdu->resp_adpdu[%d][0x%02x]", i,sap_apdu->resp_adpdu[i]);
333 g_variant_builder_add (builder, "y", sap_apdu->resp_adpdu[i]);
335 inner_gv = g_variant_builder_end(builder);
336 /* g_variant_builder_unref (builder);*/
337 apdu_gv = g_variant_new("v", inner_gv);
339 telephony_sap_complete_transfer_apdu(dbus_info->interface_object, dbus_info->invocation,
340 sap_apdu->result, apdu_gv);
344 case TRESP_SAP_SET_PROTOCOL:
345 dbg("dbus comm - TRESP_SAP_SET_PROTOCOL");
346 telephony_sap_complete_set_protocol(dbus_info->interface_object, dbus_info->invocation,
347 sap_protocol->result);
350 case TRESP_SAP_SET_POWER:
351 dbg("dbus comm - TRESP_SAP_SET_POWER");
352 telephony_sap_complete_set_power(dbus_info->interface_object, dbus_info->invocation,
356 case TRESP_SAP_REQ_CARDREADERSTATUS:
357 dbg("dbus comm - TRESP_SAP_REQ_CARDREADERSTATUS");
358 telephony_sap_complete_get_card_reader_status(dbus_info->interface_object, dbus_info->invocation,
359 sap_reader->result, sap_reader->reader_status);
363 dbg("not handled command[%d]", command);
370 gboolean dbus_plugin_sap_notification(struct custom_data *ctx, const char *plugin_name,
371 TelephonyObjectSkeleton *object, enum tcore_notification_command command,
372 unsigned int data_len, const void *data)
375 const struct tnoti_sap_status_changed *n_sap_status = data;
376 const struct tnoti_sap_disconnect *n_sap_disconn = data;
379 dbg("object is NULL");
383 sap = telephony_object_peek_sap(TELEPHONY_OBJECT(object));
384 dbg("sap = %p", sap);
386 dbg("notification !!! (command = 0x%x, data_len = %d)", command, data_len);
389 case TNOTI_SAP_STATUS:
390 dbg("notified sap_status[%d]", n_sap_status->status);
391 telephony_sap_emit_status(sap, n_sap_status->status);
393 case TNOTI_SAP_DISCONNECT:
394 dbg("notified sap_disconnect type[%d]", n_sap_disconn->type);
395 telephony_sap_emit_disconnect(sap, n_sap_disconn->type);
398 dbg("not handled command[%d]", command);