diff -r 0d1adf67ec1b -r 12f60d9a73b3 userguide/src/HelpDataProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userguide/src/HelpDataProvider.cpp Tue Aug 31 15:06:12 2010 +0300 @@ -0,0 +1,510 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include +#include +#include +#include + +#include "HelpUtils.h" +#include "HelpCommon.h" +#include "HelpProxyModel.h" +#include "HelpStandardItem.h" + +#include "HelpDataProvider.h" + + +HelpDataProvider::HelpDataProvider() +{ + mHelpModel = new QStandardItemModel(); + mKeywordModel = new QStandardItemModel(); + mSearhResultModel = new HelpProxyModel(); + mSearhResultModel->setSourceModel(mKeywordModel); + mAppItem = NULL; +} + +HelpDataProvider::~HelpDataProvider() +{ + delete mHelpModel; + delete mSearhResultModel; + delete mKeywordModel; +} + + +/////////////////////////////////////////////////////////////////////////////////////// + +HelpDataProvider* gHelpDataProviderInstance = NULL; + +HelpDataProvider* HelpDataProvider::instance() +{ + if(!gHelpDataProviderInstance) + { + gHelpDataProviderInstance = new HelpDataProvider(); + } + + return gHelpDataProviderInstance; +} + +void HelpDataProvider::destroyInstance() +{ + delete gHelpDataProviderInstance; + gHelpDataProviderInstance = NULL; +} + + +/////////////////////////////////////////////////////////////////////////////////////// + +QAbstractItemModel* HelpDataProvider::getCategoryData() +{ + return mHelpModel; +} + +QAbstractItemModel* HelpDataProvider::getSearchData(const QString& key) +{ + if(key == mLastSrhKey) + { + return mSearhResultModel; + } + + mLastSrhKey = key; + mSearhResultModel->setFilterRegExp(key); + + + return mSearhResultModel; +} + +void HelpDataProvider::setHelpContentUrl(const QString& uid, const QString& href) +{ + QUrl url = QUrl::fromLocalFile(uid+BACKSLASH+href); + mHelpContentRoot = url.toString(); +} + +void HelpDataProvider::getHelpContentData(QString& content, QString& url) +{ + // url + if(url.isEmpty()) + { + url = mHelpContentRoot; + } + url.remove(URL_HEADER_LOCAL); + + // uid + QString uid = url.section(BACKSLASH, 0, -3); + uid.append(BACKSLASH + url.section(BACKSLASH, -2,-2)); + + // href + QString href = url.section(BACKSLASH, -1,-1); + int anchorPos = href.indexOf(HASHMARK); + if(anchorPos != -1) + { + href = href.section(HASHMARK, 0, 0); + } + + QString path(uid); + path.append(BACKSLASH); + path.append(CONTENTSZIP); + HelpUtils::loadHtmlFromZipFile(path , href, content); +} + + +/////////////////////////////////////////////////////////////////////////////////////// + +void HelpDataProvider::createHelpCategory() +{ + constructCategory(); + + mHelpModel->setSortRole(Qt::DisplayRole); + + constructCategory2((HelpStandardItem*)mHelpModel->invisibleRootItem()); + + if(mAppItem) + { + mHelpModel->appendRow(mAppItem); + mAppItem->sortChildren(0, HelpUtils::sortOrder()); + constructCategory2(mAppItem); + } + + mKeywordModel->sort(0, HelpUtils::sortOrder()); +} + +void HelpDataProvider::constructCategory() +{ + QFileInfoList driveList = QDir::drives(); + QDir dir; + QString lang = HelpUtils::UILocaleFromQtToSymbian(); + + QString path(HelpUtils::rootPath()); + path.append(XHTMLPATH); + path.append(lang); + + QStringList uidList; + QStringList titleList; + parseCategoryIndexXml(path, uidList, titleList); + + //scan other root path and construct 3rd party help + foreach(QFileInfo fi, driveList) + { + path.clear(); + path.append(fi.absolutePath()); + path.append(XHTMLPATH); + path.append(lang); + dir.setPath(path); + if(dir.exists()) + { + if(QString::compare(fi.absolutePath(), HelpUtils::rootPath(), Qt::CaseInsensitive) == 0) + { + continue; + } + constructAppCategory(path, uidList); + } + } + + constructBuiltInCategory(path, uidList, titleList); + + mHelpModel->setSortRole(PriorityRole); + mHelpModel->sort(0, HelpUtils::sortOrder()); +} + +void HelpDataProvider::constructBuiltInCategory(const QString& path, const QStringList& uidList, const QStringList& titleList) +{ + if(uidList.count() != titleList.count()) + { + //ToDo + return; + } + + for(int i = 0; i < uidList.count(); i++) + { + if(mUpdateUidList.contains(uidList[i])) + { + continue; + } + + QString uid(path); + uid.append(BACKSLASH); + uid.append(uidList[i]); + + constructBuiltInCategoryItem(uid, titleList[i]); + } +} + +void HelpDataProvider::constructAppCategory(const QString& path, QStringList& uidList) +{ + QDir dir(path); + if(!dir.exists()) + { + return; + } + + QStringList uidDirList = dir.entryList(); + QString pathUid; + foreach(QString uid, uidDirList) + { + pathUid.clear(); + pathUid.append(path); + pathUid.append(BACKSLASH); + pathUid.append(uid); + + QString titleStr; + parseAppMetaxml(pathUid, titleStr); + if(titleStr.isEmpty()) + { + continue; + } + + if(uidList.contains(uid) || mUpdateUidList.contains(uid)) + { + mUpdateUidList.append(uid); + constructBuiltInCategoryItem(pathUid, titleStr); + continue; + } + + HelpStandardItem* item = NULL; + item = new HelpStandardItem(titleStr); + + if(!item) + { + //no memory + return; + } + + item->setData(pathUid, UidRole); + + if(!mAppItem) + { + mAppItem = new HelpStandardItem(qtTrId(TXT_APPLICATIONS)); + if(!mAppItem) + { + //no memory + return; + } + mAppItem->setData(APPPRIORITY, PriorityRole); + } + mAppItem->appendRow(item); + } +} + +void HelpDataProvider::constructBuiltInCategoryItem(const QString& uid, const QString& title) +{ + int priority; + parseBuiltInMetaxml(uid, priority); + + HelpStandardItem* item = NULL; + item = new HelpStandardItem(title); + + if(!item) + { + //no memory + return; + } + item->setData(uid, UidRole); + item->setData(priority, PriorityRole); + mHelpModel->appendRow(item); +} + +void HelpDataProvider::constructCategory2(HelpStandardItem* itemParent) +{ + int count = itemParent->rowCount(); + for(int i =0; i < count; i++) + { + HelpStandardItem* item = (HelpStandardItem*)itemParent->child(i); + constructCategory2Item(item); + } +} + +void HelpDataProvider::constructCategory2Item(HelpStandardItem* itemParent) +{ + QStringList hrefList; + QStringList titleList; + + QString uid = itemParent->data(UidRole).toString(); + parseCategory2IndexXml(uid, hrefList, titleList); + + if(hrefList.count() == 0 || hrefList.count() != titleList.count()) + { + return; + } + + for(int i = 0; i < hrefList.count(); i++) + { + HelpStandardItem* item = NULL; + item = new HelpStandardItem(titleList[i]); + if(!item) + { + //no memory + return; + } + item->setData(hrefList[i], HrefRole); + item->setData(uid, UidRole); + itemParent->appendRow(item); + constructKeywordModel(titleList[i], uid, hrefList[i]); + } + + itemParent->sortChildren(0, HelpUtils::sortOrder()); +} + +void HelpDataProvider::constructKeywordModel(const QString& title, const QString& uid, const QString& href) +{ + HelpStandardItem* item = NULL; + item = new HelpStandardItem(title); + if(!item) + { + //no memory + return; + } + item->setData(uid, UidRole); + item->setData(href, HrefRole); + mKeywordModel->appendRow(item); +} + +void HelpDataProvider::parseCategoryIndexXml(const QString& path, QStringList& uidList, QStringList& titleList) +{ + QString pathIndex(path); + pathIndex.append(BACKSLASH); + pathIndex.append(INDEXXML); + + QFile file(pathIndex); + if (!file.open(QIODevice::ReadOnly)) { + return; + } + + //parse index xml to a stringlist, each string include id and navtitle and seperate by "specilchar" + QXmlQuery query; + query.bindVariable("inputdoc", &file); + + query.setQuery("doc($inputdoc)/collections/collection/xs:string(@id)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&uidList)) + { + return; + } + + query.setQuery("doc($inputdoc)/collections/collection/xs:string(@navtitle)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&titleList)) + { + return; + } + + QStringList featureIdLst; + + query.setQuery("doc($inputdoc)/collections/collection/number(@FeatureId)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&featureIdLst)) + { + return; + } + + if(featureIdLst.count() != uidList.count()) + { + return; + } + + for(int i = featureIdLst.count() - 1; i >= 0; i--) + { + int featureID = featureIdLst.at(i).toInt(); + if(!HelpUtils::suppportFeatureID(featureID)) + { + uidList.removeAt(i); + titleList.removeAt(i); + } + } +} + +void HelpDataProvider::parseCategory2IndexXml(const QString& path, QStringList& hrefList, QStringList& titleList) +{ + QString pathIndex(path); + pathIndex.append(BACKSLASH); + pathIndex.append(INDEXXML); + + QFile file(pathIndex); + if (!file.open(QIODevice::ReadOnly)) { + return; + } + + //parse index xml to a stringlist, each string include href and navtitle and seperate by "specilchar" + QXmlQuery query; + query.bindVariable("inputdoc", &file); + + query.setQuery("doc($inputdoc)/topics/topicref/xs:string(@href)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&hrefList)) + { + return; + } + + query.setQuery("doc($inputdoc)/topics/topicref/xs:string(@navtitle)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&titleList)) + { + return; + } + + QStringList featureIdLst; + + query.setQuery("doc($inputdoc)/topics/topicref/number(@FeatureId)"); + if(!query.isValid()) + { + return; + } + if(!query.evaluateTo(&featureIdLst)) + { + return; + } + + if(featureIdLst.count() != hrefList.count()) + { + return; + } + + for(int i = featureIdLst.count() - 1; i >= 0; i--) + { + int featureID = featureIdLst.at(i).toInt(); + if(!HelpUtils::suppportFeatureID(featureID)) + { + hrefList.removeAt(i); + titleList.removeAt(i); + } + } +} + +void HelpDataProvider::parseBuiltInMetaxml(const QString& path, int& priority) +{ + QString pathMetaxml(path); + pathMetaxml.append(BACKSLASH); + pathMetaxml.append(METAXML); + + priority = -1; + + QFile file(pathMetaxml); + if (!file.open(QIODevice::ReadOnly)) + { + return; + } + + QXmlQuery query; + QString str; + query.bindVariable("inputdoc", &file); + + query.setQuery("doc($inputdoc)/meta/number(priority)"); + if(query.isValid() && query.evaluateTo(&str)) + { + priority = str.toInt(); + } +} + +void HelpDataProvider::parseAppMetaxml(const QString& path, QString& title) +{ + QString pathMetaxml(path); + pathMetaxml.append(BACKSLASH); + pathMetaxml.append(METAXML); + QFile file(pathMetaxml); + if (!file.open(QIODevice::ReadOnly)) { + return; + } + + //parse meta xml, get the title string + QXmlQuery query; + query.bindVariable("inputdoc", &file); + query.setQuery("doc($inputdoc)/meta/string(title)"); + if(!query.isValid()) + { + return; + } + + if(!query.evaluateTo(&title)) + { + return; + } +}