/*
* 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.
*
*/



#ifndef MMETADATAPARSER_H
#define MMETADATAPARSER_H

// INCLUDES
#include <e32base.h>
#include <MetaDataField.hrh>
#include <f32file.h>
#include <charconv.h>
#include <barsc.h>
#include <barsread.h>

#include "MetaDataID3v1Genre.h"

// FORWARD DECLARATION
class CMetaDataFieldContainer;
class CMetaDataSourceFile;

// CONSTANTS
const TInt KUnicodeBOMNotFound		= 0;
const TInt KUnicodeBOMBigEndian		= 1;
const TInt KUnicodeBOMLittleEndian	= 2;

// CLASS DECLARATION

/**
*  This class implements the base class in metadata hierarchy.
*
*  @lib MetaDataUtility.lib
*  @since 3.0
*/
class CMetaDataParser : public CBase
	{
	public:  // Destructor

		/**
		* Destructor.
		*/
		virtual ~CMetaDataParser();

	protected:  // Constructor

        /**
        * C++ default constructor.
        */
		CMetaDataParser();

    public: // New functions

        /**
        * Parses the source and if metadata is found, the metadata fields are
        * inserted into the container.
        * @since 3.0
		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
		* @param aContainer On return, metadata found in aSource is stored here
		* @return void
        */
		virtual void ParseL( const RArray<TMetaDataFieldId>& aWantedFields,
			CMetaDataFieldContainer& aContainer ) = 0;

        /**
        * Returns whether metadata was found or not.
        * @since 3.0
        * @return ETrue, if metadata was found
        */
		TBool MetaDataExists();
		
		/**
        * Returns id3 version for ID3 tag types
        * @since 3.0
        * @return TID3Type enum
        */
		virtual TID3Version ID3Version();
		
		/**
        * Maps ID3v1 genre integer to string
        * @param aNum genre integer code
        * @param aGenrePtr string genre value returned
        * @since 3.0
        * @return void
        */
		void MapID3GenreToStringL( TInt aNum, TDes& aGenrePtr );

		/**
        * Maps ID3v2 genre integer to string
        * @param aNum genre integer code
        * @param aGenrePtr string genre value returned
        * @since 3.0
        * @return void
        */

		void MapID3GenreToStringL( TInt aNum, TDes8& aGenrePtr );
		void GenerateTopCharacterSetsL();
		void SelectCharacterSetsForLanguageL( TInt aLanguage );
		void ReadCharacterSetResourceL( TInt aResourceId );
		TBool IsInTopCharacterSet( TUint aCharacterSetId );

		/**
        * Parses the common metadata, the metadata fields are
        * inserted into the container.
        * @since 9.2
        * @param aSource a Metadata source file.
        * @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
        * @param aContainer On return, metadata found in aSource is stored here
        * @return void
        */
        void CommonParseL( CMetaDataSourceFile* aSource,
                const RArray<TMetaDataFieldId>& aWantedFields, 
                CMetaDataFieldContainer& aContainer );

        /**
        * Parses the common metadata, the metadata fields are
        * inserted into the container.
        * @since 9.2
        * @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
        * @param aContainer On return, metadata found in aSource is stored here
        * @return void
        */
        void CommonParseDesL( const RArray<TMetaDataFieldId>& aWantedFields, 
                CMetaDataFieldContainer& aContainer );

        /**
        * Append DRM Protected data to the container.
        * @param aSource a Metadata source file.
        * @param aContainer On return, metadata ptotected data is stored here
        * @return void
        */
		void GetProtectedL( CMetaDataSourceFile* aSource,
		        CMetaDataFieldContainer& aContainer );

    protected:

        /**
        * Strips trailing zeros at the end of the field.
        * @since 3.0
        * @param aDesc The original descriptor
        * @return Pointer to descriptor without whitespace
        */
        TPtrC8 StripTrailingZeroes( const TDesC8& aDesc, TInt encoding = 0 );
        TPtrC StripTrailingZeroes( const TDesC& aDesc );

        /**
        * Returns BOM indication in the provided unicode.
        * @since 3.0
        * @param aUnicode Descriptor containing unicode.
        * @return KUnicodeBOMNotFound, KUnicodeBOMBigEndian, or KUnicodeBOMLittleEndian
		*/
		TInt UnicodeBOM( const TDesC8& aUnicode );

	protected:     // Data

		// Metadata container
		CMetaDataFieldContainer* iContainer;
		// Metadata exists
		TBool iExists;
		// File session
		RFs iFs;
		// Character set for unicode conversion
		CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* iCharacterSet;
		// Most likely character set for unicode conversion
		CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* iTopCharacterSet;

		RResourceFile iRscFile;

		//CArrayFixFlat<TInt>* installedLanguages;
	};

#endif      // MMETADATAPARSER_H

// End of File
