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),
67 DEBUG_ERR_MSG("Can not finish send client request %s",
69 out_result = NET_NFC_IPC_FAIL;
74 g_variant_get(parameter, "(ttt)",
79 if (callback != NULL) {
80 ndef_message_h message;
82 message = net_nfc_util_gdbus_variant_to_ndef_message(out_data);
84 callback(handle, out_type, out_result,
87 net_nfc_free_ndef_message(message);
90 g_variant_unref(parameter);
94 net_nfc_error_e net_nfc_client_snep_start_server(
95 net_nfc_target_handle_h target,
98 net_nfc_client_snep_event_cb callback,
101 net_nfc_error_e result = NET_NFC_OK;
102 GError *error = NULL;
105 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;
115 parameter = g_variant_new("(tt)",
119 if (net_nfc_gdbus_snep_call_server_start_sync(snep_proxy,
120 GPOINTER_TO_UINT(target),
123 GPOINTER_TO_UINT(parameter),
127 DEBUG_ERR_MSG("snep server(sync call) failed: %s",
129 result = NET_NFC_IPC_FAIL;
133 g_variant_unref(parameter);
140 net_nfc_error_e net_nfc_client_snep_start_client(
141 net_nfc_target_handle_h target,
144 net_nfc_client_snep_event_cb callback,
147 net_nfc_error_e result = NET_NFC_OK;
148 GError *error = NULL;
151 if (snep_proxy == NULL) {
152 DEBUG_ERR_MSG("Can not get Snep Proxy");
154 return NET_NFC_NOT_INITIALIZED;
157 /* prevent executing daemon when nfc is off */
158 if (net_nfc_client_manager_is_activated() == false)
159 return NET_NFC_NOT_ACTIVATED;
161 parameter = g_variant_new("(tt)",
165 if (net_nfc_gdbus_snep_call_client_start_sync(snep_proxy,
166 GPOINTER_TO_UINT(target),
169 GPOINTER_TO_UINT(parameter),
173 DEBUG_ERR_MSG("snep client(sync call) failed: %s",
175 result = NET_NFC_IPC_FAIL;
179 g_variant_unref(parameter);
186 net_nfc_error_e net_nfc_client_snep_send_client_request(
187 net_nfc_snep_handle_h target,
188 net_nfc_snep_type_t snep_type,
190 net_nfc_client_snep_event_cb callback,
193 GVariant *ndef_msg = NULL;
196 if (target == NULL || msg == NULL)
197 return NET_NFC_NULL_PARAMETER;
199 if (snep_proxy == NULL) {
200 DEBUG_ERR_MSG("Can not get Snep Proxy");
202 return NET_NFC_NOT_INITIALIZED;
205 /* prevent executing daemon when nfc is off */
206 if (net_nfc_client_manager_is_activated() == false)
207 return NET_NFC_NOT_ACTIVATED;
209 parameter = g_variant_new("(ttt)",
214 ndef_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
216 net_nfc_gdbus_snep_call_client_request(snep_proxy,
217 GPOINTER_TO_UINT(target),
221 snep_send_client_request,
228 net_nfc_error_e net_nfc_client_snep_send_client_request_sync(
229 net_nfc_target_handle_h target,
230 net_nfc_snep_type_t snep_type,
232 net_nfc_snep_type_t *resp_type,
233 ndef_message_h *response)
235 GVariant *resp_msg = NULL;
236 GVariant *arg_msg = NULL;
237 GError *error = NULL;
238 net_nfc_error_e result;
241 if (target == NULL || msg == NULL ||
242 resp_type == NULL || response == NULL)
243 return NET_NFC_NULL_PARAMETER;
247 if (snep_proxy == NULL) {
248 DEBUG_ERR_MSG("Can not get Snep Proxy");
250 return NET_NFC_NOT_INITIALIZED;
253 arg_msg = net_nfc_util_gdbus_ndef_message_to_variant(msg);
255 if (net_nfc_gdbus_snep_call_client_request_sync(snep_proxy,
256 GPOINTER_TO_UINT(target),
264 data_s ndef_data = { NULL, };
266 net_nfc_util_gdbus_variant_to_data_s(resp_msg, &ndef_data);
268 if (ndef_data.buffer != NULL && ndef_data.length > 0) {
269 result = net_nfc_create_ndef_message_from_rawdata(
273 net_nfc_util_free_data(&ndef_data);
276 DEBUG_ERR_MSG(" send client request (sync call) failed: %s",
280 return NET_NFC_IPC_FAIL;
288 net_nfc_error_e net_nfc_client_snep_stop_service_sync(
289 net_nfc_target_handle_h target,
290 net_nfc_snep_handle_h service)
292 net_nfc_error_e result = NET_NFC_OK;
293 GError *error = NULL;
295 if (target == NULL || service == NULL)
296 return NET_NFC_NULL_PARAMETER;
298 if (snep_proxy == NULL) {
299 DEBUG_ERR_MSG("Can not get Snep Proxy");
301 return NET_NFC_NOT_INITIALIZED;
304 /* prevent executing daemon when nfc is off */
305 if (net_nfc_client_manager_is_activated() == false)
306 return NET_NFC_NOT_ACTIVATED;
308 if (net_nfc_gdbus_snep_call_stop_snep_sync(
310 GPOINTER_TO_UINT(target),
311 GPOINTER_TO_UINT(service),
315 DEBUG_ERR_MSG("snep stop service(sync call) failed: %s",
317 result = NET_NFC_IPC_FAIL;
325 static void _snep_event_cb(NetNfcGDbusSnep *object,
329 GVariant *arg_ndef_msg,
332 GVariant *parameter = (GVariant *)GUINT_TO_POINTER(arg_user_data);
334 INFO_MSG(">>> SIGNAL arrived");
336 DEBUG_CLIENT_MSG("handle [%p], event [%d], result [%d], user_data [%p]",
337 GUINT_TO_POINTER(arg_handle),
342 if (parameter != NULL) {
343 net_nfc_client_snep_event_cb callback;
346 g_variant_get(parameter,
351 if (callback != NULL) {
352 ndef_message_h message;
354 message = net_nfc_util_gdbus_variant_to_ndef_message(
357 callback(GUINT_TO_POINTER(arg_handle),
363 net_nfc_free_ndef_message(message);
365 #if 0 /* remove temporary... */
366 if (arg_event == NET_NFC_LLCP_UNREGISTERED)
367 g_variant_unref(parameter);
373 net_nfc_error_e net_nfc_client_snep_register_server(const char *san,
375 net_nfc_client_snep_event_cb callback,
378 net_nfc_error_e result = NET_NFC_OK;
379 GError *error = NULL;
382 if (snep_proxy == NULL) {
383 if (net_nfc_client_snep_init() != NET_NFC_OK) {
384 DEBUG_ERR_MSG("Snep Proxy fail");
385 return NET_NFC_NOT_INITIALIZED;
389 /* prevent executing daemon when nfc is off */
390 if (net_nfc_client_manager_is_activated() == false)
391 return NET_NFC_NOT_ACTIVATED;
393 parameter = g_variant_new("(tt)",
397 if (net_nfc_gdbus_snep_call_server_register_sync(snep_proxy,
400 GPOINTER_TO_UINT(parameter),
404 DEBUG_ERR_MSG("snep register server(sync call) failed: %s",
406 result = NET_NFC_IPC_FAIL;
410 g_variant_unref(parameter);
417 net_nfc_error_e net_nfc_client_snep_unregister_server(const char *san,
420 net_nfc_error_e result = NET_NFC_OK;
421 GError *error = NULL;
423 if (snep_proxy == NULL) {
424 DEBUG_ERR_MSG("Can not get Snep Proxy");
426 return NET_NFC_NOT_INITIALIZED;
429 /* prevent executing daemon when nfc is off */
430 if (net_nfc_client_manager_is_activated() == false)
431 return NET_NFC_NOT_ACTIVATED;
433 if (net_nfc_gdbus_snep_call_server_unregister_sync(snep_proxy,
439 DEBUG_ERR_MSG("snep unregister server(sync call) failed: %s",
441 result = NET_NFC_IPC_FAIL;
449 net_nfc_error_e net_nfc_client_snep_init(void)
451 GError *error = NULL;
454 DEBUG_CLIENT_MSG("Already initialized");
459 snep_proxy = net_nfc_gdbus_snep_proxy_new_for_bus_sync(
461 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
462 "org.tizen.NetNfcService",
463 "/org/tizen/NetNfcService/Snep",
466 if (snep_proxy == NULL) {
467 DEBUG_ERR_MSG("Can not create proxy : %s", error->message);
470 return NET_NFC_UNKNOWN_ERROR;
473 g_signal_connect(snep_proxy, "snep-event",
474 G_CALLBACK(_snep_event_cb), NULL);
479 void net_nfc_client_snep_deinit(void)
482 g_object_unref(snep_proxy);