File indexing completed on 2024-06-16 05:25:08

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "externalbookmarkstorage.hpp"
0010 
0011 // lib
0012 #include "bytearraydocument.hpp"
0013 // Okteta core
0014 #include <Okteta/Bookmarkable>
0015 #include <Okteta/BookmarksConstIterator>
0016 #include <Okteta/Bookmark>
0017 #include <Okteta/AbstractByteArrayModel>
0018 // KF
0019 #include <KBookmarkManager>
0020 // Qt
0021 #include <QStandardPaths>
0022 
0023 namespace Kasten {
0024 
0025 ExternalBookmarkStorage::ExternalBookmarkStorage()
0026 {
0027     const QString bookmarksFileName =
0028         QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/okteta/bookmarks.xml");
0029     mBookmarkManager = KBookmarkManager::managerForFile(bookmarksFileName, QStringLiteral("okteta"));
0030 }
0031 
0032 ExternalBookmarkStorage::~ExternalBookmarkStorage() = default;
0033 
0034 void ExternalBookmarkStorage::readBookmarks(ByteArrayDocument* document, const QUrl& url)
0035 {
0036     Okteta::AbstractByteArrayModel* byteArray = document->content();
0037     Okteta::Bookmarkable* bookmarkable = qobject_cast<Okteta::Bookmarkable*>(byteArray);
0038 
0039     bookmarkable->removeAllBookmarks();
0040 
0041     const QString urlString = url.toDisplayString(QUrl::PrettyDecoded | QUrl::PreferLocalFile);
0042 
0043     KBookmarkGroup root = mBookmarkManager->root();
0044 
0045     for (KBookmark bm = root.first(); !bm.isNull(); bm = root.next(bm)) {
0046         if (bm.isSeparator() || !bm.isGroup()) {
0047             continue;
0048         }
0049 
0050         if (bm.fullText() == urlString) {
0051             KBookmarkGroup bmGroup = bm.toGroup();
0052 
0053             QVector<Okteta::Bookmark> bookmarksToBeCreated;
0054             Okteta::Bookmark bookmark;
0055             for (bm = bmGroup.first(); !bm.isNull(); bm = bmGroup.next(bm)) {
0056                 if (bm.isSeparator() || bm.isGroup()) {
0057                     continue;
0058                 }
0059 
0060                 bookmark.setOffset(bm.url().fragment().toULongLong());
0061                 bookmark.setName(bm.fullText());
0062 
0063                 bookmarksToBeCreated.append(bookmark);
0064             }
0065 
0066             bookmarkable->addBookmarks(bookmarksToBeCreated);
0067 
0068             break;
0069         }
0070     }
0071 }
0072 
0073 void ExternalBookmarkStorage::writeBookmarks(ByteArrayDocument* document, const QUrl& url)
0074 {
0075     Okteta::AbstractByteArrayModel* byteArray = document->content();
0076     Okteta::Bookmarkable* bookmarkable = qobject_cast<Okteta::Bookmarkable*>(byteArray);
0077 
0078     if (!bookmarkable) {
0079         return;
0080     }
0081 
0082     const QString urlString = url.toDisplayString(QUrl::PrettyDecoded | QUrl::PreferLocalFile);
0083 
0084     KBookmarkGroup root = mBookmarkManager->root();
0085 
0086     // rm old bookmarkable
0087     KBookmark bm = root.first();
0088     while (!bm.isNull()) {
0089         if (bm.isSeparator() || !bm.isGroup()) {
0090             continue;
0091         }
0092 
0093         if (bm.fullText() == urlString) {
0094             root.deleteBookmark(bm);
0095             break;
0096         }
0097 
0098         bm = root.next(bm);
0099     }
0100 
0101     // store current bookmarks
0102     KBookmarkGroup bookmarkGroup = root.createNewFolder(urlString);
0103     Okteta::BookmarksConstIterator bit = bookmarkable->createBookmarksConstIterator();
0104     while (bit.hasNext()) {
0105         const Okteta::Bookmark& bookmark = bit.next();
0106         QUrl bookmarkUrl = url;
0107         bookmarkUrl.setFragment(QString::number(bookmark.offset()));
0108         bookmarkGroup.addBookmark(bookmark.name(), bookmarkUrl, QString());
0109     }
0110 
0111     mBookmarkManager->save(false);
0112 }
0113 
0114 }