summaryrefslogtreecommitdiffstats
path: root/src/imports/wifi/qwifimanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/wifi/qwifimanager.cpp')
-rw-r--r--src/imports/wifi/qwifimanager.cpp818
1 files changed, 0 insertions, 818 deletions
diff --git a/src/imports/wifi/qwifimanager.cpp b/src/imports/wifi/qwifimanager.cpp
deleted file mode 100644
index 2574cd2..0000000
--- a/src/imports/wifi/qwifimanager.cpp
+++ /dev/null
@@ -1,818 +0,0 @@
-/****************************************************************************
-**
-** 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
-**
-****************************************************************************/
-#include "qwifimanager.h"
-#include "qwifiinterface.h"
-
-#include <QtCore>
-#ifdef Q_OS_ANDROID
-#include <hardware_legacy/wifi.h>
-#include <cutils/sockets.h>
-#include <unistd.h>
-#else
-#include <qwifi_elinux.h>
-#endif
-
-static const char SUPPLICANT_SVC[] = "init.svc.wpa_supplicant";
-static const char WIFI_INTERFACE[] = "wifi.interface";
-static const char QT_WIFI_BACKEND[] = "qt.wifi";
-
-static bool QT_WIFI_DEBUG = !qgetenv("QT_WIFI_DEBUG").isEmpty();
-
-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);
-
-#ifdef Q_OS_ANDROID
-/*
- * Work around API differences between Android versions
- */
-
-static int q_wifi_start_supplicant()
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && Q_ANDROID_VERSION_MINOR < 1
- return wifi_start_supplicant();
-#else
- return wifi_start_supplicant(0);
-#endif
-}
-
-static int q_wifi_stop_supplicant()
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && Q_ANDROID_VERSION_MINOR < 1
- return wifi_stop_supplicant();
-#else
- return wifi_stop_supplicant(0);
-#endif
-}
-
-static int q_wifi_connect_to_supplicant(const char *ifname)
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && (Q_ANDROID_VERSION_MINOR < 4 && Q_ANDROID_VERSION_MINOR >= 1)
- return wifi_connect_to_supplicant(ifname);
-#else
- Q_UNUSED(ifname);
- return wifi_connect_to_supplicant();
-#endif
-}
-
-static void q_wifi_close_supplicant_connection(const char *ifname)
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && (Q_ANDROID_VERSION_MINOR < 4 && Q_ANDROID_VERSION_MINOR >= 1)
- wifi_close_supplicant_connection(ifname);
-#else
- Q_UNUSED(ifname);
- wifi_close_supplicant_connection();
-#endif
-}
-
-static int q_wifi_wait_for_event(const char *ifname, char *buf, size_t len)
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && (Q_ANDROID_VERSION_MINOR < 4 && Q_ANDROID_VERSION_MINOR >= 1)
- return wifi_wait_for_event(ifname, buf, len);
-#else
- Q_UNUSED(ifname);
- return wifi_wait_for_event(buf, len);
-#endif
-}
-
-static int q_wifi_command(const char *ifname, const char *command, char *reply, size_t *reply_len)
-{
-#if Q_ANDROID_VERSION_MAJOR == 4 && (Q_ANDROID_VERSION_MINOR < 4 && Q_ANDROID_VERSION_MINOR >= 1)
- return wifi_command(ifname, command, reply, reply_len);
-#else
- Q_UNUSED(ifname);
- return wifi_command(command, reply, reply_len);
-#endif
-}
-
-/*
- * This function is borrowed from /system/core/libnetutils/dhcp_utils.c
- *
- * Wait for a system property to be assigned a specified value.
- * If desired_value is NULL, then just wait for the property to
- * be created with any value. maxwait is the maximum amount of
- * time in seconds to wait before giving up.
- */
-static const int NAP_TIME = 200; // wait for 200ms at a time when polling for property values
-static int wait_for_property(const char *name, const char *desired_value, int maxwait)
-{
- char value[PROPERTY_VALUE_MAX] = {'\0'};
- int maxnaps = (maxwait * 1000) / NAP_TIME;
-
- if (maxnaps < 1) {
- maxnaps = 1;
- }
-
- while (maxnaps-- > 0) {
- usleep(NAP_TIME * 1000);
- if (property_get(name, value, NULL)) {
- if (desired_value == NULL ||
- strcmp(value, desired_value) == 0) {
- return 0;
- }
- }
- }
- return -1; /* failure */
-}
-#endif
-
-class QWifiManagerEvent : public QEvent
-{
-public:
- QWifiManagerEvent(QEvent::Type type, const QByteArray &data = QByteArray())
- : QEvent(type)
- , m_data(data)
- {
- }
-
- QByteArray data() const { return m_data; }
-
-private:
- QByteArray m_data;
-};
-
-class QWifiManagerEventThread : public QThread
-{
-public:
- QWifiManagerEventThread(QWifiManager *manager, const QByteArray &interface)
- : m_manager(manager)
- , m_if(interface)
- {
-
- }
-
- void run() {
- if (QT_WIFI_DEBUG) qDebug("WiFi event thread is running");
- QWifiManagerEvent *event = 0;
- char buffer[2048];
- while (1) {
- int size = q_wifi_wait_for_event(m_if.constData(), buffer, sizeof(buffer) - 1);
- if (size > 0) {
- buffer[size] = 0;
- event = 0;
- if (strstr(buffer, "SCAN-RESULTS")) {
- if (m_manager->exitingEventThread()) {
- if (QT_WIFI_DEBUG) qDebug() << "Exiting WiFi event thread";
- return;
- }
- event = new QWifiManagerEvent(WIFI_SCAN_RESULTS);
- } else if (strstr(buffer, "CONNECTED")) {
- event = new QWifiManagerEvent(WIFI_CONNECTED);
- } else if (strstr(buffer, "Handshake failed")) {
- event = new QWifiManagerEvent(WIFI_HANDSHAKE_FAILED);
- } else if (strstr(buffer, "TERMINATING")) {
- // stop monitoring for events when supplicant is terminating
- return;
- }
- if (event)
- QCoreApplication::postEvent(m_manager, event);
- }
- }
- }
-
- QWifiManager *m_manager;
- QByteArray m_if;
-};
-
-/*!
- \qmlmodule Qt.labs.wifi 0.1
- \title WiFi Module
- \ingroup qtee-qmlmodules
- \brief Controlling wireless network interfaces.
-
- Provides QML types for controlling and accessing information about wireless network interfaces.
-
- The import command for adding these QML types is:
-
- \code
- import Qt.labs.wifi 0.1
- \endcode
-
- If the module is imported into a namespace, some additional methods become available through the
- \l Interface element.
-
- \code
- import Qt.labs.wifi 0.1 as Wifi
- \endcode
-
- \section1 QML Types
-*/
-
-/*!
-
- \qmltype WifiManager
- \inqmlmodule Qt.labs.wifi
- \ingroup wifi-qmltypes
- \brief Provides information about the WiFi backend and available networks.
-
- This element is the main interface to the WiFi functionality.
-
- */
-
-/*!
- \qmlproperty enumeration WifiManager::networkState
-
- This property holds the current state of the network connection.
-
- \list
- \li \e WifiManager.Disconnected - Not connected to any network
- \li \e WifiManager.Authenticating - Verifying password with the network provider
- \li \e WifiManager.HandshakeFailed - Incorrect password provided
- \li \e WifiManager.ObtainingIPAddress - Requesting IP address from DHCP server
- \li \e WifiManager.DhcpRequestFailed - Could not retrieve IP address
- \li \e WifiManager.Connected - Ready to process network requests
- \endlist
-*/
-
-/*!
- \qmlproperty bool WifiManager::backendReady
-
- This property holds whether or not the backend has been successfully initialized.
-
- \code
- WifiManager {
- id: wifiManager
- scanning: backendReady
- }
-
- Button {
- id: wifiOnOffButton
- text: (wifiManager.backendReady) ? "Switch Off" : "Switch On"
- onClicked: {
- if (wifiManager.backendReady) {
- wifiManager.stop()
- } else {
- wifiManager.start()
- }
- }
- }
- \endcode
-*/
-
-/*!
- \qmlproperty bool WifiManager::scanning
-
- This property holds whether or not the backend is scanning for WiFi networks. To
- preserve battery energy, stop scanning for networks once you are done with configuring a network.
-
- Before starting to scan for networks, you need to initialize the WiFi backend.
-
- \sa start
-*/
-
-/*!
- \qmlproperty string WifiManager::connectedSSID
-
- This property holds the network name.
-*/
-
-/*!
- \qmlproperty WifiNetworkListModel WifiManager::networks
-
- This property holds a list of networks that can be sensed by a device. Use the returned
- model as data model in ListView, model is updated every 5 seconds.
-
- WifiNetworkListModel is a simple data model consisting of WifiNetwork objects, accessed with
- the "network" data role. Instances of WifiNetwork cannot be created directly from the QML system.
-
- \code
- WifiManager {
- id: wifiManager
- scanning: backendReady
- Component.onCompleted: start()
- }
-
- Component {
- id: listDelegate
- Rectangle {
- id: delegateBackground
- height: 60
- width: parent.width
- color: "#5C5C5C"
- border.color: "black"
- border.width: 1
-
- Text {
- id: ssidLabel
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.margins: 10
- font.pixelSize: 20
- font.bold: true
- color: "#E6E6E6"
- text: network.ssid
- }
-
- Rectangle {
- width: Math.max(100 + network.signalStrength, 0) / 100 * parent.width;
- height: 20
- radius: 10
- antialiasing: true
- anchors.margins: 20
- anchors.right: parent.right
- anchors.top: parent.top
- color: "#BF8888"
- border.color: "#212126"
- }
- }
- }
-
-
- ListView {
- id: networkView
- anchors.fill: parent
- model: wifiManager.networks
- delegate: listDelegate
- }
- \endcode
-
-*/
-
-/*!
- \qmlmethod void WifiManager::start()
-
- Start an initialization of the WiFi backend.
-
- \sa stop
- */
-
-/*!
- \qmlmethod void WifiManager::stop()
-
- Stop the WiFi backend and shut down all network functionality.
-
- \sa start
- */
-
-/*!
- \qmlmethod void WifiManager::connect(WifiNetwork network, const string passphrase)
-
- Connect to network \a network and use passphrase \a passphrase for authentication.
-
- \sa disconnect, networkState
- */
-
-/*!
- \qmlmethod void WifiManager::disconnect()
-
- Disconnect from currently connected network connection.
-
- \sa connect, networkState
- */
-
-/*!
- \qmlsignal void WifiManager::scanningChanged(bool scanning)
-
- This signal is emitted when device starts or stops to scan for available wifi networks.
-
- \sa scanning
-
-*/
-
-/*!
- \qmlsignal void WifiManager::networkStateChanged(WifiNetwork network)
-
- This signal is emitted whenever changes in a network state occur. Network \a network is the
- the currently active network connection.
-
- \sa networkState
-*/
-
-/*!
- \qmlsignal void WifiManager::backendReadyChanged()
-
- This signal is emitted when backend has been successfully initialized or shut down.
-
- \sa start, stop
-*/
-
-/*!
- \qmlsignal void WifiManager::connectedSSIDChanged(string ssid)
-
- This signal is emitted when the device has connected to or disconnected from a network.
- \a ssid contains the name of the connected network, or an empty string if the network was disconnected.
-
- \sa connect, disconnect
-*/
-
-QWifiManager::QWifiManager()
- : m_networkListModel(this)
- , m_eventThread(0)
- , m_scanTimer(0)
- , m_scanning(false)
-#ifdef Q_OS_ANDROID
- , m_daemonClientSocket(0)
-#endif
- , m_exitingEventThread(false)
- , m_startingUp(true)
- , m_network(0)
-{
- if (!QWifiInterface().wifiSupported())
- // give a warning about API misuse
- qWarning() << "WifiManager may not work as expected on this device. Use the API provided by QtWifi "
- "library to verify if device has support for Wi-Fi before creating an instance of WifiManager!";
-#ifdef Q_OS_ANDROID
- char interface[PROPERTY_VALUE_MAX];
- property_get(WIFI_INTERFACE, interface, NULL);
- m_interface = interface;
-#else
- m_interface = "wlan0"; // use envvar for the interface name?
- m_dhcpRunner = new ProcessRunner(m_interface);
- QObject::connect(m_dhcpRunner, &ProcessRunner::processFinished, this, &QWifiManager::handleDhcpFinished);
-#endif
- qDebug("QWifiManager: using wifi interface: %s", m_interface.constData());
- m_eventThread = new QWifiManagerEventThread(this, m_interface);
-#ifdef Q_OS_ANDROID
- m_daemonClientSocket = new QLocalSocket;
- int qconnFd = socket_local_client("qconnectivity", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM);
- if (qconnFd != -1) {
- m_daemonClientSocket->setSocketDescriptor(qconnFd);
- QObject::connect(m_daemonClientSocket, SIGNAL(readyRead()), this, SLOT(handleDhcpReply()));
- QObject::connect(m_daemonClientSocket, SIGNAL(connected()), this, SLOT(connectedToDaemon()));
- } else {
- qWarning() << "QWifiManager: failed to connect to qconnectivity socket";
- }
- // check if backend has already been initialized
- char backendStatus[PROPERTY_VALUE_MAX];
- if (property_get(QT_WIFI_BACKEND, backendStatus, NULL)) {
- if (strcmp(backendStatus, "running") == 0) {
- // let it re-connect, in most cases this will see that everything is working properly
- // and will do nothing. Special case is when process has crashed or was killed by a system
- // signal in previous execution, which results in broken connection to a supplicant,
- // connectToBackend will fix it..
- connectToBackend();
- } else if (strcmp(backendStatus, "stopped") == 0) {
- // same here, cleans up the state
- disconnectFromBackend();
- }
- } else {
-#endif
- m_backendReady = false;
- emit backendReadyChanged();
-#ifdef Q_OS_ANDROID
- }
-#endif
-}
-
-QWifiManager::~QWifiManager()
-{
- exitEventThread();
- delete m_eventThread;
-#ifdef Q_OS_ANDROID
- delete m_daemonClientSocket;
-#endif
-}
-
-#ifdef Q_OS_ANDROID
-void QWifiManager::handleDhcpReply()
-{
- if (m_daemonClientSocket->canReadLine()) {
- QByteArray receivedMessage;
- receivedMessage = m_daemonClientSocket->readLine(m_daemonClientSocket->bytesAvailable());
- if (QT_WIFI_DEBUG) qDebug() << "QWifiManager: reply from qconnectivity: " << receivedMessage;
- if (receivedMessage == "success") {
- updateNetworkState(Connected);
- emit connectedSSIDChanged(m_connectedSSID);
- // Store settings of a working wifi connection
- call("SAVE_CONFIG");
- } else if (receivedMessage == "failed") {
- updateNetworkState(DhcpRequestFailed);
- } else {
- qWarning() << "QWifiManager: unknown message: " << receivedMessage;
- }
- }
-}
-
-void QWifiManager::sendDhcpRequest(const QByteArray &request)
-{
- if (QT_WIFI_DEBUG) qDebug() << "QWifiManager: sending request - " << request;
- m_request = request;
- m_request.append("\n");
- m_daemonClientSocket->abort();
- // path where android stores "reserved" sockets
- m_daemonClientSocket->connectToServer(ANDROID_SOCKET_DIR "/qconnectivity");
-}
-
-void QWifiManager::connectedToDaemon()
-{
- m_daemonClientSocket->write(m_request.constData(), m_request.length());
- m_daemonClientSocket->flush();
-}
-#endif
-
-void QWifiManager::handleDhcpFinished()
-{
- // ### TODO - could be that dhcp request fails, how to determine?
- updateNetworkState(Connected);
- call("SAVE_CONFIG");
-}
-
-void QWifiManager::start()
-{
- if (QT_WIFI_DEBUG) qDebug("QWifiManager: connecting to the backend");
- if (m_backendReady)
- return;
- connectToBackend();
-}
-
-void QWifiManager::stop()
-{
- if (QT_WIFI_DEBUG) qDebug("QWifiManager: shutting down");
- if (!m_backendReady)
- return;
- disconnectFromBackend();
-}
-
-void QWifiManager::connectToBackend()
-{
- // ### TODO: maybe it makes sense to move this functions in non-gui thread
-#ifdef Q_OS_ANDROID
- if (!(is_wifi_driver_loaded() || wifi_load_driver() == 0)) {
- qWarning("QWifiManager: failed to load a driver");
- return;
- }
-#else
- QProcess::execute(QStringLiteral("ifup"), QStringList() << m_interface.constData());
-#endif
- if (q_wifi_start_supplicant() != 0) {
- qWarning("QWifiManager: failed to start a supplicant");
- return;
- }
-#ifdef Q_OS_ANDROID
- if (wait_for_property(SUPPLICANT_SVC, "running", 5) < 0) {
- qWarning("QWifiManager: Timed out waiting for supplicant to start");
- return;
- }
-#endif
- if (q_wifi_connect_to_supplicant(m_interface.constData()) == 0) {
- m_backendReady = true;
- emit backendReadyChanged();
-#ifdef Q_OS_ANDROID
- property_set(QT_WIFI_BACKEND, "running");
-#endif
- } else {
- qWarning("QWifiManager: failed to connect to a supplicant");
- return;
- }
- if (QT_WIFI_DEBUG) qDebug("QWifiManager: started successfully");
- m_exitingEventThread = false;
- m_eventThread->start();
- call("SCAN");
-}
-
-void QWifiManager::disconnectFromBackend()
-{
- exitEventThread();
- if (q_wifi_stop_supplicant() < 0)
- qWarning("QWifiManager: failed to stop supplicant");
- q_wifi_close_supplicant_connection(m_interface.constData());
- setScanning(false);
-#ifdef Q_OS_ANDROID
- property_set(QT_WIFI_BACKEND, "stopped");
-#else
- QProcess::execute(QStringLiteral("ifdown"), QStringList() << m_interface.constData());
-#endif
- m_backendReady = false;
- emit backendReadyChanged();
-}
-
-void QWifiManager::exitEventThread()
-{
- if (m_eventThread->isRunning()) {
- m_exitingEventThread = true;
- call("SCAN");
- m_eventThread->wait();
- }
-}
-
-void QWifiManager::setScanning(bool scanning)
-{
- if (!m_backendReady || m_scanning == scanning)
- return;
-
- m_scanning = scanning;
- emit scanningChanged(m_scanning);
-
- if (m_scanning) {
- if (QT_WIFI_DEBUG) qDebug("QWifiManager: scanning");
- call("SCAN");
- m_scanTimer = startTimer(5000); // ### todo - this could be a qml property
- } else {
- if (QT_WIFI_DEBUG) qDebug("QWifiManager: stop scanning");
- killTimer(m_scanTimer);
- }
-}
-
-QByteArray QWifiManager::call(const char *command) const
-{
- char data[2048];
- size_t len = sizeof(data) - 1; // -1: room to add a 0-terminator
- QByteArray cmd;
-#ifdef Q_OS_ANDROID
-#if !(Q_ANDROID_VERSION_MAJOR == 4 && Q_ANDROID_VERSION_MINOR < 4)
- cmd.append("IFNAME=").append(m_interface).append(" ");
-#endif
-#endif
- cmd.append(command);
- if (q_wifi_command(m_interface.constData(), cmd.constData(), data, &len) < 0) {
- qWarning("QWifiManager: call failed: %s", cmd.constData());
- return QByteArray();
- }
- if (len < sizeof(data))
- data[len] = 0;
- QByteArray result = QByteArray::fromRawData(data, len);
- if (QT_WIFI_DEBUG) qDebug("QWifiManager::call: %s ==>\n%s", cmd.constData(), result.constData());
- return result;
-}
-
-bool QWifiManager::checkedCall(const char *command) const
-{
- return call(command).trimmed().toUpper() == "OK";
-}
-
-void QWifiManager::updateNetworkState(NetworkState state)
-{
- m_state = state;
- if (m_network)
- emit networkStateChanged(m_network);
-}
-
-bool QWifiManager::event(QEvent *e)
-{
- switch ((int) e->type()) {
- case WIFI_SCAN_RESULTS:
- m_networkListModel.parseScanResults(call("SCAN_RESULTS"));
- if (m_startingUp)
- handleConnected();
- return true;
- case WIFI_CONNECTED:
- handleConnected();
- break;
- case WIFI_HANDSHAKE_FAILED:
- updateNetworkState(HandshakeFailed);
- break;
- case QEvent::Timer: {
- int tid = static_cast<QTimerEvent *>(e)->timerId();
- if (tid == m_scanTimer) {
- call("SCAN");
- return true;
- }
- break;
- }
- }
-
- return QObject::event(e);
-}
-
-void QWifiManager::connect(QWifiNetwork *network, const QString &passphrase)
-{
- m_network = network;
- if (network->ssid() == m_connectedSSID) {
- if (QT_WIFI_DEBUG)
- qDebug("QWifiManager::connect(), already connected to %s", network->ssid().constData());
- return;
- }
- updateNetworkState(Authenticating);
- call("DISABLE_NETWORK all");
- if (!m_connectedSSID.isEmpty()) {
- m_connectedSSID.clear();
- emit connectedSSIDChanged(m_connectedSSID);
- }
-
- bool networkKnown = false;
- QByteArray id;
- QByteArray listResult = call("LIST_NETWORKS");
- QList<QByteArray> lines = listResult.split('\n');
- foreach (const QByteArray &line, lines) {
- if (line.contains(network->ssid())) {
- id = line.split('\t').at(0);
- networkKnown = true;
- break;
- }
- }
-
- if (!networkKnown) {
- bool ok;
- id = call("ADD_NETWORK").trimmed();
- id.toInt(&ok);
- if (!ok) {
- qWarning("QWifiManager::connect(), failed to add network");
- return;
- }
- }
- QByteArray setNetworkCommand = QByteArray("SET_NETWORK ") + id;
-
- bool ok = true;
- if (!networkKnown)
- ok = ok && checkedCall(setNetworkCommand + QByteArray(" ssid ") + '"' + network->ssid() + '"');
-
- QByteArray key_mgmt;
- if (network->supportsWPA() || network->supportsWPA2()) {
- ok = ok && checkedCall(setNetworkCommand + QByteArray(" psk ") + '"' + passphrase.toLatin1() + '"');
- key_mgmt = "WPA-PSK";
- } else if (network->supportsWEP()) {
- ok = ok && checkedCall(setNetworkCommand + QByteArray(" wep_key0 ") + '"' + passphrase.toLatin1() + '"');
- ok = ok && checkedCall(setNetworkCommand + QByteArray(" auth_alg OPEN SHARED"));
- key_mgmt = "NONE";
- } else if (!network->supportsWPS() && passphrase.length() == 0) {
- // open network
- key_mgmt = "NONE";
- }
- ok = ok && checkedCall(setNetworkCommand + QByteArray(" key_mgmt ") + key_mgmt);
-
- if (!ok) {
- if (!networkKnown)
- call("REMOVE_NETWORK " + id);
- qWarning("QWifiManager::connect(), failed to set properties on network '%s'", id.constData());
- return;
- }
-
- call(QByteArray("SELECT_NETWORK ") + id);
- call("RECONNECT");
-}
-
-void QWifiManager::disconnect()
-{
- call("DISCONNECT");
-#ifdef Q_OS_ANDROID
- QByteArray req = m_interface;
- sendDhcpRequest(req.append(" disconnect"));
-#endif
- m_connectedSSID.clear();
- updateNetworkState(Disconnected);
- emit connectedSSIDChanged(m_connectedSSID);
-}
-
-void ProcessRunner::run()
-{
- // kill existing udhcpc instance
- QString filePath = QString("/var/run/udhcpc.").append(m_ifc).append(".pid");
- QFile pidFile(filePath);
- if (pidFile.open(QIODevice::ReadOnly)) {
- QByteArray pid = pidFile.readAll();
- pidFile.close();
- QProcess::execute(QStringLiteral("kill"), QStringList() << pid.trimmed().constData());
- } else {
- qWarning() << "QWifiManager - Failed to read" << filePath;
- }
- QStringList args;
- args << QStringLiteral("-R") << QStringLiteral("-n") << QStringLiteral("-p")
- << filePath << QStringLiteral("-i") << m_ifc;
- // start DHCP client
- QProcess::execute(QStringLiteral("udhcpc"), args);
- emit processFinished();
-}
-
-void QWifiManager::handleConnected()
-{
- QList<QByteArray> lists = call("LIST_NETWORKS").split('\n');
- QByteArray connectedNetwork;
- for (int i = 1; i < lists.size(); ++i) {
- if (lists.at(i).toUpper().contains("[CURRENT]")) {
- connectedNetwork = lists.at(i);
- break;
- }
- }
-
- if (connectedNetwork.isEmpty()) {
- if (QT_WIFI_DEBUG) qDebug("QWifiManager::handleConnected: not connected to a network...");
- return;
- }
-
- if (QT_WIFI_DEBUG) qDebug("QWifiManager::handleConnected: current is %s", connectedNetwork.constData());
-
- QList<QByteArray> info = connectedNetwork.split('\t');
- m_connectedSSID = info.at(1);
-
- if (m_startingUp) {
- m_startingUp = false;
- if (!m_network) {
- int pos = 0; // unused
- m_network = m_networkListModel.networkForSSID(info.at(1), &pos);
- }
- }
-
- updateNetworkState(ObtainingIPAddress);
-#ifdef Q_OS_ANDROID
- QByteArray req = m_interface;
- sendDhcpRequest(req.append(" connect"));
-#else
- m_dhcpRunner->start();
-#endif
-}