ab514355938df054f89e3fca908ee240725d1107
[quassel.git] / src / qtui / qtuiapplication.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2012 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "qtuiapplication.h"
22
23 #include <QStringList>
24
25 #ifdef HAVE_KDE
26 #  include <KStandardDirs>
27 #endif
28
29 #include "client.h"
30 #include "cliparser.h"
31 #include "mainwin.h"
32 #include "qtui.h"
33 #include "qtuisettings.h"
34
35 QtUiApplication::QtUiApplication(int &argc, char **argv)
36 #ifdef HAVE_KDE
37     : KApplication(),
38 #else
39     : QApplication(argc, argv),
40 #endif
41     Quassel(),
42     _aboutToQuit(false)
43 {
44 #ifdef HAVE_KDE
45     Q_UNUSED(argc); Q_UNUSED(argv);
46
47     // We need to setup KDE's data dirs
48     QStringList dataDirs = KGlobal::dirs()->findDirs("data", "");
49     for (int i = 0; i < dataDirs.count(); i++)
50         dataDirs[i].append("quassel/");
51     dataDirs.append(":/data/");
52     setDataDirPaths(dataDirs);
53
54 #else /* HAVE_KDE */
55
56     setDataDirPaths(findDataDirPaths());
57
58 #endif /* HAVE_KDE */
59
60 #if defined(HAVE_KDE) || defined(Q_OS_MAC)
61     disableCrashhandler();
62 #endif /* HAVE_KDE || Q_OS_MAC */
63     setRunMode(Quassel::ClientOnly);
64
65     qInstallMsgHandler(Client::logMessage);
66 }
67
68
69 bool QtUiApplication::init()
70 {
71     if (Quassel::init()) {
72         // FIXME: MIGRATION 0.3 -> 0.4: Move database and core config to new location
73         // Move settings, note this does not delete the old files
74 #ifdef Q_WS_MAC
75         QSettings newSettings("quassel-irc.org", "quasselclient");
76 #else
77
78 # ifdef Q_WS_WIN
79         QSettings::Format format = QSettings::IniFormat;
80 # else
81         QSettings::Format format = QSettings::NativeFormat;
82 # endif
83
84         QString newFilePath = Quassel::configDirPath() + "quasselclient"
85                               + ((format == QSettings::NativeFormat) ? QLatin1String(".conf") : QLatin1String(".ini"));
86         QSettings newSettings(newFilePath, format);
87 #endif /* Q_WS_MAC */
88
89         if (newSettings.value("Config/Version").toUInt() == 0) {
90 #     ifdef Q_WS_MAC
91             QString org = "quassel-irc.org";
92 #     else
93             QString org = "Quassel Project";
94 #     endif
95             QSettings oldSettings(org, "Quassel Client");
96             if (oldSettings.allKeys().count()) {
97                 qWarning() << "\n\n*** IMPORTANT: Config and data file locations have changed. Attempting to auto-migrate your client settings...";
98                 foreach(QString key, oldSettings.allKeys())
99                 newSettings.setValue(key, oldSettings.value(key));
100                 newSettings.setValue("Config/Version", 1);
101                 qWarning() << "*   Your client settings have been migrated to" << newSettings.fileName();
102                 qWarning() << "*** Migration completed.\n\n";
103             }
104         }
105
106         // MIGRATION end
107
108         // check settings version
109         // so far, we only have 1
110         QtUiSettings s;
111         if (s.version() != 1) {
112             qCritical() << "Invalid client settings version, terminating!";
113             return false;
114         }
115
116         // session resume
117         QtUi *gui = new QtUi();
118         Client::init(gui);
119         // init gui only after the event loop has started
120         // QTimer::singleShot(0, gui, SLOT(init()));
121         gui->init();
122         resumeSessionIfPossible();
123         return true;
124     }
125     return false;
126 }
127
128
129 QtUiApplication::~QtUiApplication()
130 {
131     Client::destroy();
132 }
133
134
135 void QtUiApplication::quit()
136 {
137     QtUi::mainWindow()->quit();
138 }
139
140
141 void QtUiApplication::commitData(QSessionManager &manager)
142 {
143     Q_UNUSED(manager)
144     _aboutToQuit = true;
145 }
146
147
148 void QtUiApplication::saveState(QSessionManager &manager)
149 {
150     //qDebug() << QString("saving session state to id %1").arg(manager.sessionId());
151     // AccountId activeCore = Client::currentCoreAccount().accountId(); // FIXME store this!
152     SessionSettings s(manager.sessionId());
153     s.setSessionAge(0);
154     QtUi::mainWindow()->saveStateToSettings(s);
155 }
156
157
158 void QtUiApplication::resumeSessionIfPossible()
159 {
160     // load all sessions
161     if (isSessionRestored()) {
162         qDebug() << QString("restoring from session %1").arg(sessionId());
163         SessionSettings s(sessionId());
164         s.sessionAging();
165         s.setSessionAge(0);
166         QtUi::mainWindow()->restoreStateFromSettings(s);
167         s.cleanup();
168     }
169     else {
170         SessionSettings s(QString("1"));
171         s.sessionAging();
172         s.cleanup();
173     }
174 }