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