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")))
37 static NetNfcGDbusNdef *ndef_proxy = NULL;
39 static gboolean ndef_is_supported_tag(void);
41 static void ndef_call_read(GObject *source_object,
45 static void ndef_call_write(GObject *source_object,
49 static void ndef_call_make_read_only(GObject *source_object,
53 static void ndef_call_format(GObject *source_object,
57 static gboolean ndef_is_supported_tag(void)
59 net_nfc_target_info_s *target_info = NULL;
61 target_info = net_nfc_client_tag_get_client_target_info();
62 if (target_info == NULL) {
63 DEBUG_ERR_MSG("target_info does not exist");
68 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);
106 out_result = NET_NFC_IPC_FAIL;
109 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);
144 out_result = NET_NFC_IPC_FAIL;
147 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", error->message);
177 out_result = NET_NFC_IPC_FAIL;
180 if (func_data->callback != NULL) {
181 net_nfc_client_ndef_make_read_only_completed callback =
182 (net_nfc_client_ndef_make_read_only_completed)func_data->callback;
184 callback(out_result, func_data->user_data);
190 static void ndef_call_format(GObject *source_object,
194 NetNfcCallback *func_data = (NetNfcCallback *)user_data;
195 net_nfc_error_e out_result;
196 GError *error = NULL;
198 g_assert(user_data != NULL);
200 if (net_nfc_gdbus_ndef_call_format_finish(
201 NET_NFC_GDBUS_NDEF(source_object),
206 DEBUG_ERR_MSG("Can not finish format: %s", error->message);
210 out_result = NET_NFC_IPC_FAIL;
213 if (func_data->callback != NULL) {
214 net_nfc_client_ndef_format_completed callback =
215 (net_nfc_client_ndef_format_completed)func_data->callback;
217 callback(out_result, func_data->user_data);
224 net_nfc_error_e net_nfc_client_ndef_read(net_nfc_target_handle_h handle,
225 net_nfc_client_ndef_read_completed callback,
228 NetNfcCallback *func_data;
231 return NET_NFC_NULL_PARAMETER;
233 if (ndef_proxy == NULL) {
234 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
235 DEBUG_ERR_MSG("tag_proxy fail");
236 return NET_NFC_NOT_INITIALIZED;
240 /* prevent executing daemon when nfc is off */
241 if (net_nfc_client_manager_is_activated() == false)
242 return NET_NFC_NOT_ACTIVATED;
244 if (net_nfc_client_tag_is_connected() == FALSE)
245 return NET_NFC_NOT_CONNECTED;
247 DEBUG_CLIENT_MSG("send request :: read ndef = [%p]", handle);
249 func_data = g_try_new0(NetNfcCallback, 1);
250 if (func_data == NULL)
251 return NET_NFC_ALLOC_FAIL;
253 func_data->callback = (gpointer)callback;
254 func_data->user_data = user_data;
256 net_nfc_gdbus_ndef_call_read(ndef_proxy,
257 GPOINTER_TO_UINT(handle),
266 net_nfc_error_e net_nfc_client_ndef_read_sync(net_nfc_target_handle_h handle,
267 ndef_message_h *message)
269 net_nfc_error_e out_result = NET_NFC_OK;
270 GVariant *out_data = NULL;
271 GError *error = NULL;
274 return NET_NFC_NULL_PARAMETER;
276 if (ndef_proxy == NULL) {
277 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
278 DEBUG_ERR_MSG("tag_proxy fail");
279 return NET_NFC_NOT_INITIALIZED;
283 /* prevent executing daemon when nfc is off */
284 if (net_nfc_client_manager_is_activated() == false)
285 return NET_NFC_NOT_ACTIVATED;
287 if (net_nfc_client_tag_is_connected() == FALSE)
288 return NET_NFC_NOT_CONNECTED;
290 DEBUG_CLIENT_MSG("send request :: read ndef = [%p]", handle);
292 if (net_nfc_gdbus_ndef_call_read_sync(ndef_proxy,
293 GPOINTER_TO_UINT(handle),
298 *message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
301 DEBUG_ERR_MSG("can not call read: %s", error->message);
305 out_result = NET_NFC_IPC_FAIL;
312 net_nfc_error_e net_nfc_client_ndef_write(net_nfc_target_handle_h handle,
313 ndef_message_h message,
314 net_nfc_client_ndef_write_completed callback,
317 NetNfcCallback *func_data;
320 if (handle == NULL || message == NULL)
321 return NET_NFC_NULL_PARAMETER;
323 if (ndef_proxy == NULL) {
324 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
325 DEBUG_ERR_MSG("tag_proxy fail");
326 return NET_NFC_NOT_INITIALIZED;
330 /* prevent executing daemon when nfc is off */
331 if (net_nfc_client_manager_is_activated() == false)
332 return NET_NFC_NOT_ACTIVATED;
334 if (net_nfc_client_tag_is_connected() == FALSE)
335 return NET_NFC_NOT_CONNECTED;
337 func_data = g_try_new0(NetNfcCallback, 1);
338 if (func_data == NULL)
339 return NET_NFC_ALLOC_FAIL;
341 func_data->callback = (gpointer)callback;
342 func_data->user_data = user_data;
344 arg_data = net_nfc_util_gdbus_ndef_message_to_variant(message);
346 net_nfc_gdbus_ndef_call_write(ndef_proxy,
347 GPOINTER_TO_UINT(handle),
357 net_nfc_error_e net_nfc_client_ndef_write_sync(net_nfc_target_handle_h handle,
358 ndef_message_h message)
360 net_nfc_error_e out_result = NET_NFC_OK;
361 GError *error = NULL;
364 if (handle == NULL || message == NULL)
365 return NET_NFC_NULL_PARAMETER;
367 if (ndef_proxy == NULL) {
368 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
369 DEBUG_ERR_MSG("tag_proxy fail");
370 return NET_NFC_NOT_INITIALIZED;
374 /* prevent executing daemon when nfc is off */
375 if (net_nfc_client_manager_is_activated() == false)
376 return NET_NFC_NOT_ACTIVATED;
378 if (net_nfc_client_tag_is_connected() == FALSE)
379 return NET_NFC_NOT_CONNECTED;
381 arg_data = net_nfc_util_gdbus_ndef_message_to_variant(message);
383 if (net_nfc_gdbus_ndef_call_write_sync(ndef_proxy ,
384 GPOINTER_TO_UINT(handle),
390 DEBUG_ERR_MSG("can not call write: %s", error->message);
394 out_result = NET_NFC_IPC_FAIL;
401 net_nfc_error_e net_nfc_client_ndef_make_read_only(
402 net_nfc_target_handle_h handle,
403 net_nfc_client_ndef_make_read_only_completed callback,
406 NetNfcCallback *func_data;
409 return NET_NFC_NULL_PARAMETER;
411 if (ndef_proxy == NULL) {
412 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
413 DEBUG_ERR_MSG("tag_proxy fail");
414 return NET_NFC_NOT_INITIALIZED;
418 /* prevent executing daemon when nfc is off */
419 if (net_nfc_client_manager_is_activated() == false)
420 return NET_NFC_NOT_ACTIVATED;
422 if (net_nfc_client_tag_is_connected() == FALSE)
423 return NET_NFC_NOT_CONNECTED;
425 if (ndef_is_supported_tag() == FALSE)
426 return NET_NFC_NOT_SUPPORTED;
428 func_data = g_try_new0(NetNfcCallback, 1);
429 if (func_data == NULL)
430 return NET_NFC_ALLOC_FAIL;
432 func_data->callback = (gpointer)callback;
433 func_data->user_data = user_data;
435 net_nfc_gdbus_ndef_call_make_read_only(ndef_proxy,
436 GPOINTER_TO_UINT(handle),
438 ndef_call_make_read_only,
445 net_nfc_error_e net_nfc_client_ndef_make_read_only_sync(
446 net_nfc_target_handle_h handle)
448 net_nfc_error_e out_result = NET_NFC_OK;
449 GError *error = NULL;
452 return NET_NFC_NULL_PARAMETER;
454 if (ndef_proxy == NULL) {
455 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
456 DEBUG_ERR_MSG("tag_proxy fail");
457 return NET_NFC_NOT_INITIALIZED;
461 /* prevent executing daemon when nfc is off */
462 if (net_nfc_client_manager_is_activated() == false)
463 return NET_NFC_NOT_ACTIVATED;
465 if (net_nfc_client_tag_is_connected() == FALSE)
466 return NET_NFC_NOT_CONNECTED;
468 if (ndef_is_supported_tag() == FALSE)
469 return NET_NFC_NOT_SUPPORTED;
471 if (net_nfc_gdbus_ndef_call_make_read_only_sync(ndef_proxy,
472 GPOINTER_TO_UINT(handle),
477 DEBUG_ERR_MSG("can not make read only: %s", error->message);
481 out_result = NET_NFC_IPC_FAIL;
488 net_nfc_error_e net_nfc_client_ndef_format(net_nfc_target_handle_h handle,
490 net_nfc_client_ndef_format_completed callback,
493 NetNfcCallback *func_data;
497 return NET_NFC_NULL_PARAMETER;
499 if (ndef_proxy == NULL) {
500 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
501 DEBUG_ERR_MSG("tag_proxy fail");
502 return NET_NFC_NOT_INITIALIZED;
506 /* prevent executing daemon when nfc is off */
507 if (net_nfc_client_manager_is_activated() == false)
508 return NET_NFC_NOT_ACTIVATED;
510 if (net_nfc_client_tag_is_connected() == FALSE)
511 return NET_NFC_NOT_CONNECTED;
513 func_data = g_try_new0(NetNfcCallback, 1);
514 if (func_data == NULL)
515 return NET_NFC_ALLOC_FAIL;
517 func_data->callback = (gpointer)callback;
518 func_data->user_data = user_data;
520 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
522 net_nfc_gdbus_ndef_call_format(ndef_proxy ,
523 GPOINTER_TO_UINT(handle),
533 net_nfc_error_e net_nfc_client_ndef_format_sync(
534 net_nfc_target_handle_h handle,
537 net_nfc_error_e out_result = NET_NFC_OK;
539 GError *error = NULL;
542 return NET_NFC_NULL_PARAMETER;
544 if (ndef_proxy == NULL) {
545 if (net_nfc_client_ndef_init() != NET_NFC_OK) {
546 DEBUG_ERR_MSG("tag_proxy fail");
547 return NET_NFC_NOT_INITIALIZED;
551 /* prevent executing daemon when nfc is off */
552 if (net_nfc_client_manager_is_activated() == false)
553 return NET_NFC_NOT_ACTIVATED;
555 if (net_nfc_client_tag_is_connected() == FALSE)
556 return NET_NFC_NOT_CONNECTED;
558 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
560 if (net_nfc_gdbus_ndef_call_format_sync(ndef_proxy ,
561 GPOINTER_TO_UINT(handle),
567 DEBUG_ERR_MSG("can not call format: %s", error->message);
571 out_result = NET_NFC_IPC_FAIL;
577 net_nfc_error_e net_nfc_client_ndef_init(void)
579 GError *error = NULL;
582 DEBUG_CLIENT_MSG("Already initialized");
587 ndef_proxy = net_nfc_gdbus_ndef_proxy_new_for_bus_sync(
589 G_DBUS_PROXY_FLAGS_NONE,
590 "org.tizen.NetNfcService",
591 "/org/tizen/NetNfcService/Ndef",
594 if (ndef_proxy == NULL) {
596 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
600 return NET_NFC_UNKNOWN_ERROR;
606 void net_nfc_client_ndef_deinit(void)
609 g_object_unref(ndef_proxy);