From ed39aefdad7605708e4dab8709ac9d85650d801e Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 2 Jan 2018 16:42:56 +0100 Subject: [PATCH] Change structure of session file + also save window geometry Bump session file version to 4. Added support for old version to RestoreManager to prevent losing old saved sessions. --- src/lib/app/browserwindow.cpp | 54 ++++++++++------------- src/lib/app/qzcommon.cpp | 3 +- src/lib/app/qzcommon.h | 4 +- src/lib/session/restoremanager.cpp | 70 +++++++++++++++++++++++++----- 4 files changed, 82 insertions(+), 49 deletions(-) diff --git a/src/lib/app/browserwindow.cpp b/src/lib/app/browserwindow.cpp index 2bae84cb5..eaf319eee 100644 --- a/src/lib/app/browserwindow.cpp +++ b/src/lib/app/browserwindow.cpp @@ -85,6 +85,8 @@ #include #endif +static const int savedWindowVersion = 1; + BrowserWindow::SavedWindow::SavedWindow() { } @@ -135,55 +137,43 @@ void BrowserWindow::SavedWindow::clear() QDataStream &operator<<(QDataStream &stream, const BrowserWindow::SavedWindow &window) { - QByteArray tabsState; - QByteArray windowState; - -#ifdef QZ_WS_X11 - QDataStream stream1(&windowState, QIODevice::WriteOnly); - stream1 << window.windowState; - stream1 << window.virtualDesktop; -#else - windowState = window.windowState; -#endif + stream << savedWindowVersion; + stream << window.windowState; + stream << window.windowGeometry; + stream << window.virtualDesktop; + stream << window.currentTab; + stream << window.tabs.count(); - QDataStream stream2(&tabsState, QIODevice::WriteOnly); - stream2 << window.tabs.count(); - for (const WebTab::SavedTab &tab : qAsConst(window.tabs)) { - stream2 << tab; + for (int i = 0; i < window.tabs.count(); ++i) { + stream << window.tabs.at(i); } - stream2 << window.currentTab; - stream << tabsState; - stream << windowState; return stream; } QDataStream &operator>>(QDataStream &stream, BrowserWindow::SavedWindow &window) { - QByteArray tabsState; - QByteArray windowState; + int version; + stream >> version; - stream >> tabsState; - stream >> windowState; + if (version < 1) { + return stream; + } -#ifdef QZ_WS_X11 - QDataStream stream1(&windowState, QIODevice::ReadOnly); - stream1 >> window.windowState; - stream1 >> window.virtualDesktop; -#else - window.windowState = windowState; -#endif + stream >> window.windowState; + stream >> window.windowGeometry; + stream >> window.virtualDesktop; + stream >> window.currentTab; int tabsCount = -1; - QDataStream stream2(&tabsState, QIODevice::ReadOnly); - stream2 >> tabsCount; + stream >> tabsCount; window.tabs.reserve(tabsCount); + for (int i = 0; i < tabsCount; ++i) { WebTab::SavedTab tab; - stream2 >> tab; + stream >> tab; window.tabs.append(tab); } - stream2 >> window.currentTab; return stream; } diff --git a/src/lib/app/qzcommon.cpp b/src/lib/app/qzcommon.cpp index 76d74f553..9a42adda6 100644 --- a/src/lib/app/qzcommon.cpp +++ b/src/lib/app/qzcommon.cpp @@ -19,8 +19,7 @@ namespace Qz { -const int sessionVersion = 0x0003; -const int sessionVersionQt5 = 0x0003 | 0x050000; +const int sessionVersion = 0x0004; const int bookmarksVersion = 1; FALKON_EXPORT const char* APPNAME = "Falkon"; diff --git a/src/lib/app/qzcommon.h b/src/lib/app/qzcommon.h index f02b60862..11445c543 100644 --- a/src/lib/app/qzcommon.h +++ b/src/lib/app/qzcommon.h @@ -1,6 +1,6 @@ /* ============================================================ * Falkon - Qt web browser -* Copyright (C) 2010-2017 David Rosca +* Copyright (C) 2010-2018 David Rosca * * 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 @@ -51,8 +51,6 @@ namespace Qz { // Version of session.dat file extern const int sessionVersion; -// Backwards compatibility (used to be different for Qt4 and Qt5) -extern const int sessionVersionQt5; // Version of bookmarks.json file extern const int bookmarksVersion; diff --git a/src/lib/session/restoremanager.cpp b/src/lib/session/restoremanager.cpp index 61cc8a8ba..3027f3d23 100644 --- a/src/lib/session/restoremanager.cpp +++ b/src/lib/session/restoremanager.cpp @@ -49,6 +49,58 @@ QObject *RestoreManager::recoveryObject(WebPage *page) return m_recoveryObject; } +static void loadCurrentVersion(QDataStream &stream, RestoreData &data) +{ + int windowCount; + stream >> windowCount; + data.reserve(windowCount); + + for (int i = 0; i < windowCount; ++i) { + BrowserWindow::SavedWindow window; + stream >> window; + data.append(window); + } +} + +static void loadVersion3(QDataStream &stream, RestoreData &data) +{ + int windowCount; + stream >> windowCount; + data.reserve(windowCount); + + for (int i = 0; i < windowCount; ++i) { + QByteArray tabsState; + QByteArray windowState; + + stream >> tabsState; + stream >> windowState; + + BrowserWindow::SavedWindow window; + +#ifdef QZ_WS_X11 + QDataStream stream1(&windowState, QIODevice::ReadOnly); + stream1 >> window.windowState; + stream1 >> window.virtualDesktop; +#else + window.windowState = windowState; +#endif + + int tabsCount = -1; + QDataStream stream2(&tabsState, QIODevice::ReadOnly); + stream2 >> tabsCount; + window.tabs.reserve(tabsCount); + for (int i = 0; i < tabsCount; ++i) { + WebTab::SavedTab tab; + stream2 >> tab; + window.tabs.append(tab); + } + stream2 >> window.currentTab; + + data.append(window); + } +} + +// static void RestoreManager::createFromFile(const QString &file, RestoreData &data) { if (!QFile::exists(file)) { @@ -62,18 +114,12 @@ void RestoreManager::createFromFile(const QString &file, RestoreData &data) int version; stream >> version; - if (version != Qz::sessionVersion && version != Qz::sessionVersionQt5) { - return; - } - - int windowCount; - stream >> windowCount; - data.reserve(windowCount); - - for (int i = 0; i < windowCount; ++i) { - BrowserWindow::SavedWindow window; - stream >> window; - data.append(window); + if (version == Qz::sessionVersion) { + loadCurrentVersion(stream, data); + } else if (version == 0x0003 || version == (0x0003 | 0x050000)) { + loadVersion3(stream, data); + } else { + qWarning() << "Unsupported session file version" << version; } }