2013-01-03 21:40:47 +01:00
|
|
|
/* This file is part of Clementine.
|
|
|
|
Copyright 2012, Andreas Muttscheller <asfa194@gmail.com>
|
|
|
|
|
|
|
|
Clementine is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Clementine is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "incomingdataparser.h"
|
2013-04-14 00:58:49 +02:00
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
2013-01-03 21:40:47 +01:00
|
|
|
#include "core/logging.h"
|
|
|
|
#include "engines/enginebase.h"
|
|
|
|
#include "playlist/playlistmanager.h"
|
2013-01-15 14:43:02 +01:00
|
|
|
#include "playlist/playlistsequence.h"
|
2013-04-13 11:57:05 +02:00
|
|
|
#include "playlist/playlist.h"
|
2013-01-03 21:40:47 +01:00
|
|
|
|
|
|
|
IncomingDataParser::IncomingDataParser(Application* app)
|
|
|
|
:app_(app)
|
|
|
|
{
|
|
|
|
// Connect all the signals
|
|
|
|
// due the player is in a different thread, we cannot access these functions directly
|
|
|
|
connect(this, SIGNAL(Play()),
|
|
|
|
app_->player(), SLOT(Play()));
|
|
|
|
connect(this, SIGNAL(PlayPause()),
|
|
|
|
app_->player(), SLOT(PlayPause()));
|
|
|
|
connect(this, SIGNAL(Pause()),
|
|
|
|
app_->player(), SLOT(Pause()));
|
|
|
|
connect(this, SIGNAL(Stop()),
|
|
|
|
app_->player(), SLOT(Stop()));
|
|
|
|
connect(this, SIGNAL(Next()),
|
|
|
|
app_->player(), SLOT(Next()));
|
|
|
|
connect(this, SIGNAL(Previous()),
|
|
|
|
app_->player(), SLOT(Previous()));
|
|
|
|
connect(this, SIGNAL(SetVolume(int)),
|
|
|
|
app_->player(), SLOT(SetVolume(int)));
|
|
|
|
connect(this, SIGNAL(PlayAt(int,Engine::TrackChangeFlags,bool)),
|
|
|
|
app_->player(), SLOT(PlayAt(int,Engine::TrackChangeFlags,bool)));
|
2013-01-23 20:02:12 +01:00
|
|
|
connect(this, SIGNAL(SeekTo(int)),
|
|
|
|
app_->player(), SLOT(SeekTo(int)));
|
2013-01-16 19:26:33 +01:00
|
|
|
|
2013-01-03 21:40:47 +01:00
|
|
|
connect(this, SIGNAL(SetActivePlaylist(int)),
|
|
|
|
app_->playlist_manager(), SLOT(SetActivePlaylist(int)));
|
2013-01-09 20:07:28 +01:00
|
|
|
connect(this, SIGNAL(ShuffleCurrent()),
|
|
|
|
app_->playlist_manager(), SLOT(ShuffleCurrent()));
|
2013-01-15 14:43:02 +01:00
|
|
|
connect(this, SIGNAL(SetRepeatMode(PlaylistSequence::RepeatMode)),
|
|
|
|
app_->playlist_manager()->sequence(),
|
|
|
|
SLOT(SetRepeatMode(PlaylistSequence::RepeatMode)));
|
|
|
|
connect(this, SIGNAL(SetShuffleMode(PlaylistSequence::ShuffleMode)),
|
|
|
|
app_->playlist_manager()->sequence(),
|
|
|
|
SLOT(SetShuffleMode(PlaylistSequence::ShuffleMode)));
|
2013-04-13 11:57:05 +02:00
|
|
|
connect(this, SIGNAL(InsertUrls(const QList<QUrl>&, int, bool, bool)),
|
|
|
|
app_->playlist_manager()->active(),
|
|
|
|
SLOT(InsertUrls(const QList<QUrl>&, int, bool, bool)));
|
|
|
|
connect(this, SIGNAL(RemoveSongs(const QList<int>&)),
|
|
|
|
app_->playlist_manager()->active(),
|
|
|
|
SLOT(RemoveItemsWithoutUndo(const QList<int>&)));
|
2013-01-03 21:40:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
IncomingDataParser::~IncomingDataParser() {
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IncomingDataParser::close_connection() {
|
|
|
|
return close_connection_;
|
|
|
|
}
|
|
|
|
|
2013-01-23 20:02:12 +01:00
|
|
|
void IncomingDataParser::Parse(const pb::remote::Message& msg) {
|
2013-01-03 21:40:47 +01:00
|
|
|
close_connection_ = false;
|
|
|
|
|
|
|
|
// Now check what's to do
|
2013-01-15 13:05:43 +01:00
|
|
|
switch (msg.type()) {
|
2013-03-27 16:54:02 +01:00
|
|
|
case pb::remote::CONNECT: ClientConnect(msg);
|
2013-01-03 21:40:47 +01:00
|
|
|
break;
|
|
|
|
case pb::remote::DISCONNECT: close_connection_ = true;
|
|
|
|
break;
|
|
|
|
case pb::remote::REQUEST_PLAYLISTS: emit SendAllPlaylists();
|
|
|
|
break;
|
2013-01-15 13:05:43 +01:00
|
|
|
case pb::remote::REQUEST_PLAYLIST_SONGS: GetPlaylistSongs(msg);
|
2013-01-03 21:40:47 +01:00
|
|
|
break;
|
2013-01-15 13:05:43 +01:00
|
|
|
case pb::remote::SET_VOLUME: emit SetVolume(msg.request_set_volume().volume());
|
2013-01-03 21:40:47 +01:00
|
|
|
break;
|
|
|
|
case pb::remote::PLAY: emit Play();
|
|
|
|
break;
|
|
|
|
case pb::remote::PLAYPAUSE: emit PlayPause();
|
|
|
|
break;
|
|
|
|
case pb::remote::PAUSE: emit Pause();
|
|
|
|
break;
|
|
|
|
case pb::remote::STOP: emit Stop();
|
|
|
|
break;
|
|
|
|
case pb::remote::NEXT: emit Next();
|
|
|
|
break;
|
2013-01-15 13:05:43 +01:00
|
|
|
case pb::remote::PREVIOUS: emit Previous();
|
2013-01-03 21:40:47 +01:00
|
|
|
break;
|
2013-01-15 13:05:43 +01:00
|
|
|
case pb::remote::CHANGE_SONG: ChangeSong(msg);
|
2013-01-03 21:40:47 +01:00
|
|
|
break;
|
2013-01-15 13:05:43 +01:00
|
|
|
case pb::remote::SHUFFLE_PLAYLIST: emit ShuffleCurrent();
|
|
|
|
break;
|
2013-01-15 14:43:02 +01:00
|
|
|
case pb::remote::REPEAT: SetRepeatMode(msg.repeat());
|
|
|
|
break;
|
|
|
|
case pb::remote::SHUFFLE: SetShuffleMode(msg.shuffle());
|
|
|
|
break;
|
2013-01-23 20:02:12 +01:00
|
|
|
case pb::remote::SET_TRACK_POSITION:
|
|
|
|
emit SeekTo(msg.request_set_track_position().position());
|
|
|
|
break;
|
2013-04-13 11:57:05 +02:00
|
|
|
case pb::remote::INSERT_URLS: InsertUrls(msg);
|
|
|
|
break;
|
|
|
|
case pb::remote::REMOVE_SONGS:RemoveSongs(msg);
|
|
|
|
break;
|
2013-01-03 21:40:47 +01:00
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-15 13:05:43 +01:00
|
|
|
void IncomingDataParser::GetPlaylistSongs(const pb::remote::Message& msg) {
|
|
|
|
emit SendPlaylistSongs(msg.request_playlist_songs().id());
|
2013-01-03 21:40:47 +01:00
|
|
|
}
|
|
|
|
|
2013-01-15 13:05:43 +01:00
|
|
|
void IncomingDataParser::ChangeSong(const pb::remote::Message& msg) {
|
2013-01-03 21:40:47 +01:00
|
|
|
// Get the first entry and check if there is a song
|
2013-01-15 13:05:43 +01:00
|
|
|
const pb::remote::RequestChangeSong& request = msg.request_change_song();
|
2013-01-03 21:40:47 +01:00
|
|
|
|
|
|
|
// Check if we need to change the playlist
|
2013-01-15 13:05:43 +01:00
|
|
|
if (request.playlist_id() != app_->playlist_manager()->active_id()) {
|
|
|
|
emit SetActivePlaylist(request.playlist_id());
|
2013-01-03 21:40:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Play the selected song
|
2013-01-15 13:05:43 +01:00
|
|
|
emit PlayAt(request.song_index(), Engine::Manual, false);
|
2013-01-03 21:40:47 +01:00
|
|
|
}
|
2013-01-15 14:43:02 +01:00
|
|
|
|
|
|
|
void IncomingDataParser::SetRepeatMode(const pb::remote::Repeat& repeat) {
|
|
|
|
switch (repeat.repeat_mode()) {
|
|
|
|
case pb::remote::Repeat_Off:
|
|
|
|
emit SetRepeatMode(PlaylistSequence::Repeat_Off);
|
|
|
|
break;
|
|
|
|
case pb::remote::Repeat_Track:
|
|
|
|
emit SetRepeatMode(PlaylistSequence::Repeat_Track);
|
|
|
|
break;
|
|
|
|
case pb::remote::Repeat_Album:
|
|
|
|
emit SetRepeatMode(PlaylistSequence::Repeat_Album);
|
|
|
|
break;
|
|
|
|
case pb::remote::Repeat_Playlist:
|
|
|
|
emit SetRepeatMode(PlaylistSequence::Repeat_Playlist);
|
|
|
|
break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void IncomingDataParser::SetShuffleMode(const pb::remote::Shuffle& shuffle) {
|
|
|
|
switch (shuffle.shuffle_mode()) {
|
|
|
|
case pb::remote::Shuffle_Off:
|
|
|
|
emit SetShuffleMode(PlaylistSequence::Shuffle_Off);
|
|
|
|
break;
|
|
|
|
case pb::remote::Shuffle_All:
|
|
|
|
emit SetShuffleMode(PlaylistSequence::Shuffle_All);
|
|
|
|
break;
|
|
|
|
case pb::remote::Shuffle_InsideAlbum:
|
|
|
|
emit SetShuffleMode(PlaylistSequence::Shuffle_InsideAlbum);
|
|
|
|
break;
|
|
|
|
case pb::remote::Shuffle_Albums:
|
|
|
|
emit SetShuffleMode(PlaylistSequence::Shuffle_Albums);
|
|
|
|
break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
2013-03-27 16:54:02 +01:00
|
|
|
|
2013-04-13 11:57:05 +02:00
|
|
|
void IncomingDataParser::InsertUrls(const pb::remote::Message& msg) {
|
|
|
|
const pb::remote::RequestInsertUrls& request = msg.request_insert_urls();
|
|
|
|
|
|
|
|
// Check if we need to change the playlist
|
|
|
|
if (request.playlist_id() != app_->playlist_manager()->active_id()) {
|
|
|
|
emit SetActivePlaylist(request.playlist_id());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extract urls
|
|
|
|
QList<QUrl> urls;
|
2013-04-14 00:58:49 +02:00
|
|
|
for (auto it = request.urls().begin(); it != request.urls().end(); ++it) {
|
|
|
|
urls << QUrl(QString::fromStdString(*it));
|
2013-04-13 11:57:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Insert the urls
|
|
|
|
emit InsertUrls(urls, request.position(), request.play_now(), request.enqueue());
|
|
|
|
}
|
|
|
|
|
|
|
|
void IncomingDataParser::RemoveSongs(const pb::remote::Message& msg) {
|
|
|
|
const pb::remote::RequestRemoveSongs& request = msg.request_remove_songs();
|
|
|
|
|
|
|
|
// Check if we need to change the playlist
|
|
|
|
if (request.playlist_id() != app_->playlist_manager()->active_id()) {
|
|
|
|
emit SetActivePlaylist(request.playlist_id());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extract urls
|
|
|
|
QList<int> songs;
|
2013-04-14 00:58:49 +02:00
|
|
|
std::copy(request.songs().begin(), request.songs().end(), songs.begin());
|
2013-04-13 11:57:05 +02:00
|
|
|
|
|
|
|
// Insert the urls
|
|
|
|
emit RemoveSongs(songs);
|
|
|
|
}
|
|
|
|
|
2013-03-27 16:54:02 +01:00
|
|
|
void IncomingDataParser::ClientConnect(const pb::remote::Message& msg) {
|
|
|
|
// Always sned the Clementine infos
|
|
|
|
emit SendClementineInfo();
|
|
|
|
|
|
|
|
// Check if we should send the first data
|
|
|
|
if (!msg.request_connect().has_send_playlist_songs() // legacy
|
|
|
|
|| msg.request_connect().send_playlist_songs()) {
|
|
|
|
emit SendFirstData(true);
|
|
|
|
} else {
|
|
|
|
emit SendFirstData(false);
|
|
|
|
}
|
|
|
|
}
|