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")))
35 static NetNfcGDbusSnep *snep_proxy = NULL;
37 /*******************************************************************/
39 static void snep_send_client_request(GObject *source_object,
43 /*********************************************************************/
45 static void snep_send_client_request(GObject *source_object,
49 GVariant *parameter = (GVariant *)user_data;
50 net_nfc_error_e out_result;
51 net_nfc_snep_type_t out_type = NET_NFC_SNEP_GET;
52 GVariant *out_data = NULL;
54 net_nfc_client_snep_event_cb callback;
56 net_nfc_snep_handle_h handle;
58 g_assert(parameter != NULL);
60 if (net_nfc_gdbus_snep_call_client_request_finish(
61 NET_NFC_GDBUS_SNEP(source_object),
68 DEBUG_ERR_MSG("Can not finish send client request %s", error->message);
72 out_result = NET_NFC_IPC_FAIL;
75 g_variant_get(parameter, "(ttt)",
80 if (callback != NULL) {
81 ndef_message_h message;
83 message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
85 callback(handle, out_type, out_result,
88 net_nfc_free_ndef_message(message);
91 g_variant_unref(parameter);
95 net_nfc_error_e net_nfc_client_snep_start_server(
96 net_nfc_target_handle_h target,
99 net_nfc_client_snep_event_cb callback,
102 net_nfc_error_e result = NET_NFC_OK;
103 GError *error = NULL;
106 if (snep_proxy == NULL) {
107 DEBUG_ERR_MSG("Can not get Snep Proxy");
109 return NET_NFC_NOT_INITIALIZED;
112 /* prevent executing daemon when nfc is off */
113 if (net_nfc_client_manager_is_activated() == false)
114 return NET_NFC_NOT_ACTIVATED;
116 parameter = g_variant_new("(tt)",
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", error->message);
133 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) {
154 DEBUG_ERR_MSG("Can not get Snep Proxy");
156 return NET_NFC_NOT_INITIALIZED;
159 /* prevent executing daemon when nfc is off */
160 if (net_nfc_client_manager_is_activated() == false)
161 return NET_NFC_NOT_ACTIVATED;
163 parameter = g_variant_new("(tt)",
167 if (net_nfc_gdbus_snep_call_client_start_sync(snep_proxy,
168 GPOINTER_TO_UINT(target),
171 GPOINTER_TO_UINT(parameter),
176 DEBUG_ERR_MSG("snep client(sync call) failed: %s", error->message);
180 result = NET_NFC_IPC_FAIL;
182 g_variant_unref(parameter);
189 net_nfc_error_e net_nfc_client_snep_send_client_request(
190 net_nfc_snep_handle_h target,
191 net_nfc_snep_type_t snep_type,
193 net_nfc_client_snep_event_cb callback,
196 GVariant *ndef_msg = NULL;
199 if (target == NULL || msg == NULL)
200 return NET_NFC_NULL_PARAMETER;
202 if (snep_proxy == NULL) {
203 DEBUG_ERR_MSG("Can not get Snep Proxy");
205 return NET_NFC_NOT_INITIALIZED;
208 /* prevent executing daemon when nfc is off */
209 if (net_nfc_client_manager_is_activated() == false)
210 return NET_NFC_NOT_ACTIVATED;
212 parameter = g_variant_new("(ttt)",
217 ndef_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
219 net_nfc_gdbus_snep_call_client_request(snep_proxy,
220 GPOINTER_TO_UINT(target),
224 snep_send_client_request,
231 net_nfc_error_e net_nfc_client_snep_send_client_request_sync(
232 net_nfc_target_handle_h target,
233 net_nfc_snep_type_t snep_type,
235 net_nfc_snep_type_t *resp_type,
236 ndef_message_h *response)
238 GVariant *resp_msg = NULL;
239 GVariant *arg_msg = NULL;
240 GError *error = NULL;
241 net_nfc_error_e result;
244 if (target == NULL || msg == NULL ||
245 resp_type == NULL || response == NULL)
246 return NET_NFC_NULL_PARAMETER;
250 if (snep_proxy == NULL) {
251 DEBUG_ERR_MSG("Can not get Snep Proxy");
253 return NET_NFC_NOT_INITIALIZED;
256 arg_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
258 if (net_nfc_gdbus_snep_call_client_request_sync(snep_proxy,
259 GPOINTER_TO_UINT(target),
267 data_s ndef_data = { NULL, };
269 net_nfc_util_gdbus_variant_to_data_s(resp_msg, &ndef_data);
271 if (ndef_data.buffer != NULL && ndef_data.length > 0) {
272 result = net_nfc_create_ndef_message_from_rawdata(
276 net_nfc_util_free_data(&ndef_data);
279 DEBUG_ERR_MSG(" send client request (sync call) failed: %s",
283 return NET_NFC_IPC_FAIL;
291 net_nfc_error_e net_nfc_client_snep_stop_service_sync(
292 net_nfc_target_handle_h target,
293 net_nfc_snep_handle_h service)
295 net_nfc_error_e result = NET_NFC_OK;
296 GError *error = NULL;
298 if (target == NULL || service == NULL)
299 return NET_NFC_NULL_PARAMETER;
301 if (snep_proxy == NULL) {
302 DEBUG_ERR_MSG("Can not get Snep Proxy");
304 return NET_NFC_NOT_INITIALIZED;
307 /* prevent executing daemon when nfc is off */
308 if (net_nfc_client_manager_is_activated() == false)
309 return NET_NFC_NOT_ACTIVATED;
311 if (net_nfc_gdbus_snep_call_stop_snep_sync(
313 GPOINTER_TO_UINT(target),
314 GPOINTER_TO_UINT(service),
319 DEBUG_ERR_MSG("snep stop service(sync call) failed: %s", error->message);
323 result = NET_NFC_IPC_FAIL;
329 static void _snep_event_cb(NetNfcGDbusSnep *object,
333 GVariant *arg_ndef_msg,
336 GVariant *parameter = (GVariant *)GUINT_TO_POINTER(arg_user_data);
338 INFO_MSG(">>> SIGNAL arrived");
340 DEBUG_CLIENT_MSG("handle [%p], event [%d], result [%d], user_data [%p]",
341 GUINT_TO_POINTER(arg_handle),
346 if (parameter != NULL) {
347 net_nfc_client_snep_event_cb callback;
350 g_variant_get(parameter,
355 if (callback != NULL) {
356 ndef_message_h message;
358 message = net_nfc_util_gdbus_variant_to_ndef_message(
361 callback(GUINT_TO_POINTER(arg_handle),
367 net_nfc_free_ndef_message(message);
369 #if 0 /* remove temporary... */
370 if (arg_event == NET_NFC_LLCP_UNREGISTERED)
371 g_variant_unref(parameter);
377 net_nfc_error_e net_nfc_client_snep_register_server(const char *san,
379 net_nfc_client_snep_event_cb callback,
382 net_nfc_error_e result = NET_NFC_OK;
383 GError *error = NULL;
386 if (snep_proxy == NULL) {
387 if (net_nfc_client_snep_init() != NET_NFC_OK) {
388 DEBUG_ERR_MSG("Snep Proxy fail");
389 return NET_NFC_NOT_INITIALIZED;
393 /* prevent executing daemon when nfc is off */
394 if (net_nfc_client_manager_is_activated() == false)
395 return NET_NFC_NOT_ACTIVATED;
397 parameter = g_variant_new("(tt)",
401 if (net_nfc_gdbus_snep_call_server_register_sync(snep_proxy,
404 GPOINTER_TO_UINT(parameter),
409 DEBUG_ERR_MSG("snep register server(sync call) failed: %s", error->message);
410 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
411 result = NET_NFC_PERMISSION_DENIED;
413 result = NET_NFC_IPC_FAIL;
416 result = NET_NFC_IPC_FAIL;
419 g_variant_unref(parameter);
426 net_nfc_error_e net_nfc_client_snep_unregister_server(const char *san,
429 net_nfc_error_e result = NET_NFC_OK;
430 GError *error = NULL;
432 if (snep_proxy == NULL) {
433 DEBUG_ERR_MSG("Can not get Snep Proxy");
435 return NET_NFC_NOT_INITIALIZED;
438 /* prevent executing daemon when nfc is off */
439 if (net_nfc_client_manager_is_activated() == false)
440 return NET_NFC_NOT_ACTIVATED;
442 if (net_nfc_gdbus_snep_call_server_unregister_sync(snep_proxy,
449 DEBUG_ERR_MSG("snep unregister server(sync call) failed: %s", error->message);
453 result = NET_NFC_IPC_FAIL;
459 net_nfc_error_e net_nfc_client_snep_init(void)
461 GError *error = NULL;
464 DEBUG_CLIENT_MSG("Already initialized");
469 snep_proxy = net_nfc_gdbus_snep_proxy_new_for_bus_sync(
471 G_DBUS_PROXY_FLAGS_NONE,
472 "org.tizen.NetNfcService",
473 "/org/tizen/NetNfcService/Snep",
476 if (snep_proxy == NULL) {
478 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
482 return NET_NFC_UNKNOWN_ERROR;
485 g_signal_connect(snep_proxy, "snep-event",
486 G_CALLBACK(_snep_event_cb), NULL);
491 void net_nfc_client_snep_deinit(void)
494 g_object_unref(snep_proxy);