void QHelpContentProvider::run() { QString title; QString link; int depth = 0; QHelpContentItem *item = 0; m_mutex.lock(); m_rootItem = new QHelpContentItem(QString(), QString(), 0); m_rootItems.enqueue(m_rootItem); QStringList atts = m_filterAttributes; const QStringList fileNames = m_helpEngine->orderedFileNameList; m_mutex.unlock(); foreach (const QString &dbFileName, fileNames) { m_mutex.lock(); if (m_abort) { m_abort = false; m_mutex.unlock(); break; } m_mutex.unlock(); QHelpDBReader reader(dbFileName, QHelpGlobal::uniquifyConnectionName(dbFileName + QLatin1String("FromQHelpContentProvider"), QThread::currentThread()), 0); if (!reader.init()) continue; foreach (const QByteArray& ba, reader.contentsForFilter(atts)) { if (ba.size() < 1) continue; int _depth = 0; bool _root = false; QStack<QHelpContentItem*> stack; QDataStream s(ba); for (;;) { s >> depth; s >> link; s >> title; if (title.isEmpty()) break; CHECK_DEPTH: if (depth == 0) { m_mutex.lock(); item = new QHelpContentItem(title, link, m_helpEngine->fileNameReaderMap.value(dbFileName), m_rootItem); m_rootItem->appendChild(item); m_mutex.unlock(); stack.push(item); _depth = 1; _root = true; } else { if (depth > _depth && _root) { _depth = depth; stack.push(item); } if (depth == _depth) { item = new QHelpContentItem(title, link, m_helpEngine->fileNameReaderMap.value(dbFileName), stack.top()); stack.top()->appendChild(item); } else if (depth < _depth) { stack.pop(); --_depth; goto CHECK_DEPTH; } } } } }