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
|
/****************************************************************************
**
** 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 "qwifidevice.h"
#include <QtCore/QByteArray>
#include <QtCore/QDir>
#ifdef Q_OS_ANDROID_NO_SDK
#include <hardware_legacy/wifi.h>
#include <cutils/properties.h>
#endif
QT_BEGIN_NAMESPACE
/*!
\class QWifiDevice
\inmodule B2Qt.Wifi.Cpp
\ingroup wifi-cppclasses
\brief Represents a physical device.
Use this class to query if a device is Wifi capable, before attempting
to use the functionality of QWifiManager.
\code
QWifiManager *m_wifiManager = 0;
if (QWifiDevice::wifiSupported())
m_wifiManager = QWifiManager::instance();
if (m_wifiManager) {
m_wifiManager->start();
// and other wifi related code
}
\endcode
*/
QWifiDevice::QWifiDevice()
{
}
QWifiDevice::~QWifiDevice()
{
}
/*!
Returns \c true if a device is Wifi capable - Wifi driver and firmware has been
successfully loaded by the system, otherwise returns \c false.
*/
bool QWifiDevice::wifiSupported()
{
#ifdef Q_OS_ANDROID_NO_SDK
const char *fwpath = 0;
// reload wifi firmware
fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_STA);
if (!fwpath) {
qCWarning(B2QT_WIFI) << "failed to get firmware path";
return false;
}
if (wifi_change_fw_path((const char *)fwpath)) {
qCWarning(B2QT_WIFI) << "failed to change firmware path";
return false;
}
#endif
QByteArray ifc = wifiInterfaceName();
bool hasInterface = QDir().exists(QString::fromLatin1("/sys/class/net/" + ifc));
if (!hasInterface)
qCWarning(B2QT_WIFI) << "could not find wifi interface in \"/sys/class/net/\", "
"looking for interface named: " << ifc;
#ifdef Q_OS_ANDROID_NO_SDK
if (hasInterface && wifi_load_driver() == 0) {
return true;
} else {
qCWarning(B2QT_WIFI) << "wifi driver is not available";
return false;
}
#else
return hasInterface;
#endif
}
/*!
Returns Wifi interface name.
\note On Android, the Wifi interface name is read from "wifi.interface"
system property. On Linux, it is read from the \c B2QT_WIFI_INTERFACE
environment variable if it is set, otherwise, the default interface
name ("\e{wlan0}") is used.
\sa setWifiInterfaceName()
*/
QByteArray QWifiDevice::wifiInterfaceName()
{
QByteArray ifc;
#ifdef Q_OS_ANDROID_NO_SDK
char interface[PROPERTY_VALUE_MAX];
property_get("wifi.interface", interface, NULL);
ifc = interface[0] == '\0' ? "wlan0" : interface;
#else
ifc = qEnvironmentVariableIsSet("B2QT_WIFI_INTERFACE")
? qgetenv("B2QT_WIFI_INTERFACE") : "wlan0";
#endif
return ifc;
}
/*!
A conveniece method to set the Wifi interface \a name.
\sa wifiInterfaceName()
*/
void QWifiDevice::setWifiInterfaceName(const QByteArray &name)
{
#ifdef Q_OS_ANDROID_NO_SDK
property_set("wifi.interface", name);
#else
qputenv("B2QT_WIFI_INTERFACE", name);
#endif
}
QT_END_NAMESPACE
|