34
34
#include < QSet>
35
35
36
36
#include < ssusysinfo.h>
37
+ #include < qofonomanager.h>
38
+ #include < qofonomodem.h>
37
39
38
- class DeviceInfoPrivate
40
+ class DeviceInfoPrivate : public QObject
39
41
{
42
+ Q_OBJECT
40
43
public:
41
- DeviceInfoPrivate ();
44
+ DeviceInfoPrivate (DeviceInfo *deviceInfo, bool synchronousInit );
42
45
~DeviceInfoPrivate ();
46
+ QStringList imeiNumbers ();
43
47
44
48
QSet<DeviceInfo::Feature> m_features;
45
49
QSet<Qt::Key> m_keys;
@@ -51,9 +55,31 @@ class DeviceInfoPrivate
51
55
QString m_osName;
52
56
QString m_osVersion;
53
57
QString m_adaptationVersion;
58
+ private slots:
59
+ void modemsChanged (const QStringList &modems);
60
+ void modemSerialChanged (const QString &serial);
61
+ void updateModemProperties ();
62
+ private:
63
+ void modemAdded (const QString &modem);
64
+ void modemRemoved (const QString &modem);
65
+ QSharedPointer<QOfonoManager> ofonoManager ();
66
+ void updateModemPropertiesLater ();
67
+
68
+ DeviceInfo *q_ptr;
69
+ bool m_synchronousInit;
70
+ QSharedPointer<QOfonoManager> m_ofonoManager;
71
+ QHash<QString, QSharedPointer<QOfonoModem> > m_modemHash;
72
+ QStringList m_modemList;
73
+ QStringList m_imeiNumbers;
74
+ QTimer *m_updateModemPropertiesTimer;
75
+ Q_DISABLE_COPY (DeviceInfoPrivate);
76
+ Q_DECLARE_PUBLIC (DeviceInfo);
54
77
};
55
78
56
- DeviceInfoPrivate::DeviceInfoPrivate ()
79
+ DeviceInfoPrivate::DeviceInfoPrivate (DeviceInfo *deviceInfo, bool synchronousInit)
80
+ : q_ptr(deviceInfo)
81
+ , m_synchronousInit(synchronousInit)
82
+ , m_updateModemPropertiesTimer(nullptr )
57
83
{
58
84
ssusysinfo_t *si = ssusysinfo_create ();
59
85
@@ -90,10 +116,107 @@ DeviceInfoPrivate::~DeviceInfoPrivate()
90
116
{
91
117
}
92
118
119
+ QStringList DeviceInfoPrivate::imeiNumbers ()
120
+ {
121
+ /* Trigger on-demand ofono tracking and
122
+ * evaluate initial property values. */
123
+ ofonoManager ();
124
+
125
+ return m_imeiNumbers;
126
+ }
127
+
128
+ QSharedPointer<QOfonoManager> DeviceInfoPrivate::ofonoManager ()
129
+ {
130
+ if (m_ofonoManager.isNull ()) {
131
+ m_ofonoManager = QOfonoManager::instance (m_synchronousInit);
132
+ connect (&*m_ofonoManager, &QOfonoManager::modemsChanged, this , &DeviceInfoPrivate::modemsChanged);
133
+
134
+ m_updateModemPropertiesTimer = new QTimer (this );
135
+ m_updateModemPropertiesTimer->setInterval (50 );
136
+ m_updateModemPropertiesTimer->setSingleShot (true );
137
+ connect (m_updateModemPropertiesTimer, &QTimer::timeout, this , &DeviceInfoPrivate::updateModemProperties);
138
+
139
+ QStringList modems (m_ofonoManager->modems ());
140
+ for (auto iter = modems.cbegin (); iter != modems.cend (); ++iter)
141
+ modemAdded (*iter);
142
+ updateModemProperties ();
143
+ }
144
+ return m_ofonoManager;
145
+ }
146
+
147
+ void DeviceInfoPrivate::updateModemPropertiesLater ()
148
+ {
149
+ if (!m_updateModemPropertiesTimer->isActive ())
150
+ m_updateModemPropertiesTimer->start ();
151
+ }
152
+
153
+ void DeviceInfoPrivate::updateModemProperties ()
154
+ {
155
+ QStringList imeiNumbers;
156
+ for (auto iter = m_modemList.cbegin (); iter != m_modemList.cend (); ++iter) {
157
+ QString imei (m_modemHash[*iter]->serial ());
158
+ if (!imei.isEmpty ())
159
+ imeiNumbers.append (imei);
160
+ }
161
+ if (m_imeiNumbers != imeiNumbers) {
162
+ m_imeiNumbers = imeiNumbers;
163
+ Q_Q (DeviceInfo);
164
+ emit q->imeiNumbersChanged ();
165
+ }
166
+ m_updateModemPropertiesTimer->stop ();
167
+ }
168
+
169
+ void DeviceInfoPrivate::modemRemoved (const QString &modemName)
170
+ {
171
+ QSharedPointer<QOfonoModem> modem (m_modemHash.take (modemName));
172
+ if (!modem.isNull ()) {
173
+ disconnect (&*modem, &QOfonoModem::serialChanged, this , &DeviceInfoPrivate::modemSerialChanged);
174
+ m_modemList.removeOne (modemName);
175
+ updateModemPropertiesLater ();
176
+ }
177
+ }
178
+
179
+ void DeviceInfoPrivate::modemAdded (const QString &modemName)
180
+ {
181
+ if (!m_modemHash.contains (modemName)) {
182
+ QSharedPointer<QOfonoModem> modem (QOfonoModem::instance (modemName, m_synchronousInit));
183
+ connect (&*modem, &QOfonoModem::serialChanged, this , &DeviceInfoPrivate::modemSerialChanged);
184
+ m_modemHash[modemName] = modem;
185
+ m_modemList.append (modemName);
186
+ updateModemPropertiesLater ();
187
+ }
188
+ }
189
+
190
+ void DeviceInfoPrivate::modemsChanged (const QStringList &modems)
191
+ {
192
+ QSet<QString> previous (m_modemList.toSet ());
193
+ QSet<QString> current (modems.toSet ());
194
+ QSet<QString> added (current - previous);
195
+ QSet<QString> removed (previous - current);
196
+ for (auto iter = removed.cbegin (); iter != removed.cend (); ++iter)
197
+ modemRemoved (*iter);
198
+ for (auto iter = added.cbegin (); iter != added.cend (); ++iter)
199
+ modemAdded (*iter);
200
+ }
201
+
202
+ void DeviceInfoPrivate::modemSerialChanged (const QString &serial)
203
+ {
204
+ Q_UNUSED (serial);
205
+ updateModemPropertiesLater ();
206
+ }
207
+
208
+ DeviceInfo::DeviceInfo (bool synchronousInit, QObject *parent)
209
+ : QObject(parent)
210
+ , d_ptr(new DeviceInfoPrivate(this , synchronousInit))
211
+ {
212
+ Q_D (const DeviceInfo);
213
+ }
214
+
93
215
DeviceInfo::DeviceInfo (QObject *parent)
94
216
: QObject(parent)
95
- , d_ptr(new DeviceInfoPrivate())
217
+ , d_ptr(new DeviceInfoPrivate(this , false ))
96
218
{
219
+ Q_D (const DeviceInfo);
97
220
}
98
221
99
222
DeviceInfo::~DeviceInfo ()
@@ -161,3 +284,11 @@ QString DeviceInfo::adaptationVersion() const
161
284
Q_D (const DeviceInfo);
162
285
return d->m_adaptationVersion ;
163
286
}
287
+
288
+ QStringList DeviceInfo::imeiNumbers ()
289
+ {
290
+ Q_D (DeviceInfo);
291
+ return d->imeiNumbers ();
292
+ }
293
+
294
+ #include " deviceinfo.moc"
0 commit comments