/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "ffjson.h" #include "bookmarkitem.h" #include #include #include #include #include inline auto asDate(const QJsonValue &v) { // timestamps in bookmarks.json are, for some reason, in *micro*seconds return QDateTime::fromMSecsSinceEpoch(v.toVariant().toLongLong() / 1000); } inline void readElementData(const QJsonObject &object, BookmarkItem *item) { item->setData(BookmarkItem::Title, object["title"].toString()); item->setData(BookmarkItem::DateAdded, asDate(object["dateAdded"])); item->setData(BookmarkItem::LastModified, asDate(object["lastModified"])); // tags const auto tags = object["tags"].toString().split(","); if(!tags.isEmpty()) item->setData(BookmarkItem::Tags, tags); // descriptions const auto annos_array = object["annos"].toArray(); for(const auto &a : annos_array) { const auto anno = a.toObject(); if(anno["name"] == "bookmarkProperties/description") { item->setData(BookmarkItem::Description, anno["value"].toString()); } } } inline void readChildElements(const QJsonObject &object, BookmarkItem *item) { const auto children_array = object["children"].toArray(); for(const auto &c : children_array) { const auto child = c.toObject(); const auto type = child["type"].toString(); if(type == "text/x-moz-place-container") { auto *childItem = new BookmarkItem({}, BookmarkItem::Folder, item); childItem->setExpanded(true); readElementData(child, childItem); item->appendChild(childItem); readChildElements(child, childItem); } else if(type == "text/x-moz-place") { auto *childItem = new BookmarkItem({}, BookmarkItem::Bookmark, item); readElementData(child, childItem); childItem->setData(BookmarkItem::Href, child["uri"].toString()); item->appendChild(childItem); } else { qDebug() << "!!! unknown type " << qUtf8Printable(type); } } } void FFJson::read(QIODevice *device, BookmarkItem *item) { const auto doc = QJsonDocument::fromJson(device->readAll()); readChildElements(doc.object(), item); }