From ed7ff3a791bf0fe390fbc55e3a73b0a93cb6f8b8 Mon Sep 17 00:00:00 2001 From: Jari Jarvi Date: Wed, 16 Jun 2010 16:36:27 +0300 Subject: [PATCH] Complete rewrite. Does not work yet. --- src/advsettingsdlg.cpp | 4 +- src/advsettingsdlg.h | 4 +- src/engine.cpp | 44 +++++++++ src/engine.h | 27 ++++++ src/iengine.h | 20 ++++ src/irctrl.cpp | 65 ++++++------- src/irctrl.h | 18 ++-- src/irctrl_p.cpp | 67 ------------- src/irctrl_p.h | 37 ------- src/iremote.h | 33 +++++++ src/mainwidget.cpp | 31 ++++-- src/mainwidget.h | 17 +++- src/model.h | 8 +- src/netio.cpp | 18 ++++ src/netio.h | 23 +++++ src/remote.cpp | 103 ++++++++++++++++++++ src/remote.h | 43 +++++++++ src/remotedbparser.cpp | 114 ++++++++++++++++++++++ src/remotedbparser.h | 40 ++++++++ src/remotelist.cpp | 114 ---------------------- src/remotelist.h | 41 -------- src/selectremotedlg.cpp | 247 ++++++++++++++++++++++++----------------------- src/selectremotedlg.h | 5 +- src/settingsdlg.cpp | 42 ++++++-- src/settingsdlg.h | 8 +- src/src.pro | 17 +++- 26 files changed, 726 insertions(+), 464 deletions(-) create mode 100644 src/engine.cpp create mode 100644 src/engine.h create mode 100644 src/iengine.h delete mode 100644 src/irctrl_p.cpp delete mode 100644 src/irctrl_p.h create mode 100644 src/iremote.h create mode 100644 src/netio.cpp create mode 100644 src/netio.h create mode 100644 src/remote.cpp create mode 100644 src/remote.h create mode 100644 src/remotedbparser.cpp create mode 100644 src/remotedbparser.h delete mode 100644 src/remotelist.cpp delete mode 100644 src/remotelist.h diff --git a/src/advsettingsdlg.cpp b/src/advsettingsdlg.cpp index 014354e..e3d5351 100644 --- a/src/advsettingsdlg.cpp +++ b/src/advsettingsdlg.cpp @@ -7,9 +7,11 @@ #include "advsettingsdlg.h" #include "settingstable.h" +#include "iengine.h" -AdvSettingsDlg::AdvSettingsDlg(QDialog *parent) +AdvSettingsDlg::AdvSettingsDlg(QDialog *parent, IEngine *engine) : QDialog(parent) + , engine(engine) , layout(NULL) , btnLayout(NULL) , settings(NULL) diff --git a/src/advsettingsdlg.h b/src/advsettingsdlg.h index d3c2561..d04c7f5 100644 --- a/src/advsettingsdlg.h +++ b/src/advsettingsdlg.h @@ -8,13 +8,14 @@ class QPushButton; class QVBoxLayout; class QHBoxLayout; class SettingsTable; +class IEngine; class AdvSettingsDlg : public QDialog { Q_OBJECT public: - AdvSettingsDlg(QDialog *parent = 0); + AdvSettingsDlg(QDialog *parent, IEngine *engine); ~AdvSettingsDlg(); private: @@ -26,6 +27,7 @@ private slots: void save(); private: + IEngine *engine; QHBoxLayout *layout; QVBoxLayout *btnLayout; QSettings *settings; diff --git a/src/engine.cpp b/src/engine.cpp new file mode 100644 index 0000000..a449b85 --- /dev/null +++ b/src/engine.cpp @@ -0,0 +1,44 @@ +#include "engine.h" +#include "remote.h" +#include "iremote.h" +#include "remotedbparser.h" +#include "netio.h" + +#include + +Engine::Engine() + : netIO(new NetIO()) + , currentRemote(NULL) +{ +} + +Engine::~Engine() +{ + delete netIO; + if (currentRemote) + delete currentRemote; +} + +void Engine::setRemote(const QString &id) +{ + if (currentRemote) + delete currentRemote; + + currentRemote = new Remote(id, netIO); +} + +RemoteDbParser Engine::availableRemotes() +{ + // TODO download db.xml + + QDomDocument doc; + return RemoteDbParser(doc); +} + +IRemote *Engine::remote() +{ + return currentRemote; +} + + + diff --git a/src/engine.h b/src/engine.h new file mode 100644 index 0000000..cbee93b --- /dev/null +++ b/src/engine.h @@ -0,0 +1,27 @@ +#ifndef _ENGINE_H_ +#define _ENGINE_H_ + +#include "iengine.h" + +class NetIO; +class Remote; +class IRemote; +class RemoteDbParser; + +class Engine : public IEngine +{ +public: + Engine(); + ~Engine(); + RemoteDbParser availableRemotes(); + void setRemote(const QString &id); + IRemote *remote(); + +private: + NetIO *netIO; + Remote *currentRemote; +}; + +#endif // _ENGINE_H_ + + diff --git a/src/iengine.h b/src/iengine.h new file mode 100644 index 0000000..591fe85 --- /dev/null +++ b/src/iengine.h @@ -0,0 +1,20 @@ +#ifndef _IENGINE_H_ +#define _IENGINE_H_ + +#include + +class IRemote; +class RemoteDbParser; + +class IEngine +{ +public: + IEngine() {} + virtual ~IEngine() {} + virtual RemoteDbParser availableRemotes() = 0; + virtual void setRemote(const QString &id) = 0; + virtual IRemote *remote() = 0; +}; + +#endif // _IENGINE_H_ + diff --git a/src/irctrl.cpp b/src/irctrl.cpp index 5a647d0..4f40027 100644 --- a/src/irctrl.cpp +++ b/src/irctrl.cpp @@ -1,62 +1,51 @@ +#include + #include +#include + #include "irctrl.h" -#include "irctrl_p.h" IrCtrl::IrCtrl(QObject *parent) : QObject(parent) - , d_ptr(new IrCtrlPrivate()) { - Q_D(IrCtrl); - d->q_ptr = this; } - -IrCtrl::IrCtrl(IrCtrlPrivate &dd, QObject *parent) - : QObject(parent) - , d_ptr(&dd) -{ - Q_D(IrCtrl); - d->q_ptr = this; -} - + IrCtrl::~IrCtrl() { - delete d_ptr; } -void IrCtrl::sendCmd0() +void IrCtrl::sendCmd(const QString &remoteName, const QString &cmd) { - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd0", "VOLUP").toString()); -} + if (!killLircTimer->isActive()) { + startLirc(); + } else { + killLircTimer->stop(); + } -void IrCtrl::sendCmd1() -{ - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd1", "VOLDOWN-").toString()); -} +// QTcpSocket sock; +// QSettings settings(this); +// sock.setSocketOption(QAbstractSocket::LowDelayOption, 1); +// sock.connectToHost(QHostAddress::LocalHost, +// settings.value("lircPort", LIRC_PORT).toInt(), +// QIODevice::WriteOnly|QIODevice::Unbuffered); +// sock.waitForConnected(); +// QString cmdStr = "SEND_ONCE " + cmd.remoteName + " " + cmd.cmd + "\n"; +// sock.write(cmdStr.toAscii()); +// sock.waitForBytesWritten(); +// sock.close(); -void IrCtrl::sendCmd2() -{ - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd2", "CHUP").toString()); + killLircTimer->start(); } -void IrCtrl::sendCmd3() -{ - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd3", "CHDOWN").toString()); -} -void IrCtrl::sendCmd4() +void IrCtrl::stopLirc() { - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd4", "POWER").toString()); + std::system("sudo /etc/init.d/lirc stop"); } -void IrCtrl::sendCmd5() +void IrCtrl::startLirc() { - Q_D(IrCtrl); - d->genericSendCmd(d->settings->value("cmd5", "MUTE").toString()); + std::system("sudo /etc/init.d/lirc start"); } diff --git a/src/irctrl.h b/src/irctrl.h index 6152335..3bc71b4 100644 --- a/src/irctrl.h +++ b/src/irctrl.h @@ -4,7 +4,7 @@ #include #include -class IrCtrlPrivate; +class QTimer; class IrCtrl : public QObject { @@ -15,19 +15,15 @@ public: ~IrCtrl(); public slots: - void sendCmd0(); - void sendCmd1(); - void sendCmd2(); - void sendCmd3(); - void sendCmd4(); - void sendCmd5(); + void sendCmd(const QString &remoteName, const QString &cmd); -protected: - IrCtrlPrivate *const d_ptr; - IrCtrl(IrCtrlPrivate &dd, QObject *parent); +private: + void startLirc(); + void stopLirc(); private: - Q_DECLARE_PRIVATE(IrCtrl); + static const quint16 LIRC_PORT = 8765; + QTimer *killLircTimer; }; #endif diff --git a/src/irctrl_p.cpp b/src/irctrl_p.cpp deleted file mode 100644 index f44b23b..0000000 --- a/src/irctrl_p.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include - -#include -#include -#include -#include -#include - -#include "irctrl_p.h" - -IrCtrlPrivate::IrCtrlPrivate() - : settings(NULL) -{ - settings = new QSettings(this); - - killLircTimer = new QTimer(this); - killLircTimer->setInterval( - settings->value("idleTimeout", 300).toInt() * 1000); - killLircTimer->setSingleShot(true); - connect(killLircTimer, SIGNAL(timeout()), this, SLOT(stopLirc())); - startLirc(); - killLircTimer->start(); -} - -IrCtrlPrivate::~IrCtrlPrivate() -{ - delete settings; - settings = NULL; - delete killLircTimer; - stopLirc(); -} - -void IrCtrlPrivate::stopLirc() -{ - std::system("sudo /etc/init.d/lirc stop"); -} - -void IrCtrlPrivate::startLirc() -{ - std::system("sudo /etc/init.d/lirc start"); -} - -void IrCtrlPrivate::genericSendCmd(const QString &commandName) -{ - if (!killLircTimer->isActive()) { - startLirc(); - } else { - killLircTimer->stop(); - } - - QTcpSocket sock; - sock.setSocketOption(QAbstractSocket::LowDelayOption, 1); - sock.connectToHost(QHostAddress::LocalHost, - settings->value("lircPort", LIRC_PORT).toInt(), - QIODevice::WriteOnly|QIODevice::Unbuffered); - sock.waitForConnected(); - QString remoteName = - settings->value("remoteName", "REMOTE_NAME_MISSING").toString(); - QString cmd = "SEND_ONCE " + remoteName + " " + commandName + "\n"; - sock.write(cmd.toAscii()); - sock.waitForBytesWritten(); - sock.close(); - - killLircTimer->start(); -} - - diff --git a/src/irctrl_p.h b/src/irctrl_p.h deleted file mode 100644 index 0fa5879..0000000 --- a/src/irctrl_p.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _IRCTRLPRIVATE_H_ -#define _IRCTRLPRIVATE_H_ - -#include -#include -#include "irctrl.h" - -class QSettings; -class QTimer; - -class IrCtrlPrivate : public QObject -{ - Q_OBJECT -public: - IrCtrlPrivate(); - virtual ~IrCtrlPrivate(); - -protected: - void genericSendCmd(const QString &commandName); - void startLirc(); - -protected: - IrCtrl *q_ptr; - QSettings *settings; - static const quint16 LIRC_PORT = 8765; - QTimer *killLircTimer; - -protected slots: - void stopLirc(); - -private: - IrCtrlPrivate(const IrCtrlPrivate &); - Q_DECLARE_PUBLIC(IrCtrl); -}; - -#endif // _IRCTRLPRIVATE_H_ - diff --git a/src/iremote.h b/src/iremote.h new file mode 100644 index 0000000..9ad96fd --- /dev/null +++ b/src/iremote.h @@ -0,0 +1,33 @@ +#ifndef _IREMOTE_H_ +#define _IREMOTE_H_ + +#include + +class IRemote : public QObject +{ + Q_OBJECT + +public: + enum RemoteCmd + { + VOLUMEUP, + VOLUMEDOWN, + CHANNELUP, + CHANNELDOWN, + POWER, + MUTE + }; + + IRemote() {} + virtual ~IRemote() {} + + virtual void updateRating() = 0; + virtual void sendRating(bool) = 0; + virtual void sendCmd(RemoteCmd) = 0; + +signals: + void ratingChanged(int rating); +}; + +#endif // _IREMOTE_H_ + diff --git a/src/mainwidget.cpp b/src/mainwidget.cpp index 48e049f..76a3ccf 100644 --- a/src/mainwidget.cpp +++ b/src/mainwidget.cpp @@ -1,4 +1,7 @@ #include "mainwidget.h" +#include "engine.h" +#include "iengine.h" +#include "settingsdlg.h" #include #include @@ -6,11 +9,12 @@ #include #include -#include "settingsdlg.h" - MainWidget::MainWidget (QWidget *parent) : QWidget(parent) + , engine(new Engine()) { + engine->setRemote("1"); + layout = new QGridLayout(this); settings = new QSettings(this); @@ -36,24 +40,24 @@ MainWidget::MainWidget (QWidget *parent) layout->addWidget(button, i%2, i/2); } - connect(buttons[0], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd0())); - connect(buttons[1], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd1())); - connect(buttons[2], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd2())); - connect(buttons[3], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd3())); - connect(buttons[4], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd4())); - connect(buttons[5], SIGNAL(clicked()), &irCtrl, SLOT(sendCmd5())); - + connect(buttons[0], SIGNAL(clicked()), + this, SLOT(sendCmdClicked(IRemote::VOLUMEUP))); + this->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0); this->setLayout(layout); this->setAttribute(Qt::WA_TranslucentBackground); this->setAttribute(Qt::WA_OpaquePaintEvent); resize(); + + + showSettingsDialog(); } MainWidget::~MainWidget() { delete settings; + delete engine; } void MainWidget::paintEvent(QPaintEvent*) @@ -66,7 +70,7 @@ void MainWidget::paintEvent(QPaintEvent*) void MainWidget::showSettingsDialog() { - SettingsDlg dlg; + SettingsDlg dlg(this, engine); dlg.exec(); update(); // Repaint required if bgAlpha value was changed resize(); @@ -83,3 +87,10 @@ void MainWidget::resize() QWidget::resize(w, h); } +void MainWidget::sendCmdClicked(IRemote::RemoteCmd cmd) +{ + engine->remote()->sendCmd(cmd); + +} + + diff --git a/src/mainwidget.h b/src/mainwidget.h index 1f74c10..4e211d9 100644 --- a/src/mainwidget.h +++ b/src/mainwidget.h @@ -1,10 +1,11 @@ -#ifndef MAINWIDGET_H -#define MAINWIDGET_H +#ifndef _MAINWIDGET_H_ +#define _MAINWIDGET_H_ #include -#include "irctrl.h" +#include "iremote.h" +class IEngine; class QGridLayout; class QToolButton; class QSettings; @@ -12,6 +13,7 @@ class QSettings; class MainWidget : public QWidget { Q_OBJECT + public: MainWidget (QWidget *parent = NULL); ~MainWidget(); @@ -19,16 +21,21 @@ public: public slots: void showSettingsDialog(); +private slots: + void sendCmdClicked(IRemote::RemoteCmd cmd); + protected: void paintEvent(QPaintEvent *event); private: void resize(); + +private: + IEngine *engine; + QSettings *settings; static const int BUTTON_COUNT = 6; QGridLayout *layout; QToolButton *buttons[BUTTON_COUNT]; - IrCtrl irCtrl; - QSettings *settings; }; #endif diff --git a/src/model.h b/src/model.h index d22681b..638644a 100644 --- a/src/model.h +++ b/src/model.h @@ -7,20 +7,20 @@ struct Model { } - Model(const QString &name, const QString &file) + Model(const QString &name, const QString &id) : name(name) - , file(file) + , id(id) { } Model(const Model &m) : name(m.name) - , file(m.file) + , id(m.id) { } QString name; - QString file; + QString id; }; #endif // _MODEL_H_ diff --git a/src/netio.cpp b/src/netio.cpp new file mode 100644 index 0000000..2a5a164 --- /dev/null +++ b/src/netio.cpp @@ -0,0 +1,18 @@ +#include + +#include "netio.h" + +NetIO::NetIO() +{ +} + +NetIO::~NetIO() +{ +} + +void NetIO::ratingById(const QString &id) +{ + emit ratingDownloaded(1234); +} + + diff --git a/src/netio.h b/src/netio.h new file mode 100644 index 0000000..94745d7 --- /dev/null +++ b/src/netio.h @@ -0,0 +1,23 @@ +#ifndef _NETIO_H_ +#define _NETIO_H_ + +#include + +class QString; + +class NetIO : public QObject +{ + Q_OBJECT + +public: + NetIO(); + ~NetIO(); + + void ratingById(const QString &id); + +signals: + void ratingDownloaded(int); +}; + +#endif // _NETIO_H_ + diff --git a/src/remote.cpp b/src/remote.cpp new file mode 100644 index 0000000..7ebab5a --- /dev/null +++ b/src/remote.cpp @@ -0,0 +1,103 @@ +#include "irctrl.h" +#include "remote.h" +#include "netio.h" + +#include + +Remote::Remote() + : rated(false) + , model("", "") + , settings(new QSettings()) + , irCtrl(new IrCtrl()) + , netIO(NULL) +{ +} + +Remote::Remote(const QString &id, NetIO *netIO) + : rated(false) + , settings(new QSettings()) + , irCtrl(new IrCtrl()) + , netIO(netIO) +{ + setId(id); +} + +Remote::~Remote() +{ + delete settings; + delete irCtrl; +} + +const QString &Remote::id() const +{ + return model.id; +} + +void Remote::setId(const QString &id) +{ + model.id = id; +} + +void Remote::setNetIO(NetIO *netIO) +{ + this->netIO = netIO; +} + +void Remote::updateRating() +{ + connect(netIO, SIGNAL(ratingDownloaded(int)), + this, SIGNAL(ratingChanged(int))); + netIO->ratingById(model.id); +} + +void Remote::sendRating(bool) +{ +} + +void Remote::sendCmd(RemoteCmd cmd) +{ + switch (cmd) + { + case VOLUMEUP: + irCtrl->sendCmd( + model.name, + settings->value("cmdVolumeUp", "VOLUP").toString()); + break; + + case VOLUMEDOWN: + irCtrl->sendCmd( + model.name, + settings->value("cmdVolumeDown", "VOLUP").toString()); + break; + + case CHANNELUP: + irCtrl->sendCmd( + model.name, + settings->value("cmdChannelUp", "CHUP").toString()); + break; + + case CHANNELDOWN: + irCtrl->sendCmd( + model.name, + settings->value("cmdChannelDown", "CHDOWN").toString()); + break; + + case POWER: + irCtrl->sendCmd( + model.name, + settings->value("cmdPower", "POWER").toString()); + break; + + case MUTE: + irCtrl->sendCmd( + model.name, + settings->value("cmdMute", "MUTE").toString()); + break; + + default: + break; + } +} + + + diff --git a/src/remote.h b/src/remote.h new file mode 100644 index 0000000..3840360 --- /dev/null +++ b/src/remote.h @@ -0,0 +1,43 @@ +#ifndef _REMOTE_H_ +#define _REMOTE_H_ + +#include "iremote.h" +#include "model.h" + +#include + +class IrCtrl; +class NetIO; +class QSettings; + +class Remote : public IRemote +{ +public: + Remote(); + Remote(const QString &id, NetIO *); + ~Remote(); + + const QString &id() const; + void setId(const QString &id); + void setNetIO(NetIO *); + + // visible for gui + void updateRating(); + void sendRating(bool good); + void sendCmd(RemoteCmd); + +private: + Remote(const Remote &remote); + +private: + bool rated; + Model model; + QSettings *settings; + IrCtrl *irCtrl; + NetIO *netIO; +}; + +#endif // _REMOTE_H_ + + + diff --git a/src/remotedbparser.cpp b/src/remotedbparser.cpp new file mode 100644 index 0000000..e5068e5 --- /dev/null +++ b/src/remotedbparser.cpp @@ -0,0 +1,114 @@ +#include "remotedbparser.h" + +#include +#include +#include +#include + +RemoteDbParser::RemoteDbParser() + : valid(false) +{ +} + +RemoteDbParser::RemoteDbParser(const RemoteDbParser &r) + : valid(r.valid) + , mfgMap(r.mfgMap) + , modelMap(r.modelMap) +{ +} + +RemoteDbParser::RemoteDbParser(QDomDocument &doc) +{ + parse(doc); +} + +RemoteDbParser::~RemoteDbParser() +{ +} + +void RemoteDbParser::setContent(QDomDocument &doc) +{ + mfgMap.clear(); + modelMap.clear(); + parse(doc); +} + +bool RemoteDbParser::isValid() +{ + return valid; +} + +QStringList RemoteDbParser::letters() +{ + return mfgMap.keys(); +} + +QStringList RemoteDbParser::manufacturers(const QString &letter) +{ + return mfgMap.value(letter); +} + +QList RemoteDbParser::models(const QString &manufacturer) +{ + return modelMap.value(manufacturer); +} + +void RemoteDbParser::parse(QDomDocument &doc) +{ + QDomNodeList chars = doc.elementsByTagName("char"); + + for (int i = 0; i < chars.size(); ++i) + { + QDomElement charEl = chars.at(i).toElement(); + if (!charEl.isNull()) + { + if (charEl.hasAttribute("id")) + mfgMap.insert(charEl.attribute("id").at(0), parseMfgs(charEl)); + } + } + + // TODO: more error handling + valid = (mfgMap.size() > 0 && + modelMap.size() > 0); +} + +QStringList RemoteDbParser::parseMfgs(QDomElement &charEl) +{ + QStringList mfgStrings; + QDomNodeList mfgs = charEl.elementsByTagName("mfg"); + + for (int i = 0; i < mfgs.size(); ++i) + { + QDomElement mfgEl = mfgs.at(i).toElement(); + if (!mfgEl.isNull()) + { + if (mfgEl.hasAttribute("id")) + { + mfgStrings.append(mfgEl.attribute("id")); + modelMap.insert(mfgStrings.last(), parseModels(mfgEl)); + } + } + } + return mfgStrings; +} + +QList RemoteDbParser::parseModels(QDomElement &mfgEl) +{ + QList modelList; + QDomNodeList models = mfgEl.elementsByTagName("model"); + + for (int i = 0; i < models.size(); ++i) + { + QDomElement modelEl = models.at(i).toElement(); + if (!modelEl.isNull()) + { + if (modelEl.hasAttribute("name") && modelEl.hasAttribute("id")) + { + modelList.append(Model(modelEl.attribute("name"), + modelEl.attribute("id"))); + } + } + } + return modelList; +} + diff --git a/src/remotedbparser.h b/src/remotedbparser.h new file mode 100644 index 0000000..2732df0 --- /dev/null +++ b/src/remotedbparser.h @@ -0,0 +1,40 @@ +#ifndef _REMOTEDBPARSER_H_ +#define _REMOTEDBPARSER_H_ + +#include +#include +#include +#include +#include "model.h" + +class RemoteDbParser +{ +public: + RemoteDbParser(); + RemoteDbParser(const RemoteDbParser &); + RemoteDbParser(QDomDocument &); + ~RemoteDbParser(); + + void setContent(QDomDocument &); + + // Returns false if document is not set or it's invalid + bool isValid(); + + QStringList letters(); + QStringList manufacturers(const QString &letter); + QList models(const QString &manufacturer); + +private: + void parse(QDomDocument &doc); + QStringList parseMfgs(QDomElement &charEl); + QList parseModels(QDomElement &mfgEl); + +private: + bool valid; + QMap mfgMap; + QMap > modelMap; +}; + +#endif // _REMOTEDBPARSER_H_ + + diff --git a/src/remotelist.cpp b/src/remotelist.cpp deleted file mode 100644 index 5d33a3f..0000000 --- a/src/remotelist.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "remotelist.h" - -#include -#include -#include -#include - -RemoteList::RemoteList() - : valid(false) -{ -} - -RemoteList::RemoteList(const RemoteList &r) - : valid(r.valid) - , mfgMap(r.mfgMap) - , modelMap(r.modelMap) -{ -} - -RemoteList::RemoteList(QDomDocument &doc) -{ - parse(doc); -} - -RemoteList::~RemoteList() -{ -} - -void RemoteList::setContent(QDomDocument &doc) -{ - mfgMap.clear(); - modelMap.clear(); - parse(doc); -} - -bool RemoteList::isValid() -{ - return valid; -} - -QStringList RemoteList::letters() -{ - return mfgMap.keys(); -} - -QStringList RemoteList::manufacturers(const QString &letter) -{ - return mfgMap.value(letter); -} - -QList RemoteList::models(const QString &manufacturer) -{ - return modelMap.value(manufacturer); -} - -void RemoteList::parse(QDomDocument &doc) -{ - QDomNodeList chars = doc.elementsByTagName("char"); - - for (int i = 0; i < chars.size(); ++i) - { - QDomElement charEl = chars.at(i).toElement(); - if (!charEl.isNull()) - { - if (charEl.hasAttribute("id")) - mfgMap.insert(charEl.attribute("id").at(0), parseMfgs(charEl)); - } - } - - // TODO: more error handling - valid = (mfgMap.size() > 0 && - modelMap.size() > 0); -} - -QStringList RemoteList::parseMfgs(QDomElement &charEl) -{ - QStringList mfgStrings; - QDomNodeList mfgs = charEl.elementsByTagName("mfg"); - - for (int i = 0; i < mfgs.size(); ++i) - { - QDomElement mfgEl = mfgs.at(i).toElement(); - if (!mfgEl.isNull()) - { - if (mfgEl.hasAttribute("id")) - { - mfgStrings.append(mfgEl.attribute("id")); - modelMap.insert(mfgStrings.last(), parseModels(mfgEl)); - } - } - } - return mfgStrings; -} - -QList RemoteList::parseModels(QDomElement &mfgEl) -{ - QList modelList; - QDomNodeList models = mfgEl.elementsByTagName("model"); - - for (int i = 0; i < models.size(); ++i) - { - QDomElement modelEl = models.at(i).toElement(); - if (!modelEl.isNull()) - { - if (modelEl.hasAttribute("name") && modelEl.hasAttribute("file")) - { - modelList.append(Model(modelEl.attribute("name"), - modelEl.attribute("file"))); - } - } - } - return modelList; -} - diff --git a/src/remotelist.h b/src/remotelist.h deleted file mode 100644 index 28481a3..0000000 --- a/src/remotelist.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _REMOTELIST_H_ -#define _REMOTELIST_H_ - -#include -#include -#include -#include -#include "model.h" - -class RemoteList -{ -public: - RemoteList(); - RemoteList(const RemoteList &); - RemoteList(QDomDocument &); - ~RemoteList(); - - void setContent(QDomDocument &); - - // Returns false if document is not set or it's invalid - bool isValid(); - - QStringList letters(); - QStringList manufacturers(const QString &letter); - QList models(const QString &manufacturer); - -private: - void parse(QDomDocument &doc); - QStringList parseMfgs(QDomElement &charEl); - QList parseModels(QDomElement &mfgEl); - -private: - bool valid; - QMap mfgMap; - QMap > modelMap; -}; - -#endif // _REMOTELIST_H_ - - - diff --git a/src/selectremotedlg.cpp b/src/selectremotedlg.cpp index 898c6e1..a74c8b5 100644 --- a/src/selectremotedlg.cpp +++ b/src/selectremotedlg.cpp @@ -1,7 +1,8 @@ #include "selectremotedlg.h" -#include "remotelist.h" +#include "remotedbparser.h" #include "model.h" +#include "iengine.h" #include @@ -24,68 +25,69 @@ #include #include -SelectRemoteDlg::SelectRemoteDlg(QWidget *parent) +SelectRemoteDlg::SelectRemoteDlg(QWidget *parent, IEngine *engine) : QDialog(parent) { - this->setWindowTitle(tr("Select remote")); - this->setMinimumHeight(320); - - deviceNameMap = new QMap(); - settings = new QSettings(this); - remoteList = NULL; - - layout = new QHBoxLayout(this); - - alphabetList = new QListWidget(this); - alphabetList->setMaximumWidth(96); - layout->addWidget(alphabetList); - connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*))); - - mfgList = new QListWidget(this); - layout->addWidget(mfgList); - connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*))); - - modelList = new QListWidget(this); - layout->addWidget(modelList); - - downloadBtn = new QPushButton(tr("Download"), this); - layout->addWidget(downloadBtn); - connect(downloadBtn, SIGNAL(clicked()), - this, SLOT(downloadRemote())); - - this->setLayout(layout); - - //TODO caching? - listNetAM = new QNetworkAccessManager(this); - connect(listNetAM, SIGNAL(finished(QNetworkReply*)), - this, SLOT(listDownloadFinished(QNetworkReply*))); - - remoteNetAM = new QNetworkAccessManager(this); - connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)), - this, SLOT(remoteDownloadFinished(QNetworkReply*))); - beginDownload(settings->value("dbUrl", - "http://mercury.wipsl.com/irwi/db.xml").toString(), listNetAM); +// this->setWindowTitle(tr("Select remote")); +// this->setMinimumHeight(320); +// +// deviceNameMap = new QMap(); +// settings = new QSettings(this); +// remoteList = NULL; +// +// layout = new QHBoxLayout(this); +// +// alphabetList = new QListWidget(this); +// alphabetList->setMaximumWidth(96); +// layout->addWidget(alphabetList); +// connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), +// this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*))); +// +// mfgList = new QListWidget(this); +// layout->addWidget(mfgList); +// connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), +// this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*))); +// +// modelList = new QListWidget(this); +// layout->addWidget(modelList); +// +// downloadBtn = new QPushButton(tr("Download"), this); +// layout->addWidget(downloadBtn); +// connect(downloadBtn, SIGNAL(clicked()), +// this, SLOT(downloadRemote())); +// +// this->setLayout(layout); +// +// //TODO caching? +// listNetAM = new QNetworkAccessManager(this); +// connect(listNetAM, SIGNAL(finished(QNetworkReply*)), +// this, SLOT(listDownloadFinished(QNetworkReply*))); +// +// remoteNetAM = new QNetworkAccessManager(this); +// connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)), +// this, SLOT(remoteDownloadFinished(QNetworkReply*))); +// beginDownload(settings->value("dbUrl", +// "http://mercury.wipsl.com/irwi/db.xml").toString(), listNetAM); } + SelectRemoteDlg::~SelectRemoteDlg() { - delete layout; - delete settings; - delete listNetAM; - delete remoteNetAM; - delete deviceNameMap; - if (remoteList) - { - delete remoteList; - } +// delete layout; +// delete settings; +// delete listNetAM; +// delete remoteNetAM; +// delete deviceNameMap; +// if (remoteList) +// { +// delete remoteList; +// } } void SelectRemoteDlg::setBusy(bool busy) { - setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy); - setEnabled(!busy); +// setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy); +// setEnabled(!busy); } void SelectRemoteDlg::beginDownload(const QString &url, @@ -98,91 +100,92 @@ void SelectRemoteDlg::beginDownload(const QString &url, void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current, QListWidgetItem * /*previous*/) { - mfgList->clear(); - modelList->clear(); - if (current) - { - mfgList->addItems(remoteList->manufacturers(current->text())); - } +// mfgList->clear(); +// modelList->clear(); +// if (current) +// { +// mfgList->addItems(remoteList->manufacturers(current->text())); +// } } void SelectRemoteDlg::listDownloadFinished(QNetworkReply *reply) { - if (reply->error() == QNetworkReply::NoError) { - QByteArray ba = reply->readAll(); - QBuffer buf(&ba, this); - buf.open(QIODevice::ReadOnly); - buf.seek(0); - QDomDocument doc; - doc.setContent(&buf); - remoteList = new RemoteList(doc); - QStringList alist = remoteList->letters(); - for (int i = 0; i < alist.size(); ++i) - { - alphabetList->addItem(QString(alist[i])); - } - } else { - //qDebug() << (int)reply->error(); - } - reply->close(); - reply->deleteLater(); - setBusy(false); +// if (reply->error() == QNetworkReply::NoError) { +// QByteArray ba = reply->readAll(); +// QBuffer buf(&ba, this); +// buf.open(QIODevice::ReadOnly); +// buf.seek(0); +// QDomDocument doc; +// doc.setContent(&buf); +// remoteList = new RemoteList(doc); +// QStringList alist = remoteList->letters(); +// for (int i = 0; i < alist.size(); ++i) +// { +// alphabetList->addItem(QString(alist[i])); +// } +// } else { +// //qDebug() << (int)reply->error(); +// } +// reply->close(); +// reply->deleteLater(); +// setBusy(false); } void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current, QListWidgetItem * /*previous*/) { - modelList->clear(); - deviceNameMap->clear(); - if (current) - { - QList models = remoteList->models(current->text()); - for (int i = 0; i < models.size(); ++i) - { - modelList->addItem(models[i].name); - deviceNameMap->insert(models[i].name, models[i].file); - } - - } +// modelList->clear(); +// deviceNameMap->clear(); +// if (current) +// { +// QList models = remoteList->models(current->text()); +// for (int i = 0; i < models.size(); ++i) +// { +// modelList->addItem(models[i].name); +// deviceNameMap->insert(models[i].name, models[i].file); +// } +// +// } } void SelectRemoteDlg::downloadRemote() { - QListWidgetItem *currentModel = modelList->currentItem(); - if (currentModel) - { - QString name = currentModel->text(); - if (!name.isEmpty()) { - QString url = settings->value( - "remoteUrl", - "http://mercury.wipsl.com/irwi/uploaded/").toString() - + (*deviceNameMap)[name]; - beginDownload(url, remoteNetAM); - settings->setValue("remoteName", name); - } - } +// QListWidgetItem *currentModel = modelList->currentItem(); +// if (currentModel) +// { +// QString name = currentModel->text(); +// if (!name.isEmpty()) { +// QString url = settings->value( +// "remoteUrl", +// "http://mercury.wipsl.com/irwi/uploaded/").toString() +// + (*deviceNameMap)[name]; +// beginDownload(url, remoteNetAM); +// settings->setValue("remoteName", name); +// } +// } } void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply) { - if (reply->error() == QNetworkReply::NoError) { - QFile file(settings->value("lircConf", "/etc/lircd.conf").toString()); - if(file.open(QIODevice::WriteOnly)) - { - file.write(reply->readAll()); - file.close(); - } - } - reply->close(); - reply->deleteLater(); - - std::system("sudo /etc/init.d/lirc reload"); - - emit remoteDownloaded(); - setBusy(false); - QMessageBox mbox(QMessageBox::Information, tr("Success"), - tr("Remote downloaded"), QMessageBox::Ok, this); - mbox.exec(); - this->close(); +// if (reply->error() == QNetworkReply::NoError) { +// QFile file(settings->value("lircConf", "/etc/lircd.conf").toString()); +// if(file.open(QIODevice::WriteOnly)) +// { +// file.write(reply->readAll()); +// file.close(); +// } +// } +// reply->close(); +// reply->deleteLater(); +// +// std::system("sudo /etc/init.d/lirc reload"); +// +// emit remoteDownloaded(); +// setBusy(false); +// QMessageBox mbox(QMessageBox::Information, tr("Success"), +// tr("Remote downloaded"), QMessageBox::Ok, this); +// mbox.exec(); +// this->close(); } + diff --git a/src/selectremotedlg.h b/src/selectremotedlg.h index 9685df0..3658ac0 100644 --- a/src/selectremotedlg.h +++ b/src/selectremotedlg.h @@ -15,12 +15,14 @@ class QWidget; class QPushButton; class QLabel; class RemoteList; +class IEngine; class SelectRemoteDlg : public QDialog { Q_OBJECT + public: - SelectRemoteDlg(QWidget *parent = 0); + SelectRemoteDlg(QWidget *parent, IEngine *engine); ~SelectRemoteDlg(); signals: @@ -36,6 +38,7 @@ private slots: void remoteDownloadFinished(QNetworkReply *reply); private: + IEngine *engine; QHBoxLayout *layout; QListWidget *alphabetList; QListWidget *mfgList; diff --git a/src/settingsdlg.cpp b/src/settingsdlg.cpp index 402028e..2b1b195 100644 --- a/src/settingsdlg.cpp +++ b/src/settingsdlg.cpp @@ -2,6 +2,8 @@ #include "advsettingsdlg.h" #include "selectremotedlg.h" #include "aboutdlg.h" +#include "iengine.h" +#include "iremote.h" #include #include @@ -10,9 +12,11 @@ #include #include #include +#include -SettingsDlg::SettingsDlg(QWidget *parent) +SettingsDlg::SettingsDlg(QWidget *parent, IEngine *engine) : QDialog(parent) + , engine(engine) { layout = new QVBoxLayout(this); btnLayout = new QHBoxLayout(this); @@ -23,6 +27,19 @@ SettingsDlg::SettingsDlg(QWidget *parent) selectRemoteBtn = new QPushButton(tr("Select remote"), this); aboutBtn = new QPushButton(tr("About"), this); + rateUpBtn = new QPushButton( + QIcon(settings.value("rateUpIcon", + "/usr/share/icons/hicolor/48x48/hildon/chat_smiley_happy.png"). + toString()), + "", this); + rateDownBtn = new QPushButton( + QIcon(settings.value("rateDownIcon", + "/usr/share/icons/hicolor/48x48/hildon/chat_smiley_sad.png"). + toString()), + "", this); + rateUpBtn->setMaximumSize(72, 72); + rateDownBtn->setMaximumSize(72, 72); + btnLayout->addWidget(advSettingsBtn); btnLayout->addWidget(selectRemoteBtn); btnLayout->addWidget(aboutBtn); @@ -35,16 +52,22 @@ SettingsDlg::SettingsDlg(QWidget *parent) this, SLOT(showAboutDlg())); remoteNameLabel = new QLabel( - settings.value("remoteName", - tr("")).toString(), this); + settings.value("remoteName", + tr("")).toString(), this); remoteNameLayout->addWidget(new QLabel(tr("Remote name: "), this)); remoteNameLayout->addWidget(remoteNameLabel); + remoteNameLayout->addWidget(rateUpBtn); + remoteNameLayout->addWidget(rateDownBtn); layout->addLayout(remoteNameLayout); layout->addLayout(btnLayout); this->setLayout(layout); updateRemoteName(); + + connect(engine->remote(), SIGNAL(ratingChanged(int)), + this, SLOT(setRating(int))); + engine->remote()->updateRating(); } SettingsDlg::~SettingsDlg() @@ -52,6 +75,8 @@ SettingsDlg::~SettingsDlg() delete advSettingsBtn; delete selectRemoteBtn; delete aboutBtn; + delete rateUpBtn; + delete rateDownBtn; delete remoteNameLabel; delete remoteNameLayout; delete btnLayout; @@ -60,14 +85,14 @@ SettingsDlg::~SettingsDlg() void SettingsDlg::showAdvSettingsDlg() { - AdvSettingsDlg dlg(this); + AdvSettingsDlg dlg(this, engine); dlg.exec(); updateRemoteName(); } void SettingsDlg::showSelectRemoteDlg() { - SelectRemoteDlg dlg(this); + SelectRemoteDlg dlg(this, engine); connect(&dlg, SIGNAL(remoteDownloaded()), this, SLOT(updateRemoteName())); dlg.exec(); @@ -83,7 +108,12 @@ void SettingsDlg::updateRemoteName() { QSettings settings(this); remoteNameLabel->setText(settings.value("remoteName", - tr("Select remote")).toString()); + tr("Select remote")).toString()); +} + +void SettingsDlg::setRating(int rating) +{ + qDebug() << rating; } diff --git a/src/settingsdlg.h b/src/settingsdlg.h index aec925a..a8e0079 100644 --- a/src/settingsdlg.h +++ b/src/settingsdlg.h @@ -8,12 +8,13 @@ class QHBoxLayout; class QVBoxLayout; class QPushButton; class QLabel; +class IEngine; class SettingsDlg : public QDialog { Q_OBJECT public: - SettingsDlg(QWidget *parent = 0); + SettingsDlg(QWidget *parent, IEngine *engine); ~SettingsDlg(); public slots: @@ -23,15 +24,20 @@ private slots: void showAdvSettingsDlg(); void showSelectRemoteDlg(); void showAboutDlg(); + void setRating(int); private: + IEngine *engine; QVBoxLayout *layout; QHBoxLayout *btnLayout; QHBoxLayout *remoteNameLayout; QPushButton *advSettingsBtn; QPushButton *selectRemoteBtn; + QPushButton *rateUpBtn; + QPushButton *rateDownBtn; QPushButton *aboutBtn; QLabel *remoteNameLabel; + QLabel *ratingLabel; }; #endif diff --git a/src/src.pro b/src/src.pro index ad23e74..d2e4b4f 100644 --- a/src/src.pro +++ b/src/src.pro @@ -4,27 +4,34 @@ TARGET = irwi SOURCES += main.cpp SOURCES += mainwidget.cpp SOURCES += irctrl.cpp -SOURCES += irctrl_p.cpp +SOURCES += remote.cpp +SOURCES += engine.cpp +SOURCES += remotedbparser.cpp +SOURCES += netio.cpp SOURCES += settingsdlg.cpp SOURCES += selectremotedlg.cpp SOURCES += advsettingsdlg.cpp SOURCES += settingstable.cpp SOURCES += aboutdlg.cpp -SOURCES += remotelist.cpp HEADERS += mainwidget.h HEADERS += irctrl.h -HEADERS += irctrl_p.h +HEADERS += remote.h +HEADERS += iremote.h +HEADERS += engine.h +HEADERS += iengine.h +HEADERS += remotedbparser.h +HEADERS += netio.h HEADERS += settingsdlg.h HEADERS += selectremotedlg.h HEADERS += advsettingsdlg.h HEADERS += settingstable.h HEADERS += aboutdlg.h -HEADERS += remotelist.h - include(qmaemo5homescreenadaptor/qmaemo5homescreenadaptor.pri) +OBJECTS_DIR = obj +MOC_DIR = moc QT += network QT += xml -- 1.7.9.5