18 #include "sessionstorefile.h"
20 #include <Cutelyst/Context>
21 #include <Cutelyst/Application>
26 #include <QDataStream>
27 #include <QLoggingCategory>
28 #include <QCoreApplication>
32 Q_LOGGING_CATEGORY(C_SESSION_FILE,
"cutelyst.plugin.sessionfile", QtWarningMsg)
34 #define SESSION_STORE_FILE_SAVE QStringLiteral("_c_session_store_file_save")
35 #define SESSION_STORE_FILE_DATA QStringLiteral("_c_session_store_file_data")
37 static QVariantHash loadSessionData(
Context *c,
const QString &sid);
44 SessionStoreFile::~SessionStoreFile()
50 const QVariantHash data = loadSessionData(c, sid);
52 return data.value(key, defaultValue);
57 QVariantHash data = loadSessionData(c, sid);
59 data.insert(key, value);
60 c->
setStash(SESSION_STORE_FILE_DATA, data);
61 c->
setStash(SESSION_STORE_FILE_SAVE,
true);
68 QVariantHash data = loadSessionData(c, sid);
71 c->
setStash(SESSION_STORE_FILE_DATA, data);
72 c->
setStash(SESSION_STORE_FILE_SAVE,
true);
84 QVariantHash loadSessionData(
Context *c,
const QString &sid)
87 const QVariant sessionVariant = c->
stash(SESSION_STORE_FILE_DATA);
88 if (!sessionVariant.isNull()) {
89 data = sessionVariant.toHash();
93 const static QString root = QDir::tempPath()
95 + QCoreApplication::applicationName()
96 + QLatin1String(
"/session/data");
98 auto file =
new QFile(root + QLatin1Char(
'/') + sid, c);
99 if (!file->open(QIODevice::ReadWrite)) {
100 if (!QDir().mkpath(root)) {
101 qCWarning(C_SESSION_FILE) <<
"Failed to create path for session object" << root;
105 if (!file->open(QIODevice::ReadWrite)) {
112 if (!c->stash(SESSION_STORE_FILE_SAVE).toBool()) {
116 const QVariantHash data = c->
stash(SESSION_STORE_FILE_DATA).toHash();
118 if (data.isEmpty()) {
119 QFile::remove(file->fileName());
121 QLockFile lock(file->fileName() + QLatin1String(
".lock"));
123 QDataStream in(file);
131 if (file->pos() < file->size()) {
132 file->resize(file->pos());
142 QLockFile lock(file->fileName() + QLatin1String(
".lock"));
144 QDataStream in(file);
149 c->
setStash(SESSION_STORE_FILE_DATA, data);
154 #include "moc_sessionstorefile.cpp"