Complete rewrite. Does not work yet.
authorJari Jarvi <t7jaja00@students.oamk.fi>
Wed, 16 Jun 2010 13:36:27 +0000 (16:36 +0300)
committerJari Jarvi <t7jaja00@students.oamk.fi>
Wed, 16 Jun 2010 13:36:27 +0000 (16:36 +0300)
26 files changed:
src/advsettingsdlg.cpp
src/advsettingsdlg.h
src/engine.cpp [new file with mode: 0644]
src/engine.h [new file with mode: 0644]
src/iengine.h [new file with mode: 0644]
src/irctrl.cpp
src/irctrl.h
src/irctrl_p.cpp [deleted file]
src/irctrl_p.h [deleted file]
src/iremote.h [new file with mode: 0644]
src/mainwidget.cpp
src/mainwidget.h
src/model.h
src/netio.cpp [new file with mode: 0644]
src/netio.h [new file with mode: 0644]
src/remote.cpp [new file with mode: 0644]
src/remote.h [new file with mode: 0644]
src/remotedbparser.cpp [new file with mode: 0644]
src/remotedbparser.h [new file with mode: 0644]
src/remotelist.cpp [deleted file]
src/remotelist.h [deleted file]
src/selectremotedlg.cpp
src/selectremotedlg.h
src/settingsdlg.cpp
src/settingsdlg.h
src/src.pro

index 014354e..e3d5351 100644 (file)
@@ -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)
index d3c2561..d04c7f5 100644 (file)
@@ -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 (file)
index 0000000..a449b85
--- /dev/null
@@ -0,0 +1,44 @@
+#include "engine.h"
+#include "remote.h"
+#include "iremote.h"
+#include "remotedbparser.h"
+#include "netio.h"
+
+#include <QDomDocument>
+
+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 (file)
index 0000000..cbee93b
--- /dev/null
@@ -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 (file)
index 0000000..591fe85
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _IENGINE_H_
+#define _IENGINE_H_
+
+#include <QString>
+
+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_
+
index 5a647d0..4f40027 100644 (file)
@@ -1,62 +1,51 @@
+#include <cstdlib>
+
 #include <QSettings>
+#include <QTimer>
+
 #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");
 }
 
 
index 6152335..3bc71b4 100644 (file)
@@ -4,7 +4,7 @@
 #include <QObject>
 #include <QString>
 
-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 (file)
index f44b23b..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#include <cstdlib>
-
-#include <QTcpSocket>
-#include <QHostAddress>
-#include <QAbstractSocket>
-#include <QSettings>
-#include <QTimer>
-
-#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 (file)
index 0fa5879..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef _IRCTRLPRIVATE_H_
-#define _IRCTRLPRIVATE_H_
-
-#include <QString>
-#include <QObject>
-#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 (file)
index 0000000..9ad96fd
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef _IREMOTE_H_
+#define _IREMOTE_H_
+
+#include <QObject>
+
+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_
+
index 48e049f..76a3ccf 100644 (file)
@@ -1,4 +1,7 @@
 #include "mainwidget.h"
+#include "engine.h"
+#include "iengine.h"
+#include "settingsdlg.h"
 
 #include <QInputDialog>
 #include <QPainter>
@@ -6,11 +9,12 @@
 #include <QToolButton>
 #include <QSettings>
 
-#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);
+
+}
+
+
index 1f74c10..4e211d9 100644 (file)
@@ -1,10 +1,11 @@
-#ifndef MAINWIDGET_H
-#define MAINWIDGET_H
+#ifndef _MAINWIDGET_H_
+#define _MAINWIDGET_H_
 
 #include <QWidget>
 
-#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
index d22681b..638644a 100644 (file)
@@ -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 (file)
index 0000000..2a5a164
--- /dev/null
@@ -0,0 +1,18 @@
+#include <QString>
+
+#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 (file)
index 0000000..94745d7
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _NETIO_H_
+#define _NETIO_H_
+
+#include <QObject>
+
+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 (file)
index 0000000..7ebab5a
--- /dev/null
@@ -0,0 +1,103 @@
+#include "irctrl.h"
+#include "remote.h"
+#include "netio.h"
+
+#include <QSettings>
+
+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 (file)
index 0000000..3840360
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef _REMOTE_H_
+#define _REMOTE_H_
+
+#include "iremote.h"
+#include "model.h"
+
+#include <QString>
+
+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 (file)
index 0000000..e5068e5
--- /dev/null
@@ -0,0 +1,114 @@
+#include "remotedbparser.h"
+
+#include <QFile> 
+#include <QDomElement> 
+#include <QDomNodeList> 
+#include <QDebug> 
+
+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<Model> 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<Model> RemoteDbParser::parseModels(QDomElement &mfgEl)
+{
+    QList<Model> 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 (file)
index 0000000..2732df0
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _REMOTEDBPARSER_H_
+#define _REMOTEDBPARSER_H_
+
+#include <QDomDocument>
+#include <QStringList>
+#include <QMap>
+#include <QList>
+#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<Model> models(const QString &manufacturer);
+
+private:
+    void parse(QDomDocument &doc);
+    QStringList parseMfgs(QDomElement &charEl);
+    QList<Model> parseModels(QDomElement &mfgEl);
+    
+private:
+    bool valid;
+    QMap<QString, QStringList> mfgMap;
+    QMap<QString, QList<Model> > modelMap;
+};
+
+#endif // _REMOTEDBPARSER_H_
+
+
diff --git a/src/remotelist.cpp b/src/remotelist.cpp
deleted file mode 100644 (file)
index 5d33a3f..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-#include "remotelist.h"
-
-#include <QFile> 
-#include <QDomElement> 
-#include <QDomNodeList> 
-#include <QDebug> 
-
-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<Model> 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<Model> RemoteList::parseModels(QDomElement &mfgEl)
-{
-    QList<Model> 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 (file)
index 28481a3..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef _REMOTELIST_H_
-#define _REMOTELIST_H_
-
-#include <QDomDocument>
-#include <QStringList>
-#include <QMap>
-#include <QList>
-#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<Model> models(const QString &manufacturer);
-
-private:
-    void parse(QDomDocument &doc);
-    QStringList parseMfgs(QDomElement &charEl);
-    QList<Model> parseModels(QDomElement &mfgEl);
-    
-private:
-    bool valid;
-    QMap<QString, QStringList> mfgMap;
-    QMap<QString, QList<Model> > modelMap;
-};
-
-#endif // _REMOTELIST_H_
-
-
-
index 898c6e1..a74c8b5 100644 (file)
@@ -1,7 +1,8 @@
 #include "selectremotedlg.h"
 
-#include "remotelist.h"
+#include "remotedbparser.h"
 #include "model.h"
+#include "iengine.h"
 
 #include <cstdlib>
 
 #include <QListWidgetItem>
 #include <QDomDocument>
 
-SelectRemoteDlg::SelectRemoteDlg(QWidget *parent)
+SelectRemoteDlg::SelectRemoteDlg(QWidget *parent, IEngine *engine)
     : QDialog(parent)
 {
-    this->setWindowTitle(tr("Select remote"));
-    this->setMinimumHeight(320);
-
-    deviceNameMap = new QMap<QString, QString>();
-    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<QString, QString>();
+//    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<Model> 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<Model> 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();
 }
 
+
index 9685df0..3658ac0 100644 (file)
@@ -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;
index 402028e..2b1b195 100644 (file)
@@ -2,6 +2,8 @@
 #include "advsettingsdlg.h"
 #include "selectremotedlg.h"
 #include "aboutdlg.h"
+#include "iengine.h"
+#include "iremote.h"
 
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QPushButton>
 #include <QSettings>
 #include <QLabel>
+#include <QDebug>
 
-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("<no remote selected>")).toString(), this);
+            settings.value("remoteName", 
+            tr("<no remote selected>")).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;
 }
 
 
index aec925a..a8e0079 100644 (file)
@@ -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
index ad23e74..d2e4b4f 100644 (file)
@@ -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