/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #include #include #include #include #include #include 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()) { assert(connect(new QFileSystemWatcher(QStringList()<<_file.fileName(), this), SIGNAL(fileChanged(const QString&)), SLOT(changed()))); } } bool readable() { return QFileInfo(_file).exists(); } bool writeable() { return readable() || !_file.fileName().isEmpty(); } 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: QFile _file; };