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_util_internal.h"
27 #include "net_nfc_client_manager.h"
28 #include "net_nfc_client_ndef.h"
29 #include "net_nfc_client_tag_internal.h"
31 #ifndef NET_NFC_EXPORT_API
32 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))
35 static NetNfcGDbusNdef *ndef_proxy = NULL;
37 static gboolean ndef_is_supported_tag(void);
39 static void ndef_call_read(GObject *source_object,
43 static void ndef_call_write(GObject *source_object,
47 static void ndef_call_make_read_only(GObject *source_object,
51 static void ndef_call_format(GObject *source_object,
55 static gboolean ndef_is_supported_tag(void)
57 net_nfc_target_info_s *target_info = NULL;
59 target_info = net_nfc_client_tag_get_client_target_info();
60 if (target_info == NULL)
62 DEBUG_ERR_MSG("target_info does not exist");
67 switch (target_info->devType)
69 case NET_NFC_ISO14443_A_PICC :
70 case NET_NFC_MIFARE_MINI_PICC :
71 case NET_NFC_MIFARE_1K_PICC :
72 case NET_NFC_MIFARE_4K_PICC :
73 case NET_NFC_MIFARE_ULTRA_PICC :
74 case NET_NFC_JEWEL_PICC :
79 "not supported tag for read only tag");
84 static void ndef_call_read(GObject *source_object,
88 NetNfcCallback *func_data = (NetNfcCallback *)user_data;
89 net_nfc_error_e out_result;
90 GVariant *out_data = NULL;
93 g_assert(user_data != NULL);
95 if (net_nfc_gdbus_ndef_call_read_finish(
96 NET_NFC_GDBUS_NDEF(source_object),
102 DEBUG_ERR_MSG("Can not finish read: %s", error->message);
103 out_result = NET_NFC_IPC_FAIL;
108 if (func_data->callback != NULL)
110 net_nfc_client_ndef_read_completed callback =
111 (net_nfc_client_ndef_read_completed)func_data->callback;
112 ndef_message_h message;
114 message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
116 callback(out_result, message, func_data->user_data);
118 net_nfc_util_free_ndef_message(message);
124 static void ndef_call_write(GObject *source_object,
128 NetNfcCallback *func_data = (NetNfcCallback *)user_data;
129 net_nfc_error_e out_result;
130 GError *error = NULL;
132 g_assert(user_data != NULL);
134 if (net_nfc_gdbus_ndef_call_write_finish(
135 NET_NFC_GDBUS_NDEF(source_object),
140 DEBUG_ERR_MSG("Can not finish write: %s", error->message);
141 out_result = NET_NFC_IPC_FAIL;
146 if (func_data->callback != NULL)
148 net_nfc_client_ndef_write_completed callback =
149 (net_nfc_client_ndef_write_completed)func_data->callback;
151 callback(out_result, func_data->user_data);
157 static void ndef_call_make_read_only(GObject *source_object,
161 NetNfcCallback *func_data = (NetNfcCallback *)user_data;
162 net_nfc_error_e out_result;
163 GError *error = NULL;
165 g_assert(user_data != NULL);
167 if (net_nfc_gdbus_ndef_call_make_read_only_finish(
168 NET_NFC_GDBUS_NDEF(source_object),
173 DEBUG_ERR_MSG("Can not finish make read only: %s",
175 out_result = NET_NFC_IPC_FAIL;
180 if (func_data->callback != NULL)
182 net_nfc_client_ndef_make_read_only_completed callback =
183 (net_nfc_client_ndef_make_read_only_completed)func_data->callback;
185 callback(out_result, func_data->user_data);
191 static void ndef_call_format(GObject *source_object,
195 NetNfcCallback *func_data = (NetNfcCallback *)user_data;
196 net_nfc_error_e out_result;
197 GError *error = NULL;
199 g_assert(user_data != NULL);
201 if (net_nfc_gdbus_ndef_call_format_finish(
202 NET_NFC_GDBUS_NDEF(source_object),
207 DEBUG_ERR_MSG("Can not finish format: %s", error->message);
208 out_result = NET_NFC_IPC_FAIL;
213 if (func_data->callback != NULL)
215 net_nfc_client_ndef_format_completed callback =
216 (net_nfc_client_ndef_format_completed)func_data->callback;
218 callback(out_result, func_data->user_data);
225 net_nfc_error_e net_nfc_client_ndef_read(net_nfc_target_handle_h handle,
226 net_nfc_client_ndef_read_completed callback,
229 NetNfcCallback *func_data;
232 return NET_NFC_NULL_PARAMETER;
234 if (ndef_proxy == NULL)
236 if(net_nfc_client_ndef_init() != NET_NFC_OK)
238 DEBUG_ERR_MSG("tag_proxy fail");
239 return NET_NFC_NOT_INITIALIZED;
243 /* prevent executing daemon when nfc is off */
244 if (net_nfc_client_manager_is_activated() == false) {
245 return NET_NFC_NOT_ACTIVATED;
248 if (net_nfc_client_tag_is_connected() == FALSE)
249 return NET_NFC_NOT_CONNECTED;
251 DEBUG_CLIENT_MSG("send request :: read ndef = [%p]", handle);
253 func_data = g_try_new0(NetNfcCallback, 1);
254 if (func_data == NULL) {
255 return NET_NFC_ALLOC_FAIL;
258 func_data->callback = (gpointer)callback;
259 func_data->user_data = user_data;
261 net_nfc_gdbus_ndef_call_read(ndef_proxy,
262 GPOINTER_TO_UINT(handle),
271 net_nfc_error_e net_nfc_client_ndef_read_sync(net_nfc_target_handle_h handle,
272 ndef_message_h *message)
274 net_nfc_error_e out_result = NET_NFC_OK;
275 GVariant *out_data = NULL;
276 GError *error = NULL;
279 return NET_NFC_NULL_PARAMETER;
281 if (ndef_proxy == NULL)
283 if(net_nfc_client_ndef_init() != NET_NFC_OK)
285 DEBUG_ERR_MSG("tag_proxy fail");
286 return NET_NFC_NOT_INITIALIZED;
290 /* prevent executing daemon when nfc is off */
291 if (net_nfc_client_manager_is_activated() == false) {
292 return NET_NFC_NOT_ACTIVATED;
295 if (net_nfc_client_tag_is_connected() == FALSE)
296 return NET_NFC_NOT_CONNECTED;
298 DEBUG_CLIENT_MSG("send request :: read ndef = [%p]", handle);
300 if (net_nfc_gdbus_ndef_call_read_sync(ndef_proxy,
301 GPOINTER_TO_UINT(handle),
306 *message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
308 DEBUG_ERR_MSG("can not call read: %s",
310 out_result = NET_NFC_IPC_FAIL;
319 net_nfc_error_e net_nfc_client_ndef_write(net_nfc_target_handle_h handle,
320 ndef_message_h message,
321 net_nfc_client_ndef_write_completed callback,
324 NetNfcCallback *func_data;
327 if (handle == NULL || message == NULL)
328 return NET_NFC_NULL_PARAMETER;
330 if (ndef_proxy == NULL)
332 if(net_nfc_client_ndef_init() != NET_NFC_OK)
334 DEBUG_ERR_MSG("tag_proxy fail");
335 return NET_NFC_NOT_INITIALIZED;
339 /* prevent executing daemon when nfc is off */
340 if (net_nfc_client_manager_is_activated() == false) {
341 return NET_NFC_NOT_ACTIVATED;
344 if (net_nfc_client_tag_is_connected() == FALSE)
345 return NET_NFC_NOT_CONNECTED;
347 func_data = g_try_new0(NetNfcCallback, 1);
348 if (func_data == NULL) {
349 return NET_NFC_ALLOC_FAIL;
352 func_data->callback = (gpointer)callback;
353 func_data->user_data = user_data;
355 arg_data = net_nfc_util_gdbus_ndef_message_to_variant(message);
357 net_nfc_gdbus_ndef_call_write(ndef_proxy,
358 GPOINTER_TO_UINT(handle),
368 net_nfc_error_e net_nfc_client_ndef_write_sync(net_nfc_target_handle_h handle,
369 ndef_message_h message)
371 net_nfc_error_e out_result = NET_NFC_OK;
372 GError *error = NULL;
375 if (handle == NULL || message == NULL)
376 return NET_NFC_NULL_PARAMETER;
378 if (ndef_proxy == NULL)
380 if(net_nfc_client_ndef_init() != NET_NFC_OK)
382 DEBUG_ERR_MSG("tag_proxy fail");
383 return NET_NFC_NOT_INITIALIZED;
387 /* prevent executing daemon when nfc is off */
388 if (net_nfc_client_manager_is_activated() == false) {
389 return NET_NFC_NOT_ACTIVATED;
392 if (net_nfc_client_tag_is_connected() == FALSE)
393 return NET_NFC_NOT_CONNECTED;
395 arg_data = net_nfc_util_gdbus_ndef_message_to_variant(message);
397 if (net_nfc_gdbus_ndef_call_write_sync(ndef_proxy ,
398 GPOINTER_TO_UINT(handle),
404 DEBUG_ERR_MSG("can not call write: %s",
406 out_result = NET_NFC_IPC_FAIL;
415 net_nfc_error_e net_nfc_client_ndef_make_read_only(
416 net_nfc_target_handle_h handle,
417 net_nfc_client_ndef_make_read_only_completed callback,
420 NetNfcCallback *func_data;
423 return NET_NFC_NULL_PARAMETER;
425 if (ndef_proxy == NULL)
427 if(net_nfc_client_ndef_init() != NET_NFC_OK)
429 DEBUG_ERR_MSG("tag_proxy fail");
430 return NET_NFC_NOT_INITIALIZED;
434 /* prevent executing daemon when nfc is off */
435 if (net_nfc_client_manager_is_activated() == false) {
436 return NET_NFC_NOT_ACTIVATED;
439 if (net_nfc_client_tag_is_connected() == FALSE)
440 return NET_NFC_NOT_CONNECTED;
442 if (ndef_is_supported_tag() == FALSE)
443 return NET_NFC_NOT_SUPPORTED;
445 func_data = g_try_new0(NetNfcCallback, 1);
446 if (func_data == NULL) {
447 return NET_NFC_ALLOC_FAIL;
450 func_data->callback = (gpointer)callback;
451 func_data->user_data = user_data;
453 net_nfc_gdbus_ndef_call_make_read_only(ndef_proxy,
454 GPOINTER_TO_UINT(handle),
456 ndef_call_make_read_only,
463 net_nfc_error_e net_nfc_client_ndef_make_read_only_sync(
464 net_nfc_target_handle_h handle)
466 net_nfc_error_e out_result = NET_NFC_OK;
467 GError *error = NULL;
470 return NET_NFC_NULL_PARAMETER;
472 if (ndef_proxy == NULL)
474 if(net_nfc_client_ndef_init() != NET_NFC_OK)
476 DEBUG_ERR_MSG("tag_proxy fail");
477 return NET_NFC_NOT_INITIALIZED;
481 /* prevent executing daemon when nfc is off */
482 if (net_nfc_client_manager_is_activated() == false) {
483 return NET_NFC_NOT_ACTIVATED;
486 if (net_nfc_client_tag_is_connected() == FALSE)
487 return NET_NFC_NOT_CONNECTED;
489 if (ndef_is_supported_tag() == FALSE)
490 return NET_NFC_NOT_SUPPORTED;
492 if (net_nfc_gdbus_ndef_call_make_read_only_sync(ndef_proxy,
493 GPOINTER_TO_UINT(handle),
498 DEBUG_ERR_MSG("can not make read only: %s",
500 out_result = NET_NFC_IPC_FAIL;
509 net_nfc_error_e net_nfc_client_ndef_format(net_nfc_target_handle_h handle,
511 net_nfc_client_ndef_format_completed callback,
514 NetNfcCallback *func_data;
518 return NET_NFC_NULL_PARAMETER;
520 if (ndef_proxy == NULL)
522 if(net_nfc_client_ndef_init() != NET_NFC_OK)
524 DEBUG_ERR_MSG("tag_proxy fail");
525 return NET_NFC_NOT_INITIALIZED;
529 /* prevent executing daemon when nfc is off */
530 if (net_nfc_client_manager_is_activated() == false) {
531 return NET_NFC_NOT_ACTIVATED;
534 if (net_nfc_client_tag_is_connected() == FALSE)
535 return NET_NFC_NOT_CONNECTED;
537 func_data = g_try_new0(NetNfcCallback, 1);
538 if (func_data == NULL) {
539 return NET_NFC_ALLOC_FAIL;
542 func_data->callback = (gpointer)callback;
543 func_data->user_data = user_data;
545 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
547 net_nfc_gdbus_ndef_call_format(ndef_proxy ,
548 GPOINTER_TO_UINT(handle),
558 net_nfc_error_e net_nfc_client_ndef_format_sync(
559 net_nfc_target_handle_h handle,
562 net_nfc_error_e out_result = NET_NFC_OK;
564 GError *error = NULL;
567 return NET_NFC_NULL_PARAMETER;
569 if (ndef_proxy == NULL)
571 if(net_nfc_client_ndef_init() != NET_NFC_OK)
573 DEBUG_ERR_MSG("tag_proxy fail");
574 return NET_NFC_NOT_INITIALIZED;
578 /* prevent executing daemon when nfc is off */
579 if (net_nfc_client_manager_is_activated() == false) {
580 return NET_NFC_NOT_ACTIVATED;
583 if (net_nfc_client_tag_is_connected() == FALSE)
584 return NET_NFC_NOT_CONNECTED;
586 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
588 if (net_nfc_gdbus_ndef_call_format_sync(ndef_proxy ,
589 GPOINTER_TO_UINT(handle),
595 DEBUG_ERR_MSG("can not call format: %s",
597 out_result = NET_NFC_IPC_FAIL;
605 net_nfc_error_e net_nfc_client_ndef_init(void)
607 GError *error = NULL;
611 DEBUG_CLIENT_MSG("Already initialized");
616 ndef_proxy = net_nfc_gdbus_ndef_proxy_new_for_bus_sync(
618 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
619 "org.tizen.NetNfcService",
620 "/org/tizen/NetNfcService/Ndef",
623 if (ndef_proxy == NULL)
625 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
628 return NET_NFC_UNKNOWN_ERROR;
634 void net_nfc_client_ndef_deinit(void)
638 g_object_unref(ndef_proxy);