diff -r 000000000000 -r 71ca22bcf22a mmserv/metadatautility/Src/MetaDataParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/metadatautility/Src/MetaDataParser.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,1245 @@ +/* +* Copyright (c) 2004 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: This class provides the base class for metadata parsers. +* This class is the highest class in parser hierarchy. +* +*/ + + + +// INCLUDE FILES +#include "MetaDataParser.h" +#include +#include +#include +#include +#include + +_LIT(KCharacterSetRscFile, "TopCharacterSet.rsc"); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMetaDataParser::CMetaDataParser +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMetaDataParser::CMetaDataParser() + : iContainer(NULL), + iExists(EFalse), + iCharacterSet(NULL), + iTopCharacterSet(NULL) + { + } + +// Destructor +CMetaDataParser::~CMetaDataParser() + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::MetaDataExists +// ----------------------------------------------------------------------------- +// +TBool CMetaDataParser::MetaDataExists() + { + return iExists; + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::StripTrailingZeroes +// ----------------------------------------------------------------------------- +// +TPtrC8 CMetaDataParser::StripTrailingZeroes( + const TDesC8& aDesc, TInt aEncoding) + { + // Find out the actual size of data, ie without the trailing zeros + TInt realOffset = aDesc.Length() - 1; + if(aEncoding == 0x00 || aEncoding == 0x03) + { + while ( realOffset >= 0 ) + { + if ( aDesc[realOffset] != 0x00 ) + { + break; + } + realOffset--; + } + return aDesc.Left( realOffset + 1 ); + } + else + { + while ( realOffset > 0 ) + { + if ( aDesc[realOffset] != 0x00 || aDesc[realOffset-1] != 0x00) + { + break; + } + realOffset -= 2; + } + return aDesc.Left( realOffset + 1 ); + } + } + + +// ----------------------------------------------------------------------------- +// CMetaDataParser::StripTrailingZeroes +// ----------------------------------------------------------------------------- +// +TPtrC CMetaDataParser::StripTrailingZeroes( + const TDesC& aDesc) + { + // Find out the actual size of data, ie without the trailing zeros + TInt realOffset = aDesc.Length() - 1; + while ( realOffset >= 0 ) + { + if ( aDesc[realOffset] != 0x00 ) + { + break; + } + realOffset--; + } + return aDesc.Left( realOffset + 1 ); + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::UnicodeBOM +// ----------------------------------------------------------------------------- +// +TInt CMetaDataParser::UnicodeBOM( + const TDesC8& aUnicode ) + { + TPtrC8 bomData( aUnicode.Left( 2 ) ); + + TBuf8<2> BEbom; // Big endian BOM + BEbom.Append( TChar( 0xFE ) ); + BEbom.Append( TChar( 0xFF ) ); + + TBuf8<2> LEbom; // Little endian BOM + LEbom.Append( TChar( 0xFF ) ); + LEbom.Append( TChar( 0xFE ) ); + + if ( bomData.Compare( BEbom ) == 0 ) + { + // Big Endian + return KUnicodeBOMBigEndian; + } + else if ( bomData.Compare( LEbom ) == 0 ) + { + // Little Endian + return KUnicodeBOMLittleEndian; + } + else + { + return KUnicodeBOMNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::Version() +// ----------------------------------------------------------------------------- +// +TID3Version CMetaDataParser::ID3Version() +{ + return ENonID3; +} + +// ----------------------------------------------------------------------------- +// CMetaDataParser::MapID3v1GenreToString() +// ----------------------------------------------------------------------------- +// +void CMetaDataParser::MapID3GenreToStringL(TInt aNum, TDes& aGenrePtr) +{ + if(aNum < 0 || aNum > 125 && aNum != 199) + { + return; + } + switch(aNum) + { + case 0: + aGenrePtr.Append(KGenreBlues); + break; + case 1: + aGenrePtr.Append(KGenreClassicRock); + break; + case 2: + aGenrePtr.Append(KGenreCountry); + break; + case 3: + aGenrePtr.Append(KGenreDance); + break; + case 4: + aGenrePtr.Append(KGenreDisco); + break; + case 5: + aGenrePtr.Append(KGenreFunk); + break; + case 6: + aGenrePtr.Append(KGenreGrunge); + break; + case 7: + aGenrePtr.Append(KGenreHipHop); + break; + case 8: + aGenrePtr.Append(KGenreJazz); + break; + case 9: + aGenrePtr.Append(KGenreMetal); + break; + case 10: + aGenrePtr.Append(KGenreNewAge); + break; + case 11: + aGenrePtr.Append(KGenreOldies); + break; + case 12: + aGenrePtr.Append(KGenreOther); + break; + case 13: + aGenrePtr.Append(KGenrePop); + break; + case 14: + aGenrePtr.Append(KGenreRB); + break; + case 15: + aGenrePtr.Append(KGenreRap); + break; + case 16: + aGenrePtr.Append(KGenreReggae); + break; + case 17: + aGenrePtr.Append(KGenreRock); + break; + case 18: + aGenrePtr.Append(KGenreTechno); + break; + case 19: + aGenrePtr.Append(KGenreIndustrial); + break; + case 20: + aGenrePtr.Append(KGenreAlternative); + break; + case 21: + aGenrePtr.Append(KGenreSka); + break; + case 22: + aGenrePtr.Append(KGenreDeathMetal); + break; + case 23: + aGenrePtr.Append(KGenrePranks); + break; + case 24: + aGenrePtr.Append(KGenreSoundtrack); + break; + case 25: + aGenrePtr.Append(KGenreEuroTechno); + break; + case 26: + aGenrePtr.Append(KGenreAmbient); + break; + case 27: + aGenrePtr.Append(KGenreTripHop); + break; + case 28: + aGenrePtr.Append(KGenreVocal); + break; + case 29: + aGenrePtr.Append(KGenreJazzFunk); + break; + case 30: + aGenrePtr.Append(KGenreFusion); + break; + case 31: + aGenrePtr.Append(KGenreTrance); + break; + case 32: + aGenrePtr.Append(KGenreClassical); + break; + case 33: + aGenrePtr.Append(KGenreInstrumental); + break; + case 34: + aGenrePtr.Append(KGenreAcid); + break; + case 35: + aGenrePtr.Append(KGenreHouse); + break; + case 36: + aGenrePtr.Append(KGenreGame); + break; + case 37: + aGenrePtr.Append(KGenreSoundClip); + break; + case 38: + aGenrePtr.Append(KGenreGospel); + break; + case 39: + aGenrePtr.Append(KGenreNoise); + break; + case 40: + aGenrePtr.Append(KGenreAlternRock); + break; + case 41: + aGenrePtr.Append(KGenreBass); + break; + case 42: + aGenrePtr.Append(KGenreSoul); + break; + case 43: + aGenrePtr.Append(KGenrePunk); + break; + case 44: + aGenrePtr.Append(KGenreSpace); + break; + case 45: + aGenrePtr.Append(KGenreMeditative); + break; + case 46: + aGenrePtr.Append(KGenreInstrumentalPop); + break; + case 47: + aGenrePtr.Append(KGenreInstrumentalRock); + break; + case 48: + aGenrePtr.Append(KGenreEthnic); + break; + case 49: + aGenrePtr.Append(KGenreGothic); + break; + case 50: + aGenrePtr.Append(KGenreDarkwave); + break; + case 51: + aGenrePtr.Append(KGenreTechnoIndustrial); + break; + case 52: + aGenrePtr.Append(KGenreElectronic); + break; + case 53: + aGenrePtr.Append(KGenrePopFolk); + break; + case 54: + aGenrePtr.Append(KGenreEurodance); + break; + case 55: + aGenrePtr.Append(KGenreDream); + break; + case 56: + aGenrePtr.Append(KGenreSouthernRock); + break; + case 57: + aGenrePtr.Append(KGenreComedy); + break; + case 58: + aGenrePtr.Append(KGenreCult); + break; + case 59: + aGenrePtr.Append(KGenreGangsta); + break; + case 60: + aGenrePtr.Append(KGenreTop40); + break; + case 61: + aGenrePtr.Append(KGenreChristianRap); + break; + case 62: + aGenrePtr.Append(KGenrePopFunk); + break; + case 63: + aGenrePtr.Append(KGenreJungle); + break; + case 64: + aGenrePtr.Append(KGenreNativeAmerican); + break; + case 65: + aGenrePtr.Append(KGenreCabaret); + break; + case 66: + aGenrePtr.Append(KGenreNewWave); + break; + case 67: + aGenrePtr.Append(KGenrePsychadelic); + break; + case 68: + aGenrePtr.Append(KGenreRave); + break; + case 69: + aGenrePtr.Append(KGenreShowtunes); + break; + case 70: + aGenrePtr.Append(KGenreTrailer); + break; + case 71: + aGenrePtr.Append(KGenreLoFi); + break; + case 72: + aGenrePtr.Append(KGenreTribal); + break; + case 73: + aGenrePtr.Append(KGenreAcidPunk); + break; + case 74: + aGenrePtr.Append(KGenreAcidJazz); + break; + case 75: + aGenrePtr.Append(KGenrePolka); + break; + case 76: + aGenrePtr.Append(KGenreRetro); + break; + case 77: + aGenrePtr.Append(KGenreMusical); + break; + case 78: + aGenrePtr.Append(KGenreRockRoll); + break; + case 79: + aGenrePtr.Append(KGenreHardRock); + break; + case 80: + aGenrePtr.Append(KGenreFolk); + break; + case 81: + aGenrePtr.Append(KGenreFolkRock); + break; + case 82: + aGenrePtr.Append(KGenreNationalFolk); + break; + case 83: + aGenrePtr.Append(KGenreSwing); + break; + case 84: + aGenrePtr.Append(KGenreFastFusion); + break; + case 85: + aGenrePtr.Append(KGenreBebob); + break; + case 86: + aGenrePtr.Append(KGenreLatin); + break; + case 87: + aGenrePtr.Append(KGenreRevival); + break; + case 88: + aGenrePtr.Append(KGenreCeltic); + break; + case 89: + aGenrePtr.Append(KGenreBluegrass); + break; + case 90: + aGenrePtr.Append(KGenreAvantgarde); + break; + case 91: + aGenrePtr.Append(KGenreGothicRock); + break; + case 92: + aGenrePtr.Append(KGenreProgressiveRock); + break; + case 93: + aGenrePtr.Append(KGenrePsychedelicRock); + break; + case 94: + aGenrePtr.Append(KGenreSymphonicRock); + break; + case 95: + aGenrePtr.Append(KGenreSlowRock); + break; + case 96: + aGenrePtr.Append(KGenreBigBand); + break; + case 97: + aGenrePtr.Append(KGenreChorus); + break; + case 98: + aGenrePtr.Append(KGenreEasyListening); + break; + case 99: + aGenrePtr.Append(KGenreAcoustic); + break; + case 100: + aGenrePtr.Append(KGenreHumour); + break; + case 101: + aGenrePtr.Append(KGenreSpeech); + break; + case 102: + aGenrePtr.Append(KGenreChanson); + break; + case 103: + aGenrePtr.Append(KGenreOpera); + break; + case 104: + aGenrePtr.Append(KGenreChamberMusic); + break; + case 105: + aGenrePtr.Append(KGenreSonata); + break; + case 106: + aGenrePtr.Append(KGenreSymphony); + break; + case 107: + aGenrePtr.Append(KGenreBootyBass); + break; + case 108: + aGenrePtr.Append(KGenrePrimus); + break; + case 109: + aGenrePtr.Append(KGenrePornGroove); + break; + case 110: + aGenrePtr.Append(KGenreSatire); + break; + case 111: + aGenrePtr.Append(KGenreSlowJam); + break; + case 112: + aGenrePtr.Append(KGenreClub); + break; + case 113: + aGenrePtr.Append(KGenreTango); + break; + case 114: + aGenrePtr.Append(KGenreSamba); + break; + case 115: + aGenrePtr.Append(KGenreFolklore); + break; + case 116: + aGenrePtr.Append(KGenreBallad); + break; + case 117: + aGenrePtr.Append(KGenrePowerBallad); + break; + case 118: + aGenrePtr.Append(KGenreRhythmicSoul); + break; + case 119: + aGenrePtr.Append(KGenreFreestyle); + break; + case 120: + aGenrePtr.Append(KGenreDuet); + break; + case 121: + aGenrePtr.Append(KGenrePunkRock); + break; + case 122: + aGenrePtr.Append(KGenreDrumSolo); + break; + case 123: + aGenrePtr.Append(KGenreAcapella); + break; + case 124: + aGenrePtr.Append(KGenreEuroHouse); + break; + case 125: + aGenrePtr.Append(KGenreDanceHall); + break; + case 199: + aGenrePtr.Append(KGenrePodcast); + break; + default: + break; + } +} + +// ----------------------------------------------------------------------------- +// CMetaDataParser::MapID3v2GenreToString() +// ----------------------------------------------------------------------------- +// +void CMetaDataParser::MapID3GenreToStringL(TInt aNum, TDes8& aGenrePtr) +{ + if(aNum < 0 || aNum > 125 && aNum != 199) + { + return; + } + switch(aNum) + { + case 0: + aGenrePtr.Append(KGenreBlues); + break; + case 1: + aGenrePtr.Append(KGenreClassicRock); + break; + case 2: + aGenrePtr.Append(KGenreCountry); + break; + case 3: + aGenrePtr.Append(KGenreDance); + break; + case 4: + aGenrePtr.Append(KGenreDisco); + break; + case 5: + aGenrePtr.Append(KGenreFunk); + break; + case 6: + aGenrePtr.Append(KGenreGrunge); + break; + case 7: + aGenrePtr.Append(KGenreHipHop); + break; + case 8: + aGenrePtr.Append(KGenreJazz); + break; + case 9: + aGenrePtr.Append(KGenreMetal); + break; + case 10: + aGenrePtr.Append(KGenreNewAge); + break; + case 11: + aGenrePtr.Append(KGenreOldies); + break; + case 12: + aGenrePtr.Append(KGenreOther); + break; + case 13: + aGenrePtr.Append(KGenrePop); + break; + case 14: + aGenrePtr.Append(KGenreRB); + break; + case 15: + aGenrePtr.Append(KGenreRap); + break; + case 16: + aGenrePtr.Append(KGenreReggae); + break; + case 17: + aGenrePtr.Append(KGenreRock); + break; + case 18: + aGenrePtr.Append(KGenreTechno); + break; + case 19: + aGenrePtr.Append(KGenreIndustrial); + break; + case 20: + aGenrePtr.Append(KGenreAlternative); + break; + case 21: + aGenrePtr.Append(KGenreSka); + break; + case 22: + aGenrePtr.Append(KGenreDeathMetal); + break; + case 23: + aGenrePtr.Append(KGenrePranks); + break; + case 24: + aGenrePtr.Append(KGenreSoundtrack); + break; + case 25: + aGenrePtr.Append(KGenreEuroTechno); + break; + case 26: + aGenrePtr.Append(KGenreAmbient); + break; + case 27: + aGenrePtr.Append(KGenreTripHop); + break; + case 28: + aGenrePtr.Append(KGenreVocal); + break; + case 29: + aGenrePtr.Append(KGenreJazzFunk); + break; + case 30: + aGenrePtr.Append(KGenreFusion); + break; + case 31: + aGenrePtr.Append(KGenreTrance); + break; + case 32: + aGenrePtr.Append(KGenreClassical); + break; + case 33: + aGenrePtr.Append(KGenreInstrumental); + break; + case 34: + aGenrePtr.Append(KGenreAcid); + break; + case 35: + aGenrePtr.Append(KGenreHouse); + break; + case 36: + aGenrePtr.Append(KGenreGame); + break; + case 37: + aGenrePtr.Append(KGenreSoundClip); + break; + case 38: + aGenrePtr.Append(KGenreGospel); + break; + case 39: + aGenrePtr.Append(KGenreNoise); + break; + case 40: + aGenrePtr.Append(KGenreAlternRock); + break; + case 41: + aGenrePtr.Append(KGenreBass); + break; + case 42: + aGenrePtr.Append(KGenreSoul); + break; + case 43: + aGenrePtr.Append(KGenrePunk); + break; + case 44: + aGenrePtr.Append(KGenreSpace); + break; + case 45: + aGenrePtr.Append(KGenreMeditative); + break; + case 46: + aGenrePtr.Append(KGenreInstrumentalPop); + break; + case 47: + aGenrePtr.Append(KGenreInstrumentalRock); + break; + case 48: + aGenrePtr.Append(KGenreEthnic); + break; + case 49: + aGenrePtr.Append(KGenreGothic); + break; + case 50: + aGenrePtr.Append(KGenreDarkwave); + break; + case 51: + aGenrePtr.Append(KGenreTechnoIndustrial); + break; + case 52: + aGenrePtr.Append(KGenreElectronic); + break; + case 53: + aGenrePtr.Append(KGenrePopFolk); + break; + case 54: + aGenrePtr.Append(KGenreEurodance); + break; + case 55: + aGenrePtr.Append(KGenreDream); + break; + case 56: + aGenrePtr.Append(KGenreSouthernRock); + break; + case 57: + aGenrePtr.Append(KGenreComedy); + break; + case 58: + aGenrePtr.Append(KGenreCult); + break; + case 59: + aGenrePtr.Append(KGenreGangsta); + break; + case 60: + aGenrePtr.Append(KGenreTop40); + break; + case 61: + aGenrePtr.Append(KGenreChristianRap); + break; + case 62: + aGenrePtr.Append(KGenrePopFunk); + break; + case 63: + aGenrePtr.Append(KGenreJungle); + break; + case 64: + aGenrePtr.Append(KGenreNativeAmerican); + break; + case 65: + aGenrePtr.Append(KGenreCabaret); + break; + case 66: + aGenrePtr.Append(KGenreNewWave); + break; + case 67: + aGenrePtr.Append(KGenrePsychadelic); + break; + case 68: + aGenrePtr.Append(KGenreRave); + break; + case 69: + aGenrePtr.Append(KGenreShowtunes); + break; + case 70: + aGenrePtr.Append(KGenreTrailer); + break; + case 71: + aGenrePtr.Append(KGenreLoFi); + break; + case 72: + aGenrePtr.Append(KGenreTribal); + break; + case 73: + aGenrePtr.Append(KGenreAcidPunk); + break; + case 74: + aGenrePtr.Append(KGenreAcidJazz); + break; + case 75: + aGenrePtr.Append(KGenrePolka); + break; + case 76: + aGenrePtr.Append(KGenreRetro); + break; + case 77: + aGenrePtr.Append(KGenreMusical); + break; + case 78: + aGenrePtr.Append(KGenreRockRoll); + break; + case 79: + aGenrePtr.Append(KGenreHardRock); + break; + case 80: + aGenrePtr.Append(KGenreFolk); + break; + case 81: + aGenrePtr.Append(KGenreFolkRock); + break; + case 82: + aGenrePtr.Append(KGenreNationalFolk); + break; + case 83: + aGenrePtr.Append(KGenreSwing); + break; + case 84: + aGenrePtr.Append(KGenreFastFusion); + break; + case 85: + aGenrePtr.Append(KGenreBebob); + break; + case 86: + aGenrePtr.Append(KGenreLatin); + break; + case 87: + aGenrePtr.Append(KGenreRevival); + break; + case 88: + aGenrePtr.Append(KGenreCeltic); + break; + case 89: + aGenrePtr.Append(KGenreBluegrass); + break; + case 90: + aGenrePtr.Append(KGenreAvantgarde); + break; + case 91: + aGenrePtr.Append(KGenreGothicRock); + break; + case 92: + aGenrePtr.Append(KGenreProgressiveRock); + break; + case 93: + aGenrePtr.Append(KGenrePsychedelicRock); + break; + case 94: + aGenrePtr.Append(KGenreSymphonicRock); + break; + case 95: + aGenrePtr.Append(KGenreSlowRock); + break; + case 96: + aGenrePtr.Append(KGenreBigBand); + break; + case 97: + aGenrePtr.Append(KGenreChorus); + break; + case 98: + aGenrePtr.Append(KGenreEasyListening); + break; + case 99: + aGenrePtr.Append(KGenreAcoustic); + break; + case 100: + aGenrePtr.Append(KGenreHumour); + break; + case 101: + aGenrePtr.Append(KGenreSpeech); + break; + case 102: + aGenrePtr.Append(KGenreChanson); + break; + case 103: + aGenrePtr.Append(KGenreOpera); + break; + case 104: + aGenrePtr.Append(KGenreChamberMusic); + break; + case 105: + aGenrePtr.Append(KGenreSonata); + break; + case 106: + aGenrePtr.Append(KGenreSymphony); + break; + case 107: + aGenrePtr.Append(KGenreBootyBass); + break; + case 108: + aGenrePtr.Append(KGenrePrimus); + break; + case 109: + aGenrePtr.Append(KGenrePornGroove); + break; + case 110: + aGenrePtr.Append(KGenreSatire); + break; + case 111: + aGenrePtr.Append(KGenreSlowJam); + break; + case 112: + aGenrePtr.Append(KGenreClub); + break; + case 113: + aGenrePtr.Append(KGenreTango); + break; + case 114: + aGenrePtr.Append(KGenreSamba); + break; + case 115: + aGenrePtr.Append(KGenreFolklore); + break; + case 116: + aGenrePtr.Append(KGenreBallad); + break; + case 117: + aGenrePtr.Append(KGenrePowerBallad); + break; + case 118: + aGenrePtr.Append(KGenreRhythmicSoul); + break; + case 119: + aGenrePtr.Append(KGenreFreestyle); + break; + case 120: + aGenrePtr.Append(KGenreDuet); + break; + case 121: + aGenrePtr.Append(KGenrePunkRock); + break; + case 122: + aGenrePtr.Append(KGenreDrumSolo); + break; + case 123: + aGenrePtr.Append(KGenreAcapella); + break; + case 124: + aGenrePtr.Append(KGenreEuroHouse); + break; + case 125: + aGenrePtr.Append(KGenreDanceHall); + break; + case 199: + aGenrePtr.Append(KGenrePodcast); + break; + default: + break; + } +} + +// ----------------------------------------------------------------------------- +// CMetaDataParser::GenerateTopCharacterSets() +// ----------------------------------------------------------------------------- +// +void CMetaDataParser::GenerateTopCharacterSetsL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::GenerateTopCharacterSetsL")); +#endif + + TInt result = 0; + CArrayFixFlat* installedLanguages = NULL; + SysLangUtil::GetInstalledLanguages(installedLanguages); + CleanupStack::PushL(installedLanguages); + + TFileName* resourceFileName=new(ELeave) TFileName; + CleanupStack::PushL(resourceFileName); + Dll::FileName(*resourceFileName); // Get the drive letter of dll + + TParse* parse=new(ELeave) TParse; + CleanupStack::PushL(parse); + User::LeaveIfError(parse->SetNoWild(KCharacterSetRscFile, &KDC_RESOURCE_FILES_DIR, resourceFileName)); + resourceFileName->Copy(parse->FullName()); + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::GenerateTopCharacterSetsL, resourceFileName=%S"), resourceFileName); + #endif + + // Resource file should always exist in the same drive as dll + if (BaflUtils::FileExists(iFs, *resourceFileName)) + { + TRAPD(err, iRscFile.OpenL(iFs, *resourceFileName)); + result = err; + } + + CleanupStack::PopAndDestroy(parse); + CleanupStack::PopAndDestroy(resourceFileName); + + // if there is no resource file, then there is no top character set list + if (result) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::GenerateTopCharacterSetsL-unable to find resource file")); + #endif + + CleanupStack::PopAndDestroy(installedLanguages); + return; + } + + for (TInt i=0; i < installedLanguages->Count(); i++) + { + SelectCharacterSetsForLanguageL(installedLanguages->At(i)); + } + iTopCharacterSet->Compress(); + installedLanguages->Reset(); + CleanupStack::PopAndDestroy(installedLanguages); + iRscFile.Close(); + } + + +// ----------------------------------------------------------------------------- +// CMetaDataParser::SelectCharacterSetsForLanguage() +// ----------------------------------------------------------------------------- +// +void CMetaDataParser::SelectCharacterSetsForLanguageL(TInt aLanguage) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::SelectCharacterSetsForLanguageL, aLanguage=%d"), aLanguage); +#endif + + switch ( aLanguage ) + { + case ELangEnglish: + ReadCharacterSetResourceL(R_ENGLISH_CHAR_SET); + break; + case ELangFrench: + ReadCharacterSetResourceL(R_FRENCH_CHAR_SET); + break; + case ELangGerman: + ReadCharacterSetResourceL(R_GERMAN_CHAR_SET); + break; + case ELangTurkish: + ReadCharacterSetResourceL(R_TURKISH_CHAR_SET); + break; + case ELangFinnish: + ReadCharacterSetResourceL(R_FINNISH_CHAR_SET); + break; + case ELangSwedish: + ReadCharacterSetResourceL(R_SWEDISH_CHAR_SET); + break; + case ELangRussian: + ReadCharacterSetResourceL(R_RUSSIAN_CHAR_SET); + break; + case ELangArabic: + ReadCharacterSetResourceL(R_ARABIC_CHAR_SET); + break; + case ELangHebrew: + ReadCharacterSetResourceL(R_HEBREW_CHAR_SET); + break; + case ELangFarsi: + ReadCharacterSetResourceL(R_FARSI_CHAR_SET); + break; + case ELangItalian: + ReadCharacterSetResourceL(R_ITALIAN_CHAR_SET); + break; + case ELangPolish: + ReadCharacterSetResourceL(R_POLISH_CHAR_SET); + break; + case ELangHungarian: + ReadCharacterSetResourceL(R_HUNGARIAN_CHAR_SET); + break; + case ELangSpanish: + ReadCharacterSetResourceL(R_SPANISH_CHAR_SET); + break; + case ELangDutch: + ReadCharacterSetResourceL(R_DUTCH_CHAR_SET); + break; + case ELangPortuguese: + ReadCharacterSetResourceL(R_PORTUGUESE_CHAR_SET); + break; + case ELangAmerican: + ReadCharacterSetResourceL(R_ENGLISH_CHAR_SET); // Maybe an American characterset exist? + break; + case ELangCanadianFrench: + ReadCharacterSetResourceL(R_FRENCH_CHAR_SET); + break; + case ELangBrazilianPortuguese: + ReadCharacterSetResourceL(R_PORTUGUESE_CHAR_SET); + break; + case ELangLatinAmericanSpanish: + ReadCharacterSetResourceL(R_SPANISH_CHAR_SET); + break; + case ELangLatvian: + ReadCharacterSetResourceL(R_LATVIAN_CHAR_SET); + break; + case ELangGreek: + ReadCharacterSetResourceL(R_GREEK_CHAR_SET); + break; + case ELangEstonian: + ReadCharacterSetResourceL(R_ESTONIAN_CHAR_SET); + break; + case ELangLithuanian: + ReadCharacterSetResourceL(R_LITHUANIAN_CHAR_SET); + break; + case ELangRomanian: + ReadCharacterSetResourceL(R_ROMANIAN_CHAR_SET); + break; + case ELangUkrainian: + ReadCharacterSetResourceL(R_UKRAINIAN_CHAR_SET); + break; + case ELangBulgarian: + ReadCharacterSetResourceL(R_BULGARIAN_CHAR_SET); + break; + case ELangCroatian: + ReadCharacterSetResourceL(R_CROATIAN_CHAR_SET); + break; + case ELangSerbian: + ReadCharacterSetResourceL(R_SERBIAN_CHAR_SET); + break; + case ELangIndonesian: + ReadCharacterSetResourceL(R_INDONESIAN_CHAR_SET); + break; + case ELangMalay: + case ELangTagalog: + ReadCharacterSetResourceL(R_MALAY_CHAR_SET); + break; + case ELangIcelandic: + ReadCharacterSetResourceL(R_ICELANDIC_CHAR_SET); + break; + case ELangDanish: + ReadCharacterSetResourceL(R_DANISH_CHAR_SET); + break; + case ELangNorwegian: + ReadCharacterSetResourceL(R_NORWEGIAN_CHAR_SET); + break; + case ELangHindi: + ReadCharacterSetResourceL(R_INDIAN_CHAR_SET); + break; + case ELangUrdu: + ReadCharacterSetResourceL(R_URDU_CHAR_SET); + break; + case ELangCzech: + ReadCharacterSetResourceL(R_CZECH_CHAR_SET); + break; + case ELangSlovak: + ReadCharacterSetResourceL(R_SLOVAK_CHAR_SET); + break; + case ELangSlovenian: + ReadCharacterSetResourceL(R_SLOVENIAN_CHAR_SET); + break; + case ELangTaiwanChinese: + case ELangHongKongChinese: + ReadCharacterSetResourceL(R_TAIWAN_HK_CHINESE_CHAR_SET); + break; + case ELangPrcChinese: + ReadCharacterSetResourceL(R_CHINESE_CHAR_SET); + break; + case KLangTaiwanEnglish: + case KLangPrcEnglish: + case KLangJapaneseEnglish: + case KLangThaiEnglish: + case KLangHongKongEnglish: + ReadCharacterSetResourceL(R_ENGLISH_CHAR_SET); + break; + case ELangJapanese: + ReadCharacterSetResourceL(R_JAPANESE_CHAR_SET); + break; + case ELangThai: + ReadCharacterSetResourceL(R_THAI_CHAR_SET); + break; + case ELangVietnamese: + ReadCharacterSetResourceL(R_VIETNAMESE_CHAR_SET); + break; + case KLangApacMalay: + ReadCharacterSetResourceL(R_MALAY_CHAR_SET); + break; + case ELangKorean: + ReadCharacterSetResourceL(R_KOREAN_CHAR_SET); + break; + default: + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::SelectCharacterSetsForLanguageL, aLanguage=%d"),aLanguage ); + #endif + ReadCharacterSetResourceL(R_ENGLISH_CHAR_SET); + break; + } + + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::ReadCharacterSetResourceL() +// ----------------------------------------------------------------------------- +// +void CMetaDataParser::ReadCharacterSetResourceL(TInt aResourceId) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::ReadCharacterSetResourceL, ResourceID=%d"), aResourceId); +#endif + + TResourceReader rscReader; // Resource reader + HBufC8* rscBuf; // Buffer where resource is read + + rscBuf = iRscFile.AllocReadL(aResourceId); + rscReader.SetBuffer(rscBuf); + CleanupStack::PushL(rscBuf); + + TUint characterSetElementId; + TInt numCharacterSetElements = rscReader.ReadInt16(); + TUint elemId; + CCnvCharacterSetConverter::SCharacterSet elem; + + for (TInt i = 0; i < numCharacterSetElements; i++) + { + characterSetElementId = rscReader.ReadInt32(); + for (TInt j = 0; j < iCharacterSet->Count(); j++ ) + { + elem = iCharacterSet->At(j); + elemId = elem.Identifier(); + if ( elemId == characterSetElementId && !IsInTopCharacterSet(characterSetElementId) ) + { + iTopCharacterSet->AppendL(elem); + } + } + } + + CleanupStack::PopAndDestroy(1); // rscBuf + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser::IsInTopCharacterSet() +// ----------------------------------------------------------------------------- +// +TBool CMetaDataParser::IsInTopCharacterSet(TUint aCharacterSetId) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::IsInTopCharacterSet, aCharacterSetId=%d"), aCharacterSetId); +#endif + + for (TInt i = 0; i < iTopCharacterSet->Count(); i++) + { + if ( iTopCharacterSet->At(i).Identifier() == aCharacterSetId ) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser::IsInTopCharacterSet-found char set")); + #endif + + return ETrue; + } + } + return EFalse; + } +// End of File