forked from qt-creator/qt-creator
HelpManager: Hide registerDocumentationNow() in cpp
This avoid calling collectionFilePath() concurrently, which might be potentially problematic. Change-Id: Ic873b6429b933f2f3359623b1e9cb14409ef3c4b Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -94,6 +94,39 @@ QString HelpManager::collectionFilePath()
|
|||||||
return ICore::userResourcePath("helpcollection.qhc").toString();
|
return ICore::userResourcePath("helpcollection.qhc").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void registerDocumentationNow(QPromise<bool> &promise, const QString &collectionFilePath,
|
||||||
|
const QStringList &files)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&d->m_helpengineMutex);
|
||||||
|
|
||||||
|
promise.setProgressRange(0, files.count());
|
||||||
|
promise.setProgressValue(0);
|
||||||
|
|
||||||
|
QHelpEngineCore helpEngine(collectionFilePath);
|
||||||
|
helpEngine.setReadOnly(false);
|
||||||
|
helpEngine.setupData();
|
||||||
|
bool docsChanged = false;
|
||||||
|
QStringList nameSpaces = helpEngine.registeredDocumentations();
|
||||||
|
for (const QString &file : files) {
|
||||||
|
if (promise.isCanceled())
|
||||||
|
break;
|
||||||
|
promise.setProgressValue(promise.future().progressValue() + 1);
|
||||||
|
const QString &nameSpace = QHelpEngineCore::namespaceName(file);
|
||||||
|
if (nameSpace.isEmpty())
|
||||||
|
continue;
|
||||||
|
if (!nameSpaces.contains(nameSpace)) {
|
||||||
|
if (helpEngine.registerDocumentation(file)) {
|
||||||
|
nameSpaces.append(nameSpace);
|
||||||
|
docsChanged = true;
|
||||||
|
} else {
|
||||||
|
qWarning() << "Error registering namespace '" << nameSpace
|
||||||
|
<< "' from file '" << file << "':" << helpEngine.error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
promise.addResult(docsChanged);
|
||||||
|
}
|
||||||
|
|
||||||
void HelpManager::registerDocumentation(const QStringList &files)
|
void HelpManager::registerDocumentation(const QStringList &files)
|
||||||
{
|
{
|
||||||
if (d->m_needsSetup) {
|
if (d->m_needsSetup) {
|
||||||
@@ -102,7 +135,7 @@ void HelpManager::registerDocumentation(const QStringList &files)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QFuture<bool> future = Utils::asyncRun(&HelpManager::registerDocumentationNow, files);
|
QFuture<bool> future = Utils::asyncRun(registerDocumentationNow, collectionFilePath(), files);
|
||||||
Utils::onResultReady(future, this, [](bool docsChanged){
|
Utils::onResultReady(future, this, [](bool docsChanged){
|
||||||
if (docsChanged) {
|
if (docsChanged) {
|
||||||
d->m_helpEngine->setupData();
|
d->m_helpEngine->setupData();
|
||||||
@@ -125,38 +158,6 @@ void HelpManager::unregisterDocumentation(const QStringList &fileNames)
|
|||||||
unregisterNamespaces(getNamespaces(fileNames));
|
unregisterNamespaces(getNamespaces(fileNames));
|
||||||
}
|
}
|
||||||
|
|
||||||
void HelpManager::registerDocumentationNow(QPromise<bool> &promise, const QStringList &files)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&d->m_helpengineMutex);
|
|
||||||
|
|
||||||
promise.setProgressRange(0, files.count());
|
|
||||||
promise.setProgressValue(0);
|
|
||||||
|
|
||||||
QHelpEngineCore helpEngine(collectionFilePath());
|
|
||||||
helpEngine.setReadOnly(false);
|
|
||||||
helpEngine.setupData();
|
|
||||||
bool docsChanged = false;
|
|
||||||
QStringList nameSpaces = helpEngine.registeredDocumentations();
|
|
||||||
for (const QString &file : files) {
|
|
||||||
if (promise.isCanceled())
|
|
||||||
break;
|
|
||||||
promise.setProgressValue(promise.future().progressValue() + 1);
|
|
||||||
const QString &nameSpace = QHelpEngineCore::namespaceName(file);
|
|
||||||
if (nameSpace.isEmpty())
|
|
||||||
continue;
|
|
||||||
if (!nameSpaces.contains(nameSpace)) {
|
|
||||||
if (helpEngine.registerDocumentation(file)) {
|
|
||||||
nameSpaces.append(nameSpace);
|
|
||||||
docsChanged = true;
|
|
||||||
} else {
|
|
||||||
qWarning() << "Error registering namespace '" << nameSpace
|
|
||||||
<< "' from file '" << file << "':" << helpEngine.error();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
promise.addResult(docsChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HelpManager::unregisterNamespaces(const QStringList &nameSpaces)
|
void HelpManager::unregisterNamespaces(const QStringList &nameSpaces)
|
||||||
{
|
{
|
||||||
if (d->m_needsSetup) {
|
if (d->m_needsSetup) {
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ public:
|
|||||||
Core::HelpManager::HelpViewerLocation location = Core::HelpManager::HelpModeAlways) override;
|
Core::HelpManager::HelpViewerLocation location = Core::HelpManager::HelpModeAlways) override;
|
||||||
|
|
||||||
static void setupHelpManager();
|
static void setupHelpManager();
|
||||||
static void registerDocumentationNow(QPromise<bool> &promise, const QStringList &fileNames);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void collectionFileChanged();
|
void collectionFileChanged();
|
||||||
|
|||||||
Reference in New Issue
Block a user