File indexing completed on 2024-05-19 09:04:10

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2009 Frank Osterfeld <osterfeld@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 
0009 #include "importfeedlistcommand.h"
0010 
0011 #include "feedlist.h"
0012 #include "folder.h"
0013 #include "kernel.h"
0014 
0015 #include "akregator_debug.h"
0016 #include <KLocalizedString>
0017 #include <QInputDialog>
0018 
0019 #include <QDomDocument>
0020 #include <QPointer>
0021 #include <QTimer>
0022 
0023 #include <QSharedPointer>
0024 
0025 #include <cassert>
0026 
0027 using namespace Akregator;
0028 
0029 class Akregator::ImportFeedListCommandPrivate
0030 {
0031     ImportFeedListCommand *const q;
0032 
0033 public:
0034     explicit ImportFeedListCommandPrivate(ImportFeedListCommand *qq);
0035 
0036     void doImport();
0037 
0038     QWeakPointer<FeedList> targetList;
0039     QDomDocument document;
0040     ImportFeedListCommand::RootFolderOption rootFolderOption;
0041     QString importedRootFolderName;
0042 };
0043 
0044 ImportFeedListCommandPrivate::ImportFeedListCommandPrivate(ImportFeedListCommand *qq)
0045     : q(qq)
0046     , targetList()
0047     , rootFolderOption(ImportFeedListCommand::Ask)
0048     , importedRootFolderName(i18n("Imported Feeds"))
0049 {
0050 }
0051 
0052 void ImportFeedListCommandPrivate::doImport()
0053 {
0054     const QSharedPointer<FeedList> target = targetList.lock();
0055 
0056     if (!target) {
0057         qCWarning(AKREGATOR_LOG) << "Target list was deleted, could not import feed list";
0058         q->done();
0059         return;
0060     }
0061 
0062     QScopedPointer<FeedList> importedList(new FeedList(Kernel::self()->storage()));
0063     const bool parsed = importedList->readFromOpml(document);
0064 
0065     // FIXME: parsing error, print some message
0066     if (!parsed) {
0067         q->done();
0068         return;
0069     }
0070 
0071     QPointer<QObject> that(q);
0072 
0073     bool ok = false;
0074 
0075     if (rootFolderOption == ImportFeedListCommand::Ask) {
0076         importedRootFolderName = QInputDialog::getText(q->parentWidget(),
0077                                                        i18n("Add Imported Folder"),
0078                                                        i18n("Imported folder name:"),
0079                                                        QLineEdit::Normal,
0080                                                        importedRootFolderName,
0081                                                        &ok);
0082     }
0083 
0084     if (!ok || !that) {
0085         if (that) {
0086             q->done();
0087         }
0088         return;
0089     }
0090 
0091     Folder *folder = target->allFeedsFolder();
0092 
0093     if (rootFolderOption != ImportFeedListCommand::None) {
0094         folder = new Folder(importedRootFolderName);
0095         target->allFeedsFolder()->appendChild(folder);
0096     }
0097 
0098     target->append(importedList.data(), folder);
0099 
0100     q->done();
0101 }
0102 
0103 ImportFeedListCommand::ImportFeedListCommand(QObject *parent)
0104     : Command(parent)
0105     , d(new ImportFeedListCommandPrivate(this))
0106 {
0107 }
0108 
0109 ImportFeedListCommand::~ImportFeedListCommand() = default;
0110 
0111 void ImportFeedListCommand::setTargetList(const QWeakPointer<FeedList> &feedList)
0112 {
0113     d->targetList = feedList;
0114 }
0115 
0116 void ImportFeedListCommand::setImportedRootFolderOption(RootFolderOption opt)
0117 {
0118     d->rootFolderOption = opt;
0119 }
0120 
0121 void ImportFeedListCommand::setImportedRootFolderName(const QString &defaultName)
0122 {
0123     d->importedRootFolderName = defaultName;
0124 }
0125 
0126 void ImportFeedListCommand::setFeedListDocument(const QDomDocument &doc)
0127 {
0128     d->document = doc;
0129 }
0130 
0131 void ImportFeedListCommand::doAbort()
0132 {
0133     // TODO
0134 }
0135 
0136 void ImportFeedListCommand::doStart()
0137 {
0138     QTimer::singleShot(0, this, [this]() {
0139         d->doImport();
0140     });
0141 }
0142 
0143 #include "moc_importfeedlistcommand.cpp"