|
|
|
/*! @file
|
|
|
|
|
|
|
|
@id $Id$
|
|
|
|
*/
|
|
|
|
// 1 2 3 4 5 6 7 8
|
|
|
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
|
|
|
|
|
#include <QtCore/QFile>
|
|
|
|
#include <QtCore/QDir>
|
|
|
|
#include <QtCore/QFileInfo>
|
|
|
|
#include <QtCore/QFileSystemWatcher>
|
|
|
|
#include <QtCore/QString>
|
|
|
|
#include <QtCore/QStringList>
|
|
|
|
|
|
|
|
#include <cassert>
|
|
|
|
|
|
|
|
class Storage: public QObject {
|
|
|
|
Q_OBJECT;
|
|
|
|
Q_SIGNALS:
|
|
|
|
void changed();
|
|
|
|
public:
|
|
|
|
Storage() {}
|
|
|
|
bool valid() {
|
|
|
|
return readable() || writeable();
|
|
|
|
}
|
|
|
|
operator bool() {
|
|
|
|
return valid();
|
|
|
|
}
|
|
|
|
virtual bool readable() = 0;
|
|
|
|
virtual bool writeable() = 0;
|
|
|
|
virtual QStringList read() = 0;
|
|
|
|
virtual bool write(const QStringList& out) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class FileStorage: public Storage {
|
|
|
|
Q_OBJECT;
|
|
|
|
public:
|
|
|
|
FileStorage(QString file): _file(file) {
|
|
|
|
if (valid()) setupWatcher();
|
|
|
|
}
|
|
|
|
bool readable() {
|
|
|
|
return QFileInfo(_file).exists();
|
|
|
|
}
|
|
|
|
bool writeable() {
|
|
|
|
return readable() ||
|
|
|
|
(!_file.fileName().isEmpty() &&
|
|
|
|
QFileInfo(_file).absoluteDir().exists());
|
|
|
|
}
|
|
|
|
QStringList read() {
|
|
|
|
QStringList res;
|
|
|
|
if (readable()) {
|
|
|
|
if (_file.open(QIODevice::ReadOnly))
|
|
|
|
res=QString::fromUtf8(_file.readAll()).split("\n");
|
|
|
|
_file.close();
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
bool write(const QStringList& out) {
|
|
|
|
bool res(false);
|
|
|
|
if (writeable()) {
|
|
|
|
if (_file.open(QIODevice::WriteOnly))
|
|
|
|
if (_file.write(out.join("\n").toUtf8())>=0) res=true;
|
|
|
|
_file.close();
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
private Q_SLOTS:
|
|
|
|
void setupWatcher() {
|
|
|
|
if (!_watcher) {
|
|
|
|
_watcher = new QFileSystemWatcher(this);
|
|
|
|
_watcher->addPath(QFileInfo(_file).absolutePath());
|
|
|
|
assert(connect(_watcher, SIGNAL(directoryChanged(const QString&)),
|
|
|
|
SLOT(setupWatcher())));
|
|
|
|
assert(connect(_watcher, SIGNAL(fileChanged(const QString&)),
|
|
|
|
SIGNAL(changed())));
|
|
|
|
}
|
|
|
|
if (readable()) {
|
|
|
|
_watcher->removePaths(_watcher->files());
|
|
|
|
_watcher->addPath(_file.fileName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
QFile _file;
|
|
|
|
QFileSystemWatcher* _watcher;
|
|
|
|
};
|
|
|
|
|