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"