--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/csxhelp/HelpEngine/src/CSXHHTMLContentParser.cpp Wed Sep 01 12:30:56 2010 +0100
@@ -0,0 +1,1419 @@
+/*
+* 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: CCSXHHTMLContentParser class definition
+*
+*/
+
+#include "CSXHHTMLContentParser.h"
+#include "CSXHXMLParseHandler.h"
+#include "CSXHHtmlTOC1.h"
+#include "CSXHKywdTOC1.h"
+#include "CSXHHtmlTOC2.h"
+#include "CSXHHelpDataBase.h"
+#include "csxhconstants.h"
+#include "CSXHRuntimeIndexing.h"
+#include "CSXHViewIDs.h"
+
+#include <eikenv.h>
+#include <utf.h>
+#include <data_caging_path_literals.hrh>
+#include <zipfile.h>
+#include <bautils.h>
+#include <SenXmlReader.h>
+#include <f32file.h>
+#include <pathinfo.h>
+
+//Input Language variation changes
+#include <PtiEngine.h>
+
+const TInt KOffset = 2;
+
+CCSXHHTMLContentParser* CCSXHHTMLContentParser::NewL(CCoeEnv* aCoeEnv)
+ {
+ CCSXHHTMLContentParser* self = CCSXHHTMLContentParser::NewLC(aCoeEnv);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CCSXHHTMLContentParser* CCSXHHTMLContentParser::NewLC(CCoeEnv* aCoeEnv)
+ {
+ CCSXHHTMLContentParser* self = new (ELeave) CCSXHHTMLContentParser(aCoeEnv);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+void CCSXHHTMLContentParser::ConstructL()
+ {
+ //RUNTIME
+ GetSupportedFeatureListL();
+ }
+
+CCSXHHTMLContentParser::CCSXHHTMLContentParser(CCoeEnv* aCoeEnv) : iCoeEnv(aCoeEnv)
+ {
+ }
+
+CCSXHHTMLContentParser::~CCSXHHTMLContentParser()
+ {
+ delete iXmlReader;
+
+ //No need to delete the entries here, it will be done by the database
+ iHtmlTOC1List.Close();
+
+ //Delete all contents from the array.
+ TInt count = iDuplicateHelpTopicList.Count();
+ CCSXHHtmlTOC1* toc1;
+ for(TInt i=0;i<count;++i )
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ delete toc1;
+ }
+ iDuplicateHelpTopicList.Reset();
+ iDuplicateHelpTopicList.Close();
+
+ // Closes the array and frees all memory allocated to the array.
+ // iSupportedFeatures.Close();
+
+ delete iSupportedInputLanguages;
+ delete iFeatureManager_FeatureIds;
+ delete iIndexing;
+ }
+
+void CCSXHHTMLContentParser::GenerateTOC1ListL(CCSXHHelpDataBase* aDataBase)
+ {
+ RFs& FileSession = iCoeEnv->FsSession();
+
+ TDriveList DirList;
+ if(FileSession.DriveList(DirList) != KErrNone)
+ return;
+ CCSXHXMLParseHandler_MetaFile* XMLParser = CCSXHXMLParseHandler_MetaFile::NewL(iCoeEnv);
+ CleanupStack::PushL(XMLParser);
+ InitializeReaderL(XMLParser);
+
+
+ TBuf<KMaxFileName>* rootDir = new(ELeave) TBuf<KMaxFileName>;
+ CleanupStack::PushL(rootDir);//5
+
+ // begin runtime index XML generating
+ //
+ iIndexing = CCSXHRuntimeIndexing::NewL();
+ TInt driveListSize = DirList.Length();
+ TBool dirExists = iIndexing->IndexFileExistsL();
+ CDirScan* scanner=CDirScan::NewLC(FileSession);
+#ifdef _DEBUG
+ RDebug::Print(_L("runtime indexing object successfully build"));
+#endif
+ for(TInt dir(0); dir < driveListSize; dir++)
+ {
+ TInt error;
+ TDriveInfo info;
+ TChar driveLetter = '?';
+ error = FileSession.Drive(info, dir);
+
+ if ( ( error == KErrNone ) &&
+ (DirList[dir] && info.iType != EMediaNotPresent))
+ {
+ RFs::DriveToChar( dir, driveLetter );
+ TInt dirChanged = iIndexing->CheckDirChangeL( driveLetter );
+ rootDir->Delete( 0, rootDir->Length() );//Clear the previous contents
+ rootDir->Append( driveLetter );
+
+ if ( dirExists
+ && ( dirChanged == KNoChange
+ || dirChanged == KNoDirExist) )
+ {
+ // xml exist and no install/uninstall happened
+ // while Z needs special process once its index file exists
+#ifdef _DEBUG
+ RDebug::Print(_L("Used to launch, scan drive number: %d"), dir);
+#endif
+ if ( dirChanged == KNoChange )
+ {
+ // no modify helps, so just parse index.xml
+ //
+ HandleMasterMetaFileL( aDataBase, driveLetter, XMLParser );
+ }
+ else // KNoDirExist
+ {
+ // help content folder removed due to some reason (uninstall/crash?)
+ // delete index file in case it exist
+#ifdef _DEBUG
+ RDebug::Print( _L("no resource folder, delete index.xml if exists") );
+#endif
+ iIndexing->DeleteIndexFileL( driveLetter );
+ }
+ }
+ else
+ {
+ // xml not exist or install/uninstall not happend
+ //
+ if( GetHTMLContentPathForDriveL( rootDir,iCoeEnv ) )
+ {
+#ifdef _DEBUG
+ RDebug::Print( _L("No index, scan folder for parsing, drive letter: %d"), dir );
+#endif
+ iIndexing->BeginIndexFileL( driveLetter );
+ scanner->SetScanDataL(*rootDir
+ ,KEntryAttDir|KEntryAttMatchExclusive,
+ ESortByName|EAscending, CDirScan::EScanDownTree);
+ ScanAndParseXMLfileToCreateTOC1ObjectL(FileSession,scanner,aDataBase,
+ dir,XMLParser);
+
+ iIndexing->FinishAndCloseIndexFileL();
+
+ }
+
+ }
+
+ }
+ }
+ CleanupStack::PopAndDestroy( scanner );
+ CleanupStack::PopAndDestroy(rootDir);
+ CleanupStack::PopAndDestroy(XMLParser);
+
+ ClearReader();
+ }
+
+TBool CCSXHHTMLContentParser::GetHTMLContentPathForDriveL(TBuf<KMaxFileName>* aContentDrive,CCoeEnv *aCoeEnv)
+ {
+ // get the path to language level
+ // Input: aContentDrive == C or E or Z
+ // Output: aContentDrive == C:\\resource\\xhtml\\01\\ (or Z:\\resource\\xhtml\\31\\)
+ //
+ aContentDrive->Append(KXhtmlFolder);
+ TInt len = aContentDrive->Length();
+ RFs& FileSession = aCoeEnv->FsSession();
+ RArray<TLanguage> langs;
+ BaflUtils::GetDowngradePathL(FileSession,User::Language(),langs);
+
+ for(int i = 0; i < langs.Count(); ++i)
+ {
+ TLanguage lang = langs[i];
+ //TSW Error: UKAL-6YL72P
+ //Tool chain uses full symbian language id in
+ //the directory name, which is not detected by help application.
+ //
+ if(lang < 10)
+ {
+ aContentDrive->AppendNumFixedWidth(lang,EDecimal,2);
+ }
+ else
+ {
+ aContentDrive->AppendNum(lang);
+ }
+
+ aContentDrive->Append(KFwdSlash);
+ if(BaflUtils::PathExists(FileSession,*aContentDrive))
+ {
+ langs.Reset();
+ return ETrue;
+ }
+ else
+ {
+ aContentDrive->Delete((len-1),aContentDrive->Length()-len);
+ }
+ }
+ langs.Reset();
+ return EFalse;
+ }
+
+TBool CCSXHHTMLContentParser::HandleMasterMetaFileL(CCSXHHelpDataBase* aDataBase,
+ TChar& aDrive, MSenContentHandlerClient *aPrevHandler)
+ {
+ RFs& FileSession = iCoeEnv->FsSession();
+ TBuf<KMaxFileName> masterFile;
+
+ iIndexing->GetPrivatePath( masterFile );
+ masterFile.Append( aDrive );
+ masterFile.Append( KFwdSlash );
+ iIndexing->AppendLocaleL( masterFile );
+ masterFile.Append( KMasterMetaFile );
+ if(BaflUtils::FileExists( FileSession,masterFile ) )
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("index exist begin to parse! %c"), TUint( aDrive ) );
+#endif
+ CCSXHXMLParseHandler_MasterMetaFile* masterMetaHandler =
+ CCSXHXMLParseHandler_MasterMetaFile::NewL(iCoeEnv);
+ masterMetaHandler->SetDataBasePtr(aDataBase);
+ masterMetaHandler->SetHtmlContentParserPtr(this);
+ CleanupStack::PushL(masterMetaHandler);
+
+ iXmlReader->SetContentHandler(*masterMetaHandler);
+ // ParseL is not in async
+ iXmlReader->ParseL(FileSession,masterFile);
+ iXmlReader->SetContentHandler(*aPrevHandler);
+ CleanupStack::PopAndDestroy(masterMetaHandler);
+ }
+
+ return ETrue;
+ }
+
+TBool CCSXHHTMLContentParser::IsRedirectedL(CCSXHHelpDataBase *aDataBase,
+ const TDesC &aPath, TUid &aUid, TCoeContextName &aContextName)
+ {
+ RFs& FileSession = iCoeEnv->FsSession();
+ TBuf<KMaxFileName> redirectFile( aPath );
+ redirectFile.Append( KRedirectFile );
+ TBool result = EFalse;
+
+ if ( BaflUtils::FileExists( FileSession, redirectFile ) )
+ {
+ CCSXHXMLParseHandler_RedirectFile* XMLParser =
+ CCSXHXMLParseHandler_RedirectFile::NewL(iCoeEnv, aUid, aContextName);
+ XMLParser->SetDataBasePtr( aDataBase );
+
+ CleanupStack::PushL( XMLParser );
+ InitializeReaderL( XMLParser );
+ // ParseL is not in async
+ iXmlReader->ParseL( FileSession, redirectFile );
+ if ( XMLParser->IsTargetPathFound() )
+ {
+ TBuf<KMaxFileName>& targetContextName = XMLParser->TargetContextName();
+ if ( targetContextName.Length() <= aContextName.MaxLength() )
+ {
+ aUid = XMLParser->TargetUid();
+ aContextName = targetContextName;
+ result = ETrue;
+ }
+ }
+ CleanupStack::PopAndDestroy( XMLParser );
+ ClearReader();
+ }
+
+ return result;
+ }
+
+void CCSXHHTMLContentParser::GenerateTOC2ListL(CCSXHGenericTOC1&
+aGenericTOC1Object, RPointerArray<CCSXHHelpContentBase>* GenericTOC2List)
+ {
+ CCSXHXMLParseHandler_IndexFile* XMLParser = CCSXHXMLParseHandler_IndexFile::NewL(iCoeEnv);
+ CleanupStack::PushL(XMLParser);
+ InitializeReaderL(XMLParser);
+
+ XMLParser->SetArray(GenericTOC2List);
+ XMLParser->SetGenericTOC1Object(aGenericTOC1Object);
+ XMLParser->SetHtmlContentParserPtr(this);
+ RFs& FileSession = iCoeEnv->FsSession();
+ CCSXHHtmlTOC1* toc1 = STATIC_CAST(CCSXHHtmlTOC1*,&aGenericTOC1Object);
+ TBuf<KMaxFileName> lookupindexfile;
+ toc1->GetHelpFileL(lookupindexfile);
+ XMLParser->SetPath(lookupindexfile);
+ lookupindexfile.Append(KIndexFile);
+
+ if(BaflUtils::FileExists(FileSession,lookupindexfile))
+ iXmlReader->ParseL (FileSession,lookupindexfile);
+
+ TBuf<KMaxFileName>HelpContentName(toc1->GetName());
+ int toc1Count = iDuplicateHelpTopicList.Count();
+
+ for(int i=0;i < toc1Count;i++)
+ {
+ CCSXHHtmlTOC1* temptoc1 = iDuplicateHelpTopicList[i];
+
+ if(temptoc1->GetName().CompareF(HelpContentName) == 0)
+ {
+ TBuf<KMaxFileName> lookup;
+ temptoc1->GetHelpFileL(lookup);
+ XMLParser->SetPath(lookup);
+ lookup.Append(KIndexFile);
+
+ if(BaflUtils::FileExists(FileSession,lookup))
+ iXmlReader->ParseL (FileSession,lookup);
+ }
+ }
+
+ CleanupStack::PopAndDestroy(XMLParser);
+ ClearReader();
+ }
+
+TAny* CCSXHHTMLContentParser::GetTopicContentL(CCSXHGenericTOC2* aTopic)
+ {
+ CCSXHHtmlTOC2* topic = STATIC_CAST(CCSXHHtmlTOC2*,aTopic);
+ TBuf<KMaxFileName> htmlFile;
+ topic->GetHtmlFileName(htmlFile);
+ return GetContentsFromFileL(htmlFile,iCoeEnv,iFeatureControl);
+ }
+
+
+void CCSXHHTMLContentParser::ScanAndParseXMLfileToCreateTOC1ObjectL(
+ RFs& FileSession,
+ CDirScan* scanner,
+ CCSXHHelpDataBase* aDataBase,
+ const TInt& aDrive,
+ CCSXHXMLParseHandler_MetaFile* XMLParser
+ )
+ {
+ CDir* entryList = NULL;
+ scanner->NextL(entryList);
+ if (!entryList)
+ {
+ return;
+ }
+
+ CleanupStack::PushL(entryList);
+
+ TInt entryCount = entryList->Count();
+ TInt ROMDrive;
+ RFs::CharToDrive(PathInfo::RomRootPath()[0], ROMDrive);
+ TBuf<KMaxFileName> lookup;
+
+ while (entryCount--)
+ {
+ TEntry entry = (*entryList)[entryCount];
+
+ //Clear the previous values
+ lookup.Delete(0, lookup.Length());
+ lookup.Append(scanner->FullPath());
+ lookup.Append(entry.iName);
+ lookup.Append(KFwdSlash);
+ lookup.Append(KMetaFile);
+
+ //Check whether a file exists
+ if (!BaflUtils::FileExists(FileSession,lookup))
+ continue;
+
+ TRAPD(parserResult, iXmlReader->ParseL(FileSession, lookup));
+ if (parserResult == KErrNone)
+ {
+ if (CheckFeatureIDL(XMLParser->GetFeatureIds()))
+ {
+ if (!IsAppUIdPresentAlready(entry.iName))
+ {
+ TBool isRomBased = EFalse;
+ TInt32 priority = XMLParser->Priority();
+
+ // Now we take a walk if it's application helps (priority == 0)
+ if ((priority != 0)
+ && ((aDrive == ROMDrive) || IsRomBasedContentL(FileSession, entry.iName)))
+ {
+ if (priority < KHighestPriority)
+ {
+ priority = KHighestPriority;
+ }
+ else if (priority > KLowestPriority)
+ {
+ priority = KLowestPriority;
+ }
+
+ isRomBased = ETrue;
+ }
+ else
+ {
+ priority = 0;
+ }
+
+ CCSXHHtmlTOC1* categoryObj = CCSXHHtmlTOC1::NewL(XMLParser->GetApplicationName(), entry.iName, aDrive,
+ isRomBased ? KCSXHToc2ViewID : KCSXHToc2AppHelpsViewID, priority);
+ if (!categoryObj->IsValid())
+ {
+ delete categoryObj;
+ }
+ else
+ {
+ CleanupStack::PushL(categoryObj);
+ if (isRomBased)
+ {
+ if (aDataBase->GetMainTopics()->InsertChildWithPriority(categoryObj, EFalse))
+ {
+ iHtmlTOC1List.AppendL(categoryObj);
+ }
+ else
+ {
+ iDuplicateHelpTopicList.AppendL(categoryObj);
+ }
+ }
+ else
+ {
+ if (aDataBase->GetAppHelpsTopics()->InsertChild(categoryObj, EFalse))
+ {
+ iHtmlTOC1List.AppendL(categoryObj);
+ }
+ else
+ {
+ iDuplicateHelpTopicList.AppendL(categoryObj);
+ }
+ }
+
+ iIndexing->RuntimeGenerateIndexL(*categoryObj, XMLParser->GetFeatureIds());
+ CleanupStack::Pop(categoryObj);
+ }
+ }
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy(entryList);
+ }
+
+TBool CCSXHHTMLContentParser::IsRomBasedContentL( RFs& FileSession, const TDesC &aUid )
+ {
+#ifdef __WINSCW__
+ return ETrue;
+#endif
+
+ TBool result = EFalse;
+ CDirScan* scanner=CDirScan::NewLC(FileSession);
+ TBuf<KMaxFileName> rootDir;
+ rootDir.Append( 'z' );
+
+ if( GetHTMLContentPathForDriveL( &rootDir,iCoeEnv ) )
+ {
+ scanner->SetScanDataL(rootDir,KEntryAttDir|KEntryAttMatchExclusive,
+ ESortByName|EAscending, CDirScan::EScanDownTree);
+ CDir* entryList = NULL;
+ scanner->NextL(entryList);
+
+ if ( !entryList )
+ {
+ CleanupStack::PopAndDestroy( scanner );
+ return EFalse;
+ }
+
+ TInt entryCount = entryList->Count();
+
+ while ( entryCount-- )
+ {
+ TEntry entry=(*entryList)[entryCount];
+ if ( ( entry.iName ).CompareC(aUid) == 0 )
+ {
+ result = ETrue;
+ break;
+ }
+ }
+ delete entryList;
+ }
+
+ CleanupStack::PopAndDestroy( scanner );
+
+ return result;
+ }
+
+void CCSXHHTMLContentParser::InsertHTMLToc1L(
+ const TDesC& aAppUidName,
+ const TDesC& aAppName,
+ const TInt& aDrive,
+ CCSXHHelpDataBase* aDataBase,
+ const TDesC& aFeatureIds,
+ TInt32 aPriority
+ )
+ {
+ if (CheckFeatureIDL(aFeatureIds))
+ {
+ if (!IsAppUIdPresentAlready(aAppUidName))
+ {
+ // Now we take a walk if it's application helps (priority == 0)
+ CCSXHHtmlTOC1* categoryObj = CCSXHHtmlTOC1::NewL(aAppName,aAppUidName, aDrive,
+ aPriority == 0 ? KCSXHToc2AppHelpsViewID : KCSXHToc2ViewID, aPriority);
+
+ if (categoryObj->IsValid())
+ {
+ CleanupStack::PushL(categoryObj);
+ if (aPriority == 0)
+ {
+ if (aDataBase->GetAppHelpsTopics()->InsertChild(categoryObj, EFalse))
+ {
+ iHtmlTOC1List.AppendL(categoryObj);
+ }
+ else
+ {
+ iDuplicateHelpTopicList.AppendL(categoryObj);
+ }
+ }
+ else
+ {
+ if (aDataBase->GetMainTopics()->InsertChildWithPriority(categoryObj, EFalse))
+ {
+ iHtmlTOC1List.AppendL(categoryObj); //Keep a local copy*/
+ }
+ else
+ {
+ iDuplicateHelpTopicList.AppendL(categoryObj);
+ }
+ }
+ CleanupStack::Pop(categoryObj);
+ }
+ else
+ {
+ delete categoryObj;
+ }
+ }
+ }
+ }
+
+HBufC8* CCSXHHTMLContentParser::GetContentsFromFileL(const TDesC& htmlFile,CCoeEnv* aCoeEnv,
+ RFeatureControl& aFeatureControl)
+ {
+ RFs& fileSession = aCoeEnv->FsSession();
+ TInt SlashPosition = htmlFile.LocateReverse('\\');
+ TBuf<KMaxFileName>* CompressedFile = new (ELeave) TBuf<KMaxFileName>;
+ CleanupStack::PushL(CompressedFile); //1
+ CompressedFile->Copy(htmlFile.Mid(0,SlashPosition+1));
+ CompressedFile->Append(KContentZipFile);
+
+ HBufC8* CssContent = CreateBufferForCSSContentL(aFeatureControl);
+
+ if(!BaflUtils::FileExists(fileSession,*CompressedFile))
+ {
+ CleanupStack::PopAndDestroy(CompressedFile);
+
+ HBufC8* buffer = GetContentsFromHTMLFileL(htmlFile,aCoeEnv);
+
+ return MergeCssAndHTMLContentL(buffer,CssContent);
+ }
+
+ // Create an instance of CZipFile.
+ CZipFile* zipFile = CZipFile::NewL(fileSession, *CompressedFile);
+ CleanupStack::PushL(zipFile); //2
+
+ // Iterate and get the file name
+ CZipFileMemberIterator* members = zipFile->GetMembersL();
+ CleanupStack::PushL(members);//3
+ CZipFileMember* member = members->NextL(); // Get the first file in zip
+
+ TInt nCount=0;
+ const TBuf<KMaxFileName>*Fname;
+ TBuf<KMaxFileName> *HtmlFileName = new (ELeave) TBuf<KMaxFileName>;
+ CleanupStack::PushL(HtmlFileName); //4
+ HtmlFileName->Copy(htmlFile.Mid(SlashPosition+1));
+ for(nCount=0;member!=NULL;nCount++)
+ {
+ Fname = member->Name();
+ if(Fname->Compare(*HtmlFileName)==0 )
+ {
+ break;
+ }
+ delete member;
+ member = members->NextL();
+ }
+
+ if(NULL == member)
+ {
+ CleanupStack::PopAndDestroy(HtmlFileName);
+ CleanupStack::PopAndDestroy(members);
+ CleanupStack::PopAndDestroy(zipFile);
+ CleanupStack::PopAndDestroy(CompressedFile);
+
+ HBufC8* buffer = GetContentsFromHTMLFileL(htmlFile,aCoeEnv);
+ return MergeCssAndHTMLContentL(buffer,CssContent);
+ }
+
+ CleanupStack::PushL(member);//5
+ RZipFileMemberReaderStream* stream;
+ zipFile->GetInputStreamL(member, stream);
+ CleanupStack::PushL(stream);//6
+
+ // Extracts aFileName to a buffer.
+ // If the file is quite huge, then read the file in streaming mode.
+ // For example, use 4KB buffer and read it in an active object.
+ HBufC8* buffer = HBufC8::NewLC(member->UncompressedSize());//5
+ TPtr8 bufferPtr(buffer->Des());
+ User::LeaveIfError(stream->Read(bufferPtr, member->UncompressedSize()));
+
+ // Release all the resources.
+ CleanupStack::Pop(buffer);
+ CleanupStack::PopAndDestroy(stream);
+ CleanupStack::PopAndDestroy(member);
+ CleanupStack::PopAndDestroy(HtmlFileName);
+ CleanupStack::PopAndDestroy(members);
+ CleanupStack::PopAndDestroy(zipFile);
+ CleanupStack::PopAndDestroy(CompressedFile);
+
+ return MergeCssAndHTMLContentL(buffer,CssContent);
+ }
+
+TBool CCSXHHTMLContentParser::HandleMasterKeywordFileL(CCSXHHelpDataBase* aDataBase)
+ {
+ RFs& FileSession = iCoeEnv->FsSession();
+ CCSXHXMLParseHandler_MasterKywd* XMLParser_MasterKywd = CCSXHXMLParseHandler_MasterKywd::NewL(iCoeEnv);
+ CleanupStack::PushL(XMLParser_MasterKywd);
+ InitializeReaderL(XMLParser_MasterKywd);
+ XMLParser_MasterKywd->SetHtmlContentParserPtr(this);
+ XMLParser_MasterKywd->SetDataBasePtr(aDataBase);
+ TBool bMasterKeywordFilePresent = EFalse;
+
+ //Check for the availability of Master Keyword file
+ TBuf<KMaxFileName>* Master_kywdPath = new(ELeave) TBuf<KMaxFileName>;
+ CleanupStack::PushL(Master_kywdPath);//5
+ Master_kywdPath->Append(PathInfo::RomRootPath().Left(1));
+ GetHTMLContentPathForDriveL(Master_kywdPath,iCoeEnv);
+ Master_kywdPath->Append(KMasterKywdFile);
+
+ if(BaflUtils::FileExists(FileSession,*Master_kywdPath))
+ {
+ TRAP_IGNORE(iXmlReader->ParseL(FileSession,*Master_kywdPath ));
+ bMasterKeywordFilePresent = ETrue;
+ }
+
+ //KMasterKywdFile;
+ CleanupStack::PopAndDestroy(Master_kywdPath);
+ CleanupStack::PopAndDestroy(XMLParser_MasterKywd);
+ ClearReader();
+
+ return bMasterKeywordFilePresent;
+ }
+
+void CCSXHHTMLContentParser::GenerateKywdTOC1ListL(CCSXHHelpDataBase* aDataBase)
+ {
+ if(!iHtmlTOC1List.Count())
+ return;
+ TBool bMasterKeywordFilePresent = HandleMasterKeywordFileL(aDataBase);
+
+ CCSXHXMLParseHandler_Kywd* XMLParser = CCSXHXMLParseHandler_Kywd::NewL(iCoeEnv);
+ CleanupStack::PushL(XMLParser);
+ InitializeReaderL(XMLParser);
+
+ XMLParser->SetDataBasePtr(aDataBase);
+ XMLParser->SetIsTOC2(EFalse);
+ XMLParser->SetHtmlContentParserPtr(this);
+
+ //Parse keyword.xml file from Main Array list
+ ParseKeywdFileAndCreatekywdTOC1ObjectsL(iHtmlTOC1List,XMLParser,bMasterKeywordFilePresent);
+
+ //Parse keyword.xml file from duplicate Array list
+ ParseKeywdFileAndCreatekywdTOC1ObjectsL(iDuplicateHelpTopicList,XMLParser,bMasterKeywordFilePresent);
+
+ CleanupStack::PopAndDestroy(XMLParser);
+ ClearReader();
+ }
+
+void CCSXHHTMLContentParser::GenerateTOC2ListForKeywordSearchL
+(CCSXHHelpDataBase* aDataBase,CCSXHKywdTOC1* aKywdTOC1Object)
+ {
+ RPointerArray<CCSXHHtmlTOC1>* TOC1HtmlList = aKywdTOC1Object->GetHtmlTOC1List();
+ if(!TOC1HtmlList)
+ return;
+
+ CCSXHXMLParseHandler_Kywd* XMLParser = CCSXHXMLParseHandler_Kywd::NewL(iCoeEnv);
+ CleanupStack::PushL(XMLParser);
+ InitializeReaderL(XMLParser);
+
+ int toc1Count = TOC1HtmlList->Count();
+ CCSXHHtmlTOC1* toc1;
+
+ RFs& FileSession = iCoeEnv->FsSession();
+
+ XMLParser->SetDataBasePtr(aDataBase);
+ XMLParser->SetIsTOC2(ETrue);
+ XMLParser->SetHtmlContentParserPtr(this);
+
+ TBuf<KMaxFileName>* lookup = new(ELeave)TBuf<KMaxFileName>;
+ CleanupStack::PushL(lookup);//3
+ XMLParser->SetTOC1Title(aKywdTOC1Object->GetName());
+ for(int i = 0; i < toc1Count ; ++i )
+ {
+ toc1 = (*TOC1HtmlList)[i];
+ //Get Corresponding toc1 from Main array and set toc1 object
+ XMLParser->SetCurrentHtmlToc1(GetCorrespondingTOC1FromMainArray(toc1->GetName()));
+ //Clear the previous values
+ lookup->Delete(0,lookup->Length());
+ toc1->GetHelpFileL(*lookup);
+ XMLParser->SetPath(*lookup);
+ lookup->Append(KKeywordsFile);
+ TRAP_IGNORE(iXmlReader->ParseL (FileSession,*lookup ));
+ aDataBase->IncrementKeywordSearchCount();
+ }
+ CleanupStack::PopAndDestroy(lookup);
+ CleanupStack::PopAndDestroy(XMLParser);
+ ClearReader();
+ }
+
+CCSXHHelpContentBase* CCSXHHTMLContentParser::GetContextTopicL(
+ CCSXHHelpDataBase *aDataBase,
+ TUid &aUid,
+ TCoeContextName &aContextName
+ )
+ {
+ TBuf<KMaxFileName> path;
+ TInt32 toc1Count = iHtmlTOC1List.Count();
+ TInt32 dupToc1Count = iDuplicateHelpTopicList.Count();
+ CCSXHHtmlTOC1 *toc1 = NULL;
+ CCSXHHtmlTOC1 *temptoc1 = NULL;
+ TBool redirected = EFalse;
+
+ for ( TInt32 i = 0; i < toc1Count; ++i )
+ {
+ toc1 = iHtmlTOC1List[i];
+ if ( aUid == toc1->GetAppUid() )
+ {
+ toc1->GetHelpFileL( path );
+ if ( IsRedirectedL( aDataBase, path, aUid, aContextName ) )
+ {
+ redirected = ETrue;
+ }
+ else
+ {
+ return toc1->GetContextTopic( aContextName );
+ }
+ break;
+ }
+ }
+
+ if ( !redirected )
+ {
+ for ( TInt32 i = 0; i < dupToc1Count; ++i )
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ if ( aUid == toc1->GetAppUid() )
+ {
+ toc1->GetHelpFileL( path );
+ if ( IsRedirectedL( aDataBase, path, aUid, aContextName ) )
+ {
+ redirected = ETrue;
+ }
+ else
+ {
+ temptoc1 = GetCorrespondingTOC1FromMainArray(toc1->GetName());
+ return temptoc1->GetContextTopic( aContextName );
+ }
+ }
+ }
+ }
+
+ if ( redirected )
+ {
+ for ( TInt32 i = 0; i < toc1Count; ++i )
+ {
+ toc1 = iHtmlTOC1List[i];
+ if ( aUid == toc1->GetAppUid() )
+ {
+ return toc1->GetContextTopic( aContextName );
+ }
+ }
+
+ for ( TInt32 i = 0; i < dupToc1Count; ++i )
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ if ( aUid == toc1->GetAppUid() )
+ {
+ temptoc1 = GetCorrespondingTOC1FromMainArray( toc1->GetName() );
+ return temptoc1->GetContextTopic( aContextName );
+ }
+ }
+ }
+
+ return NULL;
+ }
+
+CCSXHHelpContentBase* CCSXHHTMLContentParser::GetHtmlTopicForUrlL(const TDesC& aUrl)
+ {
+ CCSXHHelpContentBase* tocobj = GetObjectBasedonUrlL(iHtmlTOC1List,aUrl,ETrue);
+
+ if(NULL == tocobj)
+ tocobj = GetObjectBasedonUrlL(iDuplicateHelpTopicList,aUrl,EFalse);
+
+ return tocobj;
+ }
+
+CCSXHHelpContentBase* CCSXHHTMLContentParser::GetObjectBasedonUrlL(RPointerArray<CCSXHHtmlTOC1>& aTOC1ObjectsArray,
+ const TDesC& aUrl, TBool aMainArrayList)
+ {
+ /*For URLs of form
+ file:://<Drive Name>:/system/xhtml/<Lang ID>/<App UID>/Html name
+ We can have help topics for other cases, help topic objects not possible
+ */
+ TBuf<KMaxFileName> aFileUrl;
+
+ int toc1Count = aTOC1ObjectsArray.Count();
+ CCSXHHtmlTOC1* toc1,*temptoc1;
+ for(int j = 0; j < toc1Count; ++j)
+ {
+ toc1 = aTOC1ObjectsArray[j];
+ TBuf<KMaxFileName> htmlFile;
+ toc1->GetHelpFileL(htmlFile);
+
+ //Convert fwd slashes to back slashes
+ TInt i = htmlFile.Find(KFwdSlash) ;
+ while (KErrNotFound != i)
+ {
+ htmlFile.Replace(i,1,KBackSlash);
+ i = htmlFile.Find(KFwdSlash) ;
+ }
+
+ i = aUrl.FindC(htmlFile);
+ if(i != KErrNotFound)
+ {
+ TFileName fileName;
+ i = aUrl.LocateReverseF('/');
+ fileName = aUrl.Mid(i + 1);
+ if(aMainArrayList)
+ temptoc1 = toc1;
+ else
+ temptoc1 = GetCorrespondingTOC1FromMainArray(toc1->GetName());
+
+ return temptoc1->GetHtmlTopicForFile(fileName);
+ }
+ }
+ return NULL;
+ }
+
+void CCSXHHTMLContentParser::GetHtmlFileL(CCoeEnv* coeEnv,const short& aDir,
+ const TAppUid& aUid,TBuf<KMaxFileName>& aFileName)
+ {
+ aFileName.Copy(KEmptyString);
+
+ RFs& FileSession = coeEnv->FsSession();
+ TDriveList DirList;
+ if( (FileSession.DriveList(DirList)<KErrNone) ||
+ (aDir >= DirList.Length()))
+ return;
+
+ TChar driveLetter = '?';
+ TDriveInfo info;
+ TInt error = FileSession.Drive(info, aDir);
+ if ((error == KErrNone) &&
+ (DirList[aDir] && info.iType != EMediaNotPresent))
+ {
+ RFs::DriveToChar(aDir, driveLetter);
+
+ aFileName.Append(driveLetter);
+ GetHTMLContentPathForDriveL(&aFileName,coeEnv);
+ aUid.AppendUid(aFileName);
+ aFileName.Append(KFwdSlash);
+ }
+ }
+
+void CCSXHHTMLContentParser::InitializeReaderL(CCSXHXMLParseHandler* aXMLParser)
+ {
+ if(iXmlReader == NULL )
+ {
+ iXmlReader = CSenXmlReader::NewL();
+ iXmlReader->SetContentHandler(*aXMLParser);
+ }
+ }
+void CCSXHHTMLContentParser::ClearReader()
+ {
+ delete iXmlReader;
+ iXmlReader = NULL;
+ }
+
+TBool CCSXHHTMLContentParser::IsUidCategoryPresent(const TUid& aUid)
+ {
+ int toc1Count = iHtmlTOC1List.Count();
+ CCSXHHtmlTOC1* toc1;
+ for(int i = 0; i < toc1Count; ++i)
+ {
+ toc1 = iHtmlTOC1List[i];
+ if(aUid == toc1->GetAppUid())
+ return ETrue;
+ }
+
+ toc1Count = iDuplicateHelpTopicList.Count();
+ for(int i = 0; i < toc1Count; ++i)
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ if(aUid == toc1->GetAppUid())
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+TBool CCSXHHTMLContentParser::GetHTMLToc1(const TDesC& aUid,CCSXHXMLParseHandler* aParser)
+ {
+ TUint AppId;
+
+ if(!aUid.Length())
+ return EFalse;
+
+ TLex FolderUid(aUid.Mid(KOffset));
+ FolderUid.Val(AppId,EHex);
+ TUid ApplicationUid = TUid::Uid((TInt)AppId);
+
+ int toc1Count = iHtmlTOC1List.Count();
+
+ CCSXHHtmlTOC1* toc1;
+ for(int i = 0; i < toc1Count; ++i)
+ {
+ toc1 = iHtmlTOC1List[i];
+ if(ApplicationUid == toc1->GetAppUid())
+ {
+ STATIC_CAST(CCSXHXMLParseHandler_MasterKywd*,aParser)->SetCurrentHtmlToc1(toc1);
+ return ETrue;
+ }
+ }
+
+ toc1Count = iDuplicateHelpTopicList.Count();
+ for(int i = 0; i < toc1Count; ++i)
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ if(ApplicationUid == toc1->GetAppUid())
+ {
+ STATIC_CAST(CCSXHXMLParseHandler_MasterKywd*,aParser)->SetCurrentHtmlToc1(toc1);
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+//To get Corresponding toc1 from main array.
+CCSXHHtmlTOC1* CCSXHHTMLContentParser::GetCorrespondingTOC1FromMainArray(const TDesC& aApplicationName)
+ {
+ TInt toc1Count = iHtmlTOC1List.Count();
+ CCSXHHtmlTOC1* toc1;
+ for(int i=0;i<toc1Count;++i)
+ {
+ toc1 = iHtmlTOC1List[i];
+ if(toc1->GetName().CompareF(aApplicationName) == 0)
+ return toc1;
+ }
+
+ return NULL;
+ }
+
+//Check UId is already present in the list.
+TBool CCSXHHTMLContentParser::IsAppUIdPresentAlready(const TDesC& aUid)
+ {
+ TBool result = EFalse;
+ TInt toc1Count = iHtmlTOC1List.Count();
+ CCSXHHtmlTOC1* toc1;
+
+ TUint AppId;
+ TLex FolderUid(aUid.Mid(KOffset));
+ FolderUid.Val(AppId,EHex);
+ TUid ApplicationUid = TUid::Uid((TInt)AppId);
+
+ for(int i=0;i<toc1Count;++i)
+ {
+ toc1 = iHtmlTOC1List[i];
+ if(ApplicationUid == toc1->GetAppUid())
+ {
+ result = ETrue;
+ break;
+ }
+ }
+
+ toc1Count = iDuplicateHelpTopicList.Count();
+ for(int i=0;i<toc1Count;++i)
+ {
+ toc1 = iDuplicateHelpTopicList[i];
+ if(ApplicationUid == toc1->GetAppUid())
+ {
+ result = ETrue;
+ break;
+ }
+ }
+
+ return result;
+
+ }
+
+void CCSXHHTMLContentParser::ParseKeywdFileAndCreatekywdTOC1ObjectsL(
+ RPointerArray<CCSXHHtmlTOC1>& aTOC1ObjectsArray,
+ CCSXHXMLParseHandler_Kywd* XMLParser, TBool bMasterKeywordFilePresent)
+ {
+ int toc1Count = aTOC1ObjectsArray.Count();
+ CCSXHHtmlTOC1* toc1;
+
+ TBuf<KMaxFileName>* lookup = new(ELeave)TBuf<KMaxFileName>;
+ CleanupStack::PushL(lookup);//1
+
+ RFs& FileSession = iCoeEnv->FsSession();
+
+ for(int i = 0; i < toc1Count; ++i)
+ {
+ toc1 = aTOC1ObjectsArray[i];
+
+ if(bMasterKeywordFilePresent && toc1->IsROMDrive())
+ continue;
+
+ //Clear the previous values
+ lookup->Delete(0,lookup->Length());
+
+ toc1->GetHelpFileL(*lookup);
+ lookup->Append(KKeywordsFile);
+
+ //Check whether a file exists
+ if(!BaflUtils::FileExists(FileSession,*lookup))
+ continue;
+
+ XMLParser->SetCurrentHtmlToc1(toc1);
+ TRAP_IGNORE(iXmlReader->ParseL(FileSession,*lookup ));
+ }
+
+ CleanupStack::PopAndDestroy(lookup);
+ }
+
+//RUNTIME
+void CCSXHHTMLContentParser::GetSupportedFeatureListL()
+ {
+ RFeatureUidArray SupportedFeatures;
+ TInt err = iFeatureControl.Connect();
+ if ( err == KErrNone )
+ {
+ // ListSupportedFeatures() returns one of the Symbian error codes.
+ err = iFeatureControl.ListSupportedFeatures( SupportedFeatures );
+
+ // Remember to call CloseL after using RFeatureControl.
+ // It disconnects the Feature Manager server.
+ iFeatureControl.Close();
+ }
+ //As per new req. add true, flase to id and create an array.
+
+ iFeatureManager_FeatureIds = new (ELeave) CDesCArrayFlat(2);
+
+ TBuf<25>CurrFId;
+
+ for(TInt i=0;i<SupportedFeatures.Count();i++)
+ {
+ CurrFId.Copy(KEmptyString);
+ CurrFId.AppendNum(SupportedFeatures[i].iUid);
+ iFeatureManager_FeatureIds->AppendL(CurrFId);
+
+ CurrFId.Copy(KTrue_StringtoAppend);
+ CurrFId.AppendNum(SupportedFeatures[i].iUid);
+ iFeatureManager_FeatureIds->AppendL(CurrFId);
+
+ CurrFId.Copy(KFalse_StringtoAppend);
+ CurrFId.AppendNum(SupportedFeatures[i].iUid);
+ iFeatureManager_FeatureIds->AppendL(CurrFId);
+ }
+
+ //Input Language variation changes
+ //-----------------------------------------
+ //Create an array with supported input language
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = new(ELeave)CArrayFixFlat<TInt>(2);
+
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+
+ TInt nCount = languageCodeArray->Count();
+
+ iSupportedInputLanguages = new (ELeave) CDesCArrayFlat(2);
+
+ //Codescanner gives error, if member variables are pushed.
+ //CleanupStack::PushL( iSupportedInputLanguages );
+
+ for(TInt i=0; i<nCount;i++)
+ {
+ TInt languageCode = languageCodeArray->At(i);
+ TBuf<25>Currlang(_L("LANGUAGE_"));
+ if(languageCode < 10)
+ Currlang.AppendNumFixedWidth(languageCode,EDecimal,2);
+ else
+ Currlang.AppendNum(languageCode);
+
+ iSupportedInputLanguages->AppendL(Currlang);
+ }
+
+ //CleanupStack::Pop(iSupportedInputLanguages);
+ CleanupStack::PopAndDestroy( ptiEngine );
+
+ delete languageCodeArray;
+ //-----------------------------------------
+
+ SupportedFeatures.Close();
+ }
+
+//RUNTIME
+TBool CCSXHHTMLContentParser::CheckFeatureIDL(const TDesC& aFeatureIds)
+ {
+ if(/*KHexPrefixLength == aFeatureIds.Length() &&*/
+ KErrNotFound != aFeatureIds.Find(KDefaultFeatureIdStringTemp))
+ {
+ return ETrue;
+ }
+
+ HBufC* Ids = HBufC::NewLC(aFeatureIds.Length());
+ TPtr CurrentFeatureIds = Ids->Des();
+ CurrentFeatureIds.Copy(aFeatureIds);
+ CleanupStack::Pop(Ids);
+
+ CDesCArray* FeatureIdList = new (ELeave) CDesCArrayFlat(2); ;
+ TInt EndPos = CurrentFeatureIds.Locate(' ');
+
+ CleanupStack::PushL(FeatureIdList);
+
+ while (KErrNotFound != EndPos)
+ {
+ FeatureIdList->AppendL(CurrentFeatureIds.Mid(0,EndPos));// FId_Val);
+ CurrentFeatureIds = CurrentFeatureIds.Mid(EndPos+1);
+ EndPos = CurrentFeatureIds.Locate(' ') ;
+ }
+
+ if(KErrNotFound == EndPos && 0!= CurrentFeatureIds.Length())
+ {
+ FeatureIdList->AppendL(CurrentFeatureIds);
+ }
+
+ CleanupStack::Pop(FeatureIdList);
+
+ TInt position;
+ if(KErrNone == FeatureIdList->Find(KDefaultFeatureIdString,position) ||
+ KErrNone == FeatureIdList->Find(KDefaultFeatureIdStringTemp,position) )
+ {
+ delete FeatureIdList;
+ delete Ids;
+ return ETrue;
+ }
+
+ TInt nCount = FeatureIdList->MdcaCount();
+
+
+ //FeatureManager list contains all enabled featureIds, appended with true, and false.
+ //New Req. text associated with true_featureId, should be displayed, if Id is enabled.
+ //else, if featureId is disabled, text associated with false_featureId should be displayed.
+ // 1. if featureId string contains "false" and it is not in the list, return ETrue.
+ // 2. if featureId string does not contain "false" and it is present in the list, return ETrue.
+ // 3. if featureId is part of input language, return ETrue.
+ for(TInt j=0;j < nCount;j++)
+ {
+ if(
+ (KErrNotFound != FeatureIdList->MdcaPoint(j).Find(KFalseString) &&
+ KErrNone != iFeatureManager_FeatureIds->Find(FeatureIdList->MdcaPoint(j),position))||
+
+ (KErrNotFound == FeatureIdList->MdcaPoint(j).Find(KFalseString) &&
+ KErrNone == iFeatureManager_FeatureIds->Find(FeatureIdList->MdcaPoint(j),position)) ||
+
+ KErrNone == iSupportedInputLanguages->Find(FeatureIdList->MdcaPoint(j),position)
+ )
+ {
+ delete FeatureIdList;
+ delete Ids;
+ return ETrue;
+ }
+ }
+
+ delete Ids;
+ delete FeatureIdList;
+ return EFalse;
+ }
+
+HBufC8* CCSXHHTMLContentParser::CreateBufferForCSSContentL(RFeatureControl& aFeatureControl)
+ {
+ RFeatureUidArray SupportedFeatures;
+ TInt err = aFeatureControl.Connect();
+ if ( err == KErrNone )
+ {
+ // ListSupportedFeatures() returns one of the Symbian error codes.
+ err = aFeatureControl.ListSupportedFeatures( SupportedFeatures );
+
+ // Remember to call CloseL after using RFeatureControl.
+ // It disconnects the Feature Manager server.
+ aFeatureControl.Close();
+ }
+
+ //Input Language variation changes
+ //-----------------------------------------
+
+ CPtiEngine* ptiEngine = CPtiEngine::NewL();
+ CleanupStack::PushL( ptiEngine );
+
+ CArrayFix<TInt>* languageCodeArray = new(ELeave)CArrayFixFlat<TInt>(2);
+
+ ptiEngine->GetAvailableLanguagesL( languageCodeArray );
+
+ TInt nInputLangCount = languageCodeArray->Count();
+ TInt nCount = SupportedFeatures.Count();
+
+ HBufC8* CssContent = HBufC8::NewLC(nCount * KMaxUnits * 6 + nInputLangCount * 3 + 400);
+ TPtr8 bufferPtr(CssContent->Des());
+
+ AppendStyleSheetContent_listitem(bufferPtr,nCount,SupportedFeatures,*languageCodeArray);
+ AppendStyleSheetContent_paragraph(bufferPtr,nCount,SupportedFeatures,*languageCodeArray);
+ AppendStyleSheetContent_ahref(bufferPtr,nCount,SupportedFeatures,*languageCodeArray);
+ AppendStyleSheetContent_none(bufferPtr,nCount,SupportedFeatures);
+
+ SupportedFeatures.Close();
+
+ CleanupStack::Pop(CssContent);
+
+ //Input Language variation changes
+ //-----------------------------------------
+ CleanupStack::PopAndDestroy( ptiEngine );
+
+ delete languageCodeArray;
+ //-----------------------------------------
+
+ return CssContent;
+ }
+
+HBufC8* CCSXHHTMLContentParser::GetContentsFromHTMLFileL(const TDesC& htmlFile,CCoeEnv* aCoeEnv)
+ {
+ RFs& fsSession = aCoeEnv->FsSession();
+ RFile file;
+
+ TInt err = file.Open(fsSession,htmlFile,EFileRead|EFileShareReadersOrWriters);
+ if(KErrNone == err)
+ {
+ TInt FileSize;
+ HBufC8* htmlFileContent = NULL;
+ if(KErrNone == file.Size(FileSize))
+ {
+ htmlFileContent = HBufC8::NewLC(FileSize);
+ TPtr8 PtrContent = htmlFileContent->Des();
+
+ file.Read(PtrContent);
+ CleanupStack::Pop(htmlFileContent);
+ }
+ file.Close();
+ return htmlFileContent;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+
+HBufC8* CCSXHHTMLContentParser::MergeCssAndHTMLContentL(HBufC8* aHTMLBuffer, HBufC8* aCssContent)
+ {
+ TInt BufferLength=0;
+ if(aHTMLBuffer)
+ BufferLength = aHTMLBuffer->Size();
+
+ if(aCssContent)
+ BufferLength += aCssContent->Size();
+
+ HBufC8* Htmlbuffer = HBufC8::NewLC(BufferLength);
+
+ TPtr8 HtmlbufferPtr(Htmlbuffer->Des());
+
+ if(aCssContent)
+ {
+ HtmlbufferPtr.Copy(aCssContent->Des());
+ delete aCssContent;
+ }
+
+ if(aHTMLBuffer)
+ {
+ HtmlbufferPtr.Append(aHTMLBuffer->Des());
+ delete aHTMLBuffer;
+ }
+
+ if(Htmlbuffer)
+ CleanupStack::Pop(Htmlbuffer);
+
+ return Htmlbuffer;
+ }
+
+void CCSXHHTMLContentParser::AppendStyleSheetContent_listitem(TPtr8& abufferptr,TInt aFeatureIdCount,
+ RFeatureUidArray& aSupportedFeatures,
+ CArrayFix<TInt>& alanguageCodeArray)
+ {
+ //List Items
+ //---------------------------------------------------------
+ abufferptr.Copy(KCsstext_First);
+
+ for(TInt i=0;i<aFeatureIdCount;++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ FeatureId.Format(KtextFormat_true_l,aSupportedFeatures[i].iUid);
+ //FeatureId.Append(KComma);
+ abufferptr.Append(FeatureId);
+ }
+
+ for(TInt i=0;i<alanguageCodeArray.Count();++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ if(alanguageCodeArray[i] < 10)
+ FeatureId.Format(KtextFormat_lang_0l,alanguageCodeArray[i]);
+ else
+ FeatureId.Format(KtextFormat_lang_l,alanguageCodeArray[i]);
+
+ abufferptr.Append(FeatureId);
+ }
+
+ abufferptr.Append(KDefaultFeatureId);
+ abufferptr.Append(KCsstext_displayp_li);
+ abufferptr.Append(KCsstext_Last);
+ //---------------------------------------------------------
+ }
+
+void CCSXHHTMLContentParser::AppendStyleSheetContent_paragraph(TPtr8& abufferptr,TInt aFeatureIdCount,
+ RFeatureUidArray& aSupportedFeatures,
+ CArrayFix<TInt>& alanguageCodeArray)
+ {
+ //Paragraph
+ //---------------------------------------------------------
+ abufferptr.Append(KCsstext_First);
+ for(TInt i=0;i<aFeatureIdCount;++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ FeatureId.Format(KtextFormat_true_b,aSupportedFeatures[i].iUid);
+ //FeatureId.Append(KComma);
+
+ abufferptr.Append(FeatureId);
+ }
+
+ for(TInt i=0;i<alanguageCodeArray.Count();++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ if(alanguageCodeArray[i] < 10)
+ FeatureId.Format(KtextFormat_lang_0b,alanguageCodeArray[i]);
+ else
+ FeatureId.Format(KtextFormat_lang_b,alanguageCodeArray[i]);
+
+ abufferptr.Append(FeatureId);
+ }
+
+ abufferptr.Append(KDefaultFeatureId);
+ abufferptr.Append(KCsstext_displayp_p);
+ abufferptr.Append(KCsstext_Last);
+
+ //---------------------------------------------------------
+ }
+
+void CCSXHHTMLContentParser::AppendStyleSheetContent_ahref(TPtr8& abufferptr,TInt aFeatureIdCount,
+ RFeatureUidArray& aSupportedFeatures,
+ CArrayFix<TInt>& alanguageCodeArray)
+ {
+ //A href
+ //---------------------------------------------------------
+ abufferptr.Append(KCsstext_First);
+ for(TInt i=0;i<aFeatureIdCount;++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ FeatureId.Format(KtextFormat_true_a,aSupportedFeatures[i].iUid);
+ abufferptr.Append(FeatureId);
+ }
+
+ for(TInt i=0;i<alanguageCodeArray.Count();++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ if(alanguageCodeArray[i] < 10)
+ FeatureId.Format(KtextFormat_lang_0a,alanguageCodeArray[i]);
+ else
+ FeatureId.Format(KtextFormat_lang_a,alanguageCodeArray[i]);
+ abufferptr.Append(FeatureId);
+ }
+
+ abufferptr.Append(KDefaultFeatureId);
+ abufferptr.Append(KCsstext_displayp_a);
+ abufferptr.Append(KCsstext_Last);
+
+ //---------------------------------------------------------
+ }
+
+void CCSXHHTMLContentParser::AppendStyleSheetContent_none(TPtr8& abufferptr,TInt aFeatureIdCount,
+ RFeatureUidArray& aSupportedFeatures
+ )
+ {
+ //False
+ //---------------------------------------------------------
+ abufferptr.Append(KCsstext_First);
+ for(TInt i=0;i<aFeatureIdCount;++i)
+ {
+ TBuf<KMaxFileName> FeatureId;
+ FeatureId.Format(KtextFormat_false,aSupportedFeatures[i].iUid,aSupportedFeatures[i].iUid,aSupportedFeatures[i].iUid);
+ abufferptr.Append(FeatureId);
+ }
+
+ abufferptr.Append(KDefaultFeatureId);
+ abufferptr.Append(KCsstext_displayp_n);
+ abufferptr.Append(KCsstext_Last);
+
+ //---------------------------------------------------------
+ }