3 * Copyright 2009 Roy Marples <roy@marples.name>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include "dhcpcd-gtk.h"
31 find_network(const char *ifname, const char *ssid)
43 otype = dbus_g_type_get_struct("GValueArray",
49 otype = dbus_g_type_get_collection("GPtrArray", otype);
51 if (!dbus_g_proxy_call(dbus, "ListNetworks", &error,
52 G_TYPE_STRING, ifname, G_TYPE_INVALID,
53 otype, &array, G_TYPE_INVALID))
55 g_warning("ListNetworks: %s", error->message);
60 for (i = 0; i < array->len; i++) {
61 varray = g_ptr_array_index(array, i);
62 val = g_value_array_get_nth(varray, 1);
63 str = g_value_get_string(val);
64 if (g_strcmp0(str, ssid) == 0) {
65 val = g_value_array_get_nth(varray, 0);
66 return g_value_get_int(val);
70 if (!dbus_g_proxy_call(dbus, "AddNetwork", &error,
71 G_TYPE_STRING, ifname, G_TYPE_INVALID,
72 G_TYPE_INT, &id, G_TYPE_INVALID))
74 g_warning("AddNetwork: %s", error->message);
79 nssid = g_strconcat("\"", ssid, "\"", NULL);
80 if (!dbus_g_proxy_call(dbus, "SetNetwork", &error,
81 G_TYPE_STRING, ifname,
83 G_TYPE_STRING, "ssid",
88 g_warning("SetNetwork: %s", error->message);
99 configure_network(const char *ifname, int id, const char *mgmt,
100 const char *var, const char *val,
105 static gboolean warned = FALSE;
111 dbus_g_proxy_call(dbus, "SetNetwork", &error,
112 G_TYPE_STRING, ifname,
114 G_TYPE_STRING, "key_mgmt",
121 str = g_strconcat("\"", val, "\"", NULL);
124 if (!dbus_g_proxy_call(dbus, "SetNetwork", &error,
125 G_TYPE_STRING, ifname,
128 G_TYPE_STRING, quote ? str : val,
132 g_warning("SetNetwork: %s", error->message);
135 dialog = gtk_message_dialog_new(NULL,
139 _("Failed to set password, probably too short."));
140 gtk_window_set_title(GTK_WINDOW(dialog),
141 _("Error setting password"));
142 gtk_dialog_run(GTK_DIALOG(dialog));
143 gtk_widget_destroy(dialog);
148 if (!dbus_g_proxy_call(dbus, "EnableNetwork", &error,
149 G_TYPE_STRING, ifname,
154 g_warning("EnableNetwork: %s", error->message);
159 if (!dbus_g_proxy_call(dbus, "SaveConfig", &error,
160 G_TYPE_STRING, ifname,
164 g_warning("SaveConfig: %s", error->message);
167 dialog = gtk_message_dialog_new(NULL,
171 _("Failed to save wpa_supplicant configuration.\n\nYou should add update_config=1 to /etc/wpa_supplicant.conf.\nThis warning will not appear again until program restarted."));
172 gtk_window_set_title(GTK_WINDOW(dialog),
173 _("Error saving configuration"));
174 gtk_dialog_run(GTK_DIALOG(dialog));
175 gtk_widget_destroy(dialog);
180 if (!dbus_g_proxy_call(dbus, "Disconnect", &error,
181 G_TYPE_STRING, ifname,
185 g_warning("Disconnect: %s", error->message);
189 if (!dbus_g_proxy_call(dbus, "Reassociate", &error,
190 G_TYPE_STRING, ifname,
194 g_warning("Reassociate: %s", error->message);
202 onEnter(_unused GtkWidget *widget, gpointer *data)
204 gtk_dialog_response(GTK_DIALOG(data), GTK_RESPONSE_ACCEPT);
208 wpa_configure(const struct if_ap *ifa)
210 GtkWidget *dialog, *label, *psk, *vbox, *hbox;
211 const char *var, *mgt;
212 gint result, id, retval;
214 dialog = gtk_dialog_new_with_buttons(ifa->ssid,
217 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
218 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
220 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
221 gtk_window_set_icon_name(GTK_WINDOW(dialog), "config-users");
222 gtk_dialog_set_default_response(GTK_DIALOG(dialog),
223 GTK_RESPONSE_ACCEPT);
224 vbox = GTK_DIALOG(dialog)->vbox;
226 hbox = gtk_hbox_new(FALSE, 2);
227 label = gtk_label_new(_("Pre Shared Key:"));
228 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
229 psk = gtk_entry_new();
230 gtk_entry_set_max_length(GTK_ENTRY(psk), 130);
231 g_signal_connect(G_OBJECT(psk), "activate", G_CALLBACK(onEnter), dialog);
232 gtk_box_pack_start(GTK_BOX(hbox), psk, TRUE, TRUE, 0);
233 gtk_container_add(GTK_CONTAINER(vbox), hbox);
235 gtk_widget_show_all(dialog);
236 result = gtk_dialog_run(GTK_DIALOG(dialog));
240 if (result == GTK_RESPONSE_ACCEPT) {
241 id = find_network(ifa->ifname, ifa->ssid);
242 if (g_strcmp0(ifa->flags, "[WEP]") == 0) {
250 retval = configure_network(ifa->ifname, id, mgt, var,
251 gtk_entry_get_text(GTK_ENTRY(psk)), TRUE);
254 gtk_widget_destroy(dialog);
255 return retval == -1 ? FALSE : TRUE;