-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackend.h
More file actions
410 lines (292 loc) · 11.4 KB
/
Copy pathbackend.h
File metadata and controls
410 lines (292 loc) · 11.4 KB
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
#ifndef BACKEND_H
#define BACKEND_H
#include <QObject>
#include <QGuiApplication>
#include <QCursor>
#include "customcursor.h"
#include "settingsmanager.h"
#include "BluetoothControl/chatserver.h"
#include <QDebug>
#include <QSet>
//bluetooth server
#include <QBluetoothHostInfo>
#include <QPermissions>
#include <QBluetoothSocket>
#include <QBluetoothDeviceInfo>
#include <QBluetoothLocalDevice>
#include <QBluetoothUuid>
#include "BluetoothControl/chatserver.h"
#include "NetworkControl/netserver.h"
#include <QDateTime>
#include <QTimer>
#include "commandhandler.h"
//handle pause play... commands from handsfree, and gnome notification to manage media and show metadata of media
#include <QDBusConnection>
#include <QDBusError>
#include "mprisadaptor.h"
#include "mprisrootadaptor.h"
#include <QElapsedTimer>
#include "config.h"
using namespace Qt::StringLiterals;
enum class NetStatus
{
Unknown=-1,
Starting=0,
AdapterNotFound=10,
Failed,
Inactive=30,
Loading,
Active
};
enum BtStatus //host
{
Unknown=-1,
Starting=0,
AdapterNotFound=10,
Failed,
DeniedPermission=20,
AskingPermission,
GrantedPermission,
Inactive=30,
Discoverable,
Loading,
Active
};
//clients
enum class UserConnectionStatus
{
UnknownStatus=-1,
Connected,
ConnectionLost, //will way some seconds and if not retunred/responsed will disconnect him.
Disconnected
};
enum class UserAccess
{
Admin,
Normal
};
enum UserConnectionType
{
Bluetooth,
Network
};
struct VideoMetaData
{
QString name;
QString artistOrPublisher;
int length;
bool isVideo;
VideoMetaData(): name("no media"), isVideo(true), length(0)
{
}
};
struct UnstoredMediaPlayerData
{
bool isPlaying;
QString volume;
QString brightness;
bool isShuffle;
bool isLoop;
UnstoredMediaPlayerData() : isPlaying(false), volume("0"), brightness("0") , isLoop(false), isShuffle(false)
{
}
};
struct RemoteUsers
{
QString name;
QString address;
UserConnectionStatus status;
UserAccess access;
QBluetoothSocket* btSocket;
QTcpSocket* netSocket;
QDateTime connectedAt;
UserConnectionType connectionType;
qint64 pingMs;
bool authenticated;
int versionCode;
QString platform;
QList<QVariant> info; //store clientInfo data for future uses. CommandHandler::ClientInfoIndexes
short connectionLostCounter;
QElapsedTimer pingTimer;
QTimer connectionLostTimer;
RemoteUsers(QString uName, QString uAddressPort, UserConnectionType connType,
QTcpSocket* networkSocket=nullptr,
QBluetoothSocket* bluetoothSocket=nullptr)
: name(uName) , address(uAddressPort), connectionType(connType)
, btSocket(bluetoothSocket), netSocket(networkSocket)
, status(UserConnectionStatus::Connected), pingMs(0) , connectionLostCounter(0)
, access(UserAccess::Normal), connectedAt(QDateTime::currentDateTime())
, authenticated(false), versionCode(0), platform("")
{
}
QString convertUserAccess() const;
QString convertConnectionType(bool shortForm=false) const;
QString convertConnectionStatus() const;
QList<QString> getAsStringList() const;
};
class Backend : public QObject
{
Q_OBJECT
Q_PROPERTY(BtStatus btStatus READ btStatus WRITE setBtStatus NOTIFY btStatusChanged)
// Q_PROPERTY(QList<QBluetoothHostInfo> btLocalAdapters READ btLocalAdapters WRITE setBtLocalAdapters NOTIFY btLocalAdaptersChanged)
Q_PROPERTY(QVariantList connectedUsersList READ connectedUsersAsVariantList NOTIFY connectedUsersListChanged)
Q_PROPERTY(QString btLocalName READ btLocalName NOTIFY btLocalNameChanged) //current adapter name [ADDRESS] which is hosting now
Q_PROPERTY(QStringList bannedUsers READ bannedUsers NOTIFY bannedUsersChanged)
Q_PROPERTY(QBluetoothLocalDevice::HostMode bluetoothHostModeState READ bluetoothHostModeState NOTIFY bluetoothHostModeStateChanged)
Q_PROPERTY(int btMaxConnectionUser READ btMaxConnectionUser WRITE setBtMaxConnectionUser NOTIFY btMaxConnectionUserChanged FINAL)
Q_PROPERTY(bool btAlwaysDiscoverable READ btAlwaysDiscoverable WRITE setBtAlwaysDiscoverable NOTIFY btAlwaysDiscoverableChanged FINAL)
public:
explicit Backend(SettingsManager* settings,QGuiApplication* app, QObject *parent = nullptr);
//to be able call qml functions and init MPRIS
void initMpris();
void closeMpris();
void initConnectionLost(RemoteUsers* user);
//------------------------ call qml functiosn
void runQmlFunction(const QString& functionName);
QVariant runQmlFunction(const QString& functionName, QVariant argum);
void btCheckPermission();
//cursor
Q_INVOKABLE bool setupCustomCursor(const QUrl& imageUrl, int width, int height, int hotX, int hotY);
Q_INVOKABLE bool restoreCursor();
Q_INVOKABLE void changeCursor(const QString& mode="");
//net
Q_INVOKABLE void netServer(const bool& status);
//bluetooth
Q_INVOKABLE void bluetoothServer(const bool& status);
Q_INVOKABLE void refreshBluetoothAdapters();
BtStatus btStatus() const;
// QList<QBluetoothHostInfo> btLocalAdapters() const;
void setBtLocalAdapters(const QList<QBluetoothHostInfo>& list);
Q_INVOKABLE QVariantList btLocalAdapters() const;
//users bluetooth either net
QList<RemoteUsers*> users() const;
RemoteUsers* findUser(QBluetoothSocket* userSocket) const;
RemoteUsers* findUser(QTcpSocket* userSocket) const;
RemoteUsers* findUser(QString& address);
void setUsers(const QList<RemoteUsers*>& newUsers);
void addUser(RemoteUsers* newUser);
QVariantList connectedUsersAsVariantList() const;//expose connected users (either bluetooth/Network) to qml
QString btLocalName() const;
void setBtLocalName(const QString &newBtLocalName);
QBluetoothLocalDevice::HostMode bluetoothHostModeState();
void setBluetoothHostModeState(QBluetoothLocalDevice::HostMode state);
int btMaxConnectionUser() const;
void setBtMaxConnectionUser(int newBtMaxConnectionUser);
bool btAlwaysDiscoverable() const;
void setBtAlwaysDiscoverable(bool newAlwaysDiscoverable);
QStringList bannedUsers() const;
Q_INVOKABLE void unbanUser(QString address);
Q_INVOKABLE void kickUser(QString address);
Q_INVOKABLE void banUser(QString address);
void setRootObject(QObject *newRootObject);
bool mprisControl() const;
void setMprisControl(bool newMprisControl);
Q_INVOKABLE void retryMprisConnection();
bool IsDBusConnectionOk() const;
void setIsDBusConnectionOk(bool newIsDBusConnectionOk);
NetStatus ntStatus() const;
void setNtStatus(NetStatus newNetStatus);
QString netLocalName() const;
void setNetLocalName(const QString &newNetLocalName);
bool hostPasswordStatus() const;
void setHostPasswordStatus(bool newHostPasswordStatus);
Q_INVOKABLE bool setHostPassword(QString pass);
Q_INVOKABLE void processCommand(CommandHandler::Command cmd,QString payload);
bool isThereNextTrack() const;
void setIsThereNextTrack(bool newIsThereNextTrack);
bool isTherePreviousTrack() const;
void setIsTherePreviousTrack(bool newIsTherePreviousTrack);
signals:
//properties
void btStatusChanged();
void btLocalAdaptersChanged();
void connectedUsersListChanged();
void btLocalNameChanged();
void bluetoothHostModeStateChanged();
//bluetooth singals
void sendMessage(const QString &message);//later remove it becasue of confusion
void sendMessage(QBluetoothSocket *receiver, const QString &message);
void sendMessage(QBluetoothSocket *receiver, const QByteArray& data);
//net signals
void sendMessage(QTcpSocket *receiver, const QString &message);
void sendMessage(QTcpSocket *receiver, const QByteArray& data);
void bannedUsersChanged();
void btMaxConnectionUserChanged();
void btAlwaysDiscoverableChanged();
void mprisControlChanged();
void IsDBusConnectionOkChanged();
void ntStatusChanged();
void netLocalNameChanged();
void hostPasswordStatusChanged();
void mediaPlayerDataChange(CommandHandler::Command cmd, QString payload);
void isThereNextTrackChanged();
void isTherePreviousTrackChanged();
public slots:
//bluetooth slots
void clientConnected(QBluetoothSocket * sender);
void clientDisconnected( QBluetoothSocket * sender);
void messageReceived(QBluetoothSocket* sender, QByteArray data);
//net slots
void clientConnected(QTcpSocket * sender);
void clientDisconnected(QTcpSocket * sender);
void messageReceived(QTcpSocket* sender, QByteArray data);
void bluetoothStateChanged(QBluetoothLocalDevice::HostMode state);
//handle mpris signals
void mprisPlayNext();
void mprisPlayPrevious();
void mprisPlay();
void mprisPause();
void mprisPlayPause();
void init();
private:
void initBluetoothServer();
void initNetServer();
void processCommand(RemoteUsers *user, QByteArray *data,
CommandHandler::Command localCommand=CommandHandler::Command::DefaultCmd, QString thePayload="");
void sendPingToAllUsers();
QString getPlayerLatestStatus();
void sendResponse(RemoteUsers* user, const QString& response);
void sendResponse(RemoteUsers* user, QByteArray response);
void sendResponseToAll(QByteArray response);
QString toPureIPv4(const QHostAddress &addr); //sender->peerAddress() contains ipv6 and ipv4 (::::ff127.0.01) so this removes that ipv6
void doProcessPing(RemoteUsers* user);
QGuiApplication* m_app;
SettingsManager* m_settings;
CustomCursor cc;
bool m_isThereNextTrack;
bool m_isTherePreviousTrack;
QString m_hostPassword;
bool m_hostPasswordStatus;
Q_PROPERTY(bool hostPasswordStatus READ hostPasswordStatus WRITE setHostPasswordStatus NOTIFY hostPasswordStatusChanged FINAL)
//net host
NetServer* m_netServer;
QString m_netLocalName;
Q_PROPERTY(QString netLocalName READ netLocalName WRITE setNetLocalName NOTIFY netLocalNameChanged FINAL)
NetStatus m_ntStatus;
Q_PROPERTY(NetStatus ntStatus READ ntStatus WRITE setNtStatus NOTIFY ntStatusChanged FINAL)
//bluetooth host
ChatServer* m_btServer;
QList<QBluetoothHostInfo> m_btLocalAdapters;
QString m_btLocalName;
BtStatus m_btStatus;
void setBtStatus(BtStatus status);
int indexCurrentAdaptor;
QList<RemoteUsers*> m_users;
QBluetoothLocalDevice::HostMode m_bluetoothHostModeState;
QSet<QString> m_bannedUsers;
CommandHandler m_commandHandler;
bool m_btAlwaysDiscoverable;
int m_btMaxConnectionUser;
VideoMetaData m_currentMedia;
UnstoredMediaPlayerData m_unstoredMPdata;
QTimer m_pingUsersTimer;
QObject* m_rootObject;//to call qml functions and run mpris stuff
MprisAdaptor* m_mprisAdaptor;
bool m_mprisControl;
bool m_IsDBusConnectionOk;//status of dbus connection if failed dont allow user to change mprisControl status
Q_PROPERTY(bool mprisControl READ mprisControl WRITE setMprisControl NOTIFY mprisControlChanged FINAL)
Q_PROPERTY(bool IsDBusConnectionOk READ IsDBusConnectionOk WRITE setIsDBusConnectionOk NOTIFY IsDBusConnectionOkChanged FINAL)
Q_PROPERTY(bool isThereNextTrack READ isThereNextTrack WRITE setIsThereNextTrack NOTIFY isThereNextTrackChanged FINAL)
Q_PROPERTY(bool isTherePreviousTrack READ isTherePreviousTrack WRITE setIsTherePreviousTrack NOTIFY isTherePreviousTrackChanged FINAL)
};
#endif // BACKEND_H