4 * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct dbus utility functions.
23 * @file wifi-direct-dbus.c
24 * @author Nishant Chaprana (n.chaprana@samsung.com)
28 #include "wifi-direct-dbus.h"
29 #include "wifi-direct-log.h"
30 #include "wifi-direct-client-proxy.h"
33 GDBusConnection *connection;
34 guint signal_subscribe_id;
35 } gdbus_connection_data;
37 static __thread gdbus_connection_data gdbus_conn = {NULL, 0};
41 const char *interface;
43 void (*function) (GDBusConnection *connection,
45 const gchar *object_path,
46 const gchar *interface,
50 } wifi_direct_dbus_signal_map_s;
52 static __thread wifi_direct_dbus_signal_map_s wifi_direct_dbus_signal_map[] = {
55 WFD_MANAGER_MANAGE_INTERFACE,
57 wifi_direct_process_manage_activation
61 WFD_MANAGER_MANAGE_INTERFACE,
63 wifi_direct_process_manage_deactivation
67 WFD_MANAGER_MANAGE_INTERFACE,
69 wifi_direct_process_manage_connection
73 WFD_MANAGER_MANAGE_INTERFACE,
75 wifi_direct_process_manage_disconnection
79 WFD_MANAGER_MANAGE_INTERFACE,
81 wifi_direct_process_manage_disconnection_ind
85 WFD_MANAGER_MANAGE_INTERFACE,
87 wifi_direct_process_manage_peer_ip_assigned
91 WFD_MANAGER_MANAGE_INTERFACE,
93 wifi_direct_process_manage_discovery_started
97 WFD_MANAGER_MANAGE_INTERFACE,
99 wifi_direct_process_manage_listen_started
103 WFD_MANAGER_MANAGE_INTERFACE,
105 wifi_direct_process_manage_discovery_finished
109 WFD_MANAGER_MANAGE_INTERFACE,
111 wifi_direct_process_manage_peer_found
115 WFD_MANAGER_MANAGE_INTERFACE,
117 wifi_direct_process_manage_peer_lost
121 WFD_MANAGER_GROUP_INTERFACE,
123 wifi_direct_process_group_created
127 WFD_MANAGER_GROUP_INTERFACE,
129 wifi_direct_process_group_destroyed
133 WFD_MANAGER_SERVICE_INTERFACE,
135 wifi_direct_process_service_discovery_started
139 WFD_MANAGER_SERVICE_INTERFACE,
141 wifi_direct_process_service_discovery_found
145 WFD_MANAGER_SERVICE_INTERFACE,
147 wifi_direct_process_service_discovery_finished
157 GVariant *wifi_direct_dbus_method_call_sync_debug(const char* interface_name,
161 const char *calling_func)
163 GVariant *reply = NULL;
165 if (gdbus_conn.connection == NULL) {
166 WDC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
167 return reply; //LCOV_EXCL_LINE
170 WDC_LOGD("[%s][%s.%s]", calling_func, interface_name, method);
171 DBUS_DEBUG_VARIANT(params);
173 reply = g_dbus_connection_call_sync(gdbus_conn.connection,
174 WFD_MANAGER_SERVICE, /* bus name */
175 WFD_MANAGER_PATH, /* object path */
176 interface_name, /* interface name */
177 method, /* method name */
178 params, /* GVariant *params */
179 NULL, /* reply_type */
180 G_DBUS_CALL_FLAGS_NONE, /* flags */
181 WIFI_DIRECT_DBUS_REPLY_TIMEOUT_SYNC,
183 NULL, /* cancellable */
185 DBUS_DEBUG_VARIANT(reply);
189 gboolean wifi_direct_dbus_init(void)
191 GError *Error = NULL;
194 if (gdbus_conn.connection != NULL) {
195 WDC_LOGI("GDbusConnection already initialized");
199 gdbus_conn.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &Error);
200 if (gdbus_conn.connection == NULL) {
201 WDC_LOGE("Failed to get connection, Error[%s]", Error->message);
202 g_error_free(Error); //LCOV_EXCL_LINE
203 return FALSE; //LCOV_EXCL_LINE
206 /* subscribe signal handler */
207 for (i = 0; wifi_direct_dbus_signal_map[i].member != NULL; i++) {
208 wifi_direct_dbus_signal_map[i].sub_id =
209 g_dbus_connection_signal_subscribe(gdbus_conn.connection,
210 WFD_MANAGER_SERVICE, /* bus name */
211 wifi_direct_dbus_signal_map[i].interface, /* interface */
212 wifi_direct_dbus_signal_map[i].member, /* member */
213 WFD_MANAGER_PATH, /* object_path */
215 G_DBUS_SIGNAL_FLAGS_NONE,
216 wifi_direct_dbus_signal_map[i].function,
219 WDC_LOGD("Subscribed dbus signals [%d]", wifi_direct_dbus_signal_map[i].sub_id);
225 void wifi_direct_dbus_deinit(void)
229 if (gdbus_conn.connection == NULL)
232 /* unsubscribe signal handler */
233 for (i = 0; wifi_direct_dbus_signal_map[i].member != NULL; i++) {
234 g_dbus_connection_signal_unsubscribe(gdbus_conn.connection,
235 wifi_direct_dbus_signal_map[i].sub_id);
236 wifi_direct_dbus_signal_map[i].sub_id = 0;
239 /* unref gdbus connection */
240 g_object_unref(gdbus_conn.connection);
241 gdbus_conn.connection = NULL;
245 int wifi_direct_dbus_unpack_ay(unsigned char *dst, GVariant *src, int size)
247 GVariantIter *iter = NULL;
251 if (!dst || !src || size == 0) {
252 WDC_LOGE("Invalid parameter");
255 g_variant_get(src, "ay", &iter);
257 WDC_LOGE("failed to get iterator");
261 while (g_variant_iter_loop(iter, "y", &dst[length])) {
266 g_variant_iter_free(iter);
269 WDC_LOGE("array is shorter than size");