--- /dev/null
+/**
+ @file dbus-helper.c
+
+ Copyright (C) 2004 Nokia Corporation. All rights reserved.
+
+ Copyright (C) 2009 Javier S. Pedro
+
+ @author Janne Ylalehto <janne.ylalehto@nokia.com>
+ @author Johan Hedberg <johan.hedberg@nokia.com>
+
+ @author Javier S. Pedro <javispedro@javispedro.com>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+#include <glib.h>
+
+#include <wlancond-dbus.h>
+
+#include "dbus-helper.h"
+#include "dbus-handler.h"
+#include "wlan.h"
+#include "supp.h"
+#include "log.h"
+
+static DBusHandlerResult wlancond_scan_results_handler(DBusMessage *message) {
+ DBusMessageIter iter;
+ gint32 number_of_results, i;
+
+ if (!wlan_is_scanning()) {
+ DLOG_DEBUG("Received scan results we didn't ask for");
+ // TODO: Somehow use them
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ dbus_message_iter_init(message, &iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32)
+ goto param_err;
+
+ dbus_message_iter_get_basic(&iter, &number_of_results);
+
+ dbus_message_iter_next(&iter);
+
+ for (i = 0; i < number_of_results; i++) {
+ DBusMessageIter array_iter;
+ gint32 ssid_len, bssid_len;
+ gchar * ssid, * bssid;
+ gint32 rssi;
+ guint32 channel, cap_bits;
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
+ dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_BYTE) {
+
+ goto param_err;
+ }
+
+ dbus_message_iter_recurse(&iter, &array_iter);
+ dbus_message_iter_get_fixed_array(&array_iter, &ssid, &ssid_len);
+ dbus_message_iter_next(&iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
+ dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_BYTE) {
+
+ goto param_err;
+ }
+
+ dbus_message_iter_recurse(&iter, &array_iter);
+ dbus_message_iter_get_fixed_array(&array_iter, &bssid, &bssid_len);
+ dbus_message_iter_next(&iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32)
+ goto param_err;
+ dbus_message_iter_get_basic(&iter, &rssi);
+ dbus_message_iter_next(&iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
+ goto param_err;
+ dbus_message_iter_get_basic(&iter, &channel);
+ dbus_message_iter_next(&iter);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
+ goto param_err;
+ dbus_message_iter_get_basic(&iter, &cap_bits);
+ dbus_message_iter_next(&iter);
+
+ DLOG_INFO("Scan result with %s.", ssid);
+ wlan_notify_ap(ssid, bssid,
+ rssi, channel, cap_bits);
+ }
+
+ DLOG_DEBUG("Handled scan result, results=%ld.",
+ (long) number_of_results);
+
+ wlan_notify_end_of_search();
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+param_err:
+ DLOG_WARN("Parameter error in scan request");
+
+ wlan_notify_end_of_search();
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult supp_state_change_handler(DBusMessage *message) {
+ gchar *old_state, *new_state;
+
+ if (!dbus_message_get_args(
+ message, NULL,
+ DBUS_TYPE_STRING, &new_state,
+ DBUS_TYPE_STRING, &old_state,
+ DBUS_TYPE_INVALID))
+ {
+ DLOG_WARN("Supplicant StateChange signal format error");
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+ supp_handle_signal(old_state, new_state);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult wlancond_sig_handler(DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data) {
+ if (dbus_message_is_signal(message,
+ WLANCOND_SIG_INTERFACE,
+ WLANCOND_SCAN_RESULTS_SIG))
+ return wlancond_scan_results_handler(message);
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusHandlerResult supp_sig_handler(DBusConnection *connection,
+ DBusMessage *message,
+ void *user_data) {
+ if (dbus_message_is_signal(message,
+ WPAS_DBUS_IFACE_INTERFACE,
+ WPAS_STATE_CHANGE_SIG))
+ return supp_state_change_handler(message);
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+/**
+ Create bindings for D-BUS handlers.
+ @param connection DBUS connection.
+*/
+void init_dbus_handlers(DBusConnection *connection) {
+ gboolean ret;
+ /*dbus_bool_t ret;
+ ret = dbus_connection_register_object_path(connection,
+ WLANCOND_REQ_PATH,
+ &wlancond_req_vtable,
+ NULL);
+ if (ret == FALSE) {
+ DLOG_ERR("dbus_connection_register_object_path failed");
+ }*/
+
+ dbus_bus_add_match(connection,
+ "interface=" WLANCOND_SIG_INTERFACE
+ ",member=" WLANCOND_SCAN_RESULTS_SIG, NULL);
+
+ ret = dbus_connection_add_filter(connection,
+ (DBusHandleMessageFunction)wlancond_sig_handler, NULL, NULL);
+
+ if (!ret) {
+ DLOG_ERR("dbus_connection_add_filter failed");
+ }
+
+ dbus_bus_add_match(connection,
+ "interface=" WPAS_DBUS_IFACE_INTERFACE
+ ",member=" WPAS_STATE_CHANGE_SIG, NULL);
+
+ ret = dbus_connection_add_filter(connection,
+ (DBusHandleMessageFunction)supp_sig_handler, NULL, NULL);
+
+ if (!ret) {
+ DLOG_ERR("dbus_connection_add_filter failed");
+ }
+}
+
+/**
+ Destroy D-BUS handlers.
+ @param connection DBUS connection.
+*/
+void destroy_dbus_handlers(DBusConnection *connection) {
+ //dbus_connection_unregister_object_path(connection, WLANCOND_REQ_PATH);
+}