From bc4fc2425f923f4ad2027cea61dac1a6c7ee6c08 Mon Sep 17 00:00:00 2001 From: Ionutz Borcoman Date: Sat, 5 Mar 2011 17:34:02 +0200 Subject: [PATCH 1/1] use http for sending commands --- src/constants.h | 23 ++++ src/json.cpp | 10 ++ src/json.h | 6 +- src/main.cpp | 2 + src/mainwindow.cpp | 294 +++++++++++++++++++++++++++++++------------ src/mainwindow.h | 30 ++++- src/mainwindow.ui | 237 +++++++++++++++++++++++++++++++++- src/xbmcnetmoviesremote.pro | 2 +- 8 files changed, 521 insertions(+), 83 deletions(-) diff --git a/src/constants.h b/src/constants.h index 2adece1..5b27fa8 100644 --- a/src/constants.h +++ b/src/constants.h @@ -11,4 +11,27 @@ #define SETUP_XBMC_PORT "xbmc/port" #define SETUP_XBMC_PORT_DEFAULT "9090" +// XBMC constants -- from https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h +#define ACTION_MOVE_LEFT 1 +#define ACTION_MOVE_RIGHT 2 +#define ACTION_MOVE_UP 3 +#define ACTION_MOVE_DOWN 4 +#define ACTION_NEXT_SUBTITLE 26 // switch to next subtitle of movie. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_SUBTITLE_DELAY_MIN 52 // Decrease subtitle/movie Delay. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_SUBTITLE_DELAY_PLUS 53 // Increase subtitle/movie Delay. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_AUDIO_DELAY_MIN 54 // Increase avsync delay. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_AUDIO_DELAY_PLUS 55 // Decrease avsync delay. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_AUDIO_NEXT_LANGUAGE 56 // Select next language in movie. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_ENTER 135 +#define ACTION_SHOW_GUI 18 // toggle between GUI and movie or GUI and visualisation. +#define ACTION_STEP_FORWARD 20 // seek +1% in the movie. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_STEP_BACK 21 // seek -1% in the movie. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_BIG_STEP_FORWARD 22 // seek +10% in the movie. Can b used in videoFullScreen.xml window id=2005 +#define ACTION_BIG_STEP_BACK 23 // seek -10% in the movie. Can b used in videoFullScreen.xml window id=2005 + +#define ACTION_PLAYER_PLAY 79 // Play current song. Unpauses song and sets playspeed to 1x. global action, can be used anywhere +#define ACTION_SELECT_ITEM 7 +#define ACTION_HIGHLIGHT_ITEM 8 +#define ACTION_PARENT_DIR 9 + #endif // SETTINGS_H diff --git a/src/json.cpp b/src/json.cpp index 095c3f1..072fced 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -18,3 +18,13 @@ QString JsonEngine::playerGetActivePlayers() { return serialize("Player.GetActivePlayers"); } + +QString JsonEngine::videoPlayerState() +{ + return serialize("VideoPlayer.State"); +} + +QString JsonEngine::videoPlayerPlayPause() +{ + return serialize("VideoPlayer.PlayPause"); +} diff --git a/src/json.h b/src/json.h index 38e9177..45b23a4 100644 --- a/src/json.h +++ b/src/json.h @@ -5,12 +5,16 @@ class JsonEngine { - QString serialize(const QString& method); static int id; public: JsonEngine(); QString playerGetActivePlayers(); + QString videoPlayerState(); + QString videoPlayerPlayPause(); + + // make this private + QString serialize(const QString& method); }; #endif // JSON_H diff --git a/src/main.cpp b/src/main.cpp index bb6450d..bc7d350 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include "constants.h" #include +#include int main(int argc, char *argv[]) { @@ -13,5 +14,6 @@ int main(int argc, char *argv[]) mainWindow.setOrientation(MainWindow::ScreenOrientationAuto); mainWindow.showExpanded(); + return app.exec(); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e152515..f4e57c1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #if defined(Q_OS_SYMBIAN) && defined(ORIENTATIONLOCK) #include @@ -26,10 +27,141 @@ #include #endif // Q_OS_SYMBIAN && ORIENTATIONLOCK +///////////////////////////////////////////////////////////////////// +// +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())); +} + +///////////////////////////////////////////////////////////////////// +// MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow) { m_ui->setupUi(this); + m_manager = new QNetworkAccessManager(this); createStates(); createTransitions(); @@ -42,6 +174,7 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { delete m_ui; + delete m_manager; } void MainWindow::setOrientation(ScreenOrientation orientation) @@ -125,137 +258,144 @@ void MainWindow::createTransitions() void MainWindow::createConnections() { + connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onNetworAccesskManagerReplyFinished(QNetworkReply*))); } -///////////////////////////////////////////////////////////////////// -// -DisconnectedState::DisconnectedState(QAbstractButton *button, QTcpSocket* socket, QState *parent) - : QState(parent), m_socket(socket) +void MainWindow::on_videoPlayerStateBtn_clicked() { - assignProperty(button, "text", "Connect"); - assignProperty(button, "enabled", true); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().videoPlayerState(); } -void DisconnectedState::onEntry(QEvent */*event*/) +void MainWindow::on_videoPlayerPlayPauseBtn_clicked() { - qDebug("DisconnectedState::onEntry"); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().videoPlayerPlayPause(); } -void DisconnectedState::onExit(QEvent */*event*/) +void MainWindow::on_videoPlayerStopBtn_clicked() { - qDebug("DisconnectedState::onExit"); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.Stop"); } -///////////////////////////////////////////////////////////////////// -// -ConnectingState::ConnectingState(QAbstractButton *button, QTcpSocket* socket, QState *parent) - : QState(parent), m_socket(socket) +void MainWindow::on_videoPlayerSkipPreviousBtn_clicked() { - assignProperty(button, "text", "Connecting"); - assignProperty(button, "enabled", false); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.SkipPrevious"); } -void ConnectingState::onEntry(QEvent */*event*/) +void MainWindow::on_videoPlayerSkipNextBtn_clicked() { - qDebug("ConnectingState::onEntry"); - - connect(m_socket, SIGNAL(connected()), this, SIGNAL(connected())); - connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError))); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.SkipNext"); +} - // 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; +void MainWindow::on_videoPlayerBigSkipBackwardBtn_clicked() +{ + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.BigSkipBackward"); +} - m_socket->connectToHost(settings.value(SETUP_XBMC_SERVER, SETUP_XBMC_SERVER_DEFAULT).toString(), - settings.value(SETUP_XBMC_PORT, SETUP_XBMC_PORT_DEFAULT).toInt()); +void MainWindow::on_videoPlayerBigSkipForwardBtn_clicked() +{ + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.BigSkipForward"); } -void ConnectingState::onExit(QEvent */*event*/) +void MainWindow::on_videoPlayerSmallSkipBackwardBtn_clicked() { - disconnect(m_socket, 0, this, 0); - qDebug("ConnectingState::onExit"); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.SmallSkipBackward"); } -void ConnectingState::onSocketError(QAbstractSocket::SocketError) +void MainWindow::on_videoPlayerSmallSkipForwardBtn_clicked() { - qDebug("ConnectingState::onSocketError: %s", qPrintable(m_socket->errorString())); - emit failed(); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.SmallSkipForward"); } -///////////////////////////////////////////////////////////////////// -// -ConnectedState::ConnectedState(QAbstractButton *button, QTcpSocket* socket, QState *parent) - : QState(parent), m_socket(socket) +void MainWindow::on_videoPlayerGetTimeBtn_clicked() { - assignProperty(button, "text", "Disconnect"); - assignProperty(button, "enabled", true); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("VideoPlayer.GetTime"); } -void ConnectedState::onEntry(QEvent */*event*/) +void MainWindow::on_xbmcGetVolumeBtn_clicked() { - qDebug("ConnectedState::onEntry"); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("XBMC.GetVolume"); +} - 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 MainWindow::on_xbmcToggleMuteBtn_clicked() +{ + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("XBMC.ToggleMute"); +} - QTextStream stream(m_socket); - stream << JsonEngine().playerGetActivePlayers(); +void MainWindow::on_xbmcPlayBtn_clicked() +{ + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("XBMC.Play"); +} - qDebug("ConnectedState::onEntry - request sent"); +void MainWindow::on_xbmcQuitBtn_clicked() +{ + QTextStream stream(&m_serverSocket); + stream << JsonEngine().serialize("XBMC.Quit"); } -void ConnectedState::onExit(QEvent */*event*/) +void MainWindow::on_playerGetActivePlayers_clicked() { - disconnect(m_socket, 0, this, 0); - qDebug("ConnectedState::onExit"); + QTextStream stream(&m_serverSocket); + stream << JsonEngine().playerGetActivePlayers(); } -void ConnectedState::onSocketError(QAbstractSocket::SocketError) +void MainWindow::on_actionLeftBtn_clicked() { - qDebug("ConnectedState::onSocketError: %s", qPrintable(m_socket->errorString())); + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_MOVE_LEFT)))); } -void ConnectedState::onSocketData() +void MainWindow::onNetworAccesskManagerReplyFinished(QNetworkReply *reply) { - QTextStream stream(m_socket); + QTextStream stream(reply); QString msg = stream.readAll(); - qDebug("ConnectedState::onSocketData: %s", qPrintable(msg)); + qDebug("MainWindow::onNetworAccesskManagerReplyFinished: %s", qPrintable(msg)); + + reply->deleteLater(); } -///////////////////////////////////////////////////////////////////// -// -DisconnectingState::DisconnectingState(QAbstractButton *button, QTcpSocket* socket, QState *parent) - : QState(parent), m_socket(socket) +void MainWindow::on_actionRightBtn_clicked() { - assignProperty(button, "text", "Disconnecting"); - assignProperty(button, "enabled", false); + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_MOVE_RIGHT)))); } -void DisconnectingState::onEntry(QEvent */*event*/) +void MainWindow::on_actionUpBtn_clicked() { - qDebug("DisconnectingState::onEntry"); + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_MOVE_UP)))); +} - connect(m_socket, SIGNAL(disconnected()), this, SIGNAL(disconnected())); - connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError))); +void MainWindow::on_actionDownBtn_clicked() +{ + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_MOVE_DOWN)))); +} - if (m_socket->state() != QTcpSocket::UnconnectedState) { - qDebug("DisconnectingState::disconnectFromHost"); - m_socket->disconnectFromHost(); - } - else { - qDebug("DisconnectingState::disconnect"); - QTimer::singleShot(0, this, SIGNAL(disconnected())); - } +void MainWindow::on_actionEnterBtn_clicked() +{ + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_ENTER)))); } -void DisconnectingState::onExit(QEvent */*event*/) +void MainWindow::on_actionPlayBtn_clicked() { - disconnect(m_socket, 0, this, 0); - qDebug("DisconnectingState::onExit"); + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_PLAYER_PLAY)))); } -void DisconnectingState::onSocketError(QAbstractSocket::SocketError) +void MainWindow::on_actionSelectItemBtn_clicked() { - qDebug("DisconnectingState::onSocketError: %s", qPrintable(m_socket->errorString())); + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_SELECT_ITEM)))); +} + +void MainWindow::on_actionParentDirBtn_clicked() +{ + m_manager->get(QNetworkRequest(QUrl(QString("http://localhost:8080/xbmcCmds/xbmcHttp?command=Action(%1)").arg(ACTION_PARENT_DIR)))); } diff --git a/src/mainwindow.h b/src/mainwindow.h index beb9299..4ef3104 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -10,11 +10,12 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include +#include #include #include #include #include +#include namespace Ui { class MainWindow; @@ -106,6 +107,32 @@ public: private slots: // auto-connected slots void on_actionSetup_triggered(); + void on_videoPlayerStateBtn_clicked(); + void on_videoPlayerPlayPauseBtn_clicked(); + void on_videoPlayerStopBtn_clicked(); + void on_videoPlayerSkipPreviousBtn_clicked(); + void on_videoPlayerSkipNextBtn_clicked(); + void on_videoPlayerBigSkipBackwardBtn_clicked(); + void on_videoPlayerBigSkipForwardBtn_clicked(); + void on_videoPlayerSmallSkipBackwardBtn_clicked(); + void on_videoPlayerSmallSkipForwardBtn_clicked(); + void on_videoPlayerGetTimeBtn_clicked(); + void on_xbmcGetVolumeBtn_clicked(); + void on_xbmcToggleMuteBtn_clicked(); + void on_xbmcPlayBtn_clicked(); + void on_xbmcQuitBtn_clicked(); + void on_playerGetActivePlayers_clicked(); + void on_actionLeftBtn_clicked(); + + void onNetworAccesskManagerReplyFinished(QNetworkReply* reply); + + void on_actionRightBtn_clicked(); + void on_actionUpBtn_clicked(); + void on_actionDownBtn_clicked(); + void on_actionEnterBtn_clicked(); + void on_actionPlayBtn_clicked(); + void on_actionSelectItemBtn_clicked(); + void on_actionParentDirBtn_clicked(); private: void pendingNetworkOperation(bool pending); @@ -115,6 +142,7 @@ private: void createConnections(); QTcpSocket m_serverSocket; + QNetworkAccessManager *m_manager; Ui::MainWindow *m_ui; QStateMachine m_stateMachine; diff --git a/src/mainwindow.ui b/src/mainwindow.ui index fa7ff30..e8808e2 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -29,9 +29,240 @@ - - 0 - + + + + + + VideoPlayer.State + + + ... + + + + + + + VideoPlayer.PlayPause + + + ... + + + + + + + VideoPlayer.Stop + + + ... + + + + + + + left + + + ... + + + + + + + XBMC.GetVolume + + + ... + + + + + + + VideoPlayer.BigSkipBackward + + + ... + + + + + + + VideoPlayer.BigSkipForward + + + ... + + + + + + + VideoPlayer.SmallSkipBackward + + + ... + + + + + + + XBMC.ToggleMute + + + ... + + + + + + + XBMC.Play + + + ... + + + + + + + right + + + ... + + + + + + + up + + + ... + + + + + + + VideoPlayer.SkipPrevious + + + ... + + + + + + + VideoPlayer.SmallSkipForward + + + ... + + + + + + + XBMC.Quit + + + ... + + + + + + + down + + + ... + + + + + + + enter + + + ... + + + + + + + playerGetActivePlayers + + + ... + + + + + + + VideoPlayer.GetTime + + + ... + + + + + + + VideoPlayer.SkipNext + + + ... + + + + + + + play + + + ... + + + + + + + select item + + + ... + + + + + + + parent dir + + + ... + + + + + diff --git a/src/xbmcnetmoviesremote.pro b/src/xbmcnetmoviesremote.pro index f64f4ae..c959dab 100644 --- a/src/xbmcnetmoviesremote.pro +++ b/src/xbmcnetmoviesremote.pro @@ -9,7 +9,7 @@ DEPLOYMENTFOLDERS = # file1 dir1 # Needs to be defined for Symbian DEFINES += NETWORKACCESS -QT += network +QT += network maemo5 symbian:TARGET.UID3 = 0xED8FBFF1 -- 1.7.9.5