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.
17 #include "net_nfc_typedef_internal.h"
18 #include "net_nfc_debug_internal.h"
19 #include "net_nfc_util_internal.h"
20 #include "net_nfc_util_ndef_message.h"
21 #include "net_nfc_util_gdbus_internal.h"
22 #include "net_nfc_gdbus.h"
23 #include "net_nfc_data.h"
24 #include "net_nfc_ndef_message.h"
25 #include "net_nfc_client.h"
26 #include "net_nfc_client_manager.h"
27 #include "net_nfc_client_snep.h"
29 #ifndef NET_NFC_EXPORT_API
30 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))
33 static NetNfcGDbusSnep *snep_proxy = NULL;
35 /*******************************************************************/
37 static void snep_send_client_request(GObject *source_object,
41 /*********************************************************************/
43 static void snep_send_client_request(GObject *source_object,
47 GVariant *parameter = (GVariant *)user_data;
48 net_nfc_error_e out_result;
49 net_nfc_snep_type_t out_type = NET_NFC_SNEP_GET;
50 GVariant *out_data = NULL;
52 net_nfc_client_snep_event_cb callback;
54 net_nfc_snep_handle_h handle;
56 g_assert(parameter != NULL);
58 if (net_nfc_gdbus_snep_call_client_request_finish(
59 NET_NFC_GDBUS_SNEP(source_object),
66 DEBUG_ERR_MSG("Can not finish send client request %s",
68 out_result = NET_NFC_IPC_FAIL;
73 g_variant_get(parameter, "(uuu)",
78 if (callback != NULL) {
79 ndef_message_h message;
81 message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
83 callback(handle, out_type, out_result,
86 net_nfc_free_ndef_message(message);
89 g_variant_unref(parameter);
93 net_nfc_error_e net_nfc_client_snep_start_server(
94 net_nfc_target_handle_h target,
97 net_nfc_client_snep_event_cb callback,
100 net_nfc_error_e result = NET_NFC_OK;
101 GError *error = NULL;
104 if (snep_proxy == NULL)
106 DEBUG_ERR_MSG("Can not get Snep Proxy");
108 return NET_NFC_NOT_INITIALIZED;
111 /* prevent executing daemon when nfc is off */
112 if (net_nfc_client_manager_is_activated() == false) {
113 return NET_NFC_NOT_ACTIVATED;
116 parameter = g_variant_new("(uu)",
117 GPOINTER_TO_UINT(callback),
118 GPOINTER_TO_UINT(user_data));
120 if (net_nfc_gdbus_snep_call_server_start_sync(snep_proxy,
121 GPOINTER_TO_UINT(target),
124 GPOINTER_TO_UINT(parameter),
129 DEBUG_ERR_MSG("snep server(sync call) failed: %s",
131 result = NET_NFC_IPC_FAIL;
135 g_variant_unref(parameter);
142 net_nfc_error_e net_nfc_client_snep_start_client(
143 net_nfc_target_handle_h target,
146 net_nfc_client_snep_event_cb callback,
149 net_nfc_error_e result = NET_NFC_OK;
150 GError *error = NULL;
153 if (snep_proxy == NULL)
155 DEBUG_ERR_MSG("Can not get Snep Proxy");
157 return NET_NFC_NOT_INITIALIZED;
160 /* prevent executing daemon when nfc is off */
161 if (net_nfc_client_manager_is_activated() == false) {
162 return NET_NFC_NOT_ACTIVATED;
165 parameter = g_variant_new("(uu)",
166 GPOINTER_TO_UINT(callback),
167 GPOINTER_TO_UINT(user_data));
169 if (net_nfc_gdbus_snep_call_client_start_sync(snep_proxy,
170 GPOINTER_TO_UINT(target),
173 GPOINTER_TO_UINT(parameter),
178 DEBUG_ERR_MSG("snep client(sync call) failed: %s",
180 result = NET_NFC_IPC_FAIL;
184 g_variant_unref(parameter);
191 net_nfc_error_e net_nfc_client_snep_send_client_request(
192 net_nfc_snep_handle_h target,
193 net_nfc_snep_type_t snep_type,
195 net_nfc_client_snep_event_cb callback,
198 GVariant *ndef_msg = NULL;
201 if (target == NULL || msg == NULL)
203 return NET_NFC_NULL_PARAMETER;
206 if (snep_proxy == NULL)
208 DEBUG_ERR_MSG("Can not get Snep Proxy");
210 return NET_NFC_NOT_INITIALIZED;
213 /* prevent executing daemon when nfc is off */
214 if (net_nfc_client_manager_is_activated() == false) {
215 return NET_NFC_NOT_ACTIVATED;
218 parameter = g_variant_new("(uuu)",
219 GPOINTER_TO_UINT(callback),
220 GPOINTER_TO_UINT(user_data),
221 GPOINTER_TO_UINT(target));
223 ndef_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
225 net_nfc_gdbus_snep_call_client_request(snep_proxy,
226 GPOINTER_TO_UINT(target),
230 snep_send_client_request,
237 net_nfc_error_e net_nfc_client_snep_send_client_request_sync(
238 net_nfc_target_handle_h target,
239 net_nfc_snep_type_t snep_type,
241 net_nfc_snep_type_t *resp_type,
242 ndef_message_h *response)
244 GVariant *resp_msg = NULL;
245 GVariant *arg_msg = NULL;
246 GError *error = NULL;
247 net_nfc_error_e result;
250 if (target == NULL || msg == NULL ||
251 resp_type == NULL || response == NULL)
253 return NET_NFC_NULL_PARAMETER;
258 if (snep_proxy == NULL)
260 DEBUG_ERR_MSG("Can not get Snep Proxy");
262 return NET_NFC_NOT_INITIALIZED;
265 arg_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
267 if (net_nfc_gdbus_snep_call_client_request_sync(snep_proxy,
268 GPOINTER_TO_UINT(target),
277 data_s ndef_data = { NULL, };
279 net_nfc_util_gdbus_variant_to_data_s(resp_msg, &ndef_data);
281 if (ndef_data.buffer != NULL && ndef_data.length > 0)
283 result = net_nfc_create_ndef_message_from_rawdata(
287 net_nfc_util_free_data(&ndef_data);
292 DEBUG_ERR_MSG(" send client request (sync call) failed: %s",
296 return NET_NFC_IPC_FAIL;
304 net_nfc_error_e net_nfc_client_snep_stop_service_sync(
305 net_nfc_target_handle_h target,
306 net_nfc_snep_handle_h service)
308 net_nfc_error_e result = NET_NFC_OK;
309 GError *error = NULL;
311 if (target == NULL || service == NULL)
313 return NET_NFC_NULL_PARAMETER;
316 if (snep_proxy == NULL)
318 DEBUG_ERR_MSG("Can not get Snep Proxy");
320 return NET_NFC_NOT_INITIALIZED;
323 /* prevent executing daemon when nfc is off */
324 if (net_nfc_client_manager_is_activated() == false) {
325 return NET_NFC_NOT_ACTIVATED;
328 if (net_nfc_gdbus_snep_call_stop_snep_sync(
330 GPOINTER_TO_UINT(target),
331 GPOINTER_TO_UINT(service),
336 DEBUG_ERR_MSG("snep stop service(sync call) failed: %s",
338 result = NET_NFC_IPC_FAIL;
346 static void _snep_event_cb(NetNfcGDbusSnep *object,
350 GVariant *arg_ndef_msg,
353 GVariant *parameter = (GVariant *)GUINT_TO_POINTER(arg_user_data);
355 INFO_MSG(">>> SIGNAL arrived");
357 DEBUG_CLIENT_MSG("handle [%p], event [%d], result [%d], user_data [%p]",
358 GUINT_TO_POINTER(arg_handle),
363 if (parameter != NULL)
365 net_nfc_client_snep_event_cb callback;
368 g_variant_get(parameter,
373 if (callback != NULL)
375 ndef_message_h message;
377 message = net_nfc_util_gdbus_variant_to_ndef_message(
380 callback(GUINT_TO_POINTER(arg_handle),
386 net_nfc_free_ndef_message(message);
388 #if 0 /* remove temporary... */
389 if (arg_event == NET_NFC_LLCP_UNREGISTERED) {
390 g_variant_unref(parameter);
397 net_nfc_error_e net_nfc_client_snep_register_server(const char *san,
399 net_nfc_client_snep_event_cb callback,
402 net_nfc_error_e result = NET_NFC_OK;
403 GError *error = NULL;
406 if (snep_proxy == NULL)
408 if(net_nfc_client_snep_init() != NET_NFC_OK)
410 DEBUG_ERR_MSG("Snep Proxy fail");
411 return NET_NFC_NOT_INITIALIZED;
415 /* prevent executing daemon when nfc is off */
416 if (net_nfc_client_manager_is_activated() == false) {
417 return NET_NFC_NOT_ACTIVATED;
420 parameter = g_variant_new("(uu)",
421 GPOINTER_TO_UINT(callback),
422 GPOINTER_TO_UINT(user_data));
424 if (net_nfc_gdbus_snep_call_server_register_sync(snep_proxy,
427 GPOINTER_TO_UINT(parameter),
432 DEBUG_ERR_MSG("snep register server(sync call) failed: %s",
434 result = NET_NFC_IPC_FAIL;
438 g_variant_unref(parameter);
445 net_nfc_error_e net_nfc_client_snep_unregister_server(const char *san,
448 net_nfc_error_e result = NET_NFC_OK;
449 GError *error = NULL;
451 if (snep_proxy == NULL)
453 DEBUG_ERR_MSG("Can not get Snep Proxy");
455 return NET_NFC_NOT_INITIALIZED;
458 /* prevent executing daemon when nfc is off */
459 if (net_nfc_client_manager_is_activated() == false) {
460 return NET_NFC_NOT_ACTIVATED;
463 if (net_nfc_gdbus_snep_call_server_unregister_sync(snep_proxy,
470 DEBUG_ERR_MSG("snep unregister server(sync call) failed: %s",
472 result = NET_NFC_IPC_FAIL;
480 net_nfc_error_e net_nfc_client_snep_init(void)
482 GError *error = NULL;
486 DEBUG_CLIENT_MSG("Already initialized");
491 snep_proxy = net_nfc_gdbus_snep_proxy_new_for_bus_sync(
493 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
494 "org.tizen.NetNfcService",
495 "/org/tizen/NetNfcService/Snep",
498 if (snep_proxy == NULL)
500 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
503 return NET_NFC_UNKNOWN_ERROR;
506 g_signal_connect(snep_proxy, "snep-event",
507 G_CALLBACK(_snep_event_cb), NULL);
512 void net_nfc_client_snep_deinit(void)
516 g_object_unref(snep_proxy);