Handle multiple connections from the demo user
This commit is contained in:
@@ -71,6 +71,13 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user)
|
||||
return std::vector<Playlist::pointer>(res.begin(), res.end());
|
||||
}
|
||||
|
||||
Playlist::pointer
|
||||
Playlist::getById(Wt::Dbo::Session& session, IdType id)
|
||||
{
|
||||
return session.find<Playlist>().where("id = ?").bind(id);
|
||||
}
|
||||
|
||||
|
||||
PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist)
|
||||
: _track(track),
|
||||
_playlist(playlist)
|
||||
|
||||
@@ -42,6 +42,7 @@ class Playlist : public Wt::Dbo::Dbo<Playlist>
|
||||
|
||||
// Search utility
|
||||
static pointer get(Wt::Dbo::Session& session, std::string name, Wt::Dbo::ptr<User> user);
|
||||
static pointer getById(Wt::Dbo::Session& session, IdType playlistId);
|
||||
static std::vector<pointer> getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user);
|
||||
|
||||
// Create utility
|
||||
|
||||
@@ -131,7 +131,8 @@ LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnecti
|
||||
}
|
||||
}
|
||||
|
||||
LmsApplication::~LmsApplication()
|
||||
void
|
||||
LmsApplication::finalize()
|
||||
{
|
||||
LmsApplicationInfo info = LmsApplicationInfo::fromEnvironment(environment());
|
||||
|
||||
@@ -141,6 +142,8 @@ LmsApplication::~LmsApplication()
|
||||
});
|
||||
|
||||
getApplicationGroup().leave();
|
||||
|
||||
preQuit().emit();
|
||||
}
|
||||
|
||||
std::unique_ptr<Wt::WAnchor>
|
||||
@@ -456,8 +459,11 @@ LmsApplication::createHome()
|
||||
_groupEvents.appOpen.connect([=] (LmsApplicationInfo info)
|
||||
{
|
||||
// Only one active session by user
|
||||
setConfirmCloseMessage("");
|
||||
quit(Wt::WString::tr("Lms.quit-other-session"));
|
||||
if (!LmsApp->getUser()->isDemo())
|
||||
{
|
||||
setConfirmCloseMessage("");
|
||||
quit(Wt::WString::tr("Lms.quit-other-session"));
|
||||
}
|
||||
});
|
||||
|
||||
_groupEvents.appClosed.connect([=] (LmsApplicationInfo info)
|
||||
|
||||
@@ -48,7 +48,6 @@ class LmsApplication : public Wt::WApplication
|
||||
{
|
||||
public:
|
||||
LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
||||
~LmsApplication();
|
||||
|
||||
static std::unique_ptr<Wt::WApplication> create(const Wt::WEnvironment& env,
|
||||
Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
||||
@@ -77,6 +76,9 @@ class LmsApplication : public Wt::WApplication
|
||||
static std::unique_ptr<Wt::WAnchor> createReleaseAnchor(Database::Release::pointer release, bool addText = true);
|
||||
static std::unique_ptr<Wt::WTemplate> createCluster(Database::Cluster::pointer cluster, bool canDelete = false);
|
||||
|
||||
// Signal emitted just before the session ends (user may already be logged out)
|
||||
Wt::Signal<>& preQuit() { return _preQuit; }
|
||||
|
||||
private:
|
||||
|
||||
LmsApplicationGroup& getApplicationGroup();
|
||||
@@ -84,9 +86,11 @@ class LmsApplication : public Wt::WApplication
|
||||
// Events
|
||||
void handleAuthEvent();
|
||||
void notify(const Wt::WEvent& event) override;
|
||||
void finalize() override;
|
||||
|
||||
void createHome();
|
||||
|
||||
Wt::Signal<> _preQuit;
|
||||
Database::Handler _db;
|
||||
LmsApplicationGroupContainer& _appGroups;
|
||||
GroupEvents _groupEvents;
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
#include "LmsApplication.hpp"
|
||||
|
||||
|
||||
namespace UserInterface {
|
||||
|
||||
PlayQueue::PlayQueue()
|
||||
@@ -50,15 +51,8 @@ PlayQueue::PlayQueue()
|
||||
|
||||
Wt::WText* shuffleBtn = bindNew<Wt::WText>("shuffle-btn", Wt::WString::tr("Lms.PlayQueue.shuffle"), Wt::TextFormat::XHTML);
|
||||
_radioMode = bindNew<Wt::WCheckBox>("radio-mode", Wt::WString::tr("Lms.PlayQueue.radio-mode"));
|
||||
|
||||
_nbTracks = bindNew<Wt::WText>("nb-tracks");
|
||||
|
||||
{
|
||||
Wt::Dbo::Transaction transaction (LmsApp->getDboSession());
|
||||
|
||||
_trackPos = LmsApp->getUser()->getCurPlayingTrackPos();
|
||||
}
|
||||
|
||||
clearBtn->clicked().connect([=]
|
||||
{
|
||||
clearTracks();
|
||||
@@ -80,6 +74,20 @@ PlayQueue::PlayQueue()
|
||||
addSome();
|
||||
});
|
||||
|
||||
LmsApp->preQuit().connect([=]
|
||||
{
|
||||
if (_playlistId)
|
||||
{
|
||||
LMS_LOG(UI, DEBUG) << "Removing playlist id " << *_playlistId;
|
||||
|
||||
Wt::Dbo::Transaction transaction(LmsApp->getDboSession());
|
||||
|
||||
auto playlist = Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId);
|
||||
if (playlist)
|
||||
playlist.remove();
|
||||
}
|
||||
});
|
||||
|
||||
updateInfo();
|
||||
addSome();
|
||||
}
|
||||
@@ -88,8 +96,22 @@ Database::Playlist::pointer
|
||||
PlayQueue::getPlaylist()
|
||||
{
|
||||
static const std::string currentPlayQueueName = "__current__playqueue__";
|
||||
Database::Playlist::pointer res;
|
||||
|
||||
Database::Playlist::pointer res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser());
|
||||
if (LmsApp->getUser()->isDemo())
|
||||
{
|
||||
if (!_playlistId)
|
||||
{
|
||||
res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser());
|
||||
LmsApp->getDboSession().flush();
|
||||
_playlistId = res.id();
|
||||
return res;
|
||||
}
|
||||
|
||||
return Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId);
|
||||
}
|
||||
|
||||
res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser());
|
||||
if (!res)
|
||||
res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser());
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ class PlayQueue : public Wt::WTemplate
|
||||
void play(std::size_t pos);
|
||||
void stop();
|
||||
|
||||
boost::optional<Database::IdType> _playlistId;
|
||||
Wt::WCheckBox* _radioMode;
|
||||
Wt::WContainerWidget* _entriesContainer;
|
||||
Wt::WTemplate* _showMore;
|
||||
|
||||
Reference in New Issue
Block a user