2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "net_nfc_typedef_internal.h"
20 #include "net_nfc_debug_internal.h"
21 #include "net_nfc_util_internal.h"
22 #include "net_nfc_util_ndef_message.h"
23 #include "net_nfc_util_gdbus_internal.h"
24 #include "net_nfc_gdbus.h"
25 #include "net_nfc_client.h"
26 #include "net_nfc_client_util_internal.h"
27 #include "net_nfc_client_manager.h"
28 #include "net_nfc_client_hce_ipc.h"
29 #include "net_nfc_client_hce.h"
32 #ifndef NET_NFC_EXPORT_API
33 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))
36 typedef struct _HceHandler HceHandler;
40 net_nfc_client_hce_event_cb hce_event_cb;
44 static NetNfcGDbusHce *hce_proxy = NULL;
46 static HceHandler hce_handler;
47 static char package_name[1024];
49 static void __load_package_name()
51 if (net_nfc_util_get_pkgid_by_pid(getpid(),
52 package_name, sizeof(package_name)) == false) {
53 DEBUG_ERR_MSG("failed to get package name, pid [%d]", getpid());
57 static void hce_event_received(GObject *source_object, guint arg_handle,
58 guint arg_event, GVariant *arg_apdu, gchar *arg_package)
60 INFO_MSG(">>> SIGNAL arrived");
62 if (hce_handler.hce_event_cb != NULL) {
64 data_s apdu = { NULL, 0 };
66 net_nfc_util_gdbus_variant_to_data_s(arg_apdu, &apdu);
68 hce_handler.hce_event_cb((net_nfc_target_handle_h)GUINT_TO_POINTER(arg_handle),
69 (net_nfc_hce_event_t)arg_event, &apdu,
70 hce_handler.hce_data);
72 net_nfc_util_clear_data(&apdu);
76 void net_nfc_client_hce_process_received_event(int event,
77 net_nfc_target_handle_h handle, data_h data)
79 INFO_MSG(">>> SIGNAL arrived");
81 if (hce_handler.hce_event_cb != NULL) {
82 hce_handler.hce_event_cb(handle,
83 (net_nfc_hce_event_t)event, data,
84 hce_handler.hce_data);
91 net_nfc_error_e net_nfc_client_hce_set_event_received_cb(
92 net_nfc_client_hce_event_cb callback, void *user_data)
94 net_nfc_error_e result = NET_NFC_OK;
97 if (callback == NULL) {
98 return net_nfc_client_hce_unset_event_received_cb();
101 if (hce_proxy == NULL)
103 result = net_nfc_client_hce_init();
104 if (result != NET_NFC_OK)
106 DEBUG_ERR_MSG("net_nfc_client_hce_init failed, [%d]", result);
112 if (net_nfc_gdbus_hce_call_start_hce_handler_sync(hce_proxy,
113 &result, NULL, &error) == true) {
114 hce_handler.hce_event_cb = callback;
115 hce_handler.hce_data = user_data;
117 if (net_nfc_client_hce_ipc_is_initialized() == false) {
118 result = net_nfc_client_hce_ipc_init();
119 if (result != NET_NFC_OK) {
120 DEBUG_ERR_MSG("net_nfc_client_hce_ipc_init failed");
122 result = NET_NFC_IPC_FAIL;
126 DEBUG_ERR_MSG("net_nfc_gdbus_hce_call_start_hce_handler_sync failed: %s", error->message);
129 result = NET_NFC_IPC_FAIL;
136 net_nfc_error_e net_nfc_client_hce_unset_event_received_cb(void)
138 net_nfc_error_e result = NET_NFC_OK;
139 GError *error = NULL;
141 if (hce_proxy == NULL) {
142 DEBUG_ERR_MSG("not initialized!!!");
144 return NET_NFC_NOT_INITIALIZED;
147 if (net_nfc_gdbus_hce_call_stop_hce_handler_sync(hce_proxy,
148 &result, NULL, &error) == true) {
149 hce_handler.hce_event_cb = NULL;
150 hce_handler.hce_data = NULL;
152 net_nfc_client_hce_ipc_deinit();
154 DEBUG_ERR_MSG("net_nfc_gdbus_hce_call_stop_hce_handler_sync failed: %s", error->message);
157 result = NET_NFC_IPC_FAIL;
164 net_nfc_error_e net_nfc_client_hce_response_apdu_sync(
165 net_nfc_target_handle_h handle,
166 data_h resp_apdu_data)
168 net_nfc_error_e result = NET_NFC_OK;
169 GError *error = NULL;
170 GVariant *arg_data = NULL;
172 INFO_MSG(">>> net_nfc_client_hce_response_apdu_sync!!");
174 if (hce_proxy == NULL)
176 result = net_nfc_client_hce_init();
177 if (result != NET_NFC_OK)
179 DEBUG_ERR_MSG("net_nfc_client_hce_init failed, [%d]", result);
185 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)resp_apdu_data);
186 if (arg_data == NULL)
189 INFO_MSG(">>> resp_apdu_data is null !!");
190 return NET_NFC_INVALID_PARAM;
193 if (net_nfc_gdbus_hce_call_response_apdu_sync(
195 GPOINTER_TO_UINT(handle),
201 DEBUG_ERR_MSG("Response APDU failed: %s", error->message);
202 result = NET_NFC_IPC_FAIL;
211 net_nfc_error_e net_nfc_client_hce_response_apdu_sync(
212 net_nfc_target_handle_h handle,
213 data_h resp_apdu_data)
215 net_nfc_error_e result;
217 DEBUG_CLIENT_MSG(">>> net_nfc_client_hce_response_apdu_sync!!");
219 if (hce_proxy == NULL) {
220 result = net_nfc_client_hce_init();
221 if (result != NET_NFC_OK) {
222 DEBUG_ERR_MSG("net_nfc_client_hce_init failed, [%d]", result);
228 if (net_nfc_client_hce_ipc_is_initialized() == false) {
229 if (net_nfc_client_hce_ipc_init() == false) {
230 DEBUG_ERR_MSG("net_nfc_client_hce_ipc_init failed");
232 return NET_NFC_NOT_INITIALIZED;
236 if (net_nfc_server_hce_ipc_send_to_server(0, handle, resp_apdu_data) == true) {
239 DEBUG_ERR_MSG("net_nfc_server_hce_ipc_send_to_server failed");
241 result = NET_NFC_IPC_FAIL;
247 net_nfc_error_e net_nfc_client_hce_init(void)
249 GError *error = NULL;
251 DEBUG_CLIENT_MSG("net_nfc_client_hce_init call");
255 DEBUG_CLIENT_MSG("Already initialized");
260 hce_proxy = net_nfc_gdbus_hce_proxy_new_for_bus_sync(
262 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
263 "org.tizen.NetNfcService",
264 "/org/tizen/NetNfcService/Hce",
268 if (hce_proxy == NULL)
270 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
274 return NET_NFC_UNKNOWN_ERROR;
277 g_signal_connect(hce_proxy, "event-received",
278 G_CALLBACK(hce_event_received), NULL);
280 /* get package name */
281 __load_package_name();
286 void net_nfc_client_hce_deinit(void)
288 if (hce_proxy != NULL)
290 net_nfc_client_hce_ipc_deinit();
292 g_object_unref(hce_proxy);