5 #include "sessionstorefile.h"
7 #include <Cutelyst/Context>
8 #include <Cutelyst/Application>
13 #include <QDataStream>
14 #include <QLoggingCategory>
15 #include <QCoreApplication>
19 Q_LOGGING_CATEGORY(C_SESSION_FILE,
"cutelyst.plugin.sessionfile", QtWarningMsg)
21 #define SESSION_STORE_FILE_SAVE QStringLiteral("_c_session_store_file_save")
22 #define SESSION_STORE_FILE_DATA QStringLiteral("_c_session_store_file_data")
24 static QVariantHash loadSessionData(
Context *c,
const QString &sid);
31 SessionStoreFile::~SessionStoreFile()
37 const QVariantHash data = loadSessionData(c, sid);
39 return data.value(key, defaultValue);
44 QVariantHash data = loadSessionData(c, sid);
46 data.insert(key, value);
47 c->
setStash(SESSION_STORE_FILE_DATA, data);
48 c->
setStash(SESSION_STORE_FILE_SAVE,
true);
55 QVariantHash data = loadSessionData(c, sid);
58 c->
setStash(SESSION_STORE_FILE_DATA, data);
59 c->
setStash(SESSION_STORE_FILE_SAVE,
true);
64 static QString rootPath()
66 static QString rootPath = QDir::tempPath()
68 + QCoreApplication::applicationName()
78 dir.removeRecursively();
83 QVariantHash loadSessionData(
Context *c,
const QString &sid)
86 const QVariant sessionVariant = c->
stash(SESSION_STORE_FILE_DATA);
87 if (!sessionVariant.isNull()) {
88 data = sessionVariant.toHash();
92 const QString root = rootPath();
94 auto file =
new QFile(root + u
'/' + sid, c);
95 if (!file->open(QIODevice::ReadWrite)) {
96 if (!QDir().mkpath(root)) {
97 qCWarning(C_SESSION_FILE) <<
"Failed to create path for session object" << root;
101 if (!file->open(QIODevice::ReadWrite)) {
108 if (!c->stash(SESSION_STORE_FILE_SAVE).toBool()) {
112 const QVariantHash data = c->
stash(SESSION_STORE_FILE_DATA).toHash();
114 if (data.isEmpty()) {
115 QFile::remove(file->fileName());
117 QLockFile lock(file->fileName() + QLatin1String(
".lock"));
119 QDataStream in(file);
127 if (file->pos() < file->size()) {
128 file->resize(file->pos());
138 QLockFile lock(file->fileName() + QLatin1String(
".lock"));
140 QDataStream in(file);
145 c->
setStash(SESSION_STORE_FILE_DATA, data);
150 #include "moc_sessionstorefile.cpp"
void afterDispatch(Cutelyst::Context *c)
void stash(const QVariantHash &unite)
void setStash(const QString &key, const QVariant &value)
Application * app() const noexcept
SessionStoreFile(QObject *parent=nullptr)
virtual bool deleteSessionData(Context *c, const QString &sid, const QString &key) final
virtual bool deleteExpiredSessions(Context *c, quint64 expires) final
virtual bool storeSessionData(Context *c, const QString &sid, const QString &key, const QVariant &value) final
virtual QVariant getSessionData(Context *c, const QString &sid, const QString &key, const QVariant &defaultValue) final
The Cutelyst namespace holds all public Cutelyst API.