File indexing completed on 2024-04-28 04:37:03

0001 /*
0002     SPDX-FileCopyrightText: 2004 Roberto Raggi <roberto@kdevelop.org>
0003     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "importprojectjob.h"
0009 #include "projectmodel.h"
0010 
0011 #include <QtConcurrentRun>
0012 #include <QFuture>
0013 #include <QFutureWatcher>
0014 #include <QPointer>
0015 
0016 #include <interfaces/iprojectfilemanager.h>
0017 #include <interfaces/iproject.h>
0018 #include <interfaces/icore.h>
0019 
0020 #include <KLocalizedString>
0021 
0022 namespace KDevelop
0023 {
0024 
0025 class ImportProjectJobPrivate
0026 {
0027 public:
0028     ImportProjectJobPrivate() {}
0029     ProjectFolderItem *m_folder;
0030     IProjectFileManager *m_importer;
0031     QFutureWatcher<void> *m_watcher;
0032     QPointer<IProject> m_project;
0033     bool cancel = false;
0034 
0035     void import(ProjectFolderItem* folder)
0036     {
0037         const auto subs = m_importer->parse(folder);
0038         for (ProjectFolderItem* sub : subs) {
0039             if(!cancel) {
0040                 import(sub);
0041             }
0042         }
0043     }
0044 };
0045 
0046 ImportProjectJob::ImportProjectJob(ProjectFolderItem *folder, IProjectFileManager *importer)
0047     : KJob(nullptr), d(new ImportProjectJobPrivate )
0048 {
0049     setCapabilities(Killable);
0050 
0051     d->m_importer = importer;
0052     d->m_folder = folder;
0053     d->m_project = folder->project();
0054 
0055     setObjectName(i18n("Project Import: %1", d->m_project->name()));
0056     connect(ICore::self(), &ICore::aboutToShutdown,
0057             this, &ImportProjectJob::aboutToShutdown);
0058 }
0059 
0060 ImportProjectJob::~ImportProjectJob()
0061 {
0062     delete d;
0063 }
0064 
0065 void ImportProjectJob::start()
0066 {
0067     d->m_watcher = new QFutureWatcher<void>();
0068     connect(d->m_watcher, &QFutureWatcher<void>::finished, this, &ImportProjectJob::importDone);
0069     connect(d->m_watcher, &QFutureWatcher<void>::canceled, this, &ImportProjectJob::importCanceled);
0070     QFuture<void> f = QtConcurrent::run(d, &ImportProjectJobPrivate::import, d->m_folder);
0071     d->m_watcher->setFuture(f);
0072 }
0073 
0074 void ImportProjectJob::importDone()
0075 {
0076     d->m_watcher->deleteLater(); /* Goodbye to the QFutureWatcher */
0077 
0078     emitResult();
0079 }
0080 
0081 bool ImportProjectJob::doKill()
0082 {
0083     d->m_watcher->cancel();
0084     d->cancel=true;
0085 
0086     setError(1);
0087     setErrorText(i18n("Project import canceled."));
0088 
0089     d->m_watcher->waitForFinished();
0090     return true;
0091 }
0092 
0093 void ImportProjectJob::aboutToShutdown()
0094 {
0095     kill();
0096 }
0097 
0098 void ImportProjectJob::importCanceled()
0099 {
0100     d->m_watcher->deleteLater();
0101 }
0102 
0103 }
0104 
0105 #include "moc_importprojectjob.cpp"