use sockets from MPD instead of running curl

This commit is contained in:
Evgenii Alekseev 2016-07-28 15:34:52 +03:00
parent 90c33ab24d
commit 1864dc71d5
17 changed files with 75 additions and 30 deletions

View File

@ -27,6 +27,8 @@ class QGraphicsScene;
class GraphicalItemHelper : public QObject class GraphicalItemHelper : public QObject
{ {
Q_OBJECT
public: public:
explicit GraphicalItemHelper(QObject *parent = nullptr, explicit GraphicalItemHelper(QObject *parent = nullptr,
QGraphicsScene *scene = nullptr); QGraphicsScene *scene = nullptr);

View File

@ -28,6 +28,8 @@
class OWMWeatherProvider : public AbstractWeatherProvider class OWMWeatherProvider : public AbstractWeatherProvider
{ {
Q_OBJECT
public: public:
explicit OWMWeatherProvider(QObject *parent, const int number); explicit OWMWeatherProvider(QObject *parent, const int number);
virtual ~OWMWeatherProvider(); virtual ~OWMWeatherProvider();

View File

@ -28,6 +28,8 @@
class YahooWeatherProvider : public AbstractWeatherProvider class YahooWeatherProvider : public AbstractWeatherProvider
{ {
Q_OBJECT
public: public:
explicit YahooWeatherProvider(QObject *parent, const int number); explicit YahooWeatherProvider(QObject *parent, const int number);
virtual ~YahooWeatherProvider(); virtual ~YahooWeatherProvider();

View File

@ -25,6 +25,8 @@
class BatterySource : public AbstractExtSysMonSource class BatterySource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit BatterySource(QObject *parent, const QStringList args); explicit BatterySource(QObject *parent, const QStringList args);
virtual ~BatterySource(); virtual ~BatterySource();

View File

@ -28,6 +28,8 @@ class ExtScript;
class CustomSource : public AbstractExtSysMonSource class CustomSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit CustomSource(QObject *parent, const QStringList args); explicit CustomSource(QObject *parent, const QStringList args);
virtual ~CustomSource(); virtual ~CustomSource();

View File

@ -25,6 +25,8 @@
class DesktopSource : public AbstractExtSysMonSource class DesktopSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit DesktopSource(QObject *parent, const QStringList args); explicit DesktopSource(QObject *parent, const QStringList args);
virtual ~DesktopSource(); virtual ~DesktopSource();

View File

@ -27,6 +27,8 @@ class QProcess;
class GPULoadSource : public AbstractExtSysMonSource class GPULoadSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit GPULoadSource(QObject *parent, const QStringList args); explicit GPULoadSource(QObject *parent, const QStringList args);
virtual ~GPULoadSource(); virtual ~GPULoadSource();

View File

@ -27,6 +27,8 @@ class QProcess;
class GPUTemperatureSource : public AbstractExtSysMonSource class GPUTemperatureSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit GPUTemperatureSource(QObject *parent, const QStringList args); explicit GPUTemperatureSource(QObject *parent, const QStringList args);
virtual ~GPUTemperatureSource(); virtual ~GPUTemperatureSource();

View File

@ -27,6 +27,8 @@ class QProcess;
class HDDTemperatureSource : public AbstractExtSysMonSource class HDDTemperatureSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit HDDTemperatureSource(QObject *parent, const QStringList args); explicit HDDTemperatureSource(QObject *parent, const QStringList args);
virtual ~HDDTemperatureSource(); virtual ~HDDTemperatureSource();

View File

@ -25,6 +25,8 @@
class LoadSource : public AbstractExtSysMonSource class LoadSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit LoadSource(QObject *parent, const QStringList args); explicit LoadSource(QObject *parent, const QStringList args);
virtual ~LoadSource(); virtual ~LoadSource();

View File

@ -25,6 +25,8 @@
class NetworkSource : public AbstractExtSysMonSource class NetworkSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit NetworkSource(QObject *parent, const QStringList args); explicit NetworkSource(QObject *parent, const QStringList args);
virtual ~NetworkSource(); virtual ~NetworkSource();

View File

@ -35,17 +35,17 @@ PlayerSource::PlayerSource(QObject *parent, const QStringList args)
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_player = args.at(0); m_player = args.at(0);
m_mpdAddress = QString("%1:%2").arg(args.at(1)).arg(args.at(2)); m_mpdAddress = args.at(1);
m_mpdPort = args.at(2).toInt();
m_mpris = args.at(3); m_mpris = args.at(3);
m_symbols = args.at(4).toInt(); m_symbols = args.at(4).toInt();
m_mpdProcess = new QProcess(nullptr); connect(&m_mpdSocket, SIGNAL(connected()), this,
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished SLOT(mpdSocketConnected()));
connect(m_mpdProcess, connect(&m_mpdSocket, SIGNAL(readyRead()), this,
static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>( SLOT(mpdSocketReadyRead()));
&QProcess::finished), connect(&m_mpdSocket, SIGNAL(bytesWritten(qint64)), this,
[this](int, QProcess::ExitStatus) { return updateMpdValue(); }); SLOT(mpdSocketWritten(const qint64)));
m_mpdProcess->waitForFinished(0);
m_mpdCached = defaultInfo(); m_mpdCached = defaultInfo();
} }
@ -54,8 +54,7 @@ PlayerSource::~PlayerSource()
{ {
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
m_mpdProcess->kill(); m_mpdSocket.close();
m_mpdProcess->deleteLater();
} }
@ -182,7 +181,7 @@ void PlayerSource::run()
// initial data // initial data
if (m_player == QString("mpd")) { if (m_player == QString("mpd")) {
// mpd // mpd
m_values = getPlayerMpdInfo(m_mpdAddress); m_values = getPlayerMpdInfo();
} else if (m_player == QString("mpris")) { } else if (m_player == QString("mpris")) {
// players which supports mpris // players which supports mpris
if (m_dbusMutex.tryLock()) { if (m_dbusMutex.tryLock()) {
@ -256,18 +255,21 @@ QString PlayerSource::stripString(const QString &value, const int s)
} }
void PlayerSource::updateMpdValue() void PlayerSource::mpdSocketConnected()
{
qCDebug(LOG_ESS) << "MPD socket connected to" << m_mpdSocket.peerName()
<< "with state" << m_mpdSocket.state();
}
void PlayerSource::mpdSocketReadyRead()
{ {
qCInfo(LOG_ESS) << "Cmd returns" << m_mpdProcess->exitCode();
QString qdebug = QTextCodec::codecForMib(106)
->toUnicode(m_mpdProcess->readAllStandardError())
.trimmed();
qCInfo(LOG_ESS) << "Error" << qdebug;
QString qoutput = QTextCodec::codecForMib(106) QString qoutput = QTextCodec::codecForMib(106)
->toUnicode(m_mpdProcess->readAllStandardOutput()) ->toUnicode(m_mpdSocket.readAll())
.trimmed(); .trimmed();
qCInfo(LOG_ESS) << "Output" << qoutput; qCInfo(LOG_ESS) << "Output" << qoutput;
// parse
for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) { for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) {
if (str.split(QString(": "), QString::SkipEmptyParts).count() == 2) { if (str.split(QString(": "), QString::SkipEmptyParts).count() == 2) {
// "Metadata: data" // "Metadata: data"
@ -292,6 +294,13 @@ void PlayerSource::updateMpdValue()
} }
void PlayerSource::mpdSocketWritten(const qint64 bytes)
{
qCDebug(LOG_ESS) << "Bytes written" << bytes << "to"
<< m_mpdSocket.peerName();
}
QVariantHash PlayerSource::defaultInfo() const QVariantHash PlayerSource::defaultInfo() const
{ {
QVariantHash info; QVariantHash info;
@ -305,16 +314,16 @@ QVariantHash PlayerSource::defaultInfo() const
} }
QVariantHash PlayerSource::getPlayerMpdInfo(const QString mpdAddress) const QVariantHash PlayerSource::getPlayerMpdInfo()
{ {
qCDebug(LOG_ESS) << "MPD" << mpdAddress; if (m_mpdSocket.state() == QAbstractSocket::UnconnectedState) {
// connect to host
// build cmd qCInfo(LOG_ESS) << "Connect to" << m_mpdAddress << m_mpdPort;
QString cmd = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl " m_mpdSocket.connectToHost(m_mpdAddress, m_mpdPort);
"--connect-timeout 1 -fsm 3 telnet://%1\"") } else if (m_mpdSocket.state() == QAbstractSocket::ConnectedState) {
.arg(mpdAddress); // send request
qCInfo(LOG_ESS) << "cmd" << cmd; m_mpdSocket.write("currentsong\nstatus\n");
m_mpdProcess->start(cmd); }
return m_mpdCached; return m_mpdCached;
} }

View File

@ -20,6 +20,7 @@
#include <QMutex> #include <QMutex>
#include <QObject> #include <QObject>
#include <QTcpSocket>
#include "abstractextsysmonsource.h" #include "abstractextsysmonsource.h"
@ -28,6 +29,8 @@ class QProcess;
class PlayerSource : public AbstractExtSysMonSource class PlayerSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit PlayerSource(QObject *parent, const QStringList args); explicit PlayerSource(QObject *parent, const QStringList args);
virtual ~PlayerSource(); virtual ~PlayerSource();
@ -42,16 +45,19 @@ public:
static QString stripString(const QString &value, const int s); static QString stripString(const QString &value, const int s);
private slots: private slots:
void updateMpdValue(); void mpdSocketConnected();
void mpdSocketReadyRead();
void mpdSocketWritten(const qint64 bytes);
private: private:
inline QVariantHash defaultInfo() const; inline QVariantHash defaultInfo() const;
QVariantHash getPlayerMpdInfo(const QString mpdAddress) const; QVariantHash getPlayerMpdInfo();
QVariantHash getPlayerMprisInfo(const QString mpris) const; QVariantHash getPlayerMprisInfo(const QString mpris) const;
QTcpSocket m_mpdSocket;
// configuration and values // configuration and values
QString m_mpdAddress; QString m_mpdAddress;
int m_mpdPort;
QVariantHash m_mpdCached; QVariantHash m_mpdCached;
QProcess *m_mpdProcess = nullptr;
QString m_mpris; QString m_mpris;
QMutex m_dbusMutex; QMutex m_dbusMutex;
QString m_player; QString m_player;

View File

@ -25,6 +25,8 @@
class ProcessesSource : public AbstractExtSysMonSource class ProcessesSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit ProcessesSource(QObject *parent, const QStringList args); explicit ProcessesSource(QObject *parent, const QStringList args);
virtual ~ProcessesSource(); virtual ~ProcessesSource();

View File

@ -28,6 +28,8 @@ class ExtQuotes;
class QuotesSource : public AbstractExtSysMonSource class QuotesSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit QuotesSource(QObject *parent, const QStringList args); explicit QuotesSource(QObject *parent, const QStringList args);
virtual ~QuotesSource(); virtual ~QuotesSource();

View File

@ -28,6 +28,8 @@ class ExtUpgrade;
class UpgradeSource : public AbstractExtSysMonSource class UpgradeSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit UpgradeSource(QObject *parent, const QStringList args); explicit UpgradeSource(QObject *parent, const QStringList args);
virtual ~UpgradeSource(); virtual ~UpgradeSource();

View File

@ -28,6 +28,8 @@ class ExtWeather;
class WeatherSource : public AbstractExtSysMonSource class WeatherSource : public AbstractExtSysMonSource
{ {
Q_OBJECT
public: public:
explicit WeatherSource(QObject *parent, const QStringList args); explicit WeatherSource(QObject *parent, const QStringList args);
virtual ~WeatherSource(); virtual ~WeatherSource();