From: Manuel Nickschas Date: Sat, 5 Jan 2008 23:47:38 +0000 (+0000) Subject: Revamped a lot of the settings stuff. This should fix the Q_ASSERT that would appear X-Git-Tag: 0.2.0-alpha1~249 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=cf28e7152c5d940aec586be1b29fbf8ddc99f087 Revamped a lot of the settings stuff. This should fix the Q_ASSERT that would appear when the quasselcore was quit, due to gui types stored in the config... I took the opportunity to change the organization name to "Quassel Project", which affects the location of the QSettings files. Also, we now use two separate files for client and core. Old core settings and some client settings are automatically migrated. Some UI settings are lost, however. :( Further reduced the usage of QSettings where it doesn't belong. --- diff --git a/Quassel.kdevelop.filelist b/Quassel.kdevelop.filelist index 46917963..08acd959 100644 --- a/Quassel.kdevelop.filelist +++ b/Quassel.kdevelop.filelist @@ -89,6 +89,8 @@ src/core/ircserverhandler.cpp src/core/ircserverhandler.h src/core/server.cpp src/core/server.h +src/core/sessionsettings.cpp +src/core/sessionsettings.h src/core/sqlitestorage.cpp src/core/sqlitestorage.h src/core/storage.cpp diff --git a/src/client/clientsettings.cpp b/src/client/clientsettings.cpp index 83dd8128..0a823068 100644 --- a/src/client/clientsettings.cpp +++ b/src/client/clientsettings.cpp @@ -20,10 +20,11 @@ #include "client.h" #include "clientsettings.h" +#include "global.h" #include -ClientSettings::ClientSettings(QString g) : Settings(g) { +ClientSettings::ClientSettings(QString g) : Settings(g, Global::clientApplicationName) { } diff --git a/src/common/global.h b/src/common/global.h index e8db8bb8..a2d8c847 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -39,8 +39,8 @@ namespace Global { // We need different config (QSettings) files for client and gui, since the core cannot work with GUI types // Set these here. They're used in ClientSettings and CoreSettings. - const QString coreApplicationName = "Quassel IRC Core"; - const QString clientApplicationName = "Quassel IRC Client"; + const QString coreApplicationName = "Quassel Core"; + const QString clientApplicationName = "Quassel Client"; enum RunMode { Monolithic, ClientOnly, CoreOnly }; extern RunMode runMode; diff --git a/src/common/main.cpp b/src/common/main.cpp index f7151923..102c9d44 100644 --- a/src/common/main.cpp +++ b/src/common/main.cpp @@ -85,7 +85,7 @@ int main(int argc, char **argv) { QCoreApplication::setOrganizationDomain("quassel-irc.org"); QCoreApplication::setApplicationName("Quassel IRC"); - QCoreApplication::setOrganizationName("Quassel IRC Development Team"); // FIXME + QCoreApplication::setOrganizationName("Quassel Project"); // Check if a non-standard core port is requested QStringList args = QCoreApplication::arguments(); // TODO Build a CLI parser diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 0563ff7e..5224560e 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -18,21 +18,22 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include #include #include #include #ifdef Q_WS_QWS #include -#include #endif #include "settings.h" -Settings::Settings(QString g) : group(g) { +Settings::Settings(QString g, QString applicationName) : QSettings(QCoreApplication::organizationName(), applicationName), group(g) { +/* we need to call the constructor immediately in order to set the path... #ifndef Q_WS_QWS - QSettings(); + QSettings(QCoreApplication::organizationName(), applicationName); #else // FIXME sandboxDir() is not currently working correctly... //if(Qtopia::sandboxDir().isEmpty()) QSettings(); @@ -44,9 +45,10 @@ Settings::Settings(QString g) : group(g) { QSettings(sandboxPath + "/etc/QuasselIRC.conf", QSettings::IniFormat); qDebug() << sandboxPath + "/etc/QuasselIRC.conf"; } else { - QSettings(); + QSettings(QCoreApplication::organizationName(), applicationName); } #endif +*/ } Settings::~Settings() { diff --git a/src/common/settings.h b/src/common/settings.h index 7142e722..0f716447 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -36,22 +36,17 @@ class Settings : private QSettings { enum Mode { Default, Custom }; protected: - Settings(QString group = "General"); + Settings(QString group, QString applicationName); void setGroup(QString group); virtual QStringList allLocalKeys(); virtual QStringList localChildKeys(const QString &rootkey = QString()); virtual QStringList localChildGroups(const QString &rootkey = QString()); - //virtual QStringList allSessionKeys() = 0; - virtual QStringList sessionKeys() = 0; virtual void setLocalValue(const QString &key, const QVariant &data); virtual QVariant localValue(const QString &key, const QVariant &def = QVariant()); - virtual void setSessionValue(const QString &key, const QVariant &data) = 0; - virtual QVariant sessionValue(const QString &key, const QVariant &def = QVariant()) = 0; - virtual void removeLocalKey(const QString &key); QString group; diff --git a/src/core/core.cpp b/src/core/core.cpp index d03ca6b6..e3c5555e 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -42,10 +42,55 @@ void Core::destroy() { } Core::Core() { - storage = NULL; + storage = 0; } void Core::init() { + + // TODO: Remove this again at some point + // Check if old core settings need to be migrated in order to make the switch to the + // new location less painful. + CoreSettings cs; + QVariant foo = cs.databaseSettings(); + if(!foo.isValid()) { + // ok, no settings stored yet. check for old ones. + QSettings os("Quassel IRC Development Team", "Quassel IRC"); + QVariant bar = os.value("Core/DatabaseSettings"); + if(bar.isValid()) { + // old settings available -- migrate! + qWarning() << "\n\nOld settings detected. Will migrate core settings to the new location...\nNOTE: GUI style settings won't be migrated!\n"; + QSettings ncs("Quassel Project", "Quassel Core"); + ncs.setValue("Core/CoreState", os.value("Core/CoreState")); + ncs.setValue("Core/DatabaseSettings", os.value("Core/DatabaseSettings")); + os.beginGroup("SessionData"); + foreach(QString group, os.childGroups()) { + ncs.setValue(QString("SessionData/%1/Identities").arg(group), os.value(QString("%1/Identities").arg(group))); + ncs.setValue(QString("SessionData/%1/Networks").arg(group), os.value(QString("%1/Networks").arg(group))); + } + os.endGroup(); + + QSettings ngs("Quassel Project", "Quassel Client"); + os.beginGroup("Accounts"); + foreach(QString key, os.childKeys()) { + ngs.setValue(QString("Accounts/%1").arg(key), os.value(key)); + } + foreach(QString group, os.childGroups()) { + ngs.setValue(QString("Accounts/%1/AccountData").arg(group), os.value(QString("%1/AccountData").arg(group))); + } + os.endGroup(); + os.beginGroup("Geometry"); + foreach(QString key, os.childKeys()) { + ngs.setValue(QString("UI/%1").arg(key), os.value(key)); + } + os.endGroup(); + + ncs.sync(); + ngs.sync(); + qWarning() << "Migration successfully finished. You may now delete $HOME/.config/Quassel IRC Development Team/ (on Linux).\n\n"; + } + } + // END + CoreSettings s; configured = false; diff --git a/src/core/core.pri b/src/core/core.pri index 4f020b9a..6664e2d2 100644 --- a/src/core/core.pri +++ b/src/core/core.pri @@ -1,4 +1,6 @@ DEPMOD = common QT_MOD = core network sql script -SRCS = core.cpp coresession.cpp coresettings.cpp server.cpp sqlitestorage.cpp storage.cpp basichandler.cpp ircserverhandler.cpp userinputhandler.cpp ctcphandler.cpp -HDRS = core.h coresession.h coresettings.h server.h sqlitestorage.h storage.h basichandler.h ircserverhandler.h userinputhandler.h ctcphandler.h +SRCS = core.cpp coresession.cpp coresettings.cpp server.cpp sqlitestorage.cpp storage.cpp basichandler.cpp \ + ircserverhandler.cpp userinputhandler.cpp ctcphandler.cpp sessionsettings.cpp +HDRS = core.h coresession.h coresettings.h server.h sqlitestorage.h storage.h basichandler.h \ + ircserverhandler.h userinputhandler.h ctcphandler.h sessionsettings.h diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index bb24c7ab..874de76d 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -30,6 +30,7 @@ #include "identity.h" #include "util.h" +#include "sessionsettings.h" #include @@ -43,14 +44,18 @@ CoreSession::CoreSession(UserId uid, Storage *_storage, QObject *parent) SignalProxy *p = signalProxy(); + SessionSettings s(user); + sessionData = s.sessionData(); qDebug() << sessionData; + /* QSettings s; // FIXME don't use QSettings anymore mutex.lock(); s.beginGroup(QString("SessionData/%1").arg(user)); - foreach(QString key, s.allKeys()) { + foreach(QString key, s.allKeys()) { qDebug() << key; sessionData[key] = s.value(key); } s.endGroup(); mutex.unlock(); // FIXME remove + */ /* temporarily disabled s.beginGroup(QString("Identities/%1").arg(user)); foreach(QString id, s.childKeys()) { @@ -137,13 +142,11 @@ void CoreSession::restoreState(const QVariant &previousState) { void CoreSession::storeSessionData(const QString &key, const QVariant &data) { - QSettings s; - s.beginGroup(QString("SessionData/%1").arg(user)); + SessionSettings s(user); mutex.lock(); + s.setSessionValue(key, data); sessionData[key] = data; - s.setValue(key, data); mutex.unlock(); - s.endGroup(); emit sessionDataChanged(key, data); emit sessionDataChanged(key); } @@ -317,6 +320,7 @@ void CoreSession::createOrUpdateIdentity(const Identity &id) { // update _identities[id.id()]->update(id); } + Q_ASSERT(false); // FIX QSettings first! QSettings s; // FIXME don't use QSettings s.beginGroup(QString("Identities/%1").arg(user)); s.setValue(QString::number(id.id()), QVariant::fromValue(*_identities[id.id()])); diff --git a/src/core/coresettings.cpp b/src/core/coresettings.cpp index 3c38b232..435f056b 100644 --- a/src/core/coresettings.cpp +++ b/src/core/coresettings.cpp @@ -22,7 +22,7 @@ #include -CoreSettings::CoreSettings() : Settings("Core") { +CoreSettings::CoreSettings(const QString group) : Settings(group, Global::coreApplicationName) { } CoreSettings::~CoreSettings() { @@ -51,17 +51,3 @@ void CoreSettings::setCoreState(const QVariant &data) { QVariant CoreSettings::coreState(const QVariant &def) { return localValue("CoreState", def); } - -QStringList CoreSettings::sessionKeys() { - Q_ASSERT(false); - return QStringList(); -} - -void CoreSettings::setSessionValue(const QString &key, const QVariant &data) { - Q_ASSERT(false); -} - -QVariant CoreSettings::sessionValue(const QString &key, const QVariant &def) { - Q_ASSERT(false); - return QVariant(); -} diff --git a/src/core/coresettings.h b/src/core/coresettings.h index 7b958b93..cf2cb454 100644 --- a/src/core/coresettings.h +++ b/src/core/coresettings.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-07 by the Quassel IRC Team * + * Copyright (C) 2005-08 by the Quassel IRC Team * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,8 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef CORESETTINGS_H_ -#define CORESETTINGS_H_ +#ifndef _CORESETTINGS_H_ +#define _CORESETTINGS_H_ #include "global.h" #include "settings.h" @@ -28,7 +28,7 @@ class CoreSettings : public Settings { public: virtual ~CoreSettings(); - CoreSettings(); + CoreSettings(const QString group = "Core"); void setDatabaseSettings(const QVariant &data); QVariant databaseSettings(const QVariant &def = QVariant()); @@ -39,12 +39,6 @@ class CoreSettings : public Settings { void setCoreState(const QVariant &data); QVariant coreState(const QVariant &def = QVariant()); - private: - //virtual QStringList allSessionKeys() = 0; - virtual QStringList sessionKeys(); - - virtual void setSessionValue(const QString &key, const QVariant &data); - virtual QVariant sessionValue(const QString &key, const QVariant &def = QVariant()); }; #endif /*CORESETTINGS_H_*/ diff --git a/src/core/sessionsettings.cpp b/src/core/sessionsettings.cpp new file mode 100644 index 00000000..3f804ab3 --- /dev/null +++ b/src/core/sessionsettings.cpp @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel IRC Team * + * devel@quassel-irc.org * + * * + * 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) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "sessionsettings.h" + +#include +#include + +SessionSettings::SessionSettings(UserId uid) : CoreSettings("SessionData"), user(uid) { + +} + +QVariantMap SessionSettings::sessionData() { + QVariantMap res; + foreach(QString key, localChildKeys(QString("%1").arg(user))) { + res[key] = localValue(QString("%1/%2").arg(user).arg(key)); + } + return res; +} + +void SessionSettings::setSessionValue(const QString &key, const QVariant &data) { + setLocalValue(QString("%1/%2").arg(user).arg(key), data); +} + +QVariant SessionSettings::sessionValue(const QString &key, const QVariant &def) { + return localValue(QString("%1/%2").arg(user).arg(key), def); +} + diff --git a/src/core/sessionsettings.h b/src/core/sessionsettings.h new file mode 100644 index 00000000..a5df1128 --- /dev/null +++ b/src/core/sessionsettings.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2005-08 by the Quassel IRC Team * + * devel@quassel-irc.org * + * * + * 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) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _SESSIONSETTINGS_H_ +#define _SESSIONSETTINGS_H_ + +#include "coresettings.h" +#include "types.h" + +#include + +// this class should only be used from CoreSession! +//! This class stores and retrieves data from permanent storage for the use in SessionData. +/** \Note Data stored here is not propagated into the actual SessionData! + */ +class SessionSettings : public CoreSettings { + + private: + explicit SessionSettings(UserId user); + + QVariantMap sessionData(); + QVariant sessionValue(const QString &key, const QVariant &def = QVariant()); + void setSessionValue(const QString &key, const QVariant &value); + + UserId user; + + friend class CoreSession; +}; + +#endif diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index fee617d4..d244dc85 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -29,8 +29,8 @@ #include "serverlist.h" #include "settingsdlg.h" #include "signalproxy.h" - #include "topicwidget.h" +#include "uisettings.h" #include "selectionmodelsynchronizer.h" #include "mappedselectionmodel.h" @@ -87,17 +87,8 @@ void MainWin::init() { ui.menuViews->addAction(nickDock->toggleViewAction()); // restore mainwin state - QSettings s; - s.beginGroup("Geometry"); - //resize(s.value("MainWinSize", QSize(500, 400)).toSize()); - //move(s.value("MainWinPos", QPoint(50, 50)).toPoint()); - if(s.contains("MainWinState")) restoreState(s.value("MainWinState").toByteArray()); - s.endGroup(); - - //s.beginGroup("Buffers"); - //QString net = s.value("CurrentNetwork", "").toString(); - //QString buf = s.value("CurrentBuffer", "").toString(); - //s.endGroup(); + UiSettings s; + restoreState(s.value("MainWinState").toByteArray()); disconnectedFromCore(); // Disable menus and stuff showCoreConnectionDlg(true); // autoconnect if appropriate @@ -266,16 +257,10 @@ void MainWin::closeEvent(QCloseEvent *event) { //if (userReallyWantsToQuit()) { ui.bufferWidget->saveState(); - QSettings s; - s.beginGroup("Geometry"); + UiSettings s; s.setValue("MainWinSize", size()); s.setValue("MainWinPos", pos()); s.setValue("MainWinState", saveState()); - s.endGroup(); - s.beginGroup("Buffers"); - //s.setValue("CurrentNetwork", currentNetwork); - s.setValue("CurrentBuffer", currentBuffer); - s.endGroup(); delete systray; event->accept(); //} else { diff --git a/src/qtui/serverlist.cpp b/src/qtui/serverlist.cpp index 2f99f050..f13ef1b1 100644 --- a/src/qtui/serverlist.cpp +++ b/src/qtui/serverlist.cpp @@ -33,7 +33,7 @@ ServerListDlg::ServerListDlg(QWidget *parent) : QDialog(parent) { QSettings settings; settings.beginGroup("GUI"); - ui.showOnStartup->setChecked(settings.value("ShowServerListOnStartup", true).toBool()); + ui.showOnStartup->setChecked(settings.value("ShowServerListOnStartup", false).toBool()); updateNetworkTree(); connect(ui.networkTree, SIGNAL(itemSelectionChanged()), this, SLOT(updateButtons())); @@ -163,8 +163,8 @@ void ServerListDlg::editIdentities(bool end) { } void ServerListDlg::on_showOnStartup_stateChanged(int) { - QSettings s; - s.setValue("GUI/ShowServerListOnStartup", ui.showOnStartup->isChecked()); + //QSettings s; + //s.setValue("GUI/ShowServerListOnStartup", ui.showOnStartup->isChecked()); } void ServerListDlg::accept() {