summaryrefslogtreecommitdiffstats
path: root/src/wifi/qwificontroller_p.h
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@theqtcompany.com>2014-11-06 18:06:49 +0100
committerGatis Paeglis <gatis.paeglis@theqtcompany.com>2014-12-02 12:39:18 +0200
commitfc2f6ac9d7e7ac8ab343c11786f7437610fa0a19 (patch)
tree1f11946d6641ccffd42e8b078ede641775debc53 /src/wifi/qwificontroller_p.h
parent5e83898cff3991d1c08f628d2687f7e2038f182b (diff)
[Wifi] graduate from Qt.labs.wifi 0.1 to B2Qt.Wifi 1.0
- Make wifi library available from c++ 1) included with "#include <B2QtWifi>", available classes are: QWifiDevice, QWifiManager, QWifiConfiguration - Re-design of API: 1) connectedSSID -> currentSSID get current network from this property instead of networks state change events 2) networkStateChanaged(QWifiNetwork *) -> networkStateChanged(NetworkState) Don't expose QWifiNetwork objects to library users, use data model roles instead, no need to pollute API with "read-only" class. The flaws of exposing QWifiNetwork become apparent when looking at C++ API. 3) New BackendState enum for backend state changes events, backendStateChanged(BackendState) Initializing backend can be lengthy operation and can block GUI thread, same is true for DHCP requests, now these operations are moved into a separate thread and backend state change events are delivered asynchronously. 4) Make WifiManager a Singleton, we don't want several instances starting and stopping system processes and it makes global state handling simpler. 5) Rename Interface -> WifiDevice 6!) Introducing QWifiConfiguration. This abstraction allows for easy way to add new features, whatever we choose to support from: http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf The idea for it is to be a Qt-style wrapper for "network {}" configurations from wpa_supplicant.conf. Also this makes life simpler for developers if they know what network they will be using, they can omit scanning, listing, selecting parts and do something like this instead: WifiConfiguration { id: config ssid: "network name" passphrase: "12345678" } if (!WifiManager.connect(config)) print("failed to connect: " + WifiManager.lastError) - Optimizations: 1) Async. event delivery. 2) eLinux: Don't use "ifup", it is slow because it starts dhcp request even before any network has been configured. Use start-stop-daemon and ifconfig directly. - Bug fixes (many), but most importantly: 1) Get backend state properly when WifiManager is created. - Public header cleanup - Other: 1) Added categorized logging. 2) Methods to get/set wifi interface name. Not exposed to qml. - Missing parts that will be added as a separate patch: * [doc] Getting started guide for c++ and qml * [doc] Update for qml docs and new docs for c++. The current docs are out-of-date. Task-number: QTEE-649 Task-number: QTEE-810 Change-Id: I7dc8709aed2de622828a119749aef31534a4296d Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/wifi/qwificontroller_p.h')
-rw-r--r--src/wifi/qwificontroller_p.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/wifi/qwificontroller_p.h b/src/wifi/qwificontroller_p.h
new file mode 100644
index 0000000..230b7c8
--- /dev/null
+++ b/src/wifi/qwificontroller_p.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use the contact form at
+** http://www.qt.io
+**
+** This file is part of Qt Enterprise Embedded.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** the contact form at http://www.qt.io
+**
+****************************************************************************/
+#ifndef QWIFICONTROLLER_H
+#define QWIFICONTROLLER_H
+
+#include "qwifimanager.h"
+
+#include <QtCore/QEvent>
+#include <QtCore/QVector>
+#include <QtCore/QThread>
+#include <QtCore/QMutex>
+#include <QtCore/QWaitCondition>
+#include <QtCore/QLoggingCategory>
+
+#ifdef Q_OS_ANDROID_NO_SDK
+#include <hardware_legacy/wifi.h>
+#include <cutils/properties.h>
+#else
+#include "qwifielinux_p.h"
+#endif
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(B2QT_WIFI)
+
+#ifdef Q_OS_ANDROID_NO_SDK
+int q_wifi_start_supplicant();
+int q_wifi_stop_supplicant();
+int q_wifi_connect_to_supplicant(const char *ifname);
+void q_wifi_close_supplicant_connection(const char *ifname);
+int q_wifi_wait_for_event(const char *ifname, char *buf, size_t len);
+int q_wifi_command(const char *ifname, const char *command, char *reply, size_t *reply_len);
+int wait_for_property(const char *name, const char *desired_value, int maxwait);
+#endif
+
+const QEvent::Type WIFI_SCAN_RESULTS = (QEvent::Type) (QEvent::User + 2001);
+const QEvent::Type WIFI_CONNECTED = (QEvent::Type) (QEvent::User + 2002);
+const QEvent::Type WIFI_HANDSHAKE_FAILED = (QEvent::Type) (QEvent::User + 2003);
+const QEvent::Type WIFI_AUTHENTICATING = (QEvent::Type) (QEvent::User + 2004);
+const QEvent::Type WIFI_DISCONNECTED = (QEvent::Type) (QEvent::User + 2005);
+
+class QWifiManager;
+class QWifiManagerPrivate;
+class QWifiEventThread;
+#ifdef Q_OS_ANDROID_NO_SDK
+class QLocalSocket;
+#endif
+
+class QWifiController : public QThread
+{
+ Q_OBJECT
+public:
+ enum Method {
+ InitializeBackend,
+ TerminateBackend,
+ AcquireIPAddress,
+ StopDhcp,
+ ExitEventLoop
+ };
+
+ explicit QWifiController(QWifiManager *manager, QWifiManagerPrivate *managerPrivate);
+ ~QWifiController();
+
+ void call(Method method);
+ QWifiManager *wifiManager() const { return m_manager; }
+ bool isWifiThreadExitRequested() const { return m_exitEventThread; }
+ void startWifiEventThread();
+ void acquireIPAddress();
+ void stopDhcp() const;
+ void resetSupplicantSocket() const;
+
+signals:
+ void backendStateChanged(QWifiManager::BackendState backendState);
+ void dhcpRequestFinished(const QString &status);
+
+protected:
+ void run();
+ void initializeBackend();
+ void terminateBackend();
+ void exitWifiEventThread();
+ void allocateOnThisThread();
+#ifdef Q_OS_ANDROID_NO_SDK
+ bool getQConnectivityReply();
+#else
+ void killDhcpProcess(const QString &path) const;
+#endif
+
+private:
+ QWifiManager *m_manager;
+ QWifiManagerPrivate *const m_managerPrivate;
+ bool m_exitEventThread;
+ QByteArray m_interface;
+#ifdef Q_OS_ANDROID_NO_SDK
+ QLocalSocket *m_qcSocket;
+#endif
+ QVector<Method> m_methods;
+ QWifiEventThread *m_eventThread;
+ QMutex m_methodsMutex;
+ QWaitCondition methodCallRequested;
+};
+
+QT_END_NAMESPACE
+
+#endif // QWIFICONTROLLER_H