aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Moore <ken@ixsystems.com>2017-12-05 15:54:11 -0500
committerKen Moore <ken@ixsystems.com>2017-12-05 15:58:09 -0500
commitb99985a3d4aa953bd694228bc4b3fadbd158581c (patch)
treebb44677d1a31ee4442c92224c728cfb3e122a5c7
parentMerge branch 'master' of github.com:trueos/lumina (diff)
downloadlumina-b99985a3d4aa953bd694228bc4b3fadbd158581c.tar.gz
lumina-b99985a3d4aa953bd694228bc4b3fadbd158581c.tar.bz2
lumina-b99985a3d4aa953bd694228bc4b3fadbd158581c.zip
Move the new OSInterface class over to the base-level src-cpp directory.
Also get it all prepped/staged to be used by QML objects (not finished yet)
-rw-r--r--src-qt5/core/libLumina/OSInterface.h136
-rw-r--r--src-qt5/src-cpp/OSInterface-template.cpp (renamed from src-qt5/core/libLumina/OSInterface-template.cpp)0
-rw-r--r--src-qt5/src-cpp/OSInterface.h154
-rw-r--r--src-qt5/src-cpp/OSInterface_private.cpp56
4 files changed, 210 insertions, 136 deletions
diff --git a/src-qt5/core/libLumina/OSInterface.h b/src-qt5/core/libLumina/OSInterface.h
deleted file mode 100644
index acbd5c38..00000000
--- a/src-qt5/core/libLumina/OSInterface.h
+++ /dev/null
@@ -1,136 +0,0 @@
-//===========================================
-// 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
diff --git a/src-qt5/core/libLumina/OSInterface-template.cpp b/src-qt5/src-cpp/OSInterface-template.cpp
index 96b01e60..96b01e60 100644
--- a/src-qt5/core/libLumina/OSInterface-template.cpp
+++ b/src-qt5/src-cpp/OSInterface-template.cpp
diff --git a/src-qt5/src-cpp/OSInterface.h b/src-qt5/src-cpp/OSInterface.h
new file mode 100644
index 00000000..bbf9e2c2
--- /dev/null
+++ b/src-qt5/src-cpp/OSInterface.h
@@ -0,0 +1,154 @@
+//===========================================
+// 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
+ // == QML ACCESSIBLE PROPERTIES ==
+ //Battery
+ Q_PROPERTY( float batteryCharge READ batteryCharge NOTIFY batteryChargeChanged)
+ Q_PROPERTY( bool batteryCharging READ batteryCharging NOTIFY batteryChargingChanged)
+ Q_PROPERTY( double batterySecondsLeft READ batterySecondsLeft NOTIFY batterySecondsLeftChanged)
+ //Volume
+ Q_PROPERTY( int volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ //Network
+ Q_PROPERTY( bool networkAvailable READ networkAvailable NOTIFY networkStatusChanged)
+ Q_PROPERTY( QString networkType READ networkType NOTIFY networkStatusChanged)
+ Q_PROPERTY( float networkStrength READ networkStrength NOTIFY networkStatusChanged)
+ Q_PROPERTY( QString networkHostname READ networkHostname NOTIFY networkStatusChanged)
+ Q_PROPERTY( QHostAddress networkAddress READ networkAddress NOTIFY networkStatusChanged)
+ //Media
+ Q_PROPERTY( QStringList mediaShortcuts READ mediaShortcuts NOTIFY mediaShortcutsChanged)
+ //Updates
+ Q_PROPERTY( bool updatesAvailable READ updatesAvailable NOTIFY updateStatusChanged)
+ Q_PROPERTY( bool updatesRunning READ updatesRunning NOTIFY updateStatusChanged)
+ Q_PROPERTY( bool updatesFinished READ updatesFinished NOTIFY updateStatusChanged)
+ //Power options
+ Q_PROPERTY( bool canReboot READ canReboot NOTIFY powerAvailableChanged)
+ Q_PROPERTY( bool canShutdown READ canShutdown NOTIFY powerAvailableChanged)
+ Q_PROPERTY( bool canSuspend READ canSuspend NOTIFY powerAvailableChanged)
+public:
+ // ================
+ // SEMI-VIRTUAL FUNCTIONS - NEED TO BE DEFINED IN THE OS-SPECIFIC FILES
+ // ================
+ //Start/stop interface watchers/notifications
+ void start();
+ void stop();
+ bool isRunning(); //status of the object - whether it has been started yet
+
+ // = Battery =
+ Q_INVOKABLE bool batteryAvailable();
+ Q_INVOKABLE float batteryCharge();
+ Q_INVOKABLE bool batteryCharging();
+ Q_INVOKABLE double batterySecondsLeft();
+ // = Volume =
+ Q_INVOKABLE bool volumeAvailable();
+ Q_INVOKABLE int volume();
+ Q_INVOKABLE void setVolume(int);
+ // = Network Information =
+ Q_INVOKABLE bool networkAvailable();
+ Q_INVOKABLE QString networkType(); //"wifi", "wired", or "cell"
+ Q_INVOKABLE float networkStrength(); //percentage. ("wired" type should always be 100%)
+ Q_INVOKABLE QString networkHostname();
+ Q_INVOKABLE QHostAddress networkAddress();
+ // = Network Modification =
+
+ // = Media Shortcuts =
+ Q_INVOKABLE QStringList mediaDirectories(); //directory where XDG shortcuts are placed for interacting with media (local/remote)
+ Q_INVOKABLE QStringList mediaShortcuts(); //List of currently-available XDG shortcut file paths
+ // = Updates =
+ Q_INVOKABLE bool updatesAvailable();
+ Q_INVOKABLE QString updateDetails(); //Information about any available updates
+ Q_INVOKABLE bool updatesRunning();
+ Q_INVOKABLE QString updateLog(); //Information about any currently-running update
+ Q_INVOKABLE bool updatesFinished();
+ Q_INVOKABLE QString updateResults(); //Information about any finished update
+ Q_INVOKABLE void startUpdates();
+ Q_INVOKABLE bool updateOnlyOnReboot(); //Should the startUpdates function be called only when rebooting the system?
+ Q_INVOKABLE QDateTime lastUpdate(); //The date/time of the previous updates
+ Q_INVOKABLE QString lastUpdateResults(); //Information about the previously-finished update
+ // = System Power =
+ Q_INVOKABLE bool canReboot();
+ Q_INVOKABLE void startReboot();
+ Q_INVOKABLE bool canShutdown();
+ Q_INVOKABLE void startShutdown();
+ Q_INVOKABLE bool canSuspend();
+ Q_INVOKABLE void startSuspend();
+
+private slots:
+ // ================
+ // SEMI-VIRTUAL FUNCTIONS - NEED TO BE DEFINED IN THE OS-SPECIFIC FILES
+ // ================
+ //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>&);
+
+signals:
+ void interfaceChanged(OSInterface::Interface);
+ void batteryChargeChanged();
+ void batteryChargingChanged();
+ void batterySecondsLeftChanged();
+ void volumeChanged();
+ void networkStatusChanged();
+ void mediaShortcutsChanged();
+ void updateStatusChanged();
+ void powerAvailableChanged();
+
+private:
+ //Internal persistant data storage, OS-specific usage implementation
+ enum Interface{ Battery, Volume, Media, Network, PowerOff, Reboot, Suspend, Updates };
+ 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;
+
+ // Internal implifications for connecting the various watcher objects to their respective slots
+ // (OS-agnostic - defined in the "OSInterface_private.cpp" file)
+ void connectWatcher();
+ void connectIodevice();
+ void connectNetman();
+
+public:
+ OSInterface(QObject *parent = 0);
+ ~OSInterface();
+
+ static OSInterface* instance(); //Get the currently-active instance of this class (or make a new one)
+
+};
+#endif
diff --git a/src-qt5/src-cpp/OSInterface_private.cpp b/src-qt5/src-cpp/OSInterface_private.cpp
new file mode 100644
index 00000000..bd2d17b5
--- /dev/null
+++ b/src-qt5/src-cpp/OSInterface_private.cpp
@@ -0,0 +1,56 @@
+//===========================================
+// Lumina desktop source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// Internal, OS-agnostic functionality for managing the object itself
+//===========================================
+#include <OSInterface.h>
+
+OSInterface::OSInterface(QObject *parent) : QObject(parent){
+ watcher = 0;
+ iodevice = 0;
+ netman = 0;
+}
+
+OSInterface::~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();
+ }
+}
+
+OSInterface::OSInterface* instance(){
+ static OSInterface* m_os_object = 0;
+ if(m_os_object==0){
+ m_os_object = new OSInterface();
+ }
+ return m_os_object;
+}
+
+void OSInterface::connectWatcher(){
+ if(watcher==0){ return; }
+ connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherFileChanged(QString)) );
+ connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherDirChanged(QString)) );
+}
+
+void OSInterface::connectIodevice(){
+ if(iodevice==0){ return; }
+ connect(iodevice, SIGNAL(readyRead()), this, SLOT(iodeviceReadyRead()) );
+}
+
+void OSInterface::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>&)) );
+}
bgstack15