Switched to using QStateMachine.
[simple-xmbc-rem] / src / mainwindow.cpp
index b7a7495..8fcae21 100644 (file)
 #include "mainwindow.h"
 #include "ui_mainwindow.h"
 
-#include <setupdialog.h>
+#include "constants.h"
+#include "setupdialog.h"
+#include "json.h"
 
 #include <QtCore/QCoreApplication>
+#include <QtCore/QSettings>
+#include <QtCore/QTimer>
+#include <QtCore/QTextStream>
 
 #if defined(Q_OS_SYMBIAN) && defined(ORIENTATIONLOCK)
 #include <eikenv.h>
@@ -25,6 +30,13 @@ MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent), ui(new Ui::MainWindow)
 {
     ui->setupUi(this);
+
+    createStates();
+    createTransitions();
+    createConnections();
+
+    stateMachine.setInitialState(disconnectedState);
+    QTimer::singleShot(0, &stateMachine, SLOT(start()));
 }
 
 MainWindow::~MainWindow()
@@ -89,3 +101,57 @@ void MainWindow::on_actionSetup_triggered()
         dialog.save();
     }
 }
+
+void MainWindow::connectToServer()
+{
+    // TODO: we asume the socket is not already connected
+    // TODO: we should add code to do nothing if the connection is ok, or close and open a new one if the server or port changed
+    QSettings settings;
+
+    serverSocket.connectToHost(settings.value(SETUP_XBMC_SERVER, SETUP_XBMC_SERVER_DEFAULT).toString(),
+                               settings.value(SETUP_XBMC_PORT, SETUP_XBMC_PORT_DEFAULT).toInt());
+}
+
+void MainWindow::disconnectFromServer()
+{
+    serverSocket.disconnectFromHost();
+}
+
+void MainWindow::createStates()
+{
+    disconnectedState = new QState(&stateMachine);
+    disconnectedState->assignProperty(ui->networkButton, "text", "Connect");
+    disconnectedState->assignProperty(ui->networkButton, "enabled", true);
+
+    connectedState = new QState(&stateMachine);
+
+    connectingState = new QState(connectedState);
+    connectingState->assignProperty(ui->networkButton, "text", "Connecting");
+    connectingState->assignProperty(ui->networkButton, "enabled", false);
+
+    normalState = new QState(connectedState);
+    normalState->assignProperty(ui->networkButton, "text", "Disconnect");
+    normalState->assignProperty(ui->networkButton, "enabled", true);
+
+    disconnectingState = new QState(connectedState);
+    disconnectingState->assignProperty(ui->networkButton, "text", "Disconnecting");
+    disconnectingState->assignProperty(ui->networkButton, "enabled", false);
+}
+
+void MainWindow::createTransitions()
+{
+    disconnectedState->addTransition(ui->networkButton, SIGNAL(clicked()), connectingState);
+
+    connectedState->addTransition(&serverSocket, SIGNAL(disconnected()), disconnectedState);
+
+    connectingState->addTransition(&serverSocket, SIGNAL(connected()), normalState);
+    connectingState->addTransition(&serverSocket, SIGNAL(error(QAbstractSocket::SocketError)), disconnectedState);
+
+    normalState->addTransition(ui->networkButton, SIGNAL(clicked()), disconnectingState);
+}
+
+void MainWindow::createConnections()
+{
+    connect(connectingState, SIGNAL(entered()), this, SLOT(connectToServer()));
+    connect(disconnectingState, SIGNAL(entered()), this, SLOT(disconnectFromServer()));
+}