diff base/ConfigFile.cpp @ 149:3e4c384f518e

* Reorganising code base. This revision will not compile.
author Chris Cannam
date Mon, 31 Jul 2006 12:03:45 +0000
parents
children 4b2ea82fd0ed
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/ConfigFile.cpp	Mon Jul 31 12:03:45 2006 +0000
@@ -0,0 +1,181 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2006 Chris Cannam.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "ConfigFile.h"
+
+#include "base/Exceptions.h"
+
+#include <iostream>
+
+#include <QFile>
+#include <QMutexLocker>
+#include <QTextStream>
+#include <QStringList>
+
+ConfigFile::ConfigFile(QString filename) :
+    m_filename(filename),
+    m_loaded(false),
+    m_modified(false)
+{
+}
+
+ConfigFile::~ConfigFile()
+{
+    try {
+        commit();
+    } catch (FileOperationFailed f) {
+        std::cerr << "WARNING: ConfigFile::~ConfigFile: Commit failed for "
+                  << m_filename.toStdString() << std::endl;
+    }
+}
+
+QString
+ConfigFile::get(QString key, QString deft)
+{
+    if (!m_loaded) load();
+        
+    QMutexLocker locker(&m_mutex);
+
+    if (m_data.find(key) == m_data.end()) return deft;
+    return m_data[key];
+}
+
+int
+ConfigFile::getInt(QString key, int deft)
+{
+    return get(key, QString("%1").arg(deft)).toInt();
+}
+
+bool
+ConfigFile::getBool(QString key, bool deft)
+{
+    QString value = get(key, deft ? "true" : "false").trimmed().toLower();
+    return (value == "true" || value == "yes" || value == "on" || value == "1");
+}
+ 
+float
+ConfigFile::getFloat(QString key, float deft)
+{
+    return get(key, QString("%1").arg(deft)).toFloat();
+}
+
+QStringList
+ConfigFile::getStringList(QString key)
+{
+    return get(key).split('|');
+}
+
+void
+ConfigFile::set(QString key, QString value)
+{
+    if (!m_loaded) load();
+        
+    QMutexLocker locker(&m_mutex);
+
+    m_data[key] = value;
+
+    m_modified = true;
+}
+
+void
+ConfigFile::set(QString key, int value)
+{
+    set(key, QString("%1").arg(value));
+}
+
+void
+ConfigFile::set(QString key, bool value)
+{
+    set(key, value ? QString("true") : QString("false"));
+}
+
+void
+ConfigFile::set(QString key, float value)
+{
+    set(key, QString("%1").arg(value));
+}
+
+void
+ConfigFile::set(QString key, const QStringList &values)
+{
+    set(key, values.join("|"));
+}
+
+void
+ConfigFile::commit()
+{
+    QMutexLocker locker(&m_mutex);
+
+    if (!m_modified) return;
+
+    // Really we should write to another file and then move to the
+    // intended target, but I don't think we're all that particular
+    // about reliability here at the moment
+
+    QFile file(m_filename);
+
+    if (!file.open(QFile::WriteOnly | QFile::Text)) {
+        throw FileOperationFailed(m_filename, "open for writing");
+    }
+    
+    QTextStream out(&file);
+
+    for (DataMap::const_iterator i = m_data.begin(); i != m_data.end(); ++i) {
+        out << i->first << "=" << i->second << endl;
+    }
+
+    m_modified = false;
+}
+
+bool
+ConfigFile::load()
+{
+    QMutexLocker locker(&m_mutex);
+
+    if (m_loaded) return true;
+
+    QFile file(m_filename);
+
+    if (!file.open(QFile::ReadOnly | QFile::Text)) {
+        return false;
+    }
+
+    QTextStream in(&file);
+
+    m_data.clear();
+
+    while (!in.atEnd()) {
+        
+        QString line = in.readLine(2048);
+        QString key = line.section('=', 0, 0);
+        QString value = line.section('=', 1, -1);
+        if (key == "") continue;
+
+        m_data[key] = value;
+    }
+    
+    m_loaded = true;
+    m_modified = false;
+    return true;
+}
+
+void
+ConfigFile::reset()
+{
+    QMutexLocker locker(&m_mutex);
+    m_loaded = false;
+    m_modified = false;
+}
+