+/////////////////////////////////////////////////////////////////////
+//
+DisconnectedState::DisconnectedState(QAbstractButton *button, QTcpSocket* socket, QState *parent)
+ : QState(parent), m_socket(socket)
+{
+ assignProperty(button, "text", "Connect");
+ assignProperty(button, "enabled", true);
+}
+
+void DisconnectedState::onEntry(QEvent */*event*/)
+{
+ qDebug("DisconnectedState::onEntry");
+}
+
+void DisconnectedState::onExit(QEvent */*event*/)
+{
+ qDebug("DisconnectedState::onExit");
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+ConnectingState::ConnectingState(QAbstractButton *button, QTcpSocket* socket, QState *parent)
+ : QState(parent), m_socket(socket)
+{
+ assignProperty(button, "text", "Connecting");
+ assignProperty(button, "enabled", false);
+}
+
+void ConnectingState::onEntry(QEvent */*event*/)
+{
+ qDebug("ConnectingState::onEntry");
+
+ connect(m_socket, SIGNAL(connected()), this, SIGNAL(connected()));
+ connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError)));
+
+ // 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;
+
+ m_socket->connectToHost(settings.value(SETUP_XBMC_SERVER, SETUP_XBMC_SERVER_DEFAULT).toString(),
+ settings.value(SETUP_XBMC_PORT, SETUP_XBMC_PORT_DEFAULT).toInt());
+}
+
+void ConnectingState::onExit(QEvent */*event*/)
+{
+ disconnect(m_socket, 0, this, 0);
+ qDebug("ConnectingState::onExit");
+}
+
+void ConnectingState::onSocketError(QAbstractSocket::SocketError)
+{
+ qDebug("ConnectingState::onSocketError: %s", qPrintable(m_socket->errorString()));
+ emit failed();
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+ConnectedState::ConnectedState(QAbstractButton *button, QTcpSocket* socket, QState *parent)
+ : QState(parent), m_socket(socket)
+{
+ assignProperty(button, "text", "Disconnect");
+ assignProperty(button, "enabled", true);
+}
+
+void ConnectedState::onEntry(QEvent */*event*/)
+{
+ qDebug("ConnectedState::onEntry");
+
+ connect(m_socket, SIGNAL(readyRead()), this, SLOT(onSocketData()));
+ connect(m_socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
+ connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError)));
+}
+
+void ConnectedState::onExit(QEvent */*event*/)
+{
+ disconnect(m_socket, 0, this, 0);
+ qDebug("ConnectedState::onExit");
+}
+
+void ConnectedState::onSocketError(QAbstractSocket::SocketError)
+{
+ qDebug("ConnectedState::onSocketError: %s", qPrintable(m_socket->errorString()));
+}
+
+void ConnectedState::onSocketData()
+{
+ QTextStream stream(m_socket);
+ QString msg = stream.readAll();
+ qDebug("ConnectedState::onSocketData: %s", qPrintable(msg));
+}
+
+/////////////////////////////////////////////////////////////////////
+//
+DisconnectingState::DisconnectingState(QAbstractButton *button, QTcpSocket* socket, QState *parent)
+ : QState(parent), m_socket(socket)
+{
+ assignProperty(button, "text", "Disconnecting");
+ assignProperty(button, "enabled", false);
+}
+
+void DisconnectingState::onEntry(QEvent */*event*/)
+{
+ qDebug("DisconnectingState::onEntry");
+
+ connect(m_socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
+ connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError)));
+
+ if (m_socket->state() != QTcpSocket::UnconnectedState) {
+ qDebug("DisconnectingState::disconnectFromHost");
+ m_socket->disconnectFromHost();
+ }
+ else {
+ qDebug("DisconnectingState::disconnect");
+ QTimer::singleShot(0, this, SIGNAL(disconnected()));
+ }
+}
+
+void DisconnectingState::onExit(QEvent */*event*/)
+{
+ disconnect(m_socket, 0, this, 0);
+ qDebug("DisconnectingState::onExit");
+}
+
+void DisconnectingState::onSocketError(QAbstractSocket::SocketError)
+{
+ qDebug("DisconnectingState::onSocketError: %s", qPrintable(m_socket->errorString()));
+}
+
+/////////////////////////////////////////////////////////////////////
+//