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"