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_debug_internal.h"
19 #include "net_nfc_gdbus.h"
20 #include "net_nfc_client.h"
21 #include "net_nfc_client_context.h"
22 #include "net_nfc_client_manager.h"
23 #include "net_nfc_neard.h"
25 #define DEACTIVATE_DELAY 500 /* ms */
27 typedef struct _ManagerFuncData ManagerFuncData;
29 struct _ManagerFuncData
33 net_nfc_error_e result;
36 static NetNfcGDbusManager *manager_proxy = NULL;
37 static ManagerFuncData activated_func_data;
38 static int is_activated = -1;
39 static guint timeout_id[2];
41 static void manager_call_get_server_state_callback(GObject *source_object,
42 GAsyncResult *res, gpointer user_data)
47 net_nfc_error_e result;
48 NetNfcCallback *func_data = user_data;
50 g_assert(user_data != NULL);
52 ret = net_nfc_gdbus_manager_call_get_server_state_finish(
53 NET_NFC_GDBUS_MANAGER(source_object),
61 NFC_ERR("Can not finish get_server_state: %s",
65 result = NET_NFC_IPC_FAIL;
68 if (func_data->callback != NULL)
70 net_nfc_client_manager_get_server_state_completed callback =
71 (net_nfc_client_manager_get_server_state_completed)func_data->callback;
73 callback(result, out_state, func_data->user_data);
79 static gboolean _activated_time_elapsed_callback(gpointer user_data)
81 net_nfc_client_manager_activated callback =
82 (net_nfc_client_manager_activated)activated_func_data.callback;
86 callback(is_activated, activated_func_data.user_data);
91 static void manager_activated(NetNfcGDbusManager *manager, gboolean activated,
94 NFC_INFO(">>> SIGNAL arrived : activated %d", activated);
96 /* update current state */
97 is_activated = (int)activated;
99 if (activated_func_data.callback != NULL)
101 if (is_activated == false)
103 /* FIXME : wait several times */
104 timeout_id[1] = g_timeout_add(DEACTIVATE_DELAY,
105 _activated_time_elapsed_callback, NULL);
109 g_main_context_invoke(NULL, _activated_time_elapsed_callback, NULL);
114 API void net_nfc_client_manager_set_activated(
115 net_nfc_client_manager_activated callback, void *user_data)
117 RET_IF(NULL == callback);
119 net_nfc_neard_set_activated(callback, user_data);
122 API void net_nfc_client_manager_unset_activated(void)
124 net_nfc_neard_unset_activated();
127 API net_nfc_error_e net_nfc_client_manager_set_active(int state,
128 net_nfc_client_manager_set_active_completed callback, void *user_data)
130 return net_nfc_neard_set_active(state, callback, user_data);
133 API net_nfc_error_e net_nfc_client_manager_set_active_sync(int state)
136 GError *error = NULL;
137 net_nfc_error_e out_result = NET_NFC_OK;
139 RETV_IF(NULL == manager_proxy, NET_NFC_NOT_INITIALIZED);
141 /* allow this function even nfc is off */
143 ret = net_nfc_gdbus_manager_call_set_active_sync(manager_proxy,
145 net_nfc_client_gdbus_get_privilege(),
152 NFC_ERR("can not call SetActive: %s", error->message);
155 out_result = NET_NFC_IPC_FAIL;
161 API net_nfc_error_e net_nfc_client_manager_get_server_state(
162 net_nfc_client_manager_get_server_state_completed callback, void *user_data)
164 NetNfcCallback *func_data;
166 RETV_IF(NULL == manager_proxy, NET_NFC_NOT_INITIALIZED);
168 /* prevent executing daemon when nfc is off */
169 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
171 func_data = g_try_new0(NetNfcCallback, 1);
172 if (func_data == NULL)
173 return NET_NFC_ALLOC_FAIL;
175 func_data->callback = (gpointer) callback;
176 func_data->user_data = user_data;
178 net_nfc_gdbus_manager_call_get_server_state(manager_proxy,
179 net_nfc_client_gdbus_get_privilege(),
181 manager_call_get_server_state_callback,
187 API net_nfc_error_e net_nfc_client_manager_get_server_state_sync(
192 GError *error = NULL;
193 net_nfc_error_e out_result = NET_NFC_OK;
195 RETV_IF(NULL == state, NET_NFC_NULL_PARAMETER);
196 RETV_IF(NULL == manager_proxy, NET_NFC_NOT_INITIALIZED);
198 /* prevent executing daemon when nfc is off */
199 RETV_IF(net_nfc_client_manager_is_activated() == false, NET_NFC_INVALID_STATE);
203 ret = net_nfc_gdbus_manager_call_get_server_state_sync(manager_proxy,
204 net_nfc_client_gdbus_get_privilege(),
216 NFC_ERR("can not call GetServerState: %s", error->message);
219 out_result = NET_NFC_IPC_FAIL;
225 net_nfc_error_e net_nfc_client_manager_init(void)
227 GError *error = NULL;
231 NFC_WARN("Already initialized");
235 manager_proxy = net_nfc_gdbus_manager_proxy_new_for_bus_sync(
237 G_DBUS_PROXY_FLAGS_NONE,
238 "org.tizen.NetNfcService",
239 "/org/tizen/NetNfcService/Manager",
243 if (NULL == manager_proxy)
245 NFC_ERR("Can not create proxy : %s", error->message);
248 return NET_NFC_UNKNOWN_ERROR;
251 g_signal_connect(manager_proxy, "activated", G_CALLBACK(manager_activated), NULL);
256 void net_nfc_client_manager_deinit(void)
262 for (i = 0; i < 2; i++)
264 if (timeout_id[i] > 0)
266 g_source_remove(timeout_id[i]);
271 g_object_unref(manager_proxy);
272 manager_proxy = NULL;
276 /* internal function */
277 bool net_nfc_client_manager_is_activated()
279 if (is_activated < 0)
280 net_nfc_client_get_nfc_state(&is_activated);