initial import
[libicd-wpa] / dbus-handler.c
diff --git a/dbus-handler.c b/dbus-handler.c
new file mode 100644 (file)
index 0000000..02ce44e
--- /dev/null
@@ -0,0 +1,202 @@
+/**
+  @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);
+}