1 /*
2 This file is part of Akregator.
3
4 SPDX-FileCopyrightText: 2009 Frank Osterfeld <osterfeld@kde.org>
5
6 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
7 */
8
9 #include "importfeedlistcommand.h"
10
11 #include "feedlist.h"
12 #include "folder.h"
13 #include "kernel.h"
14
15 #include "akregator_debug.h"
16 #include <KLocalizedString>
17 #include <QInputDialog>
18
19 #include <QDomDocument>
20 #include <QPointer>
21 #include <QTimer>
22
23 #include <QSharedPointer>
24
25 #include <cassert>
26
27 using namespace Akregator;
28
29 class Akregator::ImportFeedListCommandPrivate
30 {
31 ImportFeedListCommand *const q;
32
33 public:
34 explicit ImportFeedListCommandPrivate(ImportFeedListCommand *qq);
35
36 void doImport();
37
38 QWeakPointer<FeedList> targetList;
39 QDomDocument document;
40 ImportFeedListCommand::RootFolderOption rootFolderOption;
41 QString importedRootFolderName;
42 };
43
ImportFeedListCommandPrivate(ImportFeedListCommand * qq)44 ImportFeedListCommandPrivate::ImportFeedListCommandPrivate(ImportFeedListCommand *qq)
45 : q(qq)
46 , targetList()
47 , rootFolderOption(ImportFeedListCommand::Ask)
48 , importedRootFolderName(i18n("Imported Feeds"))
49 {
50 }
51
doImport()52 void ImportFeedListCommandPrivate::doImport()
53 {
54 const QSharedPointer<FeedList> target = targetList.lock();
55
56 if (!target) {
57 qCWarning(AKREGATOR_LOG) << "Target list was deleted, could not import feed list";
58 q->done();
59 return;
60 }
61
62 QScopedPointer<FeedList> importedList(new FeedList(Kernel::self()->storage()));
63 const bool parsed = importedList->readFromOpml(document);
64
65 // FIXME: parsing error, print some message
66 if (!parsed) {
67 q->done();
68 return;
69 }
70
71 QPointer<QObject> that(q);
72
73 bool ok = false;
74
75 if (rootFolderOption == ImportFeedListCommand::Ask) {
76 importedRootFolderName = QInputDialog::getText(q->parentWidget(),
77 i18n("Add Imported Folder"),
78 i18n("Imported folder name:"),
79 QLineEdit::Normal,
80 importedRootFolderName,
81 &ok);
82 }
83
84 if (!ok || !that) {
85 if (that) {
86 q->done();
87 }
88 return;
89 }
90
91 Folder *folder = target->allFeedsFolder();
92
93 if (rootFolderOption != ImportFeedListCommand::None) {
94 folder = new Folder(importedRootFolderName);
95 target->allFeedsFolder()->appendChild(folder);
96 }
97
98 target->append(importedList.data(), folder);
99
100 q->done();
101 }
102
ImportFeedListCommand(QObject * parent)103 ImportFeedListCommand::ImportFeedListCommand(QObject *parent)
104 : Command(parent)
105 , d(new ImportFeedListCommandPrivate(this))
106 {
107 }
108
109 ImportFeedListCommand::~ImportFeedListCommand() = default;
110
setTargetList(const QWeakPointer<FeedList> & feedList)111 void ImportFeedListCommand::setTargetList(const QWeakPointer<FeedList> &feedList)
112 {
113 d->targetList = feedList;
114 }
115
setImportedRootFolderOption(RootFolderOption opt)116 void ImportFeedListCommand::setImportedRootFolderOption(RootFolderOption opt)
117 {
118 d->rootFolderOption = opt;
119 }
120
setImportedRootFolderName(const QString & defaultName)121 void ImportFeedListCommand::setImportedRootFolderName(const QString &defaultName)
122 {
123 d->importedRootFolderName = defaultName;
124 }
125
setFeedListDocument(const QDomDocument & doc)126 void ImportFeedListCommand::setFeedListDocument(const QDomDocument &doc)
127 {
128 d->document = doc;
129 }
130
doAbort()131 void ImportFeedListCommand::doAbort()
132 {
133 // TODO
134 }
135
doStart()136 void ImportFeedListCommand::doStart()
137 {
138 QTimer::singleShot(0, this, [this]() {
139 d->doImport();
140 });
141 }
142
143 #include "moc_importfeedlistcommand.cpp"
144