d547022aa1425e85acd42c9b6182fb8c4a9b863d
[simple-xmbc-rem] / src / xbmc.cpp
1 #include "xbmc.h"
2 #include "constants.h"
3 #include "genericnotify.h"
4
5 #include <QSettings>
6 #include <QTextStream>
7 #include <QNetworkReply>
8
9 // XBMC constants -- from https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h
10 #define ACTION_MOVE_LEFT                1
11 #define ACTION_MOVE_RIGHT               2
12 #define ACTION_MOVE_UP                  3
13 #define ACTION_MOVE_DOWN                4
14 #define ACTION_SELECT_ITEM              7
15 #define ACTION_HIGHLIGHT_ITEM           8
16 #define ACTION_PARENT_DIR               9
17 #define ACTION_PAUSE                    12
18 #define ACTION_STOP                     13
19 #define ACTION_NEXT_ITEM                14
20 #define ACTION_PREV_ITEM                15
21 #define ACTION_FORWARD                  16 // Can be used to specify specific action in a window, Playback control is handled in ACTION_PLAYER_*
22 #define ACTION_REWIND                   17 // Can be used to specify specific action in a window, Playback control is handled in ACTION_PLAYER_*
23 #define ACTION_SHOW_GUI                 18 // toggle between GUI and movie or GUI and visualisation.
24 #define ACTION_STEP_FORWARD             20 // seek +1% in the movie. Can b used in videoFullScreen.xml window id=2005
25 #define ACTION_STEP_BACK                21 // seek -1% in the movie. Can b used in videoFullScreen.xml window id=2005
26 #define ACTION_BIG_STEP_FORWARD         22 // seek +10% in the movie. Can b used in videoFullScreen.xml window id=2005
27 #define ACTION_BIG_STEP_BACK            23 // seek -10% in the movie. Can b used in videoFullScreen.xml window id=2005
28 #define ACTION_NEXT_SUBTITLE            26 // switch to next subtitle of movie. Can b used in videoFullScreen.xml window id=2005
29 #define ACTION_SUBTITLE_DELAY_MIN       52 // Decrease subtitle/movie Delay. Can b used in videoFullScreen.xml window id=2005
30 #define ACTION_SUBTITLE_DELAY_PLUS      53 // Increase subtitle/movie Delay. Can b used in videoFullScreen.xml window id=2005
31 #define ACTION_AUDIO_DELAY_MIN          54 // Increase avsync delay. Can b used in videoFullScreen.xml window id=2005
32 #define ACTION_AUDIO_DELAY_PLUS         55 // Decrease avsync delay. Can b used in videoFullScreen.xml window id=2005
33 #define ACTION_AUDIO_NEXT_LANGUAGE      56 // Select next language in movie. Can b used in videoFullScreen.xml window id=2005
34 #define ACTION_PLAYER_PLAY              79 // Play current song. Unpauses song and sets playspeed to 1x. global action, can be used anywhere
35 #define ACTION_VOLUME_UP                88
36 #define ACTION_VOLUME_DOWN              89
37 #define ACTION_MUTE                     91
38 #define ACTION_CONTEXT_MENU             117 // pops up the context menu
39 #define ACTION_ENTER                    135
40
41 // 0xF000 -> 0xF200 is reserved for the keyboard; a keyboard press is either
42 #define KEY_VKEY 0xF000 // a virtual key/functional key e.g. cursor left
43 #define KEY_ASCII 0xF100 // a printable character in the range of TRUE ASCII (from 0 to 127) // FIXME make it clean and pure unicode! remove the need for KEY_ASCII
44 #define KEY_UNICODE 0xF200 // another printable character whose range is not included in this KEY code
45
46 Xbmc::Xbmc(QObject *parent) : QObject(parent)
47 {
48     m_manager = new QNetworkAccessManager(this);
49 }
50
51 Xbmc::~Xbmc()
52 {
53     delete m_manager;
54 }
55
56 void Xbmc::commandFinished()
57 {
58     QNetworkReply* reply = qobject_cast<QNetworkReply *>(sender());
59     if (reply) {
60         if (reply->error() == QNetworkReply::NoError) {
61             QTextStream stream(reply);
62             QString msg = stream.readAll();
63             qDebug("Xbmc::commandActionFinished: %s", qPrintable(msg));
64         } else {
65             notify::notify(reply->errorString());
66         }
67         reply->deleteLater();
68     }
69 }
70
71 void Xbmc::actionRight()
72 {
73     do_command_action(ACTION_MOVE_RIGHT);
74     do_command_action(ACTION_STEP_FORWARD);
75 }
76
77 void Xbmc::actionLeft()
78 {
79     do_command_action(ACTION_MOVE_LEFT);
80     do_command_action(ACTION_STEP_BACK);
81 }
82
83 void Xbmc::actionUp()
84 {
85     do_command_action(ACTION_MOVE_UP);
86     do_command_action(ACTION_BIG_STEP_FORWARD);
87 }
88
89 void Xbmc::actionDown()
90 {
91     do_command_action(ACTION_MOVE_DOWN);
92     do_command_action(ACTION_BIG_STEP_BACK);
93 }
94
95 void Xbmc::actionMute()
96 {
97     do_command_action(ACTION_MUTE);
98 }
99
100 void Xbmc::actionVolumeUp()
101 {
102     do_command_action(ACTION_VOLUME_UP);
103 }
104
105 void Xbmc::actionVolumeDown()
106 {
107     do_command_action(ACTION_VOLUME_DOWN);
108 }
109
110 void Xbmc::actionNextSubtitle()
111 {
112     do_command_action(ACTION_NEXT_SUBTITLE);
113 }
114
115 void Xbmc::actionNextLanguage()
116 {
117     do_command_action(ACTION_AUDIO_NEXT_LANGUAGE);
118 }
119
120 void Xbmc::actionPlay()
121 {
122     do_command_action(ACTION_PLAYER_PLAY);
123 }
124
125 void Xbmc::actionSelect()
126 {
127     do_command_action(ACTION_SELECT_ITEM);
128 }
129
130 void Xbmc::actionStop()
131 {
132     do_command_action(ACTION_STOP);
133 }
134
135 void Xbmc::actionShowGui()
136 {
137     do_command_action(ACTION_SHOW_GUI);
138 }
139
140 void Xbmc::actionSendKeyEsc()
141 {
142     do_command_send_key(KEY_ASCII + 0x1B); // ESC
143 }
144
145 void Xbmc::actionContextMenu()
146 {
147     do_command_action(ACTION_CONTEXT_MENU);
148 }
149
150 void Xbmc::do_command_send_key(int key)
151 {
152     do_command1("SendKey", key);
153 }
154
155 void Xbmc::do_command_action(int action)
156 {
157     do_command1("Action", action);
158 }
159
160 void Xbmc::do_command1(const QString &command, int id)
161 {
162     QSettings settings;
163     QString server = settings.value(SETUP_XBMC_SERVER, SETUP_XBMC_SERVER_DEFAULT).toString();
164     QString port = settings.value(SETUP_XBMC_PORT, SETUP_XBMC_PORT_DEFAULT).toString();
165
166     QUrl url = QUrl(QString("http://%1:%2/xbmcCmds/xbmcHttp?command=%3(%4)").arg(server).arg(port).arg(command).arg(id));
167
168     qDebug("executing command: %s", qPrintable(url.toString()));
169
170     QNetworkRequest request;
171     request.setUrl(url);
172
173     QNetworkReply *reply = m_manager->get(request);
174     connect(reply, SIGNAL(finished()), this, SLOT(commandFinished()));
175 }