diff -r 12f60d9a73b3 -r cbffe13eac63 csxhelp/HelpEngine/src/CSXHHelpDataBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/csxhelp/HelpEngine/src/CSXHHelpDataBase.cpp Wed Sep 01 12:30:56 2010 +0100 @@ -0,0 +1,276 @@ +/* +* Copyright (c) 2006 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: CCSXHHelpDataBase class definition +* +*/ + +#include "CSXHHelpDataBase.h" +#include "CSXHHTMLContentParser.h" +#include "CSXHLegacyContentParser.h" +#include "CSXHViewIDs.h" +#include "CSXHGenericTOC2.h" +#include "CSXHKywdTOC1.h" +#include "CSXHMainTopics.h" +#include "CSXHKywdTopics.h" +#include "CsHelpCmdLineParser.h" +#include "CSXHContextTopic.h" +#include "coehelp.h" + +#include +#include +#include +#include +#include +#include + + +#include + +EXPORT_C CCSXHHelpDataBase* CCSXHHelpDataBase::NewL(CCoeEnv* aCoeEnv, + const TApaAppCaption& aAppCaption, const TApaAppCaption& aAppHelpTopic) + { + CCSXHHelpDataBase* self = CCSXHHelpDataBase::NewLC(aCoeEnv,aAppCaption, aAppHelpTopic); + CleanupStack::Pop(self); + return self; + } + +CCSXHHelpDataBase* CCSXHHelpDataBase::NewLC(CCoeEnv* aCoeEnv, const TApaAppCaption& aAppCaption, const TApaAppCaption& aAppHelpTopic) + { + CCSXHHelpDataBase *self = NULL; + //Add stuff into TLS + if(Dll::Tls() == NULL ) + { + // TLS is still null, which means that no Singleton has + // been instantiated yet. Do so now, and return that + // instance: + // Store a pointer to the new instance in thread local storage: + self = new(ELeave) CCSXHHelpDataBase(aCoeEnv,aAppCaption, aAppHelpTopic); + CleanupStack::PushL(self); + self->ConstructL(); + + TInt err = Dll::SetTls(self); + if (err != KErrNone) + { + CleanupStack::Pop(self); + delete self; + self = NULL; + User::Leave(err); + } + } + else + { + self = GetInstance(); + } + + return self; + } + +CCSXHHelpDataBase* CCSXHHelpDataBase::GetInstance() + { + // Singleton has been instantiated once already, so return + // that instance: + return static_cast(Dll::Tls()); + } + +CCSXHHelpDataBase::CCSXHHelpDataBase(CCoeEnv* aCoeEnv, const TApaAppCaption& aAppCaption, const TApaAppCaption& aAppHelpTopic) + : iCoeEnv(aCoeEnv), iAppCaption(aAppCaption), iAppHelpTopic(aAppHelpTopic), iKeywordSearchCount(0) + + { + } + +CCSXHHelpDataBase::~CCSXHHelpDataBase() + { + delete iMainTOC1; + delete iKywdTOC1; + delete iLastContextTopic; + delete iHTMLContentParser; + delete iLegacyContentParser; + Dll::SetTls( NULL ); + } + +void CCSXHHelpDataBase::ConstructL() + { + iHTMLContentParser = CCSXHHTMLContentParser::NewL(iCoeEnv); + iLegacyContentParser = CCSXHLegacyContentParser::NewL(this); + + iMainTOC1 = CCSXHMainTopics::NewL(KCSXHToc1ViewID,iAppCaption); + iKywdTOC1 = CCSXHKywdTopics::NewL(iAppCaption); + + //No need to delete iAppHelpsToc in destruct, + //because it will be deleted when deleting iMainTOC1. + //All third-party helps will be put to this topic + TInt appHelpPriority = 20001; + iAppHelpsToc = CCSXHMainTopics::NewL( KCSXHToc1AppHelpsViewID, iAppHelpTopic, appHelpPriority ); + + //Build the TOC1 list here + iMainTOC1->InsertChildWithPriority(iAppHelpsToc, EFalse); + iHTMLContentParser->GenerateTOC1ListL(this); + iLegacyContentParser->GenerateTOC1ListL(this); + } + +CCoeEnv* CCSXHHelpDataBase::GetCoeEnv() + { + return iCoeEnv; + } + +EXPORT_C CCSXHGenericTOC1* CCSXHHelpDataBase::GetMainTopics() + { + return iMainTOC1; + } +EXPORT_C CCSXHGenericTOC1* CCSXHHelpDataBase::GetKywdTopics() + { + return iKywdTOC1; + } + +EXPORT_C CCSXHGenericTOC1* CCSXHHelpDataBase::GetAppHelpsTopics() + { + return iAppHelpsToc; + } + +EXPORT_C CCSXHHelpContentBase* CCSXHHelpDataBase::GetContextTopic(const TDesC8& aContextMessage) + { + TRAP_IGNORE(GetContextTopicL(aContextMessage)); + return iLastContextTopic; + + } +CCSXHHelpContentBase* CCSXHHelpDataBase::GetContextTopicL(const TDesC8& aContextMessage) + { + if(iLastContextTopic) + { + delete iLastContextTopic; + iLastContextTopic = NULL; + } + //TSW Error Correction:Help: Application crashes + //after trying to re-open context-dependent help from application + //Clear childlist of all (TOC1)parents. + ClearAllTOC1Contents(); + + CArrayFix* contextList; + CCsHlpCmdLineParser* parser = new(ELeave) CCsHlpCmdLineParser; + CleanupStack::PushL(parser); + parser->ConstructL(aContextMessage); + contextList = parser->ContextListL(); + CleanupStack::PopAndDestroy(parser); // parser + CleanupStack::PushL(contextList); + CCSXHHelpContentBase* contextTopic; + TInt numberOfContextList = contextList->Count(); + TCoeHelpContext* context; + for (TInt i(0); i < numberOfContextList; i++) + { + context = &(contextList->At(i)); + + contextTopic = iHTMLContentParser->GetContextTopicL(this, context->iMajor,context->iContext); + if(contextTopic) + { + CleanupStack::PopAndDestroy(contextList); + iLastContextTopic = CCSXHContextTopic::NewL(contextTopic); + return iLastContextTopic; + } + } + + for (TInt i(0); i < numberOfContextList; i++) + { + context = &(contextList->At(i)); + + contextTopic = iLegacyContentParser->GetContextTopic(*context); + if(contextTopic) + { + CleanupStack::PopAndDestroy(contextList); + iLastContextTopic = CCSXHContextTopic::NewL(contextTopic); + return iLastContextTopic; + } + } + + + CleanupStack::PopAndDestroy(contextList); + return NULL; + } + +EXPORT_C void CCSXHHelpDataBase::ClearAllTOC1Contents() + { + iMainTOC1->ResetChildList(); + iKywdTOC1->ResetChildList(); + } + +CCSXHLegacyContentParser* CCSXHHelpDataBase::GetLegacyParser() + { + return iLegacyContentParser; + } + +CCSXHHTMLContentParser* CCSXHHelpDataBase::GetHtmlParser() + { + return iHTMLContentParser; + } + +void CCSXHHelpDataBase::InsertKeywordL(const TDesC& aKywdName, + TInt aLegacyKywdIndex, const TUid& aCatUid) + { + if(!iHTMLContentParser->IsUidCategoryPresent(aCatUid)) + iKwydBuilder->InsertKeywordL(iKywdTOC1,aKywdName,aLegacyKywdIndex); + } + +void CCSXHHelpDataBase::InsertKeywordL(const TDesC& aKywdName, CCSXHHtmlTOC1* aToc1) + { + iKwydBuilder->InsertKeywordL(iKywdTOC1,aKywdName,aToc1); + } + +CCSXHKywdTOC1* CCSXHHelpDataBase::InsertKeywordTopicL(CCSXHGenericTOC2* aToc2) + { + CCSXHKywdTOC1* toc1 = iKywdTOC1->GetSelectedTopic(); + InsertKeywordTopic(toc1,aToc2); + return toc1; + } + +void CCSXHHelpDataBase::InsertKeywordTopic(CCSXHKywdTOC1* aToc1, CCSXHGenericTOC2* aToc2) + { + aToc1->InsertChild(aToc2); + } + +EXPORT_C TInt CCSXHHelpDataBase::InitGenerateKeywordTOC2ListL(CCSXHKywdTOC1* aTopic) + { + iKeywordSearchCount = 0; + RPointerArray* TOC1HtmlList = aTopic->GetHtmlTOC1List(); + TInt htmlCount = TOC1HtmlList ? TOC1HtmlList->Count() : 0; + TInt legacyCount = iLegacyContentParser->InitGenerateTOC2ListForKeywordSearchL(aTopic); + return (htmlCount + legacyCount); + } + +void CCSXHHelpDataBase::GenerateKeywordTOC2ListL(CCSXHKywdTOC1* aTopic) + { + iHTMLContentParser->GenerateTOC2ListForKeywordSearchL(this,aTopic); + iLegacyContentParser->GenerateTOC2ListForKeywordSearchL(aTopic); + } + +EXPORT_C CCSXHHelpContentBase* CCSXHHelpDataBase::GetHtmlTopicForUrlL(const TDesC& url) + { + return iHTMLContentParser->GetHtmlTopicForUrlL(url); + } +void CCSXHHelpDataBase::FillKeywordTopicsL(MCSXHKywdBuilder* aBuilder) + { + iKwydBuilder = aBuilder; + iHTMLContentParser->GenerateKywdTOC1ListL(this); + iLegacyContentParser->GenerateKywdTOC1ListL(this); + } + + +void CCSXHHelpDataBase::IncrementKeywordSearchCount(TInt aUnits) + { + iKeywordSearchCount += aUnits; + } + +EXPORT_C TInt CCSXHHelpDataBase::GetKeywordSearchCount() + { + return iKeywordSearchCount; + } +