bool DiskUtil::writeFile(const QString &path, const QString &content) {
QFile file(path);
if (!file.open(QIODevice::WriteOnly)) {
qWarning() << "Could not open file" << file.fileName() << "for writing.";
return false;
}
file.write(content.toUtf8());
file.flush();
#ifdef Q_OS_LINUX
fdatasync(file.handle());
#else
fsync(file.handle());
#endif
return true;
}
bool DiskUtil::writeGameObject(const QString &objectType, uint id, const QString &content) {
return writeFile(gameObjectPath(objectType, id), content);
}
QString DiskUtil::dataDir() {
static QString path;
static bool defined = false;
if (!defined) {
path = qgetenv("PT_DATA_DIR");
defined = true;
}
return path;
}
QStringList DiskUtil::dataDirFileList(const QString &subdirectory) {
QDir dir(DiskUtil::dataDir() + subdirectory);
return dir.entryList(QDir::Files);
}
QString DiskUtil::gameObjectPath(const QString &objectType, uint id) {
return dataDir() + QString("/%1.%2").arg(objectType.toLower()).arg(id, 9, 10, QChar('0'));
}
GameObject *GameObject::createFromFile(Realm *realm, const QString &path) {
QFileInfo fileInfo(path);
QString fileName = fileInfo.fileName();
QStringList components = fileName.split('.');
if (components.length() != 2) {
throw GameException(GameException::InvalidGameObjectFileName);
}
QString objectType = Util::capitalize(components[0]);
GameObject *gameObject = createByObjectType(realm, GameObjectType::fromString(objectType),
components[1].toUInt());
gameObject->load(path);
return gameObject;
}
void GameObject::load(const QString &path) {
QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
throw GameException(GameException::CouldNotOpenGameObjectFile, path);
}
loadJson(file.readAll());
}
bool GameObject::save() {
if (m_deleted) {
bool result = QFile::remove(DiskUtil::gameObjectPath(m_objectType.toString(), m_id));
m_realm->enqueueEvent(new DeleteObjectEvent(m_id));
return result;
} else {
return DiskUtil::writeGameObject(m_objectType.toString(), m_id,
toJsonString((Options) (SkipId | IncludeTypeInfo)));
}
}
void Realm::init() {
for (const QString &fileName : DiskUtil::dataDirFileList()) {
if (!fileName.startsWith("realm.")) {
createFromFile(this, DiskUtil::dataDir() + "/" + fileName);
}
}
// […]
}
180 lines, of which 80-90 of those are comments and whitespace, my verbose indention, or other not strictly necessary stuff.