2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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_ndef.h"
28 #include "net_nfc_client_tag_internal.h"
29 #include "net_nfc_neard.h"
31 static NetNfcGDbusNdef *ndef_proxy = NULL;
33 static gboolean ndef_is_supported_tag(void)
35 net_nfc_target_info_s *target_info = NULL;
37 target_info = net_nfc_client_tag_get_client_target_info();
38 if (NULL == target_info)
40 NFC_ERR("target_info does not exist");
44 switch (target_info->devType)
46 case NET_NFC_ISO14443_A_PICC :
47 case NET_NFC_MIFARE_MINI_PICC :
48 case NET_NFC_MIFARE_1K_PICC :
49 case NET_NFC_MIFARE_4K_PICC :
50 case NET_NFC_MIFARE_ULTRA_PICC :
51 case NET_NFC_JEWEL_PICC :
55 NFC_ERR("not supported tag(%d) for read only tag", target_info->devType);
60 static void ndef_call_make_read_only(GObject *source_object,
61 GAsyncResult *res, gpointer user_data)
65 net_nfc_error_e out_result;
66 NetNfcCallback *func_data = user_data;
67 net_nfc_client_ndef_make_read_only_completed callback;
69 g_assert(user_data != NULL);
71 ret = net_nfc_gdbus_ndef_call_make_read_only_finish(NET_NFC_GDBUS_NDEF(source_object),
72 (gint *)&out_result, res, &error);
76 NFC_ERR("Can not finish make read only: %s", error->message);
79 out_result = NET_NFC_IPC_FAIL;
82 if (func_data->callback != NULL)
84 callback = (net_nfc_client_ndef_make_read_only_completed)func_data->callback;
86 callback(out_result, func_data->user_data);
92 static void ndef_call_format(GObject *source_object,
93 GAsyncResult *res, gpointer user_data)
97 net_nfc_error_e out_result;
98 NetNfcCallback *func_data = user_data;
99 net_nfc_client_ndef_format_completed callback;
101 g_assert(user_data != NULL);
103 ret = net_nfc_gdbus_ndef_call_format_finish(NET_NFC_GDBUS_NDEF(source_object),
104 (gint *)&out_result, res, &error);
108 NFC_ERR("Can not finish format: %s", error->message);
111 out_result = NET_NFC_IPC_FAIL;
114 if (func_data->callback != NULL)
116 callback = (net_nfc_client_ndef_format_completed)func_data->callback;
118 callback(out_result, func_data->user_data);
124 API net_nfc_error_e net_nfc_client_ndef_read(net_nfc_target_handle_s *handle,
125 net_nfc_client_ndef_read_completed callback, void *user_data)
127 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
129 /* prevent executing daemon when nfc is off */
130 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
131 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
133 NFC_DBG("send request :: read ndef = [%p]", handle);
135 return net_nfc_neard_read_tag(handle, callback, user_data);
138 API net_nfc_error_e net_nfc_client_ndef_read_sync(net_nfc_target_handle_s *handle,
139 ndef_message_s **message)
142 GError *error = NULL;
143 GVariant *out_data = NULL;
144 net_nfc_error_e out_result = NET_NFC_OK;
146 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
147 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
149 /* prevent executing daemon when nfc is off */
150 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
151 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
153 NFC_DBG("send request :: read ndef = [%p]", handle);
155 ret = net_nfc_gdbus_ndef_call_read_sync(ndef_proxy,
156 GPOINTER_TO_UINT(handle),
157 net_nfc_client_gdbus_get_privilege(),
165 *message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
169 NFC_ERR("can not call read: %s", error->message);
171 out_result = NET_NFC_IPC_FAIL;
177 API net_nfc_error_e net_nfc_client_ndef_write(net_nfc_target_handle_s *handle,
178 ndef_message_s *message,
179 net_nfc_client_ndef_write_completed callback,
184 data_s data = {NULL, 0};
186 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
187 RETV_IF(NULL == message, NET_NFC_NULL_PARAMETER);
189 /* prevent executing daemon when nfc is off */
190 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
191 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
193 length = net_nfc_util_get_ndef_message_length((ndef_message_s *)message);
195 if (net_nfc_util_alloc_data(&data, length) == true) {
196 ret = net_nfc_util_convert_ndef_message_to_rawdata((ndef_message_s *)message,
198 if (NET_NFC_OK != ret) {
199 NFC_ERR("can not convert ndef_message to rawdata");
201 net_nfc_util_free_data(&data);
204 NFC_ERR("net_nfc_util_alloc_data failed");
206 return NET_NFC_ALLOC_FAIL;
209 NFC_ERR("message length is 0");
211 return NET_NFC_INVALID_PARAM;
214 ret = net_nfc_neard_write_ndef(handle, &data, callback, user_data);
216 net_nfc_util_free_data(&data);
221 API net_nfc_error_e net_nfc_client_ndef_write_sync(net_nfc_target_handle_s *handle,
222 ndef_message_s *message)
226 GError *error = NULL;
227 net_nfc_error_e out_result = NET_NFC_OK;
229 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
230 RETV_IF(NULL == message, NET_NFC_NULL_PARAMETER);
232 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
234 /* prevent executing daemon when nfc is off */
235 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
236 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
238 arg_data = net_nfc_util_gdbus_ndef_message_to_variant(message);
240 ret = net_nfc_gdbus_ndef_call_write_sync(ndef_proxy ,
241 GPOINTER_TO_UINT(handle),
243 net_nfc_client_gdbus_get_privilege(),
250 NFC_ERR("can not call write: %s", error->message);
252 out_result = NET_NFC_IPC_FAIL;
258 API net_nfc_error_e net_nfc_client_ndef_make_read_only(
259 net_nfc_target_handle_s *handle,
260 net_nfc_client_ndef_make_read_only_completed callback,
263 NetNfcCallback *func_data;
265 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
266 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
268 /* prevent executing daemon when nfc is off */
269 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
270 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
271 RETV_IF(ndef_is_supported_tag() == FALSE, NET_NFC_NOT_SUPPORTED);
273 func_data = g_try_new0(NetNfcCallback, 1);
274 if (NULL == func_data)
275 return NET_NFC_ALLOC_FAIL;
277 func_data->callback = (gpointer)callback;
278 func_data->user_data = user_data;
280 net_nfc_gdbus_ndef_call_make_read_only(ndef_proxy,
281 GPOINTER_TO_UINT(handle),
282 net_nfc_client_gdbus_get_privilege(),
284 ndef_call_make_read_only,
290 API net_nfc_error_e net_nfc_client_ndef_make_read_only_sync(
291 net_nfc_target_handle_s *handle)
294 GError *error = NULL;
295 net_nfc_error_e out_result = NET_NFC_OK;
297 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
298 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
300 /* prevent executing daemon when nfc is off */
301 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
302 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
303 RETV_IF(ndef_is_supported_tag() == FALSE, NET_NFC_NOT_SUPPORTED);
305 ret = net_nfc_gdbus_ndef_call_make_read_only_sync(ndef_proxy,
306 GPOINTER_TO_UINT(handle),
307 net_nfc_client_gdbus_get_privilege(),
314 NFC_ERR("can not make read only: %s", error->message);
316 out_result = NET_NFC_IPC_FAIL;
322 API net_nfc_error_e net_nfc_client_ndef_format(net_nfc_target_handle_s *handle,
323 data_s *key, net_nfc_client_ndef_format_completed callback, void *user_data)
326 NetNfcCallback *func_data;
328 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
329 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
331 /* prevent executing daemon when nfc is off */
332 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
333 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
335 func_data = g_try_new0(NetNfcCallback, 1);
336 if (NULL == func_data)
337 return NET_NFC_ALLOC_FAIL;
339 func_data->callback = (gpointer)callback;
340 func_data->user_data = user_data;
342 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
344 net_nfc_gdbus_ndef_call_format(ndef_proxy,
345 GPOINTER_TO_UINT(handle),
347 net_nfc_client_gdbus_get_privilege(),
355 API net_nfc_error_e net_nfc_client_ndef_format_sync(
356 net_nfc_target_handle_s *handle, data_s *key)
360 GError *error = NULL;
361 net_nfc_error_e out_result = NET_NFC_OK;
363 RETV_IF(NULL == handle, NET_NFC_NULL_PARAMETER);
364 RETV_IF(NULL == ndef_proxy, NET_NFC_NOT_INITIALIZED);
366 /* prevent executing daemon when nfc is off */
367 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
368 RETV_IF(net_nfc_client_tag_is_connected() == FALSE, NET_NFC_NOT_CONNECTED);
370 arg_data = net_nfc_util_gdbus_data_to_variant((data_s *)key);
372 ret = net_nfc_gdbus_ndef_call_format_sync(ndef_proxy,
373 GPOINTER_TO_UINT(handle),
375 net_nfc_client_gdbus_get_privilege(),
382 NFC_ERR("can not call format: %s", error->message);
384 out_result = NET_NFC_IPC_FAIL;
390 net_nfc_error_e net_nfc_client_ndef_init(void)
392 GError *error = NULL;
396 NFC_WARN("Already initialized");
400 ndef_proxy = net_nfc_gdbus_ndef_proxy_new_for_bus_sync(
402 G_DBUS_PROXY_FLAGS_NONE,
403 "org.tizen.NetNfcService",
404 "/org/tizen/NetNfcService/Ndef",
408 if (NULL == ndef_proxy)
410 NFC_ERR("Can not create proxy : %s", error->message);
412 return NET_NFC_UNKNOWN_ERROR;
418 void net_nfc_client_ndef_deinit(void)
422 g_object_unref(ndef_proxy);