aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/libLumina/OSInterface.h
blob: acbd5c38d8d49f25b8c10954bec21f0e980253b0 (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
135
136
//===========================================
//  Lumina desktop source code
//  Copyright (c) 2017, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This is the main interface for any OS-specific system calls
//    To port Lumina to a different operating system, just create a file 
//    called "OSInterface-<Operating System>.cpp"
//===========================================
#ifndef _LUMINA_LIBRARY_OS_INTERFACE_H
#define _LUMINA_LIBRARY_OS_INTERFACE_H

#include <QString>
#include <QStringList>
#include <QList>
#include <QObject>
#include <QVariant>
#include <QHash>

#include <QIODevice>
#include <QFileSystemWatcher>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSslError>

class OSInterface : public QObject{
	Q_OBJECT

public: 
	enum Interface{ Battery, Volume, Devices, Network, PowerOff, Reboot, Suspend, Updates };

private slots:
	//FileSystemWatcher slots
	void watcherFileChanged(QString);
	void watcherDirChanged(QString);
	//IO Device slots
	void iodeviceReadyRead();
	void iodeviceAboutToClose();
	//NetworkAccessManager slots
	void netAccessChanged(QNetworkAccessManager::NetworkAccessibility);
	void netRequestFinished(QNetworkReply*);
	void netSslErrors(QNetworkReply*, const QList<QSslError>&);

private:
	//Internal persistant data storage, OS-specific usage implementation
	QHash< OSInterface::Interface, QList<QVariant> > INFO;

	// ============
	// Internal possibilities for watching the system (OS-Specific usage/implementation)
	// ============
	//File System Watcher
	QFileSystemWatcher *watcher;
	//IO Device (QLocalSocket, QTcpConnection, QFile, etc)
	QIODevice *iodevice;
	//Network Access Manager (check network connectivity, etc)
	QNetworkAccessManager *netman;

	//Simplifications for connecting the various watcher objects to their respective slots
	void connectWatcher(){
	  if(watcher==0){ return; }
	  connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherFileChanged(QString)) );
	  connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherDirChanged(QString)) );
	}
	void connectIodevice(){
	  if(iodevice==0){ return; }
	  connect(iodevice, SIGNAL(readyRead()), this, SLOT(iodeviceReadyRead()) );
	}
	void connectNetman(){
	  if(netman==0){ return; }
	  connect(netman, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), this, SLOT(netAccessChanged(QNetworkAccessManager::NetworkAccessibility)) );
	  connect(netman, SIGNAL(requestFinished(QNetworkReply*)), this, SLOT(netRequestFinished(QNetworkReply*)) );
	  connect(netman, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), this, SLOT(netSslErrors(QNetworkReply*, const QList<QSslError>&)) );
	}
	
public:
	OSInterface(QObject *parent = 0) : QObject(parent){
	  watcher = 0;
	  iodevice = 0;
	  netman = 0;
	}
	~OSInterface(){
	  if(watcher!=0){ 
	    QStringList paths; paths << watcher->files() << watcher->directories();
	    if(!paths.isEmpty()){ watcher->removePaths(paths); }
	    watcher->deleteLater();
	  }
	  if(iodevice!=0){
	    if(iodevice->isOpen()){ iodevice->close(); }
	    iodevice->deleteLater();
	  }
	  if(netman!=0){
	    netman->deleteLater();
	  }
	}

	//Simple functions used to determine if the current OS supports using this class, and what levels of support
	QList<OSInterface::Interface> supportedNotifications(); 	//Which interfaces provide change notifications
	QList<OSInterface::Interface> supportedStatus();		//Which interfaces are available for "status" requests
	QList<OSInterface::Interface> supportedModify();	//Which interfaces are available for "modify" requests

	//Start/stop interface watchers/notifications (each only called once per session)
	void start();
	void stop();
	
	//Generic status update
	QList<QVariant> status(OSInterface::Interface);
	// ==== Interface status output lists ====
	//  Battery: [ float (percent charge), bool (is Charging), double (seconds remaining) ];
	//  Volume: [int (percent volume) ]
	//  Devices: [ QStringList[ name, mountpoint, type (optional)] ]  (List length depends on number of devices)
	//  Network: [bool (network access available)]
	//  PowerOff: [bool (can power off system)]
	//  Reboot: [bool (can reboot system)]
	//  Suspend: [bool (can suspend system)]
	//  Updates: [bool (is updating), bool (reboot required)]
	// ==========

	//Individual Interface interactions
	bool modify(OSInterface::Interface, QList<QVariant> args); //returns: success/failure
	// ==== Interface modification argument lists ====
	//  Battery: <NO MODIFICATION>
	//  Volume: [int (set percent volume) ]
	//  Devices: <NO MODIFICATION>
	//  Network: <NO MODIFICATION>
	//  PowerOff: [bool (skip updates - optional)]
	//  Reboot: [bool (skip updates - optional)]
	//  Suspend: [] (No input arguments)
	//  Updates: <NO MODIFICATION>
	// ==========

signals:
	void interfaceChanged(OSInterface::Interface);

};
#endif
bgstack15