2 * wpa_gui - AddInterface class
3 * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
10 #include "common/wpa_ctrl.h"
12 #include <QMessageBox>
15 #include "addinterface.h"
17 #ifdef CONFIG_NATIVE_WINDOWS
21 #define WPA_KEY_ROOT HKEY_LOCAL_MACHINE
23 #ifndef WPA_KEY_PREFIX
24 #define WPA_KEY_PREFIX TEXT("SOFTWARE\\wpa_supplicant")
26 #endif /* CONFIG_NATIVE_WINDOWS */
29 AddInterface::AddInterface(WpaGui *_wpagui, QWidget *parent)
30 : QDialog(parent), wpagui(_wpagui)
32 setWindowTitle(tr("Select network interface to add"));
34 vboxLayout = new QVBoxLayout(this);
36 interfaceWidget = new QTreeWidget(this);
37 interfaceWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
38 interfaceWidget->setUniformRowHeights(true);
39 interfaceWidget->setSortingEnabled(true);
40 interfaceWidget->setColumnCount(3);
41 interfaceWidget->headerItem()->setText(0, tr("driver"));
42 interfaceWidget->headerItem()->setText(1, tr("interface"));
43 interfaceWidget->headerItem()->setText(2, tr("description"));
44 interfaceWidget->setItemsExpandable(false);
45 interfaceWidget->setRootIsDecorated(false);
46 vboxLayout->addWidget(interfaceWidget);
48 connect(interfaceWidget,
49 SIGNAL(itemActivated(QTreeWidgetItem *, int)), this,
50 SLOT(interfaceSelected(QTreeWidgetItem *)));
56 void AddInterface::addInterfaces()
58 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
59 struct wpa_ctrl *ctrl;
64 ctrl = wpa_ctrl_open(NULL);
68 len = sizeof(buf) - 1;
69 ret = wpa_ctrl_request(ctrl, "INTERFACE_LIST", 14, buf, &len, NULL);
79 QStringList lines = ifaces.split(QRegExp("\\n"));
80 for (QStringList::Iterator it = lines.begin();
81 it != lines.end(); it++) {
82 QStringList arg = (*it).split(QChar('\t'));
85 QTreeWidgetItem *item = new QTreeWidgetItem(interfaceWidget);
89 item->setText(0, arg[0]);
90 item->setText(1, arg[1]);
91 item->setText(2, arg[2]);
94 interfaceWidget->resizeColumnToContents(0);
95 interfaceWidget->resizeColumnToContents(1);
96 interfaceWidget->resizeColumnToContents(2);
97 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
101 #ifdef CONFIG_NATIVE_WINDOWS
102 bool AddInterface::addRegistryInterface(const QString &ifname)
110 ret = RegOpenKeyEx(WPA_KEY_ROOT, WPA_KEY_PREFIX TEXT("\\interfaces"),
111 0, KEY_ENUMERATE_SUB_KEYS | KEY_CREATE_SUB_KEY,
113 if (ret != ERROR_SUCCESS)
123 ret = RegEnumKeyEx(hk, i, name, &namelen, NULL, NULL, NULL,
126 if (ret == ERROR_NO_MORE_ITEMS)
129 if (ret != ERROR_SUCCESS)
134 name[namelen] = '\0';
137 QString s((QChar *) name, namelen);
149 wsprintf(name, L"%04d", id);
151 os_snprintf(name, sizeof(name), "%04d", id);
153 ret = RegCreateKeyEx(hk, name, 0, NULL, 0, KEY_WRITE, NULL, &ihk,
156 if (ret != ERROR_SUCCESS)
160 RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
161 (LPBYTE) ifname.unicode(),
162 (ifname.length() + 1) * sizeof(TCHAR));
165 RegSetValueEx(ihk, TEXT("adapter"), 0, REG_SZ,
166 (LPBYTE) ifname.toLocal8Bit(), ifname.length() + 1);
168 RegSetValueEx(ihk, TEXT("config"), 0, REG_SZ,
169 (LPBYTE) TEXT("default"), 8 * sizeof(TCHAR));
170 RegSetValueEx(ihk, TEXT("ctrl_interface"), 0, REG_SZ,
171 (LPBYTE) TEXT(""), 1 * sizeof(TCHAR));
173 RegSetValueEx(ihk, TEXT("skip_on_error"), 0, REG_DWORD, (LPBYTE) &val,
179 #endif /* CONFIG_NATIVE_WINDOWS */
182 void AddInterface::interfaceSelected(QTreeWidgetItem *sel)
187 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
188 struct wpa_ctrl *ctrl;
190 char buf[20], cmd[256];
194 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
195 * <driver_param>TAB<bridge_name>
197 snprintf(cmd, sizeof(cmd),
198 "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
199 sel->text(1).toLocal8Bit().constData(),
201 sel->text(0).toLocal8Bit().constData(),
203 cmd[sizeof(cmd) - 1] = '\0';
205 ctrl = wpa_ctrl_open(NULL);
209 len = sizeof(buf) - 1;
210 ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, NULL);
211 wpa_ctrl_close(ctrl);
214 QMessageBox::warning(this, "wpa_gui",
215 tr("Add interface command could not be "
221 if (buf[0] != 'O' || buf[1] != 'K') {
222 QMessageBox::warning(this, "wpa_gui",
223 tr("Failed to add the interface."));
227 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
229 #ifdef CONFIG_NATIVE_WINDOWS
230 if (!addRegistryInterface(sel->text(1))) {
231 QMessageBox::information(this, "wpa_gui",
232 tr("Failed to add the interface into "
235 #endif /* CONFIG_NATIVE_WINDOWS */
237 wpagui->selectAdapter(sel->text(1));