summaryrefslogtreecommitdiffstats
path: root/src/wifi/qwificontroller_p.h
blob: 63ad2efdce2dd96f103527bb19022e7be59ad65a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/****************************************************************************
**
** 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 QWifiEvent : public QEvent
{
public:
    QWifiEvent(QEvent::Type type, const QString &data = QString())
        : QEvent(type)
        , m_data(data)
    {
    }
    QString data() const { return m_data; }

private:
    QString m_data;
};

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;
    bool 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