Handle multiple connections from the demo user

This commit is contained in:
emeric
2018-08-02 12:45:33 +02:00
parent 1caadcd7c5
commit 5c182f2868
6 changed files with 53 additions and 12 deletions
+9 -3
View File
@@ -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)
+5 -1
View File
@@ -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;
+30 -8
View File
@@ -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());
+1
View File
@@ -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;