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.
19 #include "net_nfc_debug_internal.h"
20 #include "net_nfc_util_defines.h"
21 #include "net_nfc_util_internal.h"
22 #include "net_nfc_server_controller.h"
23 #include "net_nfc_server_common.h"
24 #include "net_nfc_server_llcp.h"
25 #include "net_nfc_server_snep.h"
26 #include "net_nfc_server_process_snep.h"
27 #include "net_nfc_util_gdbus_internal.h"
28 #include "net_nfc_server_context.h"
31 static gboolean _handle_start_server(
32 NetNfcGDbusSnep *object,
33 GDBusMethodInvocation *invocation,
38 GVariant *arg_privilege);
40 static gboolean _handle_start_client(
41 NetNfcGDbusSnep *object,
42 GDBusMethodInvocation *invocation,
47 GVariant *arg_privilege);
49 static gboolean _handle_client_send_request(
50 NetNfcGDbusSnep *object,
51 GDBusMethodInvocation *invocation,
52 guint arg_snep_handle,
54 GVariant *arg_ndef_msg,
55 GVariant *arg_privilege);
57 static gboolean _handle_stop_snep(
58 NetNfcGDbusSnep *object,
59 GDBusMethodInvocation *invocation,
61 guint arg_snep_handle,
62 GVariant *arg_privilege);
64 static void snep_server_start_thread_func(gpointer user_data);
66 static void snep_client_start_thread_func(gpointer user_data);
68 static void snep_client_send_request_thread_func(gpointer user_data);
70 static void snep_stop_service_thread_func(gpointer user_data);
73 static NetNfcGDbusSnep *snep_skeleton = NULL;
75 static void _emit_snep_event_signal(GVariant *parameter,
76 net_nfc_snep_handle_h handle,
77 net_nfc_error_e result,
81 GDBusConnection *connection;
87 g_variant_get(parameter, "(usu)",
92 arg_data = net_nfc_util_gdbus_data_to_variant(data);
94 if (g_dbus_connection_emit_signal(
97 "/org/tizen/NetNfcService/Snep",
98 "org.tizen.NetNfcService.Snep",
100 g_variant_new("(uui@a(y)u)", GPOINTER_TO_UINT(handle), type, (gint)result,
101 arg_data, GPOINTER_TO_UINT(user_data)),
104 if (error != NULL && error->message != NULL) {
105 NFC_ERR("g_dbus_connection_emit_signal failed : %s", error->message);
107 NFC_ERR("g_dbus_connection_emit_signal failed");
114 static net_nfc_error_e _snep_server_cb(net_nfc_snep_handle_h handle,
115 net_nfc_error_e result,
120 GVariant *parameter = (GVariant *)user_param;
124 NFC_DBG("type [%d], result [%d], data [%p], user_param [%p]",
125 type, result, data, user_param);
131 uint32_t max_len = 0;
133 net_nfc_server_snep_parse_get_request(data, &max_len,
142 NFC_ERR("error [%d]", result);
146 if (result < NET_NFC_OK) {
147 type = NET_NFC_LLCP_STOP;
150 _emit_snep_event_signal(parameter, handle,
153 if (type == NET_NFC_LLCP_STOP) {
154 g_object_unref(parameter);
160 static void snep_server_start_thread_func(gpointer user_data)
162 NetNfcGDbusSnep *object;
163 GDBusMethodInvocation *invocation;
164 net_nfc_target_handle_s *arg_handle;
168 net_nfc_error_e result;
171 GDBusConnection *connection;
173 if (user_data == NULL)
175 NFC_ERR("cannot get SNEP client data");
180 g_variant_get((GVariant *)user_data,
183 (guint *)&invocation,
184 (guint *)&arg_handle,
187 (guint *)&arg_user_data);
189 g_assert(object != NULL);
190 g_assert(invocation != NULL);
192 connection = g_dbus_method_invocation_get_connection(invocation);
194 parameter = g_variant_new("(usu)",
195 GPOINTER_TO_UINT(g_object_ref(connection)),
196 g_dbus_method_invocation_get_sender(invocation),
197 GPOINTER_TO_UINT(arg_user_data));
198 if (parameter != NULL) {
199 result = net_nfc_server_snep_server(arg_handle,
204 if (result != NET_NFC_OK) {
205 NFC_ERR("net_nfc_server_snep_server failed, [%d]",
207 g_object_unref(connection);
209 g_variant_unref(parameter);
212 NFC_ERR("g_variant_new failed");
214 g_object_unref(connection);
216 result = NET_NFC_ALLOC_FAIL;
219 net_nfc_gdbus_snep_complete_server_start(object, invocation, result);
223 g_variant_unref(user_data);
226 static gboolean _handle_start_server(
227 NetNfcGDbusSnep *object,
228 GDBusMethodInvocation *invocation,
231 const gchar *arg_san,
233 GVariant *arg_privilege)
238 NFC_INFO(">>> REQUEST from [%s]",
239 g_dbus_method_invocation_get_sender(invocation));
241 /* check privilege and update client context */
242 if (net_nfc_server_gdbus_check_privilege(invocation,
246 NFC_ERR("permission denied, and finished request");
251 parameter = g_variant_new("(uuuusu)",
252 GPOINTER_TO_UINT(g_object_ref(object)),
253 GPOINTER_TO_UINT(g_object_ref(invocation)),
259 if (parameter != NULL)
261 if ((result = net_nfc_server_controller_async_queue_push(
262 snep_server_start_thread_func, parameter)) == FALSE)
264 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
266 g_dbus_method_invocation_return_dbus_error(invocation,
267 "org.tizen.NetNfcService.Snep.ThreadError",
268 "can not push to controller thread");
270 g_object_unref(invocation);
271 g_object_unref(object);
273 g_variant_unref(parameter);
278 NFC_ERR("g_variant_new failed");
280 g_dbus_method_invocation_return_dbus_error(invocation,
281 "org.tizen.NetNfcService.Snep.MemoryError",
290 static net_nfc_error_e _snep_start_client_cb(
291 net_nfc_snep_handle_h handle,
292 net_nfc_error_e result,
297 GVariant *parameter = (GVariant *)user_param;
299 NFC_DBG("type [%d], result [%d], data [%p], user_param [%p]",
300 type, result, data, user_param);
302 _emit_snep_event_signal(parameter, handle, result, type, data);
304 if (type == NET_NFC_LLCP_STOP) {
305 g_variant_unref(parameter);
311 static void snep_client_start_thread_func(gpointer user_data)
313 NetNfcGDbusSnep *object;
314 GDBusMethodInvocation *invocation;
315 net_nfc_target_handle_s *arg_handle;
319 net_nfc_error_e result;
322 GDBusConnection *connection;
324 if (user_data == NULL)
326 NFC_ERR("cannot get SNEP client data");
331 g_variant_get((GVariant *)user_data,
334 (guint *)&invocation,
335 (guint *)&arg_handle,
338 (guint *)&arg_user_data);
340 g_assert(object != NULL);
341 g_assert(invocation != NULL);
343 connection = g_dbus_method_invocation_get_connection(invocation);
345 parameter = g_variant_new("(usu)",
346 GPOINTER_TO_UINT(g_object_ref(connection)),
347 g_dbus_method_invocation_get_sender(invocation),
348 GPOINTER_TO_UINT(arg_user_data));
349 if (parameter != NULL) {
350 result = net_nfc_server_snep_client(arg_handle,
353 _snep_start_client_cb,
355 if (result != NET_NFC_OK) {
356 NFC_ERR("net_nfc_server_snep_client failed, [%d]",
358 g_object_unref(connection);
360 g_variant_unref(parameter);
363 NFC_ERR("g_variant_new failed");
365 g_object_unref(connection);
367 result = NET_NFC_ALLOC_FAIL;
370 net_nfc_gdbus_snep_complete_client_start(object, invocation, result);
374 g_variant_unref(user_data);
377 static gboolean _handle_start_client(
378 NetNfcGDbusSnep *object,
379 GDBusMethodInvocation *invocation,
382 const gchar *arg_san,
384 GVariant *arg_privilege)
389 NFC_INFO(">>> REQUEST from [%s]",
390 g_dbus_method_invocation_get_sender(invocation));
392 /* check privilege and update client context */
393 if (net_nfc_server_gdbus_check_privilege(invocation,
397 NFC_ERR("permission denied, and finished request");
402 parameter = g_variant_new("(uuuusu)",
403 GPOINTER_TO_UINT(g_object_ref(object)),
404 GPOINTER_TO_UINT(g_object_ref(invocation)),
410 if (parameter != NULL)
412 if ((result = net_nfc_server_controller_async_queue_push(
413 snep_client_start_thread_func, parameter)) == FALSE)
415 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
417 g_dbus_method_invocation_return_dbus_error(invocation,
418 "org.tizen.NetNfcService.Snep.ThreadError",
419 "can not push to controller thread");
421 g_object_unref(invocation);
422 g_object_unref(object);
424 g_object_unref(g_variant_unref);
429 NFC_ERR("g_variant_new failed");
431 g_dbus_method_invocation_return_dbus_error(invocation,
432 "org.tizen.NetNfcService.Snep.MemoryError",
441 static net_nfc_error_e _snep_client_request_cb(
442 net_nfc_snep_handle_h handle,
443 net_nfc_error_e result,
444 net_nfc_snep_type_t type,
448 GVariant *parameter = (GVariant *)user_param;
450 NFC_DBG("type [%d], result [%d], data [%p], user_param [%p]",
451 type, result, data, user_param);
453 if (parameter != NULL) {
454 NetNfcGDbusSnep *object;
455 GDBusMethodInvocation *invocation;
456 net_nfc_snep_handle_h arg_snep_handle;
457 net_nfc_snep_type_t arg_type;
458 GVariant *arg_ndef_msg;
459 GVariant *arg_data = NULL;
461 g_variant_get(parameter,
464 (guint *)&invocation,
465 (guint *)&arg_snep_handle,
469 if (data != NULL && data->buffer != NULL && data->length > 0) {
470 arg_data = net_nfc_util_gdbus_data_to_variant(data);
472 arg_data = net_nfc_util_gdbus_buffer_to_variant(NULL, 0);
475 net_nfc_gdbus_snep_complete_client_request(object,
481 g_variant_unref(arg_ndef_msg);
483 g_object_unref(invocation);
484 g_object_unref(object);
486 g_variant_unref(parameter);
490 result = NET_NFC_NULL_PARAMETER;
496 static void snep_client_send_request_thread_func(gpointer user_data)
498 NetNfcGDbusSnep *object;
499 GDBusMethodInvocation *invocation;
500 net_nfc_snep_handle_h arg_snep_handle;
501 net_nfc_snep_type_t arg_type;
502 GVariant *arg_ndef_msg;
503 data_s data = { NULL, };
504 net_nfc_error_e result;
506 if (user_data == NULL)
508 NFC_ERR("cannot get SNEP client data");
513 g_variant_get((GVariant *)user_data,
516 (guint *)&invocation,
517 (guint *)&arg_snep_handle,
521 g_assert(object != NULL);
522 g_assert(invocation != NULL);
524 net_nfc_util_gdbus_variant_to_data_s(arg_ndef_msg, &data);
526 result = net_nfc_server_snep_client_request(arg_snep_handle,
529 _snep_client_request_cb,
531 if (result != NET_NFC_OK)
535 NFC_ERR("net_nfc_server_snep_client_request "
536 "failed, [%d]",result);
538 resp = net_nfc_util_gdbus_buffer_to_variant(NULL, 0);
540 net_nfc_gdbus_snep_complete_client_request(object,
541 invocation, result, NET_NFC_LLCP_STOP, resp);
543 g_object_unref(invocation);
544 g_object_unref(object);
546 g_variant_unref(user_data);
549 net_nfc_util_free_data(&data);
551 g_variant_unref(arg_ndef_msg);
554 static gboolean _handle_client_send_request(
555 NetNfcGDbusSnep *object,
556 GDBusMethodInvocation *invocation,
557 guint arg_snep_handle,
559 GVariant *arg_ndef_msg,
560 GVariant *arg_privilege)
565 NFC_INFO(">>> REQUEST from [%s]",
566 g_dbus_method_invocation_get_sender(invocation));
568 /* check privilege and update client context */
569 if (net_nfc_server_gdbus_check_privilege(invocation,
573 NFC_ERR("permission denied, and finished request");
578 parameter = g_variant_new("(uuuu@a(y))",
579 GPOINTER_TO_UINT(g_object_ref(object)),
580 GPOINTER_TO_UINT(g_object_ref(invocation)),
585 if (parameter != NULL)
587 if ((result = net_nfc_server_controller_async_queue_push(
588 snep_client_send_request_thread_func, parameter)) == FALSE)
590 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
592 g_dbus_method_invocation_return_dbus_error(invocation,
593 "org.tizen.NetNfcService.Snep.ThreadError",
594 "can not push to controller thread");
596 g_object_unref(invocation);
597 g_object_unref(object);
599 g_variant_unref(parameter);
604 NFC_ERR("g_variant_new failed");
606 g_dbus_method_invocation_return_dbus_error(invocation,
607 "org.tizen.NetNfcService.Snep.MemoryError",
616 static void snep_stop_service_thread_func(gpointer user_data)
618 NetNfcGDbusSnep *object;
619 GDBusMethodInvocation *invocation;
620 net_nfc_target_handle_s *handle;
621 net_nfc_snep_handle_h snep_handle;
623 if (user_data == NULL)
625 NFC_ERR("cannot get SNEP client data");
630 g_variant_get((GVariant *)user_data,
633 (guint *)&invocation,
635 (guint *)&snep_handle);
637 g_assert(object != NULL);
638 g_assert(invocation != NULL);
641 g_dbus_method_invocation_return_dbus_error(
643 "org.tizen.NetNfcService.Snep.DataError",
644 "Cannot stop SNEP service");
647 net_nfc_gdbus_snep_complete_stop_snep(object,
651 g_object_unref(invocation);
652 g_object_unref(object);
654 g_variant_unref(user_data);
657 static gboolean _handle_stop_snep(
658 NetNfcGDbusSnep *object,
659 GDBusMethodInvocation *invocation,
661 guint arg_snep_handle,
662 GVariant *arg_privilege)
667 NFC_INFO(">>> REQUEST from [%s]",
668 g_dbus_method_invocation_get_sender(invocation));
670 /* check privilege and update client context */
671 if (net_nfc_server_gdbus_check_privilege(invocation,
675 NFC_ERR("permission denied, and finished request");
680 parameter = g_variant_new("(uuuu)",
681 GPOINTER_TO_UINT(g_object_ref(object)),
682 GPOINTER_TO_UINT(g_object_ref(invocation)),
686 if (parameter != NULL)
688 if ((result = net_nfc_server_controller_async_queue_push(
689 snep_stop_service_thread_func, parameter)) == FALSE)
691 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
693 g_dbus_method_invocation_return_dbus_error(invocation,
694 "org.tizen.NetNfcService.Snep.ThreadError",
695 "can not push to controller thread");
697 g_object_unref(invocation);
698 g_object_unref(object);
700 g_variant_unref(parameter);
705 NFC_ERR("g_variant_new failed");
707 g_dbus_method_invocation_return_dbus_error(invocation,
708 "org.tizen.NetNfcService.Snep.MemoryError",
717 static void _snep_activate_cb(int event, net_nfc_target_handle_s *handle,
718 uint32_t sap, const char *san, void *user_param)
720 GVariant *parameter = (GVariant *)user_param;
721 net_nfc_error_e result = NET_NFC_OK;
723 NFC_DBG("event [%d], handle [%p], sap [%d], san [%s]",
724 event, handle, sap, san);
726 if (event == NET_NFC_LLCP_START) {
727 GDBusConnection *connection;
728 GVariant *param = NULL;
733 g_variant_get(parameter, "(usu)",
734 (guint *)&connection,
736 (guint *)&user_data);
738 param = g_variant_new("(usu)",
739 GPOINTER_TO_UINT(g_object_ref(connection)),
741 GPOINTER_TO_UINT(user_data));
745 result = net_nfc_server_snep_server(handle, (char *)san, sap,
746 _snep_server_cb, param);
747 if (result == NET_NFC_OK) {
748 _emit_snep_event_signal(parameter, handle,
749 result, event, NULL);
751 NFC_ERR("net_nfc_server_snep_server failed, [%d]",
754 g_variant_unref(param);
757 _emit_snep_event_signal(parameter, handle,
758 result, NET_NFC_LLCP_UNREGISTERED, NULL);
760 /* unregister server */
761 g_variant_unref(parameter);
765 static void snep_register_server_thread_func(gpointer user_data)
767 NetNfcGDbusSnep *object;
768 GDBusMethodInvocation *invocation;
773 net_nfc_error_e result;
774 GVariant *parameter = NULL;
775 GDBusConnection *connection;
777 g_assert(user_data != NULL);
779 g_variant_get((GVariant *)user_data,
782 (guint *)&invocation,
787 g_assert(object != NULL);
788 g_assert(invocation != NULL);
790 connection = g_dbus_method_invocation_get_connection(invocation);
792 parameter = g_variant_new("(usu)",
793 GPOINTER_TO_UINT(g_object_ref(connection)),
794 g_dbus_method_invocation_get_sender(invocation),
796 if (parameter != NULL) {
797 /* register default snep server */
798 result = net_nfc_server_llcp_register_service(
799 g_dbus_method_invocation_get_sender(invocation),
804 if (result != NET_NFC_OK) {
805 NFC_ERR("net_nfc_service_llcp_register_service failed, [%d]", result);
806 g_object_unref(connection);
807 g_variant_unref(parameter);
810 result = NET_NFC_ALLOC_FAIL;
811 g_object_unref(connection);
814 net_nfc_gdbus_snep_complete_server_register(object,
820 g_object_unref(invocation);
821 g_object_unref(object);
823 g_variant_unref(user_data);
826 static gboolean _handle_register_server(
827 NetNfcGDbusSnep *object,
828 GDBusMethodInvocation *invocation,
830 const gchar *arg_san,
832 GVariant *arg_privilege)
837 NFC_INFO(">>> REQUEST from [%s]",
838 g_dbus_method_invocation_get_sender(invocation));
840 /* check privilege and update client context */
841 if (net_nfc_server_gdbus_check_privilege(invocation,
845 NFC_ERR("permission denied, and finished request");
850 parameter = g_variant_new("(uuusu)",
851 GPOINTER_TO_UINT(g_object_ref(object)),
852 GPOINTER_TO_UINT(g_object_ref(invocation)),
857 if (parameter != NULL)
859 if ((result = net_nfc_server_controller_async_queue_push(
860 snep_register_server_thread_func, parameter)) == FALSE)
862 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
864 g_dbus_method_invocation_return_dbus_error(invocation,
865 "org.tizen.NetNfcService.Snep.ThreadError",
866 "can not push to controller thread");
868 g_object_unref(invocation);
869 g_object_unref(object);
871 g_variant_unref(parameter);
876 NFC_ERR("g_variant_new failed");
878 g_dbus_method_invocation_return_dbus_error(invocation,
879 "org.tizen.NetNfcService.Snep.MemoryError",
888 static void snep_unregister_server_thread_func(gpointer user_data)
890 NetNfcGDbusSnep *object;
891 GDBusMethodInvocation *invocation;
895 net_nfc_error_e result;
897 g_assert(user_data != NULL);
899 g_variant_get((GVariant *)user_data,
902 (guint *)&invocation,
906 g_assert(object != NULL);
907 g_assert(invocation != NULL);
909 result = net_nfc_server_llcp_unregister_service(
910 g_dbus_method_invocation_get_sender(invocation),
914 net_nfc_gdbus_snep_complete_server_unregister(object,
920 g_object_unref(invocation);
921 g_object_unref(object);
923 g_variant_unref(user_data);
926 static gboolean _handle_unregister_server(
927 NetNfcGDbusSnep *object,
928 GDBusMethodInvocation *invocation,
930 const gchar *arg_san,
931 GVariant *arg_privilege)
936 NFC_INFO(">>> REQUEST from [%s]",
937 g_dbus_method_invocation_get_sender(invocation));
939 /* check privilege and update client context */
940 if (net_nfc_server_gdbus_check_privilege(invocation,
944 NFC_ERR("permission denied, and finished request");
949 parameter = g_variant_new("(uuus)",
950 GPOINTER_TO_UINT(g_object_ref(object)),
951 GPOINTER_TO_UINT(g_object_ref(invocation)),
955 if (parameter != NULL)
957 if ((result = net_nfc_server_controller_async_queue_push(
958 snep_unregister_server_thread_func, parameter)) == FALSE)
960 NFC_ERR("net_nfc_server_controller_async_queue_push failed");
962 g_dbus_method_invocation_return_dbus_error(invocation,
963 "org.tizen.NetNfcService.Snep.ThreadError",
964 "can not push to controller thread");
966 g_object_unref(invocation);
967 g_object_unref(object);
969 g_variant_unref(parameter);
974 NFC_ERR("g_variant_new failed");
976 g_dbus_method_invocation_return_dbus_error(invocation,
977 "org.tizen.NetNfcService.Snep.MemoryError",
986 gboolean net_nfc_server_snep_init(GDBusConnection *connection)
988 GError *error = NULL;
992 g_object_unref(snep_skeleton);
994 snep_skeleton = net_nfc_gdbus_snep_skeleton_new();
996 g_signal_connect(snep_skeleton,
997 "handle-server-register",
998 G_CALLBACK(_handle_register_server),
1001 g_signal_connect(snep_skeleton,
1002 "handle-server-unregister",
1003 G_CALLBACK(_handle_unregister_server),
1006 g_signal_connect(snep_skeleton,
1007 "handle-server-start",
1008 G_CALLBACK(_handle_start_server),
1011 g_signal_connect(snep_skeleton,
1012 "handle-client-start",
1013 G_CALLBACK(_handle_start_client),
1016 g_signal_connect(snep_skeleton,
1017 "handle-client-request",
1018 G_CALLBACK(_handle_client_send_request),
1021 g_signal_connect(snep_skeleton,
1023 G_CALLBACK(_handle_stop_snep),
1026 result = g_dbus_interface_skeleton_export(
1027 G_DBUS_INTERFACE_SKELETON(snep_skeleton),
1029 "/org/tizen/NetNfcService/Snep",
1031 if (result == FALSE)
1033 g_error_free(error);
1035 net_nfc_server_snep_deinit();
1041 void net_nfc_server_snep_deinit(void)
1045 g_object_unref(snep_skeleton);
1046 snep_skeleton = NULL;