/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #include #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()) 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; };