[qnut] fixed main window show/hide on tray icon click event
[nut.git] / libnutwireless / base.h
blobb0243d81f3daa1601365f0822f24c409c5ee03b6
1 #ifndef LIBNUTWIRELESS_BASE
2 #define LIBNUTWIRELESS_BASE
3 #include <QHostAddress>
4 #include <QFile>
5 #include <QSocketNotifier>
6 #include <QTimerEvent>
7 #include <QCoreApplication>
8 #include "libnutcommon/common.h"
10 #include "parsers.h"
11 #include <iwlib.h>
12 extern "C" {
13 #include <linux/wireless.h>
14 #include "wpa_ctrl/wpa_ctrl.h"
15 #include <sys/time.h>
16 #include <string.h>
17 #include <stdlib.h>
20 #define CWPA_SCAN_TIMER_TIME 1000
21 #define CWPA_SCAN_RETRY_TIMER_TIME 1000
23 namespace libnutwireless {
25 /** @brief The base class contains all timer/lowlevel io dependant functions
27 This class provides all functions that need timers, socket notifiers etc.
28 It is not used directly.
30 class CWpaSupplicantBase: public QObject, public CWpaSupplicantParsers {
31 Q_OBJECT
32 protected:
33 struct wpa_ctrl *cmd_ctrl, *event_ctrl;
34 QString m_wpaSupplicantPath;
35 int m_wpaFd, m_wextFd;
36 QSocketNotifier *m_eventSn;
37 bool m_logEnabled;
38 bool m_wpaConnected;
39 int m_connectTimerId; ///Timer id for connection timer
40 int m_wextTimerId;
41 int m_scanTimerId;
42 int m_wextTimerRate;
43 int m_timerCount;
44 bool m_inConnectionPhase;
45 QString m_ifname;
46 QList<ScanResult> m_wpaScanResults;
47 WextSignal m_signalQuality;
48 int m_scanTimeoutCount;
49 int m_wextPollTimeoutCount;
50 QList<quint32> m_supportedFrequencies;
52 //Workaround as Constructor of subclass is not beeing called
53 int m_apScanDefault;
54 bool m_lastWasAdHoc;
57 QString wpaCtrlCommand(QString cmd);
58 //Abstracted Commands:
59 inline QString wpaCtrlCmd_PING() { return wpaCtrlCommand("PING"); }
60 inline QString wpaCtrlCmd_MIB() { return wpaCtrlCommand("MIB"); }
61 inline QString wpaCtrlCmd_STATUS(bool verbose=false) { return (verbose) ? wpaCtrlCommand("STATUS-VERBOSE") : wpaCtrlCommand("STATUS"); }
62 inline QString wpaCtrlCmd_PMKSA() { return wpaCtrlCommand("PMKSA"); }
63 inline void wpaCtrlCmd_SET(QString var, QString val) { wpaCtrlCommand(QString("SET %1 %2").arg(var,val)); }
64 inline void wpaCtrlCmd_LOGON() { wpaCtrlCommand("LOGON"); }
65 inline void wpaCtrlCmd_LOGOFF() { wpaCtrlCommand("LOGOFF"); }
66 inline void wpaCtrlCmd_REASSOCIATE() { wpaCtrlCommand("REASSOCIATE"); }
67 //Start pre-authentication with the given BSSID.
68 inline void wpaCtrlCmd_PREAUTH(QString bssid) { wpaCtrlCommand(QString("PREAUTH %1").arg(bssid)); }
69 inline void wpaCtrlCmd_LEVEL(int level) { wpaCtrlCommand(QString("LEVEL %1").arg(QString::number(level))); }
70 inline void wpaCtrlCmd_RECONFIGURE() { wpaCtrlCommand("RECONFIGURE"); };
71 inline void wpaCtrlCmd_TERMINATE() { wpaCtrlCommand("TERMINATE"); }
72 //Set preferred BSSID for a network. Network id can be received from the LIST_NETWORKS command output.
73 inline QString wpaCtrlCmd_BSSID(int id, QString bssid) { return wpaCtrlCommand(QString("BSSID %1 %2").arg(QString::number(id),bssid));}
74 inline QString wpaCtrlCmd_LIST_NETWORKS() { return wpaCtrlCommand("LIST_NETWORKS"); }
75 inline void wpaCtrlCmd_DISCONNECT() { wpaCtrlCommand("DISCONNECT"); }
76 inline QString wpaCtrlCmd_SCAN() { return wpaCtrlCommand("SCAN"); }
77 inline QString wpaCtrlCmd_SCAN_RESULTS() { return wpaCtrlCommand("SCAN_RESULTS"); }
78 inline QString wpaCtrlCmd_SELECT_NETWORK(int id) { return wpaCtrlCommand(QString("SELECT_NETWORK %1").arg(QString::number(id))); }
79 inline QString wpaCtrlCmd_ENABLE_NETWORK(int id) { return wpaCtrlCommand(QString("ENABLE_NETWORK %1").arg(QString::number(id))); }
80 inline QString wpaCtrlCmd_DISABLE_NETWORK(int id) { return wpaCtrlCommand(QString("DISABLE_NETWORK %1").arg(QString::number(id))); }
81 //creates new empty network, return id on success and FAIL on failure
82 inline QString wpaCtrlCmd_ADD_NETWORK() { return wpaCtrlCommand("ADD_NETWORK"); }
83 inline void wpaCtrlCmd_REMOVE_NETWORK(int id) { wpaCtrlCommand(QString("REMOVE_NETWORK %1").arg(QString::number(id))); }
84 inline QString wpaCtrlCmd_SET_NETWORK(int id, QString var, QString val) { return wpaCtrlCommand(QString("SET_NETWORK %1 %2 %3").arg(QString::number(id),var,val));}
85 //get network variable
86 inline QString wpaCtrlCmd_GET_NETWORK(int id, QString var) { return wpaCtrlCommand(QString("GET_NETWORK %1 %2").arg(QString::number(id), var)); }
87 inline QString wpaCtrlCmd_SAVE_CONFIG() { return wpaCtrlCommand("SAVE_CONFIG"); }
88 inline void wpaCtrlCmd_CTRL_RSP(QString field_name, int id, QString val) { wpaCtrlCommand(QString("CTRL-RSP-%1-%2-%3").arg(field_name,QString::number(id), val)); }
89 inline QString wpaCtrlCmd_GET_CAPABILITY(QString option, bool strict) { return (strict) ? wpaCtrlCommand(QString("GET_CAPABILITY %1 strict").arg(option)) : wpaCtrlCommand(QString("GET_CAPABILITY %1").arg(option));}
90 //Change ap_scan value: 0 = no scanning,
91 //1 = wpa_supplicant requests scans and uses scan results to select the AP
92 //2 = wpa_supplicant does not use scanning and just requests driver to associate and take care of AP selection
93 inline QString wpaCtrlCmd_AP_SCAN(int val) { return wpaCtrlCommand(QString("AP_SCAN %1").arg(QString::number(val))); }
94 inline QString wpaCtrlCmd_INTERFACES() { return wpaCtrlCommand("INTERFACES"); }
96 //Event helper functions:
97 void eventDispatcher(Request req);
98 void eventDispatcher(EventType event, QString str);
99 /** This function is called by readFromWpa
100 when new information is available from wpa_supplicant
102 void eventDispatcher(QString event);
104 //Functions to get actual signal strength and/or signal strength for scan results:
105 //And set scanresults
106 void setScanResults(QList<WextRawScan> wextScanResults);
107 void tryScanResults();
109 //Need to do it that way, as inline fails otherwise
110 inline void printMessage(QString msg) { if (m_logEnabled) emit(message(msg));}
112 /** Open connection to wpa_supplicant */
113 void openWpa(bool time_call);
114 /** close the connection to the wpa_supplicant */
115 bool closeWpa(QString call_func, bool internal=true);
116 /**Dynamically adjust the time between two timer events for polling the wpa_supplicant interface on connection try*/
117 int dynamicTimerTime(int m_timerCount);
119 protected slots:
120 void readFromWpa(int socket);
121 void detachWpa();
122 protected:
123 /**Function to dispatch the timer events */
124 void timerEvent(QTimerEvent *event);
126 //Set ap_scan
127 virtual void setApScanDefault()=0;
129 public:
130 CWpaSupplicantBase(QObject * parent, QString m_ifname);
131 ~CWpaSupplicantBase();
132 /** open connection to wpa_supplicant */
133 inline void open() { openWpa(false); }
134 /** close connection to wpa_supplicant */
135 inline bool close() {return closeWpa("libnutclient",false); }
136 bool connected();
137 /** This function reads the signal quality from wireless extension.
138 On success signalQualityUpdated(libnutwireless::WextSignal signal) will be emitted.
140 void readWirelessInfo();
142 public slots:
143 void setLog(bool enabled);
145 /** Initiate a scan; See scanCompleted() */
146 void scan();
148 void setSignalQualityPollRate(int msec);
149 int getSignalQualityPollRate();
150 WextSignal getSignalQuality();
152 QList<ScanResult> scanResults();
154 signals:
155 /** Signal which is emitted if wpa_supplicant connects or disconnects
156 from a network
157 @param state connection state of network
158 @param id network id
160 void connectionStateChanged(bool state, int id);
161 /** Signal which is emitted if wpa_supplicant requests a action.
162 Respond with CWpaSupplicant::response();
164 void request(libnutwireless::Request req);
165 /** This signal is emitted if the connection to wpa_supplicant is
166 established: state=true or
167 closed: state=false
169 void stateChanged(bool state);
170 /** This signal is emitted whenever a scan is ready.
171 So far this happens twice:
172 First the scanresults from wpa_supplicant are set imediately.
173 Then we're trying to retrieve further information via wirelessExtension.
175 void scanCompleted();
176 /** Emits messages from wpa_supplicant like rekying */
177 void message(QString msg);
178 void eventMessage(libnutwireless::EventType type);
179 void signalQualityUpdated(libnutwireless::WextSignal signal);
180 /** This signal is emitted whenever the network list from listNetworks() has changed. */
181 void networkListUpdated();
185 #endif